开发板连接了一个USB camera,想通过UVC gadget将摄像头输出到PC上。
内核关于gadget的测试说明 gadget-testing.txt 中提到:
# uvc-gadget -u /dev/video<uvc video node #> -v /dev/video<vivid video node #>
where uvc-gadget is this program: http://git.ideasonboard.org/uvc-gadget.git
with these patches: http://www.spinics.net/lists/linux-usb/msg99220.html
这里有一份整理好的测试代码,可以将开发板上的camera通过USB OTG连接到PC,在PC端显示摄像头图像:
https://github.com/wlhe/uvc-gadget.git
需要注意的是,代码中默认只支持360p和720p的分辨率大小,如果摄像头的分辨率不一样,需要修改代码中中支持的分辨率,另外,还需要在修改驱动webcam.c中添加新的分辨率,如我的摄像头分辨率是640x480,这里说明内核中分辨率的添加方法:
1.添加新的描述符:
static const struct UVC_FRAME_UNCOMPRESSED(1) uvc_frame_yuv_640x480 = {
.bLength = UVC_DT_FRAME_UNCOMPRESSED_SIZE(1),
.bDescriptorType = USB_DT_CS_INTERFACE,
.bDescriptorSubType = UVC_VS_FRAME_UNCOMPRESSED,
.bFrameIndex = 2,
.bmCapabilities = 0,
.wWidth = cpu_to_le16(640),
.wHeight = cpu_to_le16(480),
.dwMinBitRate = cpu_to_le32(147456000),
.dwMaxBitRate = cpu_to_le32(147456000),
.dwMaxVideoFrameBufferSize = cpu_to_le32(614400),
.dwDefaultFrameInterval = cpu_to_le32(333333),
.bFrameIntervalType = 1,
.dwFrameInterval[0] = cpu_to_le32(333333),
};
其中dwMaxBitRate=dwMinBitRate= wWidth*wHeight*2*FrameRate,dwDefaultFrameInterval=333333,表示间隔为33.3333ms,即FrameRate=30。另外注意bFrameIndex的设定,一定要按顺序来设定。同时uvc_format_yuv的bNumFrameDescriptors也要相应更改
2. 在uvc_fs_streaming_cls ,uvc_hs_streaming_cls,uvc_ss_streaming_cls中添加新的描述
3.安装 g_webcam.ko 驱动,先运行./uvc-gadget -u /dev/video1 -v /dev/video0 -f 0 -r 0 ,再连接usb到pc, 打开camera应用即可看到图像。
补充:
内核驱动里面默认支持360p帧率为30f,720p帧率为2f,720p的帧率过低导致win10的camera应用一直不显示720p的分辨率选项,将帧率调整为15就可以了