2012-01-17 6 views
6

Attualmente sto cercando di trovare un modo per gestire il trasferimento dati USB su un endpoint isocrono sul mio tablet Android 3.2 (modalità host supportata). Dopo aver scritto un codice prototipo, ho notato che nel file delle costanti per USB_ENDPOINT_XFER_ISOC si afferma che "Isocrono tipo endpoint (attualmente non supportato)".Trasferimento dati USB isocrono Android

Ciò è possibile senza il rooting del dispositivo? Se sì, come potrei fare questo?

Idealmente speravo di rimanere all'interno dell'API java, ma se ciò è possibile solo tramite NDK, dovrei farlo invece. Capisco anche che ci potrebbero essere alcuni problemi di larghezza di banda USB in base alla seguente post: User mode USB isochronous transfer from device-to-host

risposta

5

È "può" farlo senza radici, mi creda.

È necessario eseguire tutte le operazioni utilizzando un codice C nativo che si interfaccia con il dispositivo USB tramite USBFS. Il grosso problema deriva dalla mancanza di documentazione degli usbf di Linux. Fondamentalmente tutto deve essere fatto tramite ioctls. Detto questo, apri un dispositivo come faresti normalmente da Java. Quindi si passa il descrittore di file da USBDeviceConnection

Aggiungete a ciò che avrete bisogno di analizzare tutti i descrittori USB da soli. È possibile ottenere da loro, di nuovo dal USBDeviceConnection. Saltare dal descrittore al descrittore è semplice trovare la documentazione per ciò che ogni descrittore significa è un mal di testa MASSIVO ma è possibile trovare la maggior parte della documentazione su www.usb.org.

Ho scritto la maggior parte del codice necessario per eseguire l'analisi per i dispositivi audio e ho ottenuto tutto il tempo per provare a inviare un trasferimento isocrono e quindi ho iniziato a ricevere errori.

Dopo il passaggio a libusb ho scoperto che il problema, nel mio caso, era perché il dispositivo audio aveva anche controllori HID e il driver di default è stato atatching a quelli e rubare tutta la banda di distanza dal trasferimento isocrono. Se l'avessi saputo prima, avrei potuto perseverare con il metodo non-root non-libusb. Come è stato ho fatto arrivare i trasferimenti isocroni di lavoro tramite usb lib ma ha richiesto un dispositivo radicata :(

Ad un certo punto andrò di nuovo esso.

In sintesi, sono abbastanza sicuro che la sua possibile, ma la sua non sara 'facile !!

+0

Wou Ti piacerebbe condividere il tuo codice, per quanto incompleto possa essere? – JellicleCat

6

ho scritto una classe Java per il trasferimento di dati isocrono USB sotto Android (o Linux):. UsbIso

utilizza JNA per accedere al USBFS API tramite IOCTL chiama

+0

Puoi dirmi come determinare quale valore fornire come 'altSetting' per la funzione' setInterface'? – JellicleCat

+1

@JellicleCat È possibile utilizzare 'lsusb -v -d xxxx: xxxx' (Linux) o' USBView' (Windows) per elencare il descrittore di dispositivo del dispositivo USB. Lì si trovano i valori di Impostazione alternata supportati dal dispositivo. Se hai Android 5.0 o più recente, puoi usare UsbInterface.getAlternateSetting(). –

+0

Grazie. Mi chiedo se potresti fornire qualche consiglio sul messaggio di errore "Dispositivo o risorsa occupato" che ricevo quando provo a creare un'istanza di 'UsbIso'. Ho scritto i dettagli di questo problema come un thread separato: http://stackoverflow.com/questions/37356148/android-app-device-or-resource-busy-when-accessing-usb-device-via-jna – JellicleCat