156 lines
7.4 KiB
ReStructuredText
Raw Normal View History

2025-10-10 16:07:00 +08:00
DVP
=================================
:link_to_translation:`en:[English]`
1. 简介
---------------------------------
本工程是DVP默认调试工程可以用来测试插入的DVP工作是否正常默认使用16M PSRAM。
1.1 规格
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
请参考 `规格 <../../media/doorviewer/index.html#id2>`_
1.2 路径
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
<bk_avdk源代码路径>/projects/peripheral/dvp
2. 框架图
---------------------------------
请参考 `框架图 <../../media/doorviewer/index.html#id4>`_
3. 配置
---------------------------------
3.1 蓝牙与多媒体内存复用
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
使用此工程只是单纯验证dvp故内存不需要与蓝牙共用。
+-------------------------------------+---------------+-------------------------------------+
| marco | value | implication |
+-------------------------------------+---------------+-------------------------------------+
| CONFIG_BT_REUSE_MEDIA_MEMORY | N | 多媒体和蓝牙共用一块sram分时复用|
+-------------------------------------+---------------+-------------------------------------+
3.1.1 卸载蓝牙
.................................
::
#ifdef CONFIG_BT_REUSE_MEDIA_MEMORY
#if CONFIG_BLUETOOTH
bk_bluetooth_deinit();
#endif
#endif
3.1.2 初始化蓝牙
.................................
::
bk_bluetooth_init();
3.2 区别
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
dvp与doorviewer的区别在于
* dvp默认上电启动dvp并通过软件解码器分析输出的JPEG图像原始数据格式YUV422/YUV420和输出分辨率。其他外设不参与不支持图传LCD显示语音传输等。
* doorviewer是一个完整的门锁方案。
4. 演示说明
---------------------------------
默认上电自启动不需要额外操作会打印如下log。
::
(7598):##MJPEG:camera_type:1(1:dvp 2:uvc) frame_id:178, length:26163, frame_addr:0x6011f7a0
video_co:I(7598):4:2:2, YUV:
(7598):##DECODE:pixel_x:640, pixel_y:480
(7600):rotate_angle:0(0:0 1:90 2:180 3:270)
(7600):byte_order:0(0:little endian 1:big endian)
(7600):out_fmt:YUYV
5. 代码讲解
---------------------------------
请参考 `代码讲解 <../../media/doorviewer/index.html#id13>`_
6. 新增适配
---------------------------------
当适配一个新的摄像头,调试步骤如下:
步骤一:参考其他外设的配置方式:”./components/bk_peripheral/src/dvp/dvp_gc2145.c”添加新的dvp_xx.c文件添加到相应的文件夹下
并将新增的外设添加到”dvp_sensor_devices.c”中修改: ”./components/bk_peripheral“目录下的CMakeList.txt文件将新增的dvp_xx.c文件加入到编译中。
步骤二在dvp_xx.c中明确I2C读写地址明确使用的硬件I2C IDBK7258默认使用的是I2C1对应的GPIO为GPIO0和GPIO1。DVP使用的I2C ID通过宏配置。
+------------------------------+---------------+-------------------------------------+
| marco | value | implication |
+------------------------------+---------------+-------------------------------------+
| CONFIG_DVP_CAMERA_I2C_ID | 1 | 使用的I2C序号 |
+------------------------------+---------------+-------------------------------------+
步骤三在dvp_xx.c中明确摄像头的CHIP_ID。
步骤四在dvp_xx.c中明确结构体“dvp_sensor_config_t”的成员。注意所配置的参数需要与摄像头的配置一致比如CLK=MCLK_24表明sensor的输入时钟为24MHz
而不是其他值否则与预期的帧率不一致比如fmt = PIXEL_FMT_YUYV表明sensor出图的格式是YUYV而不是其他类型否则主控无法识别导致无法出图或者出图延时异常比如vsync = SYNC_HIGH_LEVEL表示sensor的有效信号是在vsync高时有效而不是低有效否则会导致主控采样异常无法出图。其他成员变量类似需要严格对应。
步骤五在dvp_xx.c中配置好对应的初始化表分辨率子表帧率子表等。
步骤六明确DVP硬件电源的控制GPIOBK7258控制DVP的LDO也是通过GPIO28拉高即可使能DVP的IOVDD拉低即给DVP掉电可以通过宏进行配置
+--------------------------------------+---------------+-------------------------------------+
| marco | value | implication |
+--------------------------------------+---------------+-------------------------------------+
| CONFIG_CAMERA_CTRL_POWER_GPIO_ID | 0x1C | 使用此GPIO控制电源 |
+--------------------------------------+---------------+-------------------------------------+
DVP还需要给DVDD供电不同的摄像头DVDD也是不一样的。
步骤七:当前支持的功能配置较少,比如支持帧率的配置,如果需要额外支持曝光调节/图像翻转/图像黑夜模式等需要增加上面结构体的成员并给对应的成员赋对应的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摄像头支持的分辨率表需要配置对应的寄存器来实现