146 lines
7.5 KiB
ReStructuredText
Raw Permalink Normal View History

2025-10-10 16:07:00 +08:00
UVC常见问题
=================================
:link_to_translation:`en:[English]`
1. 简介
---------------------------------
在使用uvc时有些常见的问题可能会遇到下面提供一些调试方法。
Q调用uvc open的接口后摄像头不枚举没有提示连接成功
A这种问题一般是摄像头没有上电或者供电不足一半建议给USB供5.0v的电压。BK7258控制USB的LDO是通过GPIO28拉高即可使能USB的电源拉低即给USB掉电可以通过宏进行配置
+-------------------------------------+---------------+-------------------------------------+
| marco | value | implication |
+-------------------------------------+---------------+-------------------------------------+
| CONFIG_USB_VBAT_CONTROL_GPIO_ID | 0x1C | USB电压使能控制GPIO号 |
+-------------------------------------+---------------+-------------------------------------+
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: “bk_video_camera_packet_malloc, index:x [x,x,x,x]”,或同步出图异常切屏。
A出现该问题的原因是usb申请packet存储fifo里面的数据但是申请不到。申请不到的原因是所有的packet都被用完了没有空闲态的packet。出现的根本原因有两个
* 一个是消耗解析已经存储fifo数据的packet效率太低了或者被卡住了导致所有的空闲的packet的被消耗完packet池中都是待解析的packet。
参考代码:”./bk_idk/middleware/driver/uvc_camera.c”, 解析函数uvc_camera_process_packet_handler(),需要分析此解析函数是否被卡住了。
* 另一个原因是出现packet泄漏泄漏的原因是uvc_class运行在cpu1上uvc_driver运行在cpu0或者cpu2上那么两者交互就需要通过mailbox
一旦mailbox操作异常就可能出现packet泄漏。参考异常log” [=] bk_usb_mailbox_video_camera_packet_push WAIT TIMEOUT”。
解决方案出现上面的问题可以在申请不到空闲packet时重置packet池中packet的状态。参考如下代码
下面的宏定义了packet池的数量。
+-------------------------------------+---------------+-------------------------------------+
| marco | value | implication |
+-------------------------------------+---------------+-------------------------------------+
| CONFIG_UVC_MAX_PACKET_CNT | 16 | packet的数量取值范围[0, 64] |
+-------------------------------------+---------------+-------------------------------------+
::
//Path bk_idk/middleware/driver/camera/video_common_driver.c
camera_packet_t *bk_video_camera_packet_malloc(void)
{
//申请一包空闲的packet存储uvc fifo数据
...
//当申请不到空闲packet时会覆盖其他状态的packet
if (i == list_cnt)
{
for (i = list_cnt; i > 0; i--)
{
if (camera_packet_list[i - 1]->packet_state == CAM_STREAM_READY)
{
LOGW("%s, index:%d [%d,%d,%d,%d]\r\n", __func__, i - 1,
camera_packet_list[0]->packet_state,
camera_packet_list[1]->packet_state,
camera_packet_list[2]->packet_state,
camera_packet_list[3]->packet_state);
camera_packet_list[i - 1]->packet_state = CAM_STREAM_IDLE;
i--;
break;
}
}
}
...
}
----------
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;
}
----------
QPC端出图正常接到板子上不出图而且log打印“uvc_drv:W(18012):seq:0 ok:39654, error:0, emp:70614, eof_not_ffd9:0, end_not_ffd9:xxxx”;
A上面的log中seq一直为0表示没有出图ok不为0且一直增加表示USB有正常传输数据end_not_ffd9不为0且一直增加表示解析包异常。
出现该问题一般原因为:
- 如果是BULK传输可能是中间有传输空包只含有包头没有有效数据当前SDK默认中间不允许传输空包
修改方式建议修改固件保证不传输空包也可以将宏CONFIG_UVC_CHECK_BULK_JPEG_HEADER关闭
- 如果是ISO传输可能是0xFFD9末尾有多余的填充数据
修改方式将严格检查图像末尾最后两个字节为0xff/0xd9改为检查图像最后1024个或者其他是否包含0xffd9后续SDK会这样修改
检查的长度由宏CONFIG_JPEG_FRAME_CHECK_LENGTH控制默认值为1024可自行修改此值。
注意:如果图像末尾填充数据太多,会导致检查机制花费的时间更多。