2013-11-24 27 views
0

我試圖將Pololu的迷你大師USB伺服控制器驅動程序移植到Linux內核模塊中(這是我第一次編寫kenel模塊)。 Pololu的Linux驅動程序實際上使用單聲道運行時環境,我認爲很多是兼容層,它是用C#編寫的(因爲我是未知的),所以將它移植到C將它編譯爲內核模塊非常重要,因爲我希望其他程序使用管道與USB模塊進行通信。{USB複合設備內核模塊驅動程序編程}多接口管理和「無端點」處理

所以,這裏的交易,我用的lsusb -vvv列出Device Characteristics

但最後界面態:

Interface Descriptor: 
    bInterfaceNumber  4 
    bNumEndpoints   0 
    bInterfaceClass  255 Vendor Specific Class 
    bInterfaceSubClass  4 
    bInterfaceProtocol  1 
    iInterface    2 Pololu Mini Maestro 18-Channel USB Servo Controller 

我想不通的是:

  • 是否有可用於配置設備模式的未列出控制端點?
  • 我可以處理它嗎?我該怎麼做?

從複合設備本身:

  • 內核驅動程序實例運行爲每個接口?
  • 如何捕捉界面並確定如何管理界面?
  • 我該如何處理界面關聯?

最好的問候!

回答

1

這裏有一些問題的答案:

是否有可用於 配置設備模式下的非上市控制端點?我可以處理它嗎?我該怎麼做?

控制端點將始終爲端點0,您只需將您的設置數據包引導至此端點以將控制請求傳送至設備。由於每個設備只有一個端點,因此您需要了解Polulu如何爲指定的控制請求指定接口,通常作爲控制傳輸的wIndex值傳入。

從複合設備本身:內核驅動程序實例爲每個接口運行 ?我如何捕捉界面並確定如何管理它?我如何處理界面關聯?

每個接口將呈現爲一些獨特的USB接口。每個人都是獨立的,會有自己的行爲。例如,您可以有一個帶有3個接口的複合設備:海量存儲設備的接口,USB音頻設備的接口和供應商特定接口。這些中的每一個都會專門爲該接口加載自己的驅動程序實例。由於它們被定義爲USB類,所以前兩個通常已經內置到現代操作系統和內核版本中。但供應商特定的設備可能必須爲供應商特定的驅動程序進行一些VID/PID匹配。如果您需要與上面顯示的特定界面進行交談,這將會發生在您的案例中。

+0

我如何才能看到它的界面我會處理的驅動程序? (從駕駛員角度)。據我所知,VendorID(VID)和ProductID(PID)由5個接口或VID/PID共享它對每個接口都是唯一的嗎? –

+1

是的,VID/PID將作爲一個整體(複合設備)存在於物理設備中,但每個接口將代表一種邏輯設備。從原始的角度來看,您可以向USB設備詢問其配置描述符以獲取總數接口。然後你可以遍歷並詢問每個接口描述符並檢查它。如果您正在爲某些特定設備創建驅動程序,例如'usbserial',則您爲設備註冊的回調將傳遞給您一些結構。從那裏你可以找到那些來確定你正在與之交談的界面的數量。 – Preston

+0

你也可以查看libusb,從那裏你可以訪問你的設備,而不需要內核驅動程序部分。取決於你想做什麼,這可能足以讓你前進。 – Preston

0

因此,我挖了幾個網站,並詢問了Pololu forum我得到了一些答案,首先感謝@preston的線索!

  • 我可以處理它{未列出的控制端點}以及我該怎麼做?

是的,我們可以經由usb_control_msgfunction,在/drivers/usb/core/message.c

INT usb_control_msg的線132定義(結構USB_DEVICE * dev的,無符號整型管,__u8請求, __u8的RequestType,__u16值,

  • 內核驅動程序實例跑了EA __u16指數,void *的數據, __u16大小,INT超時) ch接口?

由於@preston回答道:這是

  • 我如何能趕上的接口,並確定如何管理呢?

我們不需要「抓」的接口,該接口發送探測到內核模塊:

static int probe(struct usb_interface *interface, const struct usb_device_id *id)

  • 我該如何治療接口關聯?

正如我已經告訴我不需要處理它們以特殊的方式,只是承認與接口上探功能

+1

好的工作,祝您的開發順利! – Preston

相關問題