在UVC驱动中调用mygadget_init()、mygadget_remove(),可以从UVC中得到部分描述符信息,(lsusb是可以得到全部信息,但它是应用层的,怎么在驱动上得到全部信息,暂时还不知道,)但是怎么在PC HOST请求时将这些信息正确回复呢?现在,最多只是把device descriptor部分传过去, 但按照file_storage方式的话就会显示为USB Composite Device。
现在最想知道的就是USB摄像头内部,它是怎么做的、怎么处理的?可是没有做USB摄像头的资源。还有就是Linux usb gadget,但是内核中唯一一个webcam,不涉及otg(usb device)功能部分。而可以参考的file_storage毕竟是U盘类的,和camera类的有区别。
正如前面搜索的,gadget方面,多数是分析zero驱动。关于这方面的很少,像韦东山说的UVC驱动也只是linux HOST侧的UVC驱动。
下面怎么办呢???
找来找去就两个,《uvc摄像头代码解析》系列之《uvc摄像头代码解析之描述符》http://blog.csdn.net/ropenyuan/article/details/41014423,《UVC摄像头枚举过程分析——D881HD720P》。
看《uvc摄像头代码解析之描述符》了解了点UVC描述符,再看看《UVC摄像头枚举过程分析——D881HD720P》来分析分析。
摘录“
1. get desc
80 06 00 01 00 00 12 00
type : 0x80 , req : 0x06 , value : 0x01 00 , index : 0x00 00 , length : 0x00 12
请求程度 0x12=18字节
12 01 00 02 ef 02 01 40 cf 1b 02 80 04 00 01 02 03 01
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 2.00
bDeviceClass 239 Miscellaneous Device
bDeviceSubClass 2 ?
bDeviceProtocol 1 Interface Association
bMaxPacketSize0 64
idVendor 0x1bcf Sunplus Innovation Technology Inc.
idProduct 0x8002
bcdDevice 0.04
iManufacturer 1 SGSG
iProduct 2 SGSG/HJ-OUTER-CAMERA-500
iSerial 3 SGSG
bNumConfigurations 1
2. get desc
80 06 00 02 00 00 09 00
type : 0x80 , req : 0x06 , value : 0x02 00 , index : 0x00 00 , length : 0x00 09
请求程度 0x09=9字节
09 02 a5 03 02 01 00 80 fa
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 933
bNumInterfaces 2
bConfigurationValue 1
iConfiguration 0
bmAttributes 0x80 (Bus Powered)
MaxPower 500mA
3. get desc
80 06 00 02 00 00 a5 03
type : 0x80 , req : 0x06 , value : 0x02 00 , index : 0x00 00 , length :0x03 a5
wTotalLength=933=0x03 a5, 请求长度0x03 a5
09 02 a5 03 02 01 00 80 fa 08 0b 00 02 ...
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 933
bNumInterfaces 2
bConfigurationValue 1
iConfiguration 0
bmAttributes 0x80 (Bus Powered)
MaxPower 500mA
Interface Association:
bLength 8
bDescriptorType 11
bFirstInterface 0
bInterfaceCount 2
...
00 09 01 00 00 00 00 00
type : 0x00 , req : 0x09 , value : 0x00 01 , index : 0x00 00 , length : 0x00 00
5. get desc
80 06 01 03 09 04 04 00
type : 0x80 , req : 0x06 , value : 0x03 01 , index : 0x04 09 , length : 0x00 04
请求程度 0x04=4字节0a 03 53 00
6. get desc
80 06 01 03 09 04 0a 00
type : 0x80 , req : 0x06 , value : 0x03 01 , index : 0x04 09 , length : 0x00 04
bLength=0x0a,请求程度 0x0a=10字节0a 03 53 00 47 00 53 00 47 00
我目前的状况是
上面一分析,再看这个就清楚了,在config desc中,我的只有0x0017=23字节,所以后面只有23字节。看了下代码,现在就明白了,usb_gadget_config_buf()这个函数添加config desc和func。在此之前,我不知道func应该怎么做,所以只到这里了,差不多是23字节。
之后要做的就是根据上面分析的枚举流程,向UVC驱动获取描述符,然后看怎样正确发送过来。现在也知道了,要结合BUS HUND抓包来分析,再写代码执行,再抓包分析,一点一点来。