HPM SDK
HPMicro Software Development Kit
hpm_cam_drv.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2021 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 
25 #define CAM_DATA_STORE_MODE_NORMAL (0U)
26 #define CAM_DATA_STORE_MODE_Y_UV_PLANES (CAM_CR1_STORAGE_MODE_SET(1))
27 #define CAM_DATA_STORE_MODE_Y_ONLY (CAM_CR1_STORAGE_MODE_SET(2))
28 #define CAM_DATA_STORE_MODE_BINARY (CAM_CR1_STORAGE_MODE_SET(3))
29 
33 #define CAM_SENSOR_BITWIDTH_8BITS (CAM_CR1_SENSOR_BIT_WIDTH_SET(0))
34 #define CAM_SENSOR_BITWIDTH_10BITS (CAM_CR1_SENSOR_BIT_WIDTH_SET(1))
35 #define CAM_SENSOR_BITWIDTH_24BITS (CAM_CR1_SENSOR_BIT_WIDTH_SET(3))
36 
40 typedef enum {
50 
54 typedef enum {
64 
68 #define CAM_COLOR_FORMAT_RGB888 (CAM_CR1_COLOR_FORMATS_SET(2))
69 #define CAM_COLOR_FORMAT_RGB565 (CAM_CR1_COLOR_FORMATS_SET(4))
70 #define CAM_COLOR_FORMAT_RGB555 (CAM_CR1_COLOR_FORMATS_SET(6))
71 #define CAM_COLOR_FORMAT_YCBCR422 (CAM_CR1_COLOR_FORMATS_SET(7))
72 #define CAM_COLOR_FORMAT_YUV444 (CAM_CR1_COLOR_FORMATS_SET(8))
73 #define CAM_COLOR_FORMAT_RAW8 (CAM_CR1_COLOR_FORMATS_SET(0xf))
74 #define CAM_COLOR_FORMAT_UNSUPPORTED (1)
75 
79 typedef struct {
80  uint32_t width;
81  uint32_t height;
83  bool de_active_low; /* de_active_low must is same with hsync_active_low when dvp be used */
86  bool color_ext;
88  uint16_t data_store_mode;
89  uint8_t color_format;
90  uint8_t sensor_bitwidth;
91  uint32_t buffer1;
92  uint32_t buffer2;
94 } cam_config_t;
95 
99 typedef enum {
100  cam_input_pixel_yuv444 = 0, /* Y[23:16] U[15:8] V[7:0] */
101  cam_input_pixel_yvu444 = 1, /* Y[23:16] V[15:8] U[7:0] */
102  cam_input_pixel_uyv444 = 2, /* U[23:16] Y[15:8] V[7:0] */
103  cam_input_pixel_vyu444 = 3, /* V[23:16] Y[15:8] U[7:0] */
104  cam_input_pixel_uvy444 = 4, /* U[23:16] V[15:8] Y[7:0] */
105  cam_input_pixel_vuy444 = 5, /* V[23:16] U[15:8] Y[7:0] */
106  cam_input_pixel_yuyv422 = 0, /* Y0[31:24] U0[23:16] Y1[15:8] V0[7:0] */
107  cam_input_pixel_yvyu422 = 1, /* Y0[31:24] V0[23:16] Y1[15:8] U0[7:0] */
108  cam_input_pixel_uyvy422 = 2, /* U0[31:24] Y0[23:16] V0[15:8] Y1[7:0] */
109  cam_input_pixel_vyuy422 = 3, /* V0[31:24] Y0[23:16] U0[15:8] Y1[7:0] */
110  cam_input_pixel_rgb565 = 0, /* R[15:11] G[10:8] G[7:5] B[4:0] */
111  cam_input_pixel_bgr565 = 1, /* B[15:11] G[10:8] G[7:5] R[4:0] */
112  cam_input_pixel_gbr888 = 0, /* G[23:16] B[15:8] R[7:0] */
113  cam_input_pixel_grb888 = 1, /* G[23:16] R[15:8] B[7:0] */
114  cam_input_pixel_bgr888 = 2, /* B[23:16] G[15:8] R[7:0] */
115  cam_input_pixel_rgb888 = 3, /* R[23:16] G[15:8] B[7:0] */
116  cam_input_pixel_brg888 = 4, /* B[23:16] R[15:8] G[7:0] */
117  cam_input_pixel_rbg888 = 5, /* R[23:16] B[15:8] G[7:0] */
119 
120 #ifdef __cplusplus
121 extern "C" {
122 #endif
123 
130 static inline uint32_t cam_get_pixel_format(display_pixel_format_t format)
131 {
132  switch (format) {
138  return CAM_COLOR_FORMAT_RAW8;
139  default:
141  }
142 }
143 
151 static inline void cam_set_color_key(CAM_Type *ptr, uint32_t high, uint32_t low)
152 {
155 }
156 
164 void cam_get_default_config(CAM_Type *ptr, cam_config_t *config, display_pixel_format_t pixel_format);
165 
175 
181 void cam_start(CAM_Type *ptr);
182 
190 void cam_stop(CAM_Type *ptr);
191 
198 static inline void cam_update_buffer(CAM_Type *ptr, uint32_t buffer)
199 {
200  ptr->DMASA_FB1 = buffer;
201 }
202 
209 static inline void cam_update_buffer2(CAM_Type *ptr, uint32_t buffer)
210 {
211  ptr->DMASA_FB2 = buffer;
212 }
213 
222 static inline void cam_enable_binary_output(CAM_Type *ptr)
223 {
225 }
226 
232 static inline void cam_disable_binary_output(CAM_Type *ptr)
233 {
234  ptr->CR20 &= ~CAM_CR20_BINARY_EN_MASK;
235 }
236 
243 static inline void cam_set_binary_threshold(CAM_Type *ptr, uint8_t threshold)
244 {
245  ptr->CR20 = (ptr->CR20 & (~CAM_CR20_THRESHOLD_MASK)) | CAM_CR20_THRESHOLD_SET(threshold);
246 }
247 
256 static inline void cam_enable_argb8888_output(CAM_Type *ptr)
257 {
258  ptr->CR1 |= CAM_CR1_COLOR_EXT_MASK;
259 }
260 
266 static inline void cam_disable_argb8888_output(CAM_Type *ptr)
267 {
268  ptr->CR1 &= ~CAM_CR1_COLOR_EXT_MASK;
269 }
270 
278 {
279  ptr->CR2 = (ptr->CR2 & (~CAM_CR2_CLRBITFORMAT_MASK)) | CAM_CR2_CLRBITFORMAT_SET(order);
280 }
281 
288 static inline void cam_enable_irq(CAM_Type *ptr, cam_irq_mask_t irq_mask)
289 {
290  ptr->INT_EN |= irq_mask;
291 }
292 
293 
300 static inline void cam_disable_irq(CAM_Type *ptr, cam_irq_mask_t irq_mask)
301 {
302  ptr->INT_EN &= ~irq_mask;
303 }
304 
313 static inline bool cam_check_status(CAM_Type *ptr, cam_status_mask_t sta_mask)
314 {
315  return ((ptr->STA & sta_mask) != 0U) ? true : false;
316 }
317 
324 static inline void cam_clear_status(CAM_Type *ptr, cam_status_mask_t sta_mask)
325 {
326  ptr->STA = sta_mask;
327 }
328 
336 void cam_stop_safely(CAM_Type *ptr);
337 
343 #ifdef __cplusplus
344 }
345 #endif
346 
347 #endif /* HPM_CAM_DRV_H */
348 
349 
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_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:266
hpm_stat_t cam_init(CAM_Type *ptr, cam_config_t *config)
CAM init.
Definition: hpm_cam_drv.c:76
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:277
static void cam_enable_binary_output(CAM_Type *ptr)
CAM enable binary output.
Definition: hpm_cam_drv.h:222
#define CAM_COLOR_FORMAT_RAW8
Definition: hpm_cam_drv.h:73
cam_irq_mask_t
CAM IRQ mask.
Definition: hpm_cam_drv.h:40
void cam_start(CAM_Type *ptr)
CAM start.
Definition: hpm_cam_drv.c:147
static void cam_update_buffer2(CAM_Type *ptr, uint32_t buffer)
CAM update DMASA_FB2 buffer.
Definition: hpm_cam_drv.h:209
static void cam_enable_irq(CAM_Type *ptr, cam_irq_mask_t irq_mask)
CAM enable irq.
Definition: hpm_cam_drv.h:288
static void cam_disable_irq(CAM_Type *ptr, cam_irq_mask_t irq_mask)
CAM disable irq.
Definition: hpm_cam_drv.h:300
#define CAM_COLOR_FORMAT_UNSUPPORTED
Definition: hpm_cam_drv.h:74
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:324
#define CAM_COLOR_FORMAT_RGB565
Definition: hpm_cam_drv.h:69
static uint32_t cam_get_pixel_format(display_pixel_format_t format)
cam get pixel format value
Definition: hpm_cam_drv.h:130
static void cam_disable_binary_output(CAM_Type *ptr)
CAM disable binary output.
Definition: hpm_cam_drv.h:232
void cam_stop_safely(CAM_Type *ptr)
CAM safety stop.
Definition: hpm_cam_drv.c:152
#define CAM_COLOR_FORMAT_YCBCR422
Definition: hpm_cam_drv.h:71
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:313
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:151
static void cam_enable_argb8888_output(CAM_Type *ptr)
CAM enable argb8888 output.
Definition: hpm_cam_drv.h:256
cam_status_mask_t
CAM status mask.
Definition: hpm_cam_drv.h:54
static void cam_update_buffer(CAM_Type *ptr, uint32_t buffer)
CAM update DMASA_FB1 buffer.
Definition: hpm_cam_drv.h:198
static void cam_set_binary_threshold(CAM_Type *ptr, uint8_t threshold)
CAM set binary threshold.
Definition: hpm_cam_drv.h:243
void cam_stop(CAM_Type *ptr)
CAM stop.
Definition: hpm_cam_drv.c:142
cam_input_pixel_byte_order_t
cam input pixel byte order
Definition: hpm_cam_drv.h:99
@ cam_irq_hist_calculation_done
Definition: hpm_cam_drv.h:42
@ cam_irq_start_of_frame
Definition: hpm_cam_drv.h:48
@ cam_irq_hresponse_error
Definition: hpm_cam_drv.h:43
@ cam_irq_unsupported_configuration
Definition: hpm_cam_drv.h:41
@ cam_irq_fb1_dma_transfer_done
Definition: hpm_cam_drv.h:47
@ cam_irq_end_of_frame
Definition: hpm_cam_drv.h:44
@ cam_irq_fb2_dma_transfer_done
Definition: hpm_cam_drv.h:46
@ cam_irq_rx_fifo_overrun
Definition: hpm_cam_drv.h:45
@ cam_status_hist_calculation_done
Definition: hpm_cam_drv.h:56
@ cam_status_rx_fifo_overrun
Definition: hpm_cam_drv.h:57
@ cam_status_fb1_dma_transfer_done
Definition: hpm_cam_drv.h:59
@ cam_status_unsupported_configuration
Definition: hpm_cam_drv.h:55
@ cam_status_hresponse_error
Definition: hpm_cam_drv.h:62
@ cam_status_start_of_frame
Definition: hpm_cam_drv.h:61
@ cam_status_fb2_dma_transfer_done
Definition: hpm_cam_drv.h:58
@ cam_status_end_of_frame
Definition: hpm_cam_drv.h:60
@ cam_input_pixel_gbr888
Definition: hpm_cam_drv.h:112
@ cam_input_pixel_bgr565
Definition: hpm_cam_drv.h:111
@ cam_input_pixel_yvu444
Definition: hpm_cam_drv.h:101
@ cam_input_pixel_uvy444
Definition: hpm_cam_drv.h:104
@ cam_input_pixel_rgb888
Definition: hpm_cam_drv.h:115
@ cam_input_pixel_brg888
Definition: hpm_cam_drv.h:116
@ cam_input_pixel_rgb565
Definition: hpm_cam_drv.h:110
@ cam_input_pixel_vyuy422
Definition: hpm_cam_drv.h:109
@ cam_input_pixel_yvyu422
Definition: hpm_cam_drv.h:107
@ cam_input_pixel_rbg888
Definition: hpm_cam_drv.h:117
@ cam_input_pixel_uyvy422
Definition: hpm_cam_drv.h:108
@ cam_input_pixel_yuv444
Definition: hpm_cam_drv.h:100
@ cam_input_pixel_vyu444
Definition: hpm_cam_drv.h:103
@ cam_input_pixel_vuy444
Definition: hpm_cam_drv.h:105
@ cam_input_pixel_grb888
Definition: hpm_cam_drv.h:113
@ cam_input_pixel_bgr888
Definition: hpm_cam_drv.h:114
@ cam_input_pixel_uyv444
Definition: hpm_cam_drv.h:102
@ cam_input_pixel_yuyv422
Definition: hpm_cam_drv.h:106
uint32_t hpm_stat_t
Definition: hpm_common.h:119
#define CAM_CR20_THRESHOLD_MASK
Definition: hpm_cam_regs.h:625
#define CAM_STA_ERR_CL_BWID_CFG_MASK
Definition: hpm_cam_regs.h:398
#define CAM_INT_EN_FB2_DMA_DONE_INTEN_MASK
Definition: hpm_cam_regs.h:299
#define CAM_INT_EN_SOF_INT_EN_MASK
Definition: hpm_cam_regs.h:324
#define CAM_STA_EOF_INT_MASK
Definition: hpm_cam_regs.h:457
#define CAM_STA_HRESP_ERR_INT_MASK
Definition: hpm_cam_regs.h:482
#define CAM_CLRKEY_LOW_LIMIT_SET(x)
Definition: hpm_cam_regs.h:737
#define CAM_INT_EN_EOF_INT_EN_MASK
Definition: hpm_cam_regs.h:274
#define CAM_STA_DMA_TSF_DONE_FB1_MASK
Definition: hpm_cam_regs.h:445
#define CAM_CR1_COLOR_EXT_MASK
Definition: hpm_cam_regs.h:65
#define CAM_CR2_CLRBITFORMAT_MASK
Definition: hpm_cam_regs.h:387
#define CAM_STA_SOF_INT_MASK
Definition: hpm_cam_regs.h:469
#define CAM_STA_RF_OR_INT_MASK
Definition: hpm_cam_regs.h:421
#define CAM_INT_EN_ERR_CL_BWID_CFG_INT_EN_MASK
Definition: hpm_cam_regs.h:240
#define CAM_STA_DMA_TSF_DONE_FB2_MASK
Definition: hpm_cam_regs.h:433
#define CAM_CLRKEY_HIGH_LIMIT_SET(x)
Definition: hpm_cam_regs.h:748
#define CAM_INT_EN_HIST_DONE_INT_EN_MASK
Definition: hpm_cam_regs.h:250
#define CAM_INT_EN_RF_OR_INTEN_MASK
Definition: hpm_cam_regs.h:286
#define CAM_CR20_THRESHOLD_SET(x)
Definition: hpm_cam_regs.h:627
#define CAM_INT_EN_HRESP_ERR_EN_MASK
Definition: hpm_cam_regs.h:262
#define CAM_CR2_CLRBITFORMAT_SET(x)
Definition: hpm_cam_regs.h:389
#define CAM_STA_HIST_DONE_MASK
Definition: hpm_cam_regs.h:408
#define CAM_INT_EN_FB1_DMA_DONE_INTEN_MASK
Definition: hpm_cam_regs.h:312
#define CAM_CR20_BINARY_EN_MASK
Definition: hpm_cam_regs.h:595
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:34
__RW uint32_t CLRKEY_LOW
Definition: hpm_cam_regs.h:33
__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:28
__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:79
uint32_t buffer2
Definition: hpm_cam_drv.h:92
uint8_t color_format
Definition: hpm_cam_drv.h:89
uint16_t data_store_mode
Definition: hpm_cam_drv.h:88
uint32_t width
Definition: hpm_cam_drv.h:80
uint8_t sensor_bitwidth
Definition: hpm_cam_drv.h:90
bool color_ext
Definition: hpm_cam_drv.h:86
bool hsync_active_low
Definition: hpm_cam_drv.h:84
bool vsync_active_low
Definition: hpm_cam_drv.h:85
display_yuv2rgb_config_t csc_config
Definition: hpm_cam_drv.h:93
uint32_t height
Definition: hpm_cam_drv.h:81
uint32_t buffer1
Definition: hpm_cam_drv.h:91
bool data_pack_msb
Definition: hpm_cam_drv.h:87
bool de_active_low
Definition: hpm_cam_drv.h:83
bool pixclk_sampling_falling
Definition: hpm_cam_drv.h:82
display yuv to rgb format conversion config
Definition: hpm_display_common.h:126