我正在编写一个设备端的USB驱动程序,它使用飞思卡尔动力公司K20 ARM Cortex-M4处理器上的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模块在question微控制器上工作(尽管任何提示和经验都会很感激),...its会发现这个错误代码意味着什么,并诊断导致它的问题。
错误-18 (注意负值)是EXDEV (交叉连接设备),这对我来说毫无意义,因为我不知道它意味着什么。
Note 1
我知道USB模块没有硬件问题,因为微控制器是Teensy 3.1板的一部分,我在过去的项目中使用过它的USB模块,但是使用了附带的Teensyduino库提供的驱动程序。为了更好地理解模块,我自己写了一篇文章。
Note 2
如果知道有帮助的话,那么微控制器正在接收要分配地址的命令,并且似乎响应正确(即我的日志中没有“不接受地址”错误.我已经对这些错误进行了研究)。除了这个命令和get描述符命令之外,它似乎没有收到任何附加命令。
发布于 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()。代码流应该是清楚的。
https://stackoverflow.com/questions/27287610
复制相似问题