公司领导策划做一个带后拉线的高清摄像头的行车记录仪,目前市面上只有VGA的模拟摄像头,像素不高。如果支持USB HD 720P的摄像头那是相当有优势,搞了一个多月,将自己定义成不能完成的事情搞定了,俗话说:有压力就有动,被关注才有激情。
要完成这项艰巨的任务必须完成量大关键技术 1> 准备UVC协议; 2> 完成ISO同步传输。
回想起来,要想在小系统上,通过阅读《USB Video Class 1_1 协议》,coding一份UVC协议源码真的很难。哈哈...幸运的是我们有linux源码,里面有支持UVC协议的代码,而且做的兼容性非常好,感谢大牛!直接下一份linux3.0源码,在目录\drivers\media\video\uvc就有V4L2(video 4 linux 2)详细的实现了。读,使劲的读源码,理解其中的流程,代码里面有很多linux特有的东西,我们只需要理解它的作用就可以了,然后将其功能在自己小系统上,实现类似的功能就OK了。其中最重要的是理解配置描述解析的过程,这个流程要好好理解,这样才能进入UVC的殿堂。一个摄像头要跑起来重要的操作步骤:1. 打开设备; 2.取得设备的capability,看看设备具有什么功能,比如是否具有视频输入,或者音频输入输出等; 3.设置视频帧的格式个包括宽度和高度等; 3.开始视频的采集; 4. 停止视频的采集; 5.关闭设备。小系统就不要像Linux那样做复杂的BUF队列管理了,做适合自己的就最好了。如果Webcam能被USB控制器能枚举到,就说明你的UVC协议移植完成,值得庆贺,啤酒准备...... 下面show一下我的枚举后得到的结果:
Probing generic UVC device
Found format MJPEG.
- 1280x720 (30.0 fps)
- 160x120 (30.0 fps)
- 320x240 (30.0 fps)
- 352x288 (30.0 fps)
- 640x360 (30.0 fps)
- 640x480 (30.0 fps)
- 800x600 (30.0 fps)
- 960x720 (30.0 fps)
- 1024x576 (30.0 fps)
Found format YUV 4:2:2 (YUYV).
- 1280x720 (10.0 fps)
- 160x120 (30.0 fps)
- 320x240 (30.0 fps)
- 352x288 (30.0 fps)
- 640x360 (30.0 fps)
- 640x480 (30.0 fps)
- 800x600 (10.0 fps)
- 960x720 (10.0 fps)
- 1024x576 (10.0 fps)
Found UVC 1.00 device HD 720P Webcam (0bda:58bb)
USB ISO 同步传输,在控制,批量和中断传输中是最难的。可恨的是我们USB系统里面没有人实现它,这个得完全靠自己了,悲催啊...... 我使用的USB的控制器是EHCI,首先你得了解它的工作原理,这样你就不得不到USB官网上下一份SPEC了,真想中国也制定一些协议,SPEC都是中文的,这样对推广汉语到世界,是有相当的作用,没办法,没有好环境造就好人才。
EHCI同步传输大致的算法如下:
先构建一个512 frame list, 每一个frame里面有8 micro-frames,当USB控制器扫描完8 frame后会产生一个中断,
软件处理这8 frame的数据后再设置其信息给控制器使用。如此反复不断的决心同步传输,一个URB接个一个URB,谁叫他要实时呢!
其中webcam过来的高清数据有被压缩,我们得到数据后,需要解码,最好你的硬件平台能够硬解MJPEG数据,不然速度就赶不上了。
说得比较简单,开发过程中每前进一步就有一堵墙。希望对大家有用!