我正在寫一個使用飛思卡爾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