首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Linux设备描述符读/64,错误18

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

Stack Overflow用户
提问于 2014-12-04 06:24:26
回答 1查看 10.5K关注 0票数 2

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

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

代码语言:javascript
运行
复制
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开始的字节,我会认为这个描述符可以工作(我有相应的配置和接口描述符,但它甚至没有达到那么远)。

我得到的错误如下:

代码语言:javascript
运行
复制
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模块在question微控制器上工作(尽管任何提示和经验都会很感激),...its会发现这个错误代码意味着什么,并诊断导致它的问题。

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

Note 1

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

Note 2

如果知道有帮助的话,那么微控制器正在接收要分配地址的命令,并且似乎响应正确(即我的日志中没有“不接受地址”错误.我已经对这些错误进行了研究)。除了这个命令和get描述符命令之外,它似乎没有收到任何附加命令。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-04 08:22:15

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

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

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

检查驱动程序/usb/core/hub.c中的hub_port_init()。代码流应该是清楚的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27287610

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档