UVC常见问题

[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:使用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
    {
        //可以将这条log打开,分析具体问题
        LOGD("decoder_error, %u, %u, %u, %u\n", src_size, dec_size, strip, max);
    }
    return ok;
}

Q:PC端出图正常,接到板子上不出图,而且log打印“cpu1:uvc_stre:W(8614):uvc_id0:30[227 28KB], uvc_id1: 0[0 0KB], uvc_id2:0[0 0KB], packets:[all:62568, err:0]”;

A:上面的log中uvc_id后面的值一直为0表示没有出图,err后面不为0,表示usb有数据错误。 出现该问题一般原因为:

  • 请检查usb连接的稳定性

  • 请检查打开uvc使用的分辨率当前摄像头是否支持

  • 请检查使用的port号是否匹配,当前USB最多支持3个port,对应的port范围为:[1, 3],使能uvc时确保结构体:media_device_t->port的准确性。