2012-04-13 112 views
2

我有一個USB設備,其接口使用 其端點的備用設置。如何使用 'android.hardware.usb'包中的類來選擇這些設置?是否可以使用Android SDK選擇備用USB接口?

在本地代碼中,我使用libUsb中的'libusb_set_interface_alt_setting'函數 ,它基本上是IOCTL。但是,我不想 使用NDK。

由於

回答

1

要啓用的接口的選擇設定只不過是一個標準設備請求根據在USB specification(usb_2.0.pdf)章節9.4以上。

所以這個:

UsbDeviceConnection.controlTransfer(UsbConstants.USB_DIR_OUT | 0x01, SET_INTERFACE, _alternate_setting_, _interface_nr_, null, 0, _timeout_); 

應該工作。 SET_INTERFACE(= 11 = 0x0B)是一個USB規範常量。我無法在android API中找到它作爲Java常量。

+0

嗨亞歷山大,謝謝你的回覆。我閱讀文檔並嘗試使用'controlTransfer'玩。不幸的是,所有的alt值。我嘗試過的設置無效。我提到'bulkTransfer'返回1.我使用的調用序列有錯嗎? 'UsbDevice - > getInterface - > getEndpoint - > openDevice - > claimInterface - > controlTransfer - > bulkTransfer ...... - > close_connection' – aknopov 2012-05-08 21:02:18

+0

你對_didn't work_有什麼意思?什麼返回我建議的'controlTransfer'?在claimInterface之前嘗試controlTransfer,因爲controlTransfer以某種方式更改了接口的相關資源,而我們的hack並沒有通知libUSB它,但這與[libusb recomandation](http://libusb.sourceforge.net/api- 1.0/group__dev.html#ga3047fea29830a56524388fd423068b53)。注意:我以前從來沒有這樣做過,我也不知道Android在底層做什麼。我只是告訴你,閱讀USB規格是有意義的。 – Alexander 2012-05-10 10:43:34

+0

通過_didn't work_我的意思是數據沒有正確發送到設備。設備從發送的包中收到0或1個字節,儘管這是一個猜測 - 我沒有運行嗅探器。關於'controlTransfer' - 它爲無效的接口ID返回-1,並且返回0用於有效接口的任何alt.settings數字。關於順序 - 如果在'claimInterface'之前調用'controlTransfer',它將返回-1而不管參數如何。 – aknopov 2012-05-10 23:32:55

1

只是爲了關閉這個問題。

我通過爲我的設備編寫內核驅動程序並將其用作char設備來解決此問題。

作爲一個便箋,我可以說在libusbhost庫中實現set_interface_alt_settings將會很好,並通過JNI在'android.hardware.usb'包中使用它。

0

我有這個問題,以及 - 檢查我的解決方案在這裏:

Android USB host DeviceConnection.setInterface prior to API Level 21

我第一次嘗試用controlTransfer,上述方法的建議,但它太失敗了我。 SET_INTERFACE命令正常,並且讀回的GET_INTERFACE返回了預期的備用值,因此設備獲得了正確的接口集。即便如此,讀取和寫入端點失敗: -/

我通過libusb,usbfs和內核跟蹤了libusb_set_interface_alt_setting()。在內核中,除了向USB設備發送SET_INTERFACE外,還有更多的代碼,例如關於「9.1.1.5:重置在新的altsetting中切換所有端點」的註釋。 libusb的對libusb_set_interface_alt_setting()文檔也說:

你應該總是使用此功能,而不是制定自己 SET_INTERFACE控制要求。這是因爲底層的 操作系統需要知道這些更改何時發生。

所以我想我最好這樣做。長話短說:查看上面鏈接中的代碼。

相關問題