2014-12-04 165 views
0

我正在写一个使用飞思卡尔Kinetis K20 ARM Cortex-M4处理器上的USB模块的设备端USB驱动程序。在主机端,我在一台x64处理器上运行Arch。Linux设备描述符读取/ 64,错误18

我遇到的问题是我似乎无法让linux读取我的设备的描述符。我的设备有一个配置,只有一个接口,没有端点(只是控制)。我的设备描述符看起来像这样:

typedef struct { 
    uint8_t bLength; 
    uint8_t bDescriptorType; 
    uint16_t bcdUSB; 
    uint8_t bDeviceClass; 
    uint8_t bDeviceSubClass; 
    uint8_t bDeviceProtocol; 
    uint8_t bMaxPacketSize0; 
    uint16_t idVendor; 
    uint16_t idProduct; 
    uint16_t bcdDevice; 
    uint8_t iManufacturer; 
    uint8_t iProduct; 
    uint8_t iSerialNumber; 
    uint8_t bNumConfigurations; 
} dev_descriptor_t; 

static const dev_descriptor_t dev_descriptor = { 
    .bLength = 18, 
    .bDescriptorType = 1, 
    .bcdUSB = 0x0100, 
    .bDeviceClass = 0xff, 
    .bDeviceSubClass = 0x0, 
    .bDeviceProtocol = 0x0, 
    .bMaxPacketSize0 = ENDP0_SIZE, 
    .idVendor = 0x16c0, 
    .idProduct = 0x05dc, 
    .bcdDevice = 0x0001, 
    .iManufacturer = 0, 
    .iProduct = 0, 
    .iSerialNumber = 0, 
    .bNumConfigurations = 1 
}; 

假设处理器读取的字节开始bLength我认为这将描述符的工作(我有相应的配置和接口的描述,但它甚至没有得到那么远)。

我得到的错误如下:

usb 4-1.4: device descriptor read/64, error 18 
...repeated 4 times 
usb 4-1.4: device descriptor read/8, error -75 
..repeated 4 times 
usb 4-1-port4: unable to enumerate USB device 

我设法找到的错误代码列表和-75是EOVERFLOW这是有道理的,因为我的描述不适合8字节读取里面。真正让我困惑的一个是错误18.

我的问题

什么是错误18,什么原因呢?

只是要清楚:我的问题不是让USB模块在Kinetis微控制器上工作(尽管任何提示和经验值得赞赏)......它关于找出这个错误代码的含义和诊断问题导致它。

错误-18(注意否定的)是EXDEV(交叉连接设备),这对我没有意义,因为我不知道它的含义。


注1

我知道,没有一个硬件问题USB模块由于微控制器是Teensy 3.1板的一部分,我已经在过去的项目中使用了USB模块,但使用附带的Teensyduino库提供的驱动程序。我正在写我自己来更好地理解模块。

注2

如果它有助于了解,微控制器接收的命令被分配一个地址,似乎正确的反应(即在我的日志中没有“不接受地址”的错误......我已经通过这些工作)。除此之外和get描述符命令,它似乎没有收到任何额外的命令。

回答

0

18这里不是一个错误。注意它是一个正数,而所有的错误代码在Linux内核中被转换为负数。

这里,18是usb_control_msg()的返回值,如果成功则返回设备描述符的长度。因此,它是设备描述符中的bLength字段,它是18.

问题出在bMaxPacketSize0字段。我不知道ENDP0_SIZE是什么,但是usb内核只接受以下值:8,16,32,64,255。如果不匹配,usb_control_msg()被认为是失败并报告错误。

检查drivers/usb/core/hub.c中的hub_port_init()。代码流应该清楚。

+0

原来,它是'bMaxPacketSize0',但不是它没有正确设置(我的设置为64)。通过代码阅读,它似乎没有收到我的设备上的任何数据,当它期待18个字节时。我把我的描述符'struct'标记为'const',由于某种原因,它将它放置在一个无法访问的内存区域(可能是闪存)。删除'const'然后允许设备实际发送解决问题的描述符。感谢关于'drivers/usb/core'的提示! – 2014-12-04 18:19:52