0

この ( http://www.linux-usb.org/gadget/usb.c ) Gadget FS ユーザー モード ドライバーを組み込みデバイスで実行しています。

Windows に接続すると、次のGET_DESCRIPTORセットアップ要求が表示されます。 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 実装を失速させます。Descriptor Type は 3 です。これは、「String」タイプの Descriptor が要求されているが、wIndexLanguage 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 に答える