all things learned from UVC -- 1
关于UVC协议的QA,欢迎扩充,添加comments。
1.1, usb 协议概述:
http://99tiantian.blog.163.com/blog/static/220056512011101710514812/
http://99tiantian.blog.163.com/blog/static/220056512011101511265343/
2.2, usb和endpoint关系。
端点(Endpoint):是 USB 设备中的可以进行数据收发的最小单元,支持单向或者双向的数据传输。设备支持端点的数量是有限制的,除默认端点外低速设备最多支持 2 组端点(2 个输入,2 个输出),高速和全速设备最多支持 15 组端点。
总起来说就是一个设备(device)会拥有一个或者多个endpoint,
endpoint 0: 所有的USB 设备必须具有端点0,它可以作为in 端点,也可以作为out 端点,USB 系统软件利用它来实现缺省的控制管道,从而控制设备。设备插入windows后,系统用来查询设备信息。
3.3, Endpoint的类型:
USB endpoint 有四种类型,也就分别对应了四种不同的数据传输方式。它们是控制传输(Control Transfers),中断传输(Interrupt Data Transfers),批量传输(Bulk DataTransfers),等时传输(Isochronous Data Transfers)。控制传输用来控制对USB 设备不同部分的访问,通常用于配置设备,获取设备信息,发送命令到设备,或者获取设备的状态报告。总之就是用来传送控制信息的,每个USB设备都会有一个endpoint 0 的控制端点,内核里的USB core 使用它在设备插入时进行设备的配置
http://99tiantian.blog.163.com/blog/static/220056512011101425224749/
4.4, 如何拿到工作(我们需要的)的endpoint
正在研究中:是固定的address,还是启动是获取?
2012-6-25 update :现在看来,可以在init的时候,通过libusb 获取,根据类型,大小参数区分,是否是自己需要的EP。
5.5, 如何与usb设备进行通信
用usblib库, 简单用例:
http://libusb.sourceforge.net/api-1.0/index.html
6.6, 是否有windows自带api与usb设备通讯?
WinUSB library. Do some work like libusb, but provided by MS.
7.7, 我们需要和usb直接打交道吗?换句话说,我们需要在WinUSB 或者 libuse上面封装,发送数据,控制我们的camera?
暂时看来,不需要,因为UVC是在USB协议上层的子协议(是否可以这么理解?)而我们有这样的库,帮我们做UVC的事情。
2012-6-25 update:说法没有错误,只是现在看来,不够。
8.8, 接问题7,那是神马东东?
DirectShow
优势:有demo, 封装好。
劣势:跨平台?(有多少项目能真正做到这点?)
More info: http://msdn.microsoft.com/en-us/library/windows/hardware/ff568658(v=vs.85).aspx
2012-6-25 update:DirectShow不够,痛苦的摸索后,最后还是转到libusb上。
9.9, 与usb设备进行通讯时,同步传输? 可否异步,多线程?
DirectShow 关心。(不确定)
2012-6-25 update: Direct Show不够,direct show 排除,问题无意义。
1010, 提供一个最简单的demo,譬如从摄像头里拿参数信息。
2 2012-6-25 update: future。
all things learned from UVC -- libusb & libusbk
2012-06-26 15:41:27| 分类: UVC|字号 订阅
Libusb and libusbK 的关系?
Libusbk是libusb的超集。同时支持libusb, winusb, libusbk三种驱动模式。
环境搭建?
在 http://sourceforge.net/projects/libusbk 上可以拿到最新的 libusbk 库, setup.exe 会装好运行环境,driver installer creator Wizard 等工具。
如何使用?
用 “driver installer creator Wizard” 更新自己的driver,如果是UVC设备,就要把自带的usbvideo驱动换成 libusbk的驱动。更新成功后,device manager 里会有libusbk的一栏。
Sample?
C:\libusbK-dev-kit\examples 里有自带的各种sample, 默认是vs2008的工程,如没有2008环境,自己可以改project文件。 Sample写的都很舒服, 一般只需要更把EXAMPLE_VID,EXAMPLE_VID的值改成自己设备的, 把EXAMPLES_USE_BENCHMARK_CONFIGURE 设为0 就OK。 体验体验吧,从设备里拿到第一个字节的冲动。:)
如何验证?
简单的验证,可以用usblyzer抓包工具 和你的sample结果进行对比,看是否一致。 Usblyzer一次抓包buffer是有限制的(默认16k?),自己摸索的改成最大。
为何选择libusbk?
因为硬件设计,每个isopackage 的头都标示frame的信息(非标准视频文件头),而我又需要这些信息,libusb不满足,详情见我的request:
http://libusb.6.n5.nabble.com/how-to-get-the-size-of-each-packet-td5663684.html
有什么不足?
曾经见一位仁兄抱怨,是不是他是第一个用这个库的人。。现在用下来,有时候也真有同感,不过好在库的开发者都很好,support都很nice。几轮回合下来(http://libusb.6.n5.nabble.com/template/NamlServlet.jtp?macro=user_nodes&user=334628),看着最新的release note里,好几个 reported by peter, 有那么点成就感(IT行业摸爬5年,终于为开源做点贡献),也有担心—蓝屏的问题还没有solution。将来。。。
如何编译
在 http://sourceforge.net/projects/libusbk 下到最新的source, 在\src\lib下面有libusbK_lib.vcproj,修改Version="8.00", 然后build,应该会报告两个错, error code找不到,可以google标准的windows error code,直接用数字代替。重新编译,就能得到静态库了。