2014-12-04 167 views
0

我正在寫一個使用飛思卡爾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描述符命令,它似乎沒有收到任何額外的命令。

回答

0

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()。代碼流應該清楚。

+0

原來,它是'bMaxPacketSize0',但不是它沒有正確設置(我的設置爲64)。通過代碼閱讀,它似乎沒有收到我的設備上的任何數據,當它期待18個字節時。我把我的描述符'struct'標記爲'const',由於某種原因,它將它放置在一個無法訪問的內存區域(可能是閃存)。刪除'const'然後允許設備實際發送解決問題的描述符。感謝關於'drivers/usb/core'的提示! – 2014-12-04 18:19:52