DVP
概述
本节主要说明USB如何在当前CPU上进行适配
支持的功能
1、支持最大支持3个UVC同时输出;
2、支持双码流,即单个摄像头同时输出两种类型的码流;
3、默认支持最大8个分辨率,如摄像头支持更多分辨率,需要软件作相应改动
用户需要根据自己的应用方案,通过配置参数的方式,打开对应的功能
代码流程
Figure 1. uvc process flow chart
备注
此方案中,所有的大内存使用的是PSRAM,无PSRAM方案请参考BK7257。
相关宏定义
Marco name
info
CONFIG_USB
enable usb or not
CONFIG_USB_HOST
enable usb host or not
CONFIG_USB_HUB_MULTIPLE_DEVICES
config usb hub support multiple device
CONFIG_USBHOST_HUB_MAX_EHPORTS
config support max ep, default 4
CONFIG_USBHOST_HUB_PORT_SUPPORT_MAX_DEVICE
config support max devices, default 5
CONFIG_USBHOST_HUB_PORT_1_VBAT_CONTROL_GPIO_ID
gpio control hub power, default 0
CONFIG_USBH_MSC
enable usb hub MSC or not
CONFIG_USBH_UVC
enable usb hub uvc or not
CONFIG_USBH_UAC
enable usb hub uvc or not
CONFIG_USB_CAMERA
enable usb camera or not
CONFIG_USB_VBAT_CONTROL_GPIO_ID
gpio control hub power, default 0x1C
CONFIG_USB_DMA_ENABLE
enable usb dma copy data or not
常见问题
在使用uvc时,有些常见的问题,可能会遇到,下面提供一些调试方法。
Q:调用uvc open的接口后,摄像头不枚举(没有提示连接成功)
A:这种问题一般是摄像头没有上电,或者供电不足,一半建议给USB供5.0v的电压。BK7258控制USB的LDO是通过GPIO28,拉高即可使能USB的电源,拉低即给USB掉电,可以通过宏进行配置:
marco
value
implication
CONFIG_USB_VBAT_CONTROL_GPIO_ID
0x1C
gpio control hub power, default 0x1C
Q:枚举成功,但是不出图
A:这种问题一般需要检查参数是否配置错误,比如此摄像头不支持你配置的分辨率,这就需要你重新配置。 当分辨率配置错误时,会打印如下log: “uvc_camera_set_param, not support this format or resolution, please check!”。 如果不是,则需要抓包分析,UVC数据包是否正常。包含包头+有效数据,且有效数据为正常值。
Q:帧率低于预期
A:所谓的预期是相对于PC而言,比如配置30fps,实际出来只有一半,或者低了很多,插到电脑上分析一下, 是不是帧率也同样低,这样可以排除摄像头本身的影响。若不是摄像头本身的问题,则考虑是不是SDK的问题。 这个需要拉逻分分析,或者用协议分析仪抓包分析。
Q:图像出现切屏异常,图像不完整
A:这种情况一般需要检查传输方式ISO/BULK是否有配置错误,然后检查上层解包逻辑是否有误。
Q:图像出现不正常的光晕和畸变
A:这个一般考虑摄像头本身的问题,插到PC上分析是否有同样的问题。
Q:出现异常log: “uvc_camera_urb_malloc failed”,或同步出图异常切屏。
A:出现该问题的原因是,usb申请urb存储fifo里面的数据,但是申请不到。申请不到的原因是,所有的usb都被用完了,没有空闲态的urb。出现的根本原因有两个:
- 一个是消耗(解析)已经存储fifo数据的urb效率太低了,或者被卡住了,导致所有的空闲的urb的被消耗完,urb池中都是待解析的urb。
参考代码:“./ap/bk_uvc/bk_uvc.c”, 是由任务“uvc_pro_task”进行解析,需要分析时是否被卡住了,或者说效率太低了。
另一个原因是urb的数量真不够了,比如使用双摄时,urb的个数建议是默认值4的至少两倍。
下面的宏定义了urb的数量。
marco
value
implication
CONFIG_UVC_URB_NUM
4
receive usb data urb number
CONFIG_UVC_NUM_PACKET_PER_URB
8
an urb include packets
Q:使用UVC进行H264 pipeline编码时,打印“h264_encode_finish_handle 26430-65536, error:1”。
A:打印该log的原因有两个:
一个是当第一个数字(26430)大于第二个数字(65536)时,说明此时I帧的长度大于frame_buffer的长度(第二个数字);
修改方式:将宏CONFIG_H264_FRAME_SIZE配置成一个更大的值;
另一个是“error:”的值为1,表示出来的JPEG图像解码长度不对,说明JPEG图像有填充位,为了防止图像异常,解码器内部做了严格的图像长度检查;
修改方式:建议修改摄像头固件,保证UVC输出的JPEG图像没有填充位,这种类型的填充位一般在末尾且为0xFF或0x00; 另一种方法是降低解码器内部的图像长度检查机制,不建议这么做,这样有可能会有JPEG异常图像造成显示花屏,参考如下修改。
//Path : bk_idk/middleware/driver/jpeg_dec_driver.c
bool jpeg_dec_comp_status(uint8_t *src, uint32_t src_size, uint32_t dec_size)
{
...
if (max > 0 && strip + dec_size == src_size - JPEG_TAIL_SIZE)
{
ok = true;
}
else if (max > 0 && src_size - dec_size == 3 && src[src_size - 3] == 0x00)
{
ok = true;
}
else
{
LOGD("decoder_error, %u, %u, %u, %u\n", src_size, dec_size, strip, max);
}
return ok;
}
Q:PC端出图正常,接到板子上不出图,而且log打印“uvc_id1:0[348 85KB], uvc_id2: 0[0 0KB], uvc_id3:0[0 0KB], packets:[all:95832, err:0]”;
A:log的格式解析如下:uvc port id:当前帧率[当前帧号 当前图片大小];此时请检查错误log,是否有打开失败的对应log。