1 /*
2 * Copyright (c) 2021 HPMicro
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 *
6 */
7
8 #ifndef HPM_DISPLAY_COMMON_H
9 #define HPM_DISPLAY_COMMON_H
10
11 #include "hpm_common.h"
12
13 /**
14 * @brief Display_common driver APIs
15 * @defgroup Display_common_interface Display_common driver APIs
16 * @ingroup io_interfaces
17 * @{
18 */
19
20 /**
21 * @brief display alphablend mode
22 */
23 typedef enum display_alphablend_mode {
24 display_alphablend_mode_clear = 0,
25 display_alphablend_mode_src = 1,
26 display_alphablend_mode_dst = 2,
27 display_alphablend_mode_src_over = 3,
28 display_alphablend_mode_dst_over = 4,
29 display_alphablend_mode_src_in = 5,
30 display_alphablend_mode_dst_in = 6,
31 display_alphablend_mode_src_out = 7,
32 display_alphablend_mode_dst_out = 8,
33 display_alphablend_mode_src_at_top = 9,
34 display_alphablend_mode_dst_at_top = 10,
35 display_alphablend_mode_xor = 11,
36 display_alphablend_mode_plus = 12,
37 display_alphablend_mode_modulate = 13,
38 display_alphablend_mode_src_org = 14,
39 display_alphablend_mode_dst_org = 15,
40 } display_alphablend_mode_t;
41
42 /**
43 * @brief display pixel format
44 */
45 typedef enum display_pixel_format {
46 display_pixel_format_argb8888,
47 display_pixel_format_rgb565,
48 display_pixel_format_rgb555,
49 display_pixel_format_rgb444,
50 display_pixel_format_gbr422,
51 display_pixel_format_yuv422,
52 display_pixel_format_ycbcr422,
53 display_pixel_format_y8,
54 display_pixel_format_raw8,
55 } display_pixel_format_t;
56
57 /**
58 * @brief display data byte order
59 */
60 typedef enum display_byteorder {
61 display_byteorder_a3a2a1a0 = 0,
62 display_byteorder_a2a3a0a1 = 1,
63 display_byteorder_a1a0a3a2 = 2,
64 display_byteorder_a0a1a2a3 = 3,
65 } display_byteorder_t;
66
67 /**
68 * @brief display yuv format
69 */
70 typedef enum display_yuv_format {
71 display_yuv_mode_422_u1y1v1y2 = 0,
72 display_yuv_mode_422_v1y1u1y2,
73 display_yuv_mode_422_y1u1y2v1,
74 display_yuv_mode_422_y1v1y2u1,
75 } display_yuv_format_t;
76
77 /**
78 * @brief display data 32 bits argb
79 */
80 typedef union display_color_32b {
81 uint32_t u;
82 struct {
83 uint8_t b;
84 uint8_t g;
85 uint8_t r;
86 uint8_t alpha;
87 };
88 } display_color_32b_t;
89
90 /**
91 * @brief display data alpha value usage option
92 */
93 typedef enum display_alpha_op {
94 display_alpha_op_invalid = 0,
95 display_alpha_op_override = 1,
96 display_alpha_op_scale = 2,
97 } display_alpha_op_t;
98
99 /**
100 * @brief display data alphablend option
101 */
102 typedef struct dispaly_alphablend_option {
103 uint8_t dst_alpha;
104 uint8_t src_alpha;
105 display_alpha_op_t dst_alpha_op;
106 display_alpha_op_t src_alpha_op;
107 display_alphablend_mode_t mode;
108 } display_alphablend_option_t;
109
110 /**
111 * @brief display yuv to rgb format conversion coefficient
112 */
113 typedef struct dispaly_yuv2rgb_coef {
114 uint16_t c0;
115 uint16_t c1;
116 uint16_t c2;
117 uint16_t c3;
118 uint16_t c4;
119 uint16_t uv_offset;
120 uint16_t y_offset;
121 } display_yuv2rgb_coef_t;
122
123 /**
124 * @brief display yuv to rgb format conversion config
125 */
126 typedef struct display_yuv2rgb_config {
127 bool enable;
128 bool ycbcr_mode;
129 display_yuv2rgb_coef_t yuv2rgb_coef;
130 } display_yuv2rgb_config_t;
131
132 /**
133 * @brief display rgb to yuv format conversion config
134 */
135 typedef struct display_rgb2yuv_config {
136 bool enable;
137 bool ycbcr_mode;
138 uint16_t c0;
139 uint16_t c1;
140 uint16_t c2;
141 uint16_t c3;
142 uint16_t c4;
143 uint16_t c5;
144 uint16_t c6;
145 uint16_t c7;
146 uint16_t c8;
147 uint16_t uv_offset;
148 uint16_t y_offset;
149 } display_rgb2yuv_config_t;
150
151 #ifdef __cplusplus
152 extern "C" {
153 #endif
154
155 /**
156 * @brief Display get pixel size in bit
157 *
158 * @param [in] format display_pixel_format_t
159 *
160 * @retval pixel size in bit
161 */
162 static inline
display_get_pixel_size_in_bit(display_pixel_format_t format)163 uint8_t display_get_pixel_size_in_bit(display_pixel_format_t format)
164 {
165 switch (format) {
166 case display_pixel_format_argb8888:
167 return 32;
168 case display_pixel_format_rgb565:
169 return 16;
170 case display_pixel_format_yuv422:
171 return 16;
172 case display_pixel_format_ycbcr422:
173 return 16;
174 case display_pixel_format_y8:
175 return 8;
176 case display_pixel_format_raw8:
177 return 8;
178 default:
179 return 0;
180 }
181 }
182
183 /**
184 * @brief Check whether the pixel data is yuv format
185 *
186 * @param [in] format display_pixel_format_t
187 *
188 * @retval bool: true or false
189 */
display_pixel_format_is_yuv_format(display_pixel_format_t format)190 static inline bool display_pixel_format_is_yuv_format(display_pixel_format_t format)
191 {
192 switch (format) {
193 case display_pixel_format_yuv422:
194 return true;
195 case display_pixel_format_ycbcr422:
196 return true;
197 default:
198 return false;
199 }
200 }
201
202 /**
203 * @brief Display get pixel size in byte
204 *
205 * @param [in] format display_pixel_format_t
206 *
207 * @retval pixel size in byte
208 */
209 static inline
display_get_pixel_size_in_byte(display_pixel_format_t format)210 uint8_t display_get_pixel_size_in_byte(display_pixel_format_t format)
211 {
212 return display_get_pixel_size_in_bit(format) >> 3;
213 }
214
215 /**
216 * @brief Display get pitch length in byte
217 *
218 * @param [in] format display_pixel_format_t
219 * @param [in] width_in_pixel pixel width
220 *
221 * @retval pitch length in byte
222 */
223 static inline
display_get_pitch_length_in_byte(display_pixel_format_t format,uint32_t width_in_pixel)224 uint32_t display_get_pitch_length_in_byte(display_pixel_format_t format,
225 uint32_t width_in_pixel)
226 {
227 return width_in_pixel * (display_get_pixel_size_in_bit(format) >> 3);
228 }
229
230 /**
231 * @}
232 *
233 */
234
235 #ifdef __cplusplus
236 }
237 #endif
238 #endif /* HPM_DISPLAY_COMMON_H */
239