现在模仿webcam (drivers/usb/gadget/webcam.c )
在 Android usb (drivers/usb/gadget/Android.c)上 实现了一个UVC Camera驱动(添加到usb composite设备数组里)
USB连上PC后,在PC端可以被识别为uvc camera设备。
USB视频输出的应用程序,主要参照
http://git.ideasonboard.org/uvc-gadget.git/commit/9fbc003442056cdf59b87e94c1d0e3814575d4b3
并做了一些修改
【实现思路】
传输数据的基本流程是这样的
开始数据传输时
1.向驱动申请了4个帧缓冲(VIDIOC_REQBUFS)
2.获取帧缓冲信息(VIDIOC_QUERYBUF),并将申请到的帧缓冲映射到用户空间
3.填充4帧数据后,将4个帧缓冲入驱动队列(VIDIOC_QBUF)
4.select监听并等待设备文件的“可写”状态
5.设备文件“可写”时,出队列取得一帧缓冲(VIDIOC_DQBUF)
6.向帧缓冲填充一帧数据
7.将帧缓冲重新入队列(VIDIOC_QBUF)
重复 5 - 7步 实现连续的数据传输
目前已经可以实现,将摄像头实时采集的连续图像数据,经过USB在PC端显示出来。(MJPEG)
PC端使用软件是AMCap
【目前问题】
现在当每帧的数据量保持在500多KB以上时,视频可以连续传输,这没有问题。
但是如果每帧数据量低于500多KB时,可能传输了十几帧,几十帧后,就停止了。
跟踪代码后,发现是在 select这边超时了。既select不返回“可写”状态
这个问题查了很久,一直不明白是哪里的原因。
新手刚接触USB这块,烦请各位高手们赐教!~
4 个解决方案
#1
[select超时,获取错误码试试?,
select超时,errno 是22 (Invalid argument)
, usb使用的是 同步传输 模式,出现select 超时现象时,内核输出log “There are no more ISOC requests”, LZ ,请问你用的是什么板子,我也在做这个]
select超时,errno 是22 (Invalid argument)
, usb使用的是 同步传输 模式,出现select 超时现象时,内核输出log “There are no more ISOC requests”, LZ ,请问你用的是什么板子,我也在做这个]
#1
[select超时,获取错误码试试?,
select超时,errno 是22 (Invalid argument)
, usb使用的是 同步传输 模式,出现select 超时现象时,内核输出log “There are no more ISOC requests”, LZ ,请问你用的是什么板子,我也在做这个]
select超时,errno 是22 (Invalid argument)
, usb使用的是 同步传输 模式,出现select 超时现象时,内核输出log “There are no more ISOC requests”, LZ ,请问你用的是什么板子,我也在做这个]