2012-04-13 3 views
2

Ich habe ein USB-Gerät mit Schnittstelle, die alternative Einstellungen für seine Endpunkte verwendet. Wie kann ich diese Einstellungen mit Klassen in 'android.hardware.usb' Paket auswählen?Ist es möglich, eine alternative USB-Schnittstelle mit Android SDK auszuwählen?

Im nativen Code verwende ich 'libusb_set_interface_alt_setting' Funktion von libUsb, die im Wesentlichen IOCTL ist. Ich möchte jedoch nicht verwenden NDK dafür.

Dank

Antwort

1

Um eine andere Einstellung für eine Schnittstelle ist nichts anderes als ein Standardgerät anfordern gemäß Kapitel 9.4 in dem USB specification (usb_2.0.pdf) zu ermöglichen.

So folgt aus:

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

sollte funktionieren. SET_INTERFACE (= 11 = 0x0B) ist eine USB-Spezifikationskonstante. Ich konnte es in der Android-API nicht als Java const finden.

+0

Hallo Alexander, danke für die Antwort. Ich las das Dokument und versuchte mit 'controlTransfer' zu spielen. Leider sind alle Werte von alt. Einstellungen, die ich versuchte, funktionierten nicht. Ich erwähnte, dass "bulkTransfer" zurückgibt. 1. Stimmt etwas nicht in der Reihenfolge der Anrufe, die ich verwende? 'UsbDevice -> getInterface -> getEndpoint -> openDevice -> claimnterface -> controlTransfer -> bulkTransfer ...... -> close_connection' – aknopov

+0

Was meinst du mit _didnot work_? Was gibt den vorgeschlagenen 'controlTransfer' zurück?Probieren Sie controlTransfer vor claimInterface aus, da der controlTransfer die zugehörigen Ressourcen der Schnittstelle irgendwie verändert und unser Hack libUSB nicht darüber informiert, dies steht jedoch im Widerspruch zu [der libusb recomandation] (http://libusb.sourceforge.net/api- 1.0/group__dev.html # ga3047fea29830a56524388fd423068b53). Hinweis: Ich habe das vorher noch nie gemacht und kann nicht sagen, was Android unter der Haube macht. Ich sage Ihnen nur, was sinnvoll ist, wenn Sie die USB-Spezifikationen lesen. – Alexander

+0

By _didnot work_ Ich meine, dass Daten nicht ordnungsgemäß an das Gerät gesendet werden. Das Gerät empfängt entweder 0 oder 1 Byte vom gesendeten Paket, obwohl es eine Vermutung ist - ich habe keinen Sniffer ausgeführt. In Bezug auf "controlTransfer" - gibt es -1 für ungültige Interface-ID zurück und gibt 0 für jede alt.settings-Nummer mit gültiger Schnittstelle zurück. Bezüglich der Reihenfolge - wenn 'controlTransfer' vor' claimInterface' aufgerufen wird, gibt es -1 unabhängig von den Parametern zurück. – aknopov

1

Nur um diese Frage zu schließen.

Ich löste das Problem, indem ich den Kernel-Treiber für mein Gerät schrieb und es als Char-Gerät verwendete.

Als eine Randnotiz könnte ich sagen, dass es nett wäre, set_interface_alt_settings in libusbhost Bibliothek zu implementieren und es in 'android.hardware.usb' Paket über JNI zu verwenden.

0

hatte ich dieses Problem auch - meine Lösung hier überprüfen:

Android USB host DeviceConnection.setInterface prior to API Level 21

ich die Methode mit einem controlTransfer zuerst wie oben vorgeschlagen versucht, aber es scheiterte auch für mich. Der SET_INTERFACE-Befehl war OK, und der GET_INTERFACE, den ich zurückgelesen habe, gab den erwarteten alternativen Wert zurück, so dass das Gerät den richtigen Schnittstellensatz erhalten hat. Trotzdem, Lese-und Schreibvorgänge auf den Endpunkten fehlgeschlagen: -/

Ich verfolgt die libusb_set_interface_alt_setting() über libusb, usbfs und den Kernel. Im Kernel gibt es mehr Code als einfach ein SET_INTERFACE an das USB-Gerät zu senden, zum Beispiel ein Kommentar über "9.1.1.5: Zurücksetzen schaltet für alle Endpunkte in der neuen Alteinstellung um". libusb der Dokumentation libusb_set_interface_alt_setting() auch sagt:

Sie diese Funktion immer eher Ihre eigene SET_INTERFACE Steueranforderung als Formulierung verwendet werden soll. Dies liegt daran, dass das zugrunde liegende Betriebssystem wissen muss, wann solche Änderungen auftreten.

Also dachte ich, dass ich das besser machen sollte. Lange Rede, kurzer Sinn: Schau dir den Code im obigen Link an.