HPM SDK
HPMicro Software Development Kit
hpm_cam_drv.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2021-2025 HPMicro
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  *
6  */
7 
8 #ifndef HPM_CAM_DRV_H
9 #define HPM_CAM_DRV_H
10 
11 #include "hpm_common.h"
12 #include "hpm_display_common.h"
13 #include "hpm_cam_regs.h"
14 #include "hpm_soc_feature.h"
15 
26 #define CAM_DATA_STORE_MODE_NORMAL (0U)
27 #define CAM_DATA_STORE_MODE_Y_UV_PLANES (CAM_CR1_STORAGE_MODE_SET(1))
28 #define CAM_DATA_STORE_MODE_Y_ONLY (CAM_CR1_STORAGE_MODE_SET(2))
29 #define CAM_DATA_STORE_MODE_BINARY (CAM_CR1_STORAGE_MODE_SET(3))
30 
34 #define CAM_SENSOR_BITWIDTH_8BITS (CAM_CR1_SENSOR_BIT_WIDTH_SET(0))
35 #define CAM_SENSOR_BITWIDTH_10BITS (CAM_CR1_SENSOR_BIT_WIDTH_SET(1))
36 #define CAM_SENSOR_BITWIDTH_24BITS (CAM_CR1_SENSOR_BIT_WIDTH_SET(3))
37 
41 typedef enum {
51 
55 typedef enum {
65 
69 #define CAM_COLOR_FORMAT_RGB888 (CAM_CR1_COLOR_FORMATS_SET(2))
70 #define CAM_COLOR_FORMAT_RGB565 (CAM_CR1_COLOR_FORMATS_SET(4))
71 #define CAM_COLOR_FORMAT_RGB555 (CAM_CR1_COLOR_FORMATS_SET(6))
72 #define CAM_COLOR_FORMAT_YCBCR422_YUV422 (CAM_CR1_COLOR_FORMATS_SET(7))
73 #define CAM_COLOR_FORMAT_YUV444 (CAM_CR1_COLOR_FORMATS_SET(8))
74 #define CAM_COLOR_FORMAT_RAW8 (CAM_CR1_COLOR_FORMATS_SET(0xf))
75 #define CAM_COLOR_FORMAT_UNSUPPORTED (1)
76 
80 typedef struct {
81  uint32_t width;
82  uint32_t height;
84 #if defined(HPM_IP_FEATURE_CAM_INV_DEN) && (HPM_IP_FEATURE_CAM_INV_DEN == 1)
85  bool de_active_low; /* de_active_low must is same with hsync_active_low when dvp be used */
86 #endif
89  bool color_ext;
91  uint16_t data_store_mode;
92  uint8_t color_format;
93  uint8_t sensor_bitwidth;
94  uint32_t buffer1;
95  uint32_t buffer2;
97  uint32_t colorkey_low;
98  uint32_t colorkey_high;
99 } cam_config_t;
100 
104 typedef enum {
105  cam_input_pixel_yuv444 = 0, /* Y[23:16] U[15:8] V[7:0] */
106  cam_input_pixel_yvu444 = 1, /* Y[23:16] V[15:8] U[7:0] */
107  cam_input_pixel_uyv444 = 2, /* U[23:16] Y[15:8] V[7:0] */
108  cam_input_pixel_vyu444 = 3, /* V[23:16] Y[15:8] U[7:0] */
109  cam_input_pixel_uvy444 = 4, /* U[23:16] V[15:8] Y[7:0] */
110  cam_input_pixel_vuy444 = 5, /* V[23:16] U[15:8] Y[7:0] */
111  cam_input_pixel_yuyv422 = 0, /* Y0[31:24] U0[23:16] Y1[15:8] V0[7:0] */
112  cam_input_pixel_yvyu422 = 1, /* Y0[31:24] V0[23:16] Y1[15:8] U0[7:0] */
113  cam_input_pixel_uyvy422 = 2, /* U0[31:24] Y0[23:16] V0[15:8] Y1[7:0] */
114  cam_input_pixel_vyuy422 = 3, /* V0[31:24] Y0[23:16] U0[15:8] Y1[7:0] */
115  cam_input_pixel_rgb565 = 0, /* R[15:11] G[10:8] G[7:5] B[4:0] */
116  cam_input_pixel_bgr565 = 1, /* B[15:11] G[10:8] G[7:5] R[4:0] */
117  cam_input_pixel_gbr888 = 0, /* G[23:16] B[15:8] R[7:0] */
118  cam_input_pixel_grb888 = 1, /* G[23:16] R[15:8] B[7:0] */
119  cam_input_pixel_bgr888 = 2, /* B[23:16] G[15:8] R[7:0] */
120  cam_input_pixel_rgb888 = 3, /* R[23:16] G[15:8] B[7:0] */
121  cam_input_pixel_brg888 = 4, /* B[23:16] R[15:8] G[7:0] */
122  cam_input_pixel_rbg888 = 5, /* R[23:16] B[15:8] G[7:0] */
124 
125 #ifdef __cplusplus
126 extern "C" {
127 #endif
128 
135 static inline uint32_t cam_get_pixel_format(display_pixel_format_t format)
136 {
137  switch (format) {
144  return CAM_COLOR_FORMAT_RAW8;
145  default:
147  }
148 }
149 
157 static inline void cam_set_color_key(CAM_Type *ptr, uint32_t high, uint32_t low)
158 {
161 }
162 
170 void cam_get_default_config(CAM_Type *ptr, cam_config_t *config, display_pixel_format_t pixel_format);
171 
181 
187 void cam_start(CAM_Type *ptr);
188 
196 void cam_stop(CAM_Type *ptr);
197 
204 static inline void cam_update_buffer(CAM_Type *ptr, uint32_t buffer)
205 {
206  ptr->DMASA_FB1 = buffer;
207 }
208 
215 static inline void cam_update_buffer2(CAM_Type *ptr, uint32_t buffer)
216 {
217  ptr->DMASA_FB2 = buffer;
218 }
219 
228 static inline void cam_enable_binary_output(CAM_Type *ptr)
229 {
231 }
232 
238 static inline void cam_disable_binary_output(CAM_Type *ptr)
239 {
240  ptr->CR20 &= ~CAM_CR20_BINARY_EN_MASK;
241 }
242 
249 static inline void cam_set_binary_threshold(CAM_Type *ptr, uint8_t threshold)
250 {
251  ptr->CR20 = (ptr->CR20 & (~CAM_CR20_THRESHOLD_MASK)) | CAM_CR20_THRESHOLD_SET(threshold);
252 }
253 
262 static inline void cam_enable_argb8888_output(CAM_Type *ptr)
263 {
264  ptr->CR1 |= CAM_CR1_COLOR_EXT_MASK;
265 }
266 
272 static inline void cam_disable_argb8888_output(CAM_Type *ptr)
273 {
274  ptr->CR1 &= ~CAM_CR1_COLOR_EXT_MASK;
275 }
276 
284 {
285  ptr->CR2 = (ptr->CR2 & (~CAM_CR2_CLRBITFORMAT_MASK)) | CAM_CR2_CLRBITFORMAT_SET(order);
286 }
287 
294 static inline void cam_enable_irq(CAM_Type *ptr, cam_irq_mask_t irq_mask)
295 {
296  ptr->INT_EN |= irq_mask;
297 }
298 
299 
306 static inline void cam_disable_irq(CAM_Type *ptr, cam_irq_mask_t irq_mask)
307 {
308  ptr->INT_EN &= ~irq_mask;
309 }
310 
319 static inline bool cam_check_status(CAM_Type *ptr, cam_status_mask_t sta_mask)
320 {
321  return ((ptr->STA & sta_mask) != 0U) ? true : false;
322 }
323 
330 static inline void cam_clear_status(CAM_Type *ptr, cam_status_mask_t sta_mask)
331 {
332  ptr->STA = sta_mask;
333 }
334 
342 void cam_stop_safely(CAM_Type *ptr);
343 
349 #ifdef __cplusplus
350 }
351 #endif
352 
353 #endif /* HPM_CAM_DRV_H */
354 
355 
#define CAM_CR20_THRESHOLD_MASK
Definition: hpm_cam_regs.h:571
#define CAM_STA_ERR_CL_BWID_CFG_MASK
Definition: hpm_cam_regs.h:366
#define CAM_INT_EN_FB2_DMA_DONE_INTEN_MASK
Definition: hpm_cam_regs.h:267
#define CAM_INT_EN_SOF_INT_EN_MASK
Definition: hpm_cam_regs.h:292
#define CAM_STA_EOF_INT_MASK
Definition: hpm_cam_regs.h:425
#define CAM_STA_HRESP_ERR_INT_MASK
Definition: hpm_cam_regs.h:450
#define CAM_CLRKEY_LOW_LIMIT_SET(x)
Definition: hpm_cam_regs.h:683
#define CAM_INT_EN_EOF_INT_EN_MASK
Definition: hpm_cam_regs.h:242
#define CAM_STA_DMA_TSF_DONE_FB1_MASK
Definition: hpm_cam_regs.h:413
#define CAM_CR1_COLOR_EXT_MASK
Definition: hpm_cam_regs.h:46
#define CAM_CR2_CLRBITFORMAT_MASK
Definition: hpm_cam_regs.h:355
#define CAM_STA_SOF_INT_MASK
Definition: hpm_cam_regs.h:437
#define CAM_STA_RF_OR_INT_MASK
Definition: hpm_cam_regs.h:389
#define CAM_INT_EN_ERR_CL_BWID_CFG_INT_EN_MASK
Definition: hpm_cam_regs.h:208
#define CAM_STA_DMA_TSF_DONE_FB2_MASK
Definition: hpm_cam_regs.h:401
#define CAM_CLRKEY_HIGH_LIMIT_SET(x)
Definition: hpm_cam_regs.h:694
#define CAM_INT_EN_HIST_DONE_INT_EN_MASK
Definition: hpm_cam_regs.h:218
#define CAM_INT_EN_RF_OR_INTEN_MASK
Definition: hpm_cam_regs.h:254
#define CAM_CR20_THRESHOLD_SET(x)
Definition: hpm_cam_regs.h:573
#define CAM_INT_EN_HRESP_ERR_EN_MASK
Definition: hpm_cam_regs.h:230
#define CAM_CR2_CLRBITFORMAT_SET(x)
Definition: hpm_cam_regs.h:357
#define CAM_STA_HIST_DONE_MASK
Definition: hpm_cam_regs.h:376
#define CAM_INT_EN_FB1_DMA_DONE_INTEN_MASK
Definition: hpm_cam_regs.h:280
#define CAM_CR20_BINARY_EN_MASK
Definition: hpm_cam_regs.h:541
enum display_pixel_format display_pixel_format_t
display pixel format
@ display_pixel_format_rgb565
Definition: hpm_display_common.h:47
@ display_pixel_format_raw8
Definition: hpm_display_common.h:54
@ display_pixel_format_yuv422
Definition: hpm_display_common.h:51
@ display_pixel_format_ycbcr422
Definition: hpm_display_common.h:52
void cam_get_default_config(CAM_Type *ptr, cam_config_t *config, display_pixel_format_t pixel_format)
CAM get default config.
Definition: hpm_cam_drv.c:12
static void cam_disable_argb8888_output(CAM_Type *ptr)
CAM disable argb8888 output.
Definition: hpm_cam_drv.h:272
hpm_stat_t cam_init(CAM_Type *ptr, cam_config_t *config)
CAM init.
Definition: hpm_cam_drv.c:80
static void cam_set_input_pixel_byte_order(CAM_Type *ptr, cam_input_pixel_byte_order_t order)
CAM set input pixel byte order.
Definition: hpm_cam_drv.h:283
static void cam_enable_binary_output(CAM_Type *ptr)
CAM enable binary output.
Definition: hpm_cam_drv.h:228
#define CAM_COLOR_FORMAT_RAW8
Definition: hpm_cam_drv.h:74
cam_irq_mask_t
CAM IRQ mask.
Definition: hpm_cam_drv.h:41
void cam_start(CAM_Type *ptr)
CAM start.
Definition: hpm_cam_drv.c:157
static void cam_update_buffer2(CAM_Type *ptr, uint32_t buffer)
CAM update DMASA_FB2 buffer.
Definition: hpm_cam_drv.h:215
static void cam_enable_irq(CAM_Type *ptr, cam_irq_mask_t irq_mask)
CAM enable irq.
Definition: hpm_cam_drv.h:294
static void cam_disable_irq(CAM_Type *ptr, cam_irq_mask_t irq_mask)
CAM disable irq.
Definition: hpm_cam_drv.h:306
#define CAM_COLOR_FORMAT_UNSUPPORTED
Definition: hpm_cam_drv.h:75
static void cam_clear_status(CAM_Type *ptr, cam_status_mask_t sta_mask)
Clear CAM status according to the given status mask.
Definition: hpm_cam_drv.h:330
#define CAM_COLOR_FORMAT_RGB565
Definition: hpm_cam_drv.h:70
static uint32_t cam_get_pixel_format(display_pixel_format_t format)
cam get pixel format value
Definition: hpm_cam_drv.h:135
static void cam_disable_binary_output(CAM_Type *ptr)
CAM disable binary output.
Definition: hpm_cam_drv.h:238
void cam_stop_safely(CAM_Type *ptr)
CAM safety stop.
Definition: hpm_cam_drv.c:162
static bool cam_check_status(CAM_Type *ptr, cam_status_mask_t sta_mask)
Check CAM status according to the given status mask.
Definition: hpm_cam_drv.h:319
static void cam_set_color_key(CAM_Type *ptr, uint32_t high, uint32_t low)
CAM set high and low limits of color key.
Definition: hpm_cam_drv.h:157
#define CAM_COLOR_FORMAT_YCBCR422_YUV422
Definition: hpm_cam_drv.h:72
static void cam_enable_argb8888_output(CAM_Type *ptr)
CAM enable argb8888 output.
Definition: hpm_cam_drv.h:262
cam_status_mask_t
CAM status mask.
Definition: hpm_cam_drv.h:55
static void cam_update_buffer(CAM_Type *ptr, uint32_t buffer)
CAM update DMASA_FB1 buffer.
Definition: hpm_cam_drv.h:204
static void cam_set_binary_threshold(CAM_Type *ptr, uint8_t threshold)
CAM set binary threshold.
Definition: hpm_cam_drv.h:249
void cam_stop(CAM_Type *ptr)
CAM stop.
Definition: hpm_cam_drv.c:152
cam_input_pixel_byte_order_t
cam input pixel byte order
Definition: hpm_cam_drv.h:104
@ cam_irq_hist_calculation_done
Definition: hpm_cam_drv.h:43
@ cam_irq_start_of_frame
Definition: hpm_cam_drv.h:49
@ cam_irq_hresponse_error
Definition: hpm_cam_drv.h:44
@ cam_irq_unsupported_configuration
Definition: hpm_cam_drv.h:42
@ cam_irq_fb1_dma_transfer_done
Definition: hpm_cam_drv.h:48
@ cam_irq_end_of_frame
Definition: hpm_cam_drv.h:45
@ cam_irq_fb2_dma_transfer_done
Definition: hpm_cam_drv.h:47
@ cam_irq_rx_fifo_overrun
Definition: hpm_cam_drv.h:46
@ cam_status_hist_calculation_done
Definition: hpm_cam_drv.h:57
@ cam_status_rx_fifo_overrun
Definition: hpm_cam_drv.h:58
@ cam_status_fb1_dma_transfer_done
Definition: hpm_cam_drv.h:60
@ cam_status_unsupported_configuration
Definition: hpm_cam_drv.h:56
@ cam_status_hresponse_error
Definition: hpm_cam_drv.h:63
@ cam_status_start_of_frame
Definition: hpm_cam_drv.h:62
@ cam_status_fb2_dma_transfer_done
Definition: hpm_cam_drv.h:59
@ cam_status_end_of_frame
Definition: hpm_cam_drv.h:61
@ cam_input_pixel_gbr888
Definition: hpm_cam_drv.h:117
@ cam_input_pixel_bgr565
Definition: hpm_cam_drv.h:116
@ cam_input_pixel_yvu444
Definition: hpm_cam_drv.h:106
@ cam_input_pixel_uvy444
Definition: hpm_cam_drv.h:109
@ cam_input_pixel_rgb888
Definition: hpm_cam_drv.h:120
@ cam_input_pixel_brg888
Definition: hpm_cam_drv.h:121
@ cam_input_pixel_rgb565
Definition: hpm_cam_drv.h:115
@ cam_input_pixel_vyuy422
Definition: hpm_cam_drv.h:114
@ cam_input_pixel_yvyu422
Definition: hpm_cam_drv.h:112
@ cam_input_pixel_rbg888
Definition: hpm_cam_drv.h:122
@ cam_input_pixel_uyvy422
Definition: hpm_cam_drv.h:113
@ cam_input_pixel_yuv444
Definition: hpm_cam_drv.h:105
@ cam_input_pixel_vyu444
Definition: hpm_cam_drv.h:108
@ cam_input_pixel_vuy444
Definition: hpm_cam_drv.h:110
@ cam_input_pixel_grb888
Definition: hpm_cam_drv.h:118
@ cam_input_pixel_bgr888
Definition: hpm_cam_drv.h:119
@ cam_input_pixel_uyv444
Definition: hpm_cam_drv.h:107
@ cam_input_pixel_yuyv422
Definition: hpm_cam_drv.h:111
uint32_t hpm_stat_t
Definition: hpm_common.h:135
Definition: hpm_cam_regs.h:12
__RW uint32_t INT_EN
Definition: hpm_cam_regs.h:14
__RW uint32_t CLRKEY_HIGH
Definition: hpm_cam_regs.h:33
__RW uint32_t CLRKEY_LOW
Definition: hpm_cam_regs.h:32
__RW uint32_t STA
Definition: hpm_cam_regs.h:18
__RW uint32_t DMASA_FB1
Definition: hpm_cam_regs.h:20
__RW uint32_t CR1
Definition: hpm_cam_regs.h:13
__RW uint32_t CR20
Definition: hpm_cam_regs.h:27
__RW uint32_t CR2
Definition: hpm_cam_regs.h:16
__RW uint32_t DMASA_FB2
Definition: hpm_cam_regs.h:21
CAM config.
Definition: hpm_cam_drv.h:80
uint32_t buffer2
Definition: hpm_cam_drv.h:95
uint8_t color_format
Definition: hpm_cam_drv.h:92
uint16_t data_store_mode
Definition: hpm_cam_drv.h:91
uint32_t width
Definition: hpm_cam_drv.h:81
uint32_t colorkey_high
Definition: hpm_cam_drv.h:98
uint8_t sensor_bitwidth
Definition: hpm_cam_drv.h:93
bool color_ext
Definition: hpm_cam_drv.h:89
bool hsync_active_low
Definition: hpm_cam_drv.h:87
bool vsync_active_low
Definition: hpm_cam_drv.h:88
display_yuv2rgb_config_t csc_config
Definition: hpm_cam_drv.h:96
uint32_t height
Definition: hpm_cam_drv.h:82
uint32_t buffer1
Definition: hpm_cam_drv.h:94
bool data_pack_msb
Definition: hpm_cam_drv.h:90
uint32_t colorkey_low
Definition: hpm_cam_drv.h:97
bool pixclk_sampling_falling
Definition: hpm_cam_drv.h:83
display yuv to rgb format conversion config
Definition: hpm_display_common.h:126