DVP

[English]

概述

本节主要说明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数据接收错误检测

用户需要根据自己的应用方案,通过配置参数的方式,打开对应的功能

代码流程

flow chart Overview

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提供的配置,只保证出图正常。