USB gadget UVC 笔记(待续)

建议先看下下面链接里面的八,九章,
http://www.voidcn.com/article/p-kugfmlzy-bbs.html
1.应用代码
https://github.com/wlhe/uvc-gadget
gadget-testing.txt 提到的命令用法为:# uvc-gadget -u /dev/video<uvc video node #> -v /dev/video<vivid video node #>,其中
u后面的video节点为 out数据流 udev ubuf
v后面的video节点为 capture数据流 vdev vbuf
所以,难怪uvc gadget驱动中一直没有找到sensor的信息(异步注册啊等等,相对于普通的v4l2驱动,因为驱动里面看到了register video,也可以看到v4l2,一开始的疑惑是,难道是传统v4l2视频驱动的另一种实现?看完应用代码后,再想想,猜测,只是用了V4l2里面的部分功能,如queue管理,video方法等,并不是取代传统的v4l2驱动,要跑uvc gadget需要uvc驱动 + 传统的V4L2驱动)
也可查看应用工程自带的README描述,输入参数中 -u 为UVC Video Output device; -v 为 V4L2 Video Capture device
应用代码流程为:
打开vdev,udev;
设置参数,图像宽高,buffer数目(默认为2),speed等;
为vdev申请buffer,uvc的buffer申请在event中;
udev event init;
出图的数据流为
vdev设备操作,
a.reqbufs ,通过VIDIOC_REQBUFS调用ioctl(两种方式mmap,userptr)
mmap方式,VIDIOC_QUERYBUF(把VIDIOC_REQBUFS中分配的数据缓存转换成物理地址);
userptr方式,不需要映射;
b. 在UVC_EVENT_STREAMON中响应VIDIOC_STREAMON,
如果buffer为mmap方式,先将申请的buf,入队列(通过VIDIOC_QBUF);
调用ioctl,参数为VIDIOC_STREAMON,打开vdev视频流;
FD_ISSET检查vdev是否有数据可读,若可读则,(v4l2_process_data);
VIDIOC_DQBUF,将数据ready的buffer出队列,取出数据;
VIDIOC_QBUF,将buffer入队,为后续的取数据做准备;
和传统的v4l2出图类似,只不过得到的vbuf数据地址和指针,直接传递给udev中的ubuf。
a. udev
响应event(udev最重要的部分)
在vdev获取得到数据信息后,
VIDIOC_DQBUF,将一个buffer出队列;
填充vdev数据ready的buffer信息填充,
VIDIOC_QBUF,将buffer入队,给usb发送;
vdev和udev都有队列成员的出和入,出队列的数据有效还是入队列的数据有效取决于driver的行为,因为driver可以捕获出入队列的动作,上面的描述中对于vdev,出队列的buffer数据为有效的图像数据,待udev取走;对于udev,入队列的buffer数据为有效数据,待usb发送出去。
2.上面的过程中,UVC比较重要的部分应该是event处理,app中主要有如下操作
a.通过VIDIOC_SUBSCRIBE_EVENT,注册setup, data, streamon, streamoff事件
b.事件响应,比较复杂,后续待完善

3.UVC协议
https://blog.csdn.net/qq_37554547/article/details/105687342

  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值