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 #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 } cam_config_t;
98 
102 typedef enum {
103  cam_input_pixel_yuv444 = 0, /* Y[23:16] U[15:8] V[7:0] */
104  cam_input_pixel_yvu444 = 1, /* Y[23:16] V[15:8] U[7:0] */
105  cam_input_pixel_uyv444 = 2, /* U[23:16] Y[15:8] V[7:0] */
106  cam_input_pixel_vyu444 = 3, /* V[23:16] Y[15:8] U[7:0] */
107  cam_input_pixel_uvy444 = 4, /* U[23:16] V[15:8] Y[7:0] */
108  cam_input_pixel_vuy444 = 5, /* V[23:16] U[15:8] Y[7:0] */
109  cam_input_pixel_yuyv422 = 0, /* Y0[31:24] U0[23:16] Y1[15:8] V0[7:0] */
110  cam_input_pixel_yvyu422 = 1, /* Y0[31:24] V0[23:16] Y1[15:8] U0[7:0] */
111  cam_input_pixel_uyvy422 = 2, /* U0[31:24] Y0[23:16] V0[15:8] Y1[7:0] */
112  cam_input_pixel_vyuy422 = 3, /* V0[31:24] Y0[23:16] U0[15:8] Y1[7:0] */
113  cam_input_pixel_rgb565 = 0, /* R[15:11] G[10:8] G[7:5] B[4:0] */
114  cam_input_pixel_bgr565 = 1, /* B[15:11] G[10:8] G[7:5] R[4:0] */
115  cam_input_pixel_gbr888 = 0, /* G[23:16] B[15:8] R[7:0] */
116  cam_input_pixel_grb888 = 1, /* G[23:16] R[15:8] B[7:0] */
117  cam_input_pixel_bgr888 = 2, /* B[23:16] G[15:8] R[7:0] */
118  cam_input_pixel_rgb888 = 3, /* R[23:16] G[15:8] B[7:0] */
119  cam_input_pixel_brg888 = 4, /* B[23:16] R[15:8] G[7:0] */
120  cam_input_pixel_rbg888 = 5, /* R[23:16] B[15:8] G[7:0] */
122 
123 #ifdef __cplusplus
124 extern "C" {
125 #endif
126 
133 static inline uint32_t cam_get_pixel_format(display_pixel_format_t format)
134 {
135  switch (format) {
142  return CAM_COLOR_FORMAT_RAW8;
143  default:
145  }
146 }
147 
155 static inline void cam_set_color_key(CAM_Type *ptr, uint32_t high, uint32_t low)
156 {
159 }
160 
168 void cam_get_default_config(CAM_Type *ptr, cam_config_t *config, display_pixel_format_t pixel_format);
169 
179 
185 void cam_start(CAM_Type *ptr);
186 
194 void cam_stop(CAM_Type *ptr);
195 
202 static inline void cam_update_buffer(CAM_Type *ptr, uint32_t buffer)
203 {
204  ptr->DMASA_FB1 = buffer;
205 }
206 
213 static inline void cam_update_buffer2(CAM_Type *ptr, uint32_t buffer)
214 {
215  ptr->DMASA_FB2 = buffer;
216 }
217 
226 static inline void cam_enable_binary_output(CAM_Type *ptr)
227 {
229 }
230 
236 static inline void cam_disable_binary_output(CAM_Type *ptr)
237 {
238  ptr->CR20 &= ~CAM_CR20_BINARY_EN_MASK;
239 }
240 
247 static inline void cam_set_binary_threshold(CAM_Type *ptr, uint8_t threshold)
248 {
249  ptr->CR20 = (ptr->CR20 & (~CAM_CR20_THRESHOLD_MASK)) | CAM_CR20_THRESHOLD_SET(threshold);
250 }
251 
260 static inline void cam_enable_argb8888_output(CAM_Type *ptr)
261 {
262  ptr->CR1 |= CAM_CR1_COLOR_EXT_MASK;
263 }
264 
270 static inline void cam_disable_argb8888_output(CAM_Type *ptr)
271 {
272  ptr->CR1 &= ~CAM_CR1_COLOR_EXT_MASK;
273 }
274 
282 {
283  ptr->CR2 = (ptr->CR2 & (~CAM_CR2_CLRBITFORMAT_MASK)) | CAM_CR2_CLRBITFORMAT_SET(order);
284 }
285 
292 static inline void cam_enable_irq(CAM_Type *ptr, cam_irq_mask_t irq_mask)
293 {
294  ptr->INT_EN |= irq_mask;
295 }
296 
297 
304 static inline void cam_disable_irq(CAM_Type *ptr, cam_irq_mask_t irq_mask)
305 {
306  ptr->INT_EN &= ~irq_mask;
307 }
308 
317 static inline bool cam_check_status(CAM_Type *ptr, cam_status_mask_t sta_mask)
318 {
319  return ((ptr->STA & sta_mask) != 0U) ? true : false;
320 }
321 
328 static inline void cam_clear_status(CAM_Type *ptr, cam_status_mask_t sta_mask)
329 {
330  ptr->STA = sta_mask;
331 }
332 
340 void cam_stop_safely(CAM_Type *ptr);
341 
347 #ifdef __cplusplus
348 }
349 #endif
350 
351 #endif /* HPM_CAM_DRV_H */
352 
353 
#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:270
hpm_stat_t cam_init(CAM_Type *ptr, cam_config_t *config)
CAM init.
Definition: hpm_cam_drv.c:78
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:281
static void cam_enable_binary_output(CAM_Type *ptr)
CAM enable binary output.
Definition: hpm_cam_drv.h:226
#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:152
static void cam_update_buffer2(CAM_Type *ptr, uint32_t buffer)
CAM update DMASA_FB2 buffer.
Definition: hpm_cam_drv.h:213
static void cam_enable_irq(CAM_Type *ptr, cam_irq_mask_t irq_mask)
CAM enable irq.
Definition: hpm_cam_drv.h:292
static void cam_disable_irq(CAM_Type *ptr, cam_irq_mask_t irq_mask)
CAM disable irq.
Definition: hpm_cam_drv.h:304
#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:328
#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:133
static void cam_disable_binary_output(CAM_Type *ptr)
CAM disable binary output.
Definition: hpm_cam_drv.h:236
void cam_stop_safely(CAM_Type *ptr)
CAM safety stop.
Definition: hpm_cam_drv.c:157
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:317
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:155
#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:260
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:202
static void cam_set_binary_threshold(CAM_Type *ptr, uint8_t threshold)
CAM set binary threshold.
Definition: hpm_cam_drv.h:247
void cam_stop(CAM_Type *ptr)
CAM stop.
Definition: hpm_cam_drv.c:147
cam_input_pixel_byte_order_t
cam input pixel byte order
Definition: hpm_cam_drv.h:102
@ 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:115
@ cam_input_pixel_bgr565
Definition: hpm_cam_drv.h:114
@ cam_input_pixel_yvu444
Definition: hpm_cam_drv.h:104
@ cam_input_pixel_uvy444
Definition: hpm_cam_drv.h:107
@ cam_input_pixel_rgb888
Definition: hpm_cam_drv.h:118
@ cam_input_pixel_brg888
Definition: hpm_cam_drv.h:119
@ cam_input_pixel_rgb565
Definition: hpm_cam_drv.h:113
@ cam_input_pixel_vyuy422
Definition: hpm_cam_drv.h:112
@ cam_input_pixel_yvyu422
Definition: hpm_cam_drv.h:110
@ cam_input_pixel_rbg888
Definition: hpm_cam_drv.h:120
@ cam_input_pixel_uyvy422
Definition: hpm_cam_drv.h:111
@ cam_input_pixel_yuv444
Definition: hpm_cam_drv.h:103
@ cam_input_pixel_vyu444
Definition: hpm_cam_drv.h:106
@ cam_input_pixel_vuy444
Definition: hpm_cam_drv.h:108
@ cam_input_pixel_grb888
Definition: hpm_cam_drv.h:116
@ cam_input_pixel_bgr888
Definition: hpm_cam_drv.h:117
@ cam_input_pixel_uyv444
Definition: hpm_cam_drv.h:105
@ cam_input_pixel_yuyv422
Definition: hpm_cam_drv.h:109
uint32_t hpm_stat_t
Definition: hpm_common.h:126
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
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
bool pixclk_sampling_falling
Definition: hpm_cam_drv.h:83
display yuv to rgb format conversion config
Definition: hpm_display_common.h:126