OTG与gadget学习(三)

     在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》来分析分析。

      摘录“


传输类型总览:

其中bRequest意义参考此表:

整个流程中使用了GET_CUR,GET_MIN,GET_MAX以及SET_CUR四种请求。

Transfer分析:
在上图所有transfer中wIndex都是0x0001,即指定了entity0及interface1。
由配置描述符可知interface1为VideoStreaming,所以根据下表分析:

bRequest中缩写的意义:
Current setting attribute (GET_CUR)
Minimum setting attribute (GET_MIN)
Maximum setting attribute (GET_MAX)
Default setting attribute (GET_DEF)
Resolution attribute (GET_RES)
Data length attribute (GET_LEN)
Information attribute (GET_INFO)

wValue是选择控制器,除一个0x0200外,都是0x0100,意义如下
VS_CONTROL_UNDEFINED 0x00
VS_PROBE_CONTROL 0x01
VS_COMMIT_CONTROL 0x02
VS_STILL_PROBE_CONTROL 0x03
VS_STILL_COMMIT_CONTROL 0x04
VS_STILL_IMAGE_TRIGGER_CONTROL 0x05
VS_STREAM_ERROR_CODE_CONTROL 0x06
VS_GENERATE_KEY_FRAME_CONTROL 0x07
VS_UPDATE_FRAME_SEGMENT_CONTROL 0x08
VS_SYNCH_DELAY_CONTROL 0x09
wLength指定附件参数长度,都是26

这样分析后,就可以清楚的看到,系统对视频流接口的参数进行了probe和commit两种操作,先通过probe进行参数协商,最后commit激活。
也可以看下协议中对这个过程的描述:

关于data中26字节数据的分析,请看下表,如果表格显示不完整,请看附件。

在在协商完成后,设置interface altr setting,随后启动同步传输,开始搬运数据。
至此,针对D881HD720P摄像头的枚举分析完毕。

OTG与gadget学习(三)_第1张图片

OTG与gadget学习(三)_第2张图片

      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

      ...


      4. set config

      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


     我目前的状况是

OTG与gadget学习(三)_第3张图片

     上面一分析,再看这个就清楚了,在config desc中,我的只有0x0017=23字节,所以后面只有23字节。看了下代码,现在就明白了,usb_gadget_config_buf()这个函数添加config desc和func。在此之前,我不知道func应该怎么做,所以只到这里了,差不多是23字节。

      之后要做的就是根据上面分析的枚举流程,向UVC驱动获取描述符,然后看怎样正确发送过来。现在也知道了,要结合BUS HUND抓包来分析,再写代码执行,再抓包分析,一点一点来。


你可能感兴趣的:(OTG与gadget学习(三))