この ( 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 が要求されているが、wIndex
Language 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;
誰かが私を助けてくれれば、本当に感謝します!