DVP

[English]

概述

本节主要说明USB如何在当前CPU上进行适配

支持的功能

1、支持最大支持3个UVC同时输出;

2、支持双码流,即单个摄像头同时输出两种类型的码流;

3、默认支持最大8个分辨率,如摄像头支持更多分辨率,需要软件作相应改动

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

代码流程

flow chart Overview

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。