0

我在嵌入式设备上运行这个 ( 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 实现停滞不前。描述符类型为 3,这意味着请求了“字符串”类型的描述符,但未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;

如果有人可以帮助我,我将不胜感激!

4

1 回答 1

0

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

于 2013-11-01T11:19:00.637 回答