DVP
概述
本节主要说明DVP的使用和适配方法,以及相关的宏定义。
支持的功能
1、支持最大分辨率1280X720输入(输出);
2、只支持Sensor输出标准YUV422数据格式(大端模式):YUYV/UYVY/YYUV/UVYY;
3、默认VSYNC/HSYNC输入高有效,且支持翻转
4、支持直接输出YUV422数据到BUFF;
5、支持直接输出JPEG编码数据,或YUV422&JPEG数据分别到BUFF;
6、支持直接输出H264编码数据,或YUV422&H264数据分别到BUFF;
7、支持动态调节编码码率(JPEG或H264);
8、支持H264编码任意时刻重新生成IDR帧
9、支持Sensor数据接收错误检测
用户需要根据自己的应用方案,通过配置参数的方式,打开对应的功能
代码流程
Figure 1. dvp process flow chart
备注
此方案中,所有的大内存使用的是PSRAM。
相关宏定义
Marco name
info
CONFIG_DVP_CAMERA
enable dvp sensor function or not
CONFIG_DVP_CAMERA_I2C_ID
config dvp sensor communicate i2c id
CONFIG_DVP_POWER_GPIO_CTRL
enable gpio control dvp vdd or not
CONFIG_DVP_CTRL_POWER_GPIO_ID
config the gpio id of control dvp vdd
CONFIG_ENCODE_BUF_NOT_FREE
in order to avoid mem fragmentation, enable or not free the mem use to hw
CONFIG_JPEG_FRAME_SIZE
config a jpeg frame size
CONFIG_H264_FRAME_SIZE
config a h264 frame size
适配新摄像头
适配新DVP摄像头,需要在外设文件中添加对应DVP的驱动文件,主要包含I2C配置sensor寄存器的配置表,不同的分辨率配置不同的表。具体sensor的结构如下:
//dvp摄像头结构体
typedef struct
{
char *name; /**< sensor name */
media_ppi_t def_ppi; /**< sensor default resolution */
frame_fps_t def_fps; /**< sensor default fps */
mclk_freq_t clk; /**< sensor work clk in config fps and ppi */
pixel_format_t fmt; /**< sensor output data format */
sync_level_t vsync; /**< sensor vsync active level */
sync_level_t hsync; /**< sensor hsync active level */
uint16_t id; /**< sensor type, sensor_id_t */
uint16_t address; /**< sensor write register address by i2c */
uint16_t fps_cap; /**< sensor support fps */
uint16_t ppi_cap; /**< sensor support resoultions */
bool (*detect)(void); /**< auto detect used dvp sensor */
int (*init)(void); /**< init dvp sensor */
int (*set_ppi)(media_ppi_t ppi); /**< set resolution of sensor */
int (*set_fps)(frame_fps_t fps); /**< set fps of sensor */
int (*power_down)(void); /**< power down or reset of sensor */
int (*dump_register)(media_ppi_t ppi); /**< dump sensor register */
void (*read_register)(bool enable); /**< read sensor register when write*/
} dvp_sensor_config_t;
- 一些参数的说明:
clk:摄像头输入的时钟,默认使用24MHz,需要根据摄像头规格书自行配置;
fmt:摄像头输出数据给芯片的格式,当前只支持YUV420,顺序需要根据摄像头输出顺序同步,默认YUYV;
vsync:摄像头输出vsync有效电平,有些摄像头vsync为低时,输出有效数据,需要与摄像头vsync输出电平同步,默认高电平有效;
hsync:摄像头输出vsync有效电平,有些摄像头vsync为低时,输出有效数据,需要与摄像头hsync输出电平同步,默认高电平有效;
address:配置摄像头寄存器的I2C slave地址,参需要根据摄像头规格书自行配置;
fps_cap:摄像头支持的帧率表,需要配置对应的寄存器来实现;
ppi_cap:摄像头支持的分辨率表,需要配置对应的寄存器来实现;
常见问题
本节主要描述调试和使用DVP摄像头过程中常遇到的问题和解决方案。
Q:识别不到摄像头
A:如果不能识别表明,表明新适配的sensor,dvp_xxx.c中参数配置有错,最根本的是I2C读写地址,新sensor的CHIP_ID。 如果连gc2145都不能识别,则检查sensor电源DVDD,IOVDD是否符合协议要求,硬件上控电的GPIO是否也是GPIO28,I2C也是对应的GPIO0和GPIO1。 另外还有注意接触问题,也可能因为物理上连接不够紧密,导致不能正常工作。
Q:出图异常,且打印:”sensor’s yuyv data resoltion is not right”。
A:表示主控采集的dvp数据与配置的分辨率不一致,可以通过逻辑分析仪,抓取的vsync/hsync/pclk的信号, 必须遵守以下条件:如果配置给主控的分辨率为640X480,那么一个vsync内部必须包含480个hsync个脉冲,一个hsync内部必须包含640*2=1280个pclk脉冲。 如果不符合,那么必然出图异常。 可能因为物理上接触不良,导致这个问题,需要重新拔插安装。 可能因为线序与BK7258默认不一致,导致数据采集异常。 可能因为pclk受板子的电磁干扰导致主控采样不准确,可以在plk上接一个上拉滤波电容8-22pf。
Q:出图异常,且打印:”sensor fifo is full”。
A:表示主控接收dvp数据太慢了,导致sensor fifo溢出,解决方案可以尝试: 降低帧率/降低分辨率/增大YUV_BUF硬件模块时钟(当前默认JPEG:120MHz,YUV_BUF:120MHz,H264:120MHz)。
Q:出图异常,且打印:”jpeg code rate is slow than sensor’s data rate”。
A:表示编码速度太慢,解决方案可以尝试:降低帧率/降低分辨率/增大编码硬件模块时钟(当前默认JPEG:120MHz H264:120MHz)。
Q:出图异常,且打印:”h264 encode erro”。
A:表示h264编码错误,可能出现的原因是sensor的帧间隙时间太低了,导致主控异常; 也可能是新一帧h264编码开始之前,上一帧还未编码完成。这种情况,软件代码已经cover了,直接复位相关的硬件模块。
Q:开关后I2C异常,摄像头无法正常通信。
A:出现这种情况一般是,其他外设与DVP共用一组I2C,该I2C被其他外设切过去使用; 建议使用软件I2C,防止出现复用后,不能工作的问题,打开软件I2C功能宏控:
marco
value
implication
CONFIG_SIM_I2C
Y
enable gpio simulate I2C function
Q:配置成h264/JPEG编码模式,出现异常打印:”··· size no match···”.
A:一般情况是dma搬运的数据长度与实际编码长度不一致,这样会在软件上默认丢弃这样的错帧,防止出现花屏等问题,并且将对应的模块重置。
Q:出图时视角不在正中间。
A:这样的问题是因为配置dvp的参数(寄存器)导致的,建议找sensor原厂的工程师重新配置,目前SDK提供的配置,只保证出图正常。