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

标签 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 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,表示请求“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;

如果有人能帮助我,我将非常感激!

最佳答案

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

关于linux - 来自 Linux 主机或 Windows 主机的 USB 设置请求不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19723924/

相关文章:

driver - 我是否认为现代消费类显卡使用完全相同的 GPU 结构来进行实际图形渲染和裸计算?

debugging - 如何从内核模式驱动程序查看DbgPrint输出?

driver - 如何从一个 GSM 调制解调器到另一个进行语音通话

linux - 配置 gnuplot 以处理像 excel 这样的时间序列

linux - 如何创建一个基本的 NASM Assembly (Linux) 计算器来添加两个整数?

javax.usb.UsbException : Properties file javax. 未找到 usb.properties

objective-c - 读取串行数据时 CPU 消耗和延迟较高

c++ - OpenCL/OpenGL 互操作性纹理段错误

linux - 如何获取系统ioWait

linux - g_mass_storage 虚拟 usb 设备的性能非常低