1 版本历史
 1.1 UVC uvc_version
 UVC 1.0: Sep-4-2003
 UVC 1.1: Jun-1-2005
 UVC 1.5: August-9-2012, H.264 video codec. Linux 4.5 introduces UVC 1.5, but does not support H264.
 1.2 V4L版本历史
 Video4Linux取名的灵感来自1992 Video for Windows(V4W),但两者在技术上并没有任何关系。
 Linux 2.5.46:2002年11月发布,natively支持V4L2
 Linux 2.6.26:2008年发布,natively支持UVC;GSPCA使用的是V4L规范
 2 UVC数据包格式
 2.1 UVC帧格式
 Figure 2-1 UVC Video Data Header Format

Figure 2-2 UVC帧格式

每16KB的一次Bulk burst中包含一个12字节的Video Header;并且每一次的Bulk burst对应一个URB。
 2.2 主流UVC摄像头支持的格式
 V4L2_PIX_FMT_MJPG
 V4L2_PIX_FMT_YUYV
 V4L2_PIX_FMT_H264
 V4L2_PIX_FMT_JPEG
 USB摄像头的成像效果一般不稳定,对着日光灯拍照,会有flicker现象。原因是日光灯照射时,光照比较充足,只需要很短的时间,譬如1/120秒或者1/100秒,sensor像素就可以获得足够的电流,然后sensor中的ADC就启动转换。
 2.3 Linux数据包解码
 1)ISO:一个URB对应一帧,等于number_of_packets * BPI(wBytesPerInterval),其中BPI = packet的大小 x burst的个数。只有高速和全速端点支持同步传输,高速同步端点的最大包长度为1024(400h),全速同步端点的最大包长度为1023(3FFh)。
 2)Bulk:一个URB对应dwMaxPayloadTransferSize,dwMaxPayloadTransferSize = packet的大小 x burst的个数。
 3)解码函数分别如下所示。
 drivers/media/usb/uvc/uvc_video.c
 uvc_video_decode_start()
 uvc_video_decode_data()
 uvc_video_decode_end()
 2.4 UVC OV2640
 UVC摄像头OV2640,计算需要多少个USB frame/uframe发送完一帧JPEG图像,可以用示波器测量摄像头模块的VSYNC信号来计算获得。一帧JPEG数据以FF D8字段开始,FF D9字段结束。
 3 Still Image Capture
 Figure 3-1 Still Image Capture

其中Method 1和Method 3属于ZSL。
 方法一是从preview中截图。
 方法三是专用的端点(类似于手机ISP专用的snapshot AXI port)拍照。
 方法二是preview和拍照二选一,属于传统模式,拍照时停止预览,拍完时恢复预览。
 4 协议
 bInterfaceClass/bInterfaceSubClass/bInterfaceProtocol:0x0E/0x01/0x00和0x0E/0x02/0x00
 5 libuvc
 libuvc based on libusb
 https://github.com/libuvc/libuvc
 https://ken.tossell.net/libuvc/
 6 主控芯片
 6.1 EZ-USB CX3
 1)4-lane CSI-2接口
 2)芯片内部没有ISP和JPEG编码器,所以只支持V4L2_PIX_FMT_YUYV,可以在CIS和CX3之间外挂ISP解决Camera的效果处理问题
 3)使用ThreadX
 6.2 SanJet DVR
 7 Tools
 7.1 UVC播放器
 AMCap: ActiveMovie Capture
 VLC: [Tools][Preferences][All][Input / Codecs][Demuxers][H264]
 gstreamer
 7.2 Wireshark分析RTP中的H264码流
 1)用Wireshark打开.pcap文件
 2)右键点击H264的UDP包,选择“Decode as…”,选择 RTP,点击OK之后UDP就解析成RTP包了
 3)查看RTP包的payload type,通常H264 SDP文件中指定了类型是96
 4)WireShark工具栏中选择Edit – preferences – protocols – H264,把“H264 dynamic payload types”设成96,点击OK。以后payload就可以自动解析了
 8 URLs
 https://github.com/joeshang/joycar/blob/master/module/v4l2_camera/decoder_mjpeg.c
 Linux UVC driver and tools
 http://www.ideasonboard.org/uvc/
 9 Abbreviations
 ADAS:Advanced Driver Assistance System,先进驾驶辅助系统,Bosch提供整个方案模块
 AFE:USB PHY Analog Front-end
 ARC:Argonant RISC Core
 AT91SAM9260:SAM means Smart ARM-based Microcontroller
 ATMEL SAMBA:ATMEL Smart ARM-based Microcontroller Boot Assistant
 BYOD:bring-your-own-device,CarPlay和Android Auto就属于BYOD
 C2B:ADI Car Camera Bus
 DMS:Driver Monitoring System,疲劳驾驶监控,使用GHS INTEGRITY RTOS系统,通过车载以太网通信(PHY工作在Master模式,连接时,会主动和Slave PHY进行链路训练),法国Valeo提供方案
 DWC2:Design Ware Controller 2,Apple的嵌入式设备,包括iPad和iPhone都是使用的DWC2
 EVS:Exterior View System,Android车载系统Camera架构HAL层(不同于手机Camera架构)
 FourCC:Four-Character Codes
 GSPCA:Generic Software Package for Camera Adapters,开始是为了支持Sunplus(凌阳单片机)camera模组spca50x(SunPlus CAmera),后来基于这个驱动进行扩展变成了通用的驱动gspca,所以缩写里面仍然包含了spca关键字,已经不再维护,现在使用uvc。
 HSSQ:USB PHY High-speed Squelch
 ISP1161:Philips' Integrated host Solution Pairs 1161,“Firms introduce USB host controllers”,https://www.eetimes.com/document.asp?doc_id=1290054
 Leica:Leitz Camera
 SL811HS:Cypress/ScanLogic 811 Host/Slave,性能上与ISP1161(Integrated host Solution Pairs 1161)相当
 SPS:Sequence Parameter Set,序列参数集
 suspendM:UTMI suspend Macrocell
 TDI:TransDimension Inc.,该公司首先发明了将TT集成到EHCI RootHub中的方法,这样对于嵌入式系统来说,就省去了OHCI/UHCI的硬件,同时降低了成本,作为对该公司的纪念,Linux内核定义了宏ehci_is_TDI(ehci);产品UHC124表示USB Host Controller;收购了ARC USB技术;现已被chipidea收购,chipidea又被mips收购
 TT:Transaction Translator(事务转换器,将USB2.0的包转换成USB1.1的包)


















