2六、從零寫UVC驅動之分析描述符

指令:lsusb 能夠查看usb設備的描述符信息,固然lsusb指令要帶一些參數數組

一個usb設備有多個config配置+設備描述符,一個config有多個接口和association、config描述符(這裏的接口包括這個config全部的接口,control和streaming也在裏面,control和streaming的個數在association裏面說明,C和S也是屬於接口),一個接口裏面有多個設置(若是cur_altsetting->extralen不爲零,其應該就是control接口或者streaming接口,這時其cur_altsetting->extra存放的就是control和streaming描述符,而且這個接口有多種設置),設置裏面有接口描述符和endpoint,框架

注意:接口描述符在每一個設置裏面ide


[585955.047776] usb 1-1: new high speed USB device using ehci_hcd and address 3
[585955.269142] usb 1-1: configuration #1 chosen from 1 choice
[585955.379843] uvcvideo: Found UVC 1.00 device USB2.0 Camera (1e4e:0102)
[585955.440427] uvcvideo: UVC non compliance - GET_DEF(PROBE) not supported. Enabling workaround.
[585955.554594] input: USB2.0 Camera as /devices/pci0000:00/0000:00:11.0/0000:02:02.0/usb1/1-1/1-1:1.0/input/input5函數

(lsusb -v -d 0x1e4e:  能夠顯示全部描述符,見文件uvc_desc.txt(https://files.cnblogs.com/files/liusiluandzhangkun/uvc_desc.zip))lua

本節主要是仿照lsusb寫咱們本身打印全部描述符的程序orm

UVC設備描述符框架入下圖所示,其在USB設備描述符基礎上添加了本身的一些描述符視頻

 

static struct usb_device_id myuvc_ids[] = {
/* Generic USB Video Class */
{ USB_INTERFACE_INFO(USB_CLASS_VIDEO, 1, 0) }, /* VideoControl Interface */
{ USB_INTERFACE_INFO(USB_CLASS_VIDEO, 2, 0) }, /* VideoStreaming Interface */
{}
};blog

#define USB_INTERFACE_INFO(cl, sc, pr) \
.match_flags = USB_DEVICE_ID_MATCH_INT_INFO, \
.bInterfaceClass = (cl), \
.bInterfaceSubClass = (sc), \
.bInterfaceProtocol = (pr)接口

關於Class、SubClass能夠見UVC 1.5 Class specification.pdf   61頁的表,見表中descriptionip

uvc設備驅動有兩個接口,一個是control,一個是streaming,因此基於usb總線框架,其probe函數會被調用兩次

 

VC和VS接口的個數等信息在IAD描述符中的bInterfaceCount表示,IDA(usb_interface_assoc_descriptor)在usb_host_config 描述符中,UVC設備值關心usb_interface_assoc_descriptor數組的第一個,VC和VS的描述符信息在各自的usb_interface->cur_altsetting->extra中,長度是extralen,全部的UVC自定義的描述符都在這,對於VC中各個Unit和Terminal等的描述符分析見"UVC1.5 class specification.pfd",由於第一個字節是長度,全部能夠把buf分爲不少串在分析:

VideoControl Interface的自定義描述符:
extra buffer of interface 0:
extra desc 0: 0d 24 01 00 01 4d 00 80 c3 c9 01 01 01
           VC_HEADER
extra desc 1: 12 24 02            01 01 02 00 00 00 00 00 00 00 00 03 0e 00 00
           VC_INPUT_TERMINAL ID
extra desc 2: 09 24 03            02 01 01 00 04 00
         VC_OUTPUT_TERMINAL ID wTerminalType bAssocTerminal bSourceID
extra desc 3: 0b 24 05 03 01 00 00 02 7f 14 00
           VC_PROCESSING_UNIT ID bSourceID wMaxMultiplier bControlSize bmControls
extra desc 4: 1a 24 06 04 ad cc b1 c2 f6 ab b8 48 8e 37 32 d4 f3 a3 fe ec 08 01 03 01 3f 00
         VC_EXTENSION_UNIT ID GUID bNumControls bNrInPins baSourceID

IT(01) ===> PU(03) ===> EU(04) ===> OT(02)(根據SourceID來確認本Unit或者Terminal的輸入信號)

(PU的數據域會描述它具備哪些功能,具體分析見pdf)

VC_DESCRIPTOR_UNDEFINED 0x00
VC_HEADER 0x01
VC_INPUT_TERMINAL 0x02
VC_OUTPUT_TERMINAL 0x03
VC_SELECTOR_UNIT 0x04
VC_PROCESSING_UNIT 0x05
VC_EXTENSION_UNIT 0x06
VC_ENCODING_UNIT 0x07


VideoStreaming Interface的自定義描述符:
extra buffer of interface 1: 
extra desc 0: 0e 24 01 01 df 00 81 00 02 02 01 01 01 00
VS_INPUT_HEADER bNumFormats(支持多少種格式) 
extra desc 1: 1b 24 04 01 05 59 55 59 32 00 00 10 00 80 00 00 aa 00 38 9b 71 10 01 00 00 00 00
VS_FORMAT_UNCOMPRESSED(未壓縮的數據格式) bFormatIndex(當前是第幾種格式) bNumFrameDescriptors(這種格式支持多少種Frame) GUID bBitsPerPixel(每個像素用多少位表示)
extra desc 2: 1e 24 05 01 00 80 02 e0 01 00 00 ca 08 00 00 ca 08 00 60 09 00 15 16 05 00 01 15 16 05 00
VS_FRAME_UNCOMPRESSED(未壓縮的分辨率)  bFrameIndex(當前是第幾種分辨率) bmCapabilities(每一位有不一樣功能:好比拍照、幀固定)  wWidth(兩字節,低位在前)  wHeight  FrameBufferSize  FrameInterval(每幀數據間隙,單位是100ns)
640x480
extra desc 3: 1e 24 05 02 00 60 01 20 01 00 80 e6 02 00 80 e6 02 00 18 03 00 15 16 05 00 01 15 16 05 00
VS_FRAME_UNCOMPRESSED
extra desc 4: 1e 24 05 03 00 40 01 f0 00 00 80 32 02 00 80 32 02 00 58 02 00 15 16 05 00 01 15 16 05 00
extra desc 5: 1e 24 05 04 00 b0 00 90 00 00 a0 b9 00 00 a0 b9 00 00 c6 00 00 15 16 05 00 01 15 16 05 00
extra desc 6: 1e 24 05 05 00 a0 00 78 00 00 a0 8c 00 00 a0 8c 00 00 96 00 00 15 16 05 00 01 15 16 05 00

extra desc 7: 1a 24 03 00 05 80 02 e0 01 60 01 20 01 40 01 f0 00 b0 00 90 00 a0 00 78 00 00
VS_STILL_IMAGE_FRAME
extra desc 8: 06 24 0d 01 01 04

VS_INPUT_HEADER 0x01
VS_STILL_IMAGE_FRAME 0x03
VS_FORMAT_UNCOMPRESSED 0x04
VS_FRAME_UNCOMPRESSED 0x05
VS_COLORFORMAT 0x0D

關於usb_interface 在probe函數調用的時候傳進來,usb設備有多個接口,若是接口能夠被driver支持,即吻合idtable,probe就會被調用,而且調用driver的probe函數;一個接口有多個設置usb_host_interface,設置裏面有端點信息及端點描述符,多個端點組成一個接口的一個功能

(接口在UVC中能夠理解爲VC控制接口、VS視頻接口)

相關文章
相關標籤/搜索