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

标签 c linux arm usb

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

我遇到的问题是我似乎无法让 linux 读取我的设备的描述符。我的设备有一种配置,只有一个接口(interface),没有端点(只有控制)。我的设备描述符如下所示:

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 开始的字节,我认为这个描述符可以工作(我有相应的配置和接口(interface)描述符,但它甚至没有达到那么远)。

我得到的错误如下:

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 微 Controller 上工作(尽管任何提示和经验都将不胜感激)...而是找出该错误代码的含义并诊断问题这导致了它。

错误-18(注意负数)是 EXDEV(交叉链接设备),这对我来说毫无意义,因为我不知道它意味着什么。


注1

我知道 USB 模块不存在硬件问题,因为微 Controller 是 Teensy 3.1 的一部分。我和开发板在过去的项目中使用过它的 USB 模块,但使用的是附带的 Teensyduino 库附带的驱动程序。我正在编写自己的模块以更好地理解该模块。

注2

如果知道的话有帮助的话,微 Controller 正在接收要分配地址的命令,并且似乎响应正确(即我的日志中没有“不接受地址”错误......我已经解决了这些问题)。除了该命令和获取描述符命令之外,它似乎没有接收任何其他命令。

最佳答案

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

这里18是usb_control_msg()的返回值,成功则返回设备描述符的长度。所以它是设备描述符中的 bLength 字段,即 18。

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

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

关于c - Linux设备描述符读取/64,错误18,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27287610/

相关文章:

android - 是否可以为 ARM 运行 GoogleTV 模拟器?

c - 如何从 ARM 汇编调用 C 函数?

c - 链表中第六次插入时出现段错误

c - 为什么 pthread_equal 是线程安全的?

linux - 在另一个函数中调用一个函数

linux - 在 linux 上使用 ffmpeg 删除/覆盖 mp4 视频格式上的 Logo

assembly - 如何在arm中编码立即值?

通过niceness改变所有进程的niceness

c - 防止不断检查错误的模式?

c++ - 可以运行 Qt GUI 应用程序的最小 linux