来自linux主机或Windows主机的USB设置请求不同

时间:2013-11-01 09:21:02

标签: linux usb driver

我在嵌入式设备上运行此(http://www.linux-usb.org/gadget/usb.c)Gadget FS用户模式驱动程序。

当我将其连接到Windows时,这些是我收到的GET_DESCRIPTOR设置请求: 80 06 03 03 09 04 ff 00 80 06 00 03 00 00 ff 00 80 06 02 03 09 04 ff 00 80 06 03 03 09 04 ff 00 80 06 00 03 00 00 ff 00 80 06 02 03 09 04 ff 00

`bmRequestType`: 0x80 Device-to-host transfer direction
`bRequest`: 0x06 GET_DESCRIPTOR
`wValueH` : 0x03 Descriptor Type 'String'
`wValueL` : Descriptor Index
`wIndex` : 0x04 0x09 Language ID "US-English" for Descriptor Types "String", 0x00 for others
`wLength` : Length of the requested descriptor

这些是我连接设备时来自Linux主机的设置请求。 80 06 00 03 00 00 ff 00 80 06 02 03 09 04 ff 00 80 06 01 03 09 04 ff 00 80 06 03 03 09 04 ff 00 80 06 ee 03 00 00 00 04

最后一个使我的GadgetFS实现STALL。 Descriptor Type为3,表示请求类型为“String”的描述符,但在wIndex中没有提供语言ID(0x00 0x00)。此外,描述符索引是0xEE,但为什么你有一个设备的238字符串描述符? 另请注意所请求描述符的长度:0x0400(1024)。

这是我使用的驱动程序实现(linux-usb.org)的代码摘录,用于处理设置请求:

case USB_REQ_GET_DESCRIPTOR:     //0x06         
        if (setup->bRequestType != USB_DIR_IN) //USB_DIR_IN = 0x80
            goto stall;
        switch (value >> 8) // wValueH: Descriptor Type
        {
        case USB_DT_STRING: // 0x03 Type = "String"
            {           
                tmp = value & 0x0ff; // wValueL : Descriptor Index

                struct usb_gadget_strings strings = {
                    0x0409,     /* "en-us" */
                    m_aUsbStringtab
                };

                index = 0x0409
                if (tmp != 0 && index != strings.language) //This makes it STALL when connected to a linux 
                    goto stall;

如果有人可以帮助我,我真的很感激!

1 个答案:

答案 0 :(得分:0)

在linux上看来,描述符索引为0xEE且长度为1024的设置请求不是由linux上的libusb发送的,而是由mtp-probe(libmtp的一部分,媒体传输协议)发送的。