Linux设备描述符读取/ 64,错误18

时间:2014-12-04 06:24:27

标签: c linux arm usb

我正在使用飞思卡尔Kinetis K20 ARM Cortex-M4处理器上的USB模块编写设备端USB驱动程序。在主机端,我在x64处理器上运行Arch。

我遇到的问题是我似乎无法让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 descriptor命令,它似乎没有接收到任何其他命令。

1 个答案:

答案 0 :(得分:2)

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()。代码流应该清楚。