我正在使用飞思卡尔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命令,它似乎没有接收到任何其他命令。
答案 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()。代码流应该清楚。