我正在写一个使用飞思卡尔Kinetis K20 ARM Cortex-M4处理器上的USB模块的设备端USB驱动程序。在主机端,我在一台x64处理器上运行Arch。Linux设备描述符读取/ 64,错误18
我遇到的问题是我似乎无法让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描述符命令,它似乎没有收到任何额外的命令。
原来,它是'bMaxPacketSize0',但不是它没有正确设置(我的设置为64)。通过代码阅读,它似乎没有收到我的设备上的任何数据,当它期待18个字节时。我把我的描述符'struct'标记为'const',由于某种原因,它将它放置在一个无法访问的内存区域(可能是闪存)。删除'const'然后允许设备实际发送解决问题的描述符。感谢关于'drivers/usb/core'的提示! – 2014-12-04 18:19:52