2012-01-17 19 views
6

Actualmente estoy tratando de encontrar una manera de manejar la transferencia de datos USB en un punto final isócrono en mi tableta Android 3.2 (Modo de host compatible). Después de escribir un código de prototipo, noté que en el archivo de constantes para USB_ENDPOINT_XFER_ISOC se indica que "Tipo de punto extremo isócrono (actualmente no compatible)".Android isócrono transferencia de datos USB

¿Esto es posible sin enrutar el dispositivo? Si es así, ¿cómo voy a hacer esto?

Idealmente esperaba permanecer dentro de la API de Java, pero si esto solo es posible a través del NDK, tendría que buscarlo. También entiendo que puede haber algunos problemas de ancho de banda USB basados ​​en la siguiente publicación: User mode USB isochronous transfer from device-to-host

Respuesta

5

"Puede" hacerlo sin root, creo.

Tendrá que hacer todo esto utilizando algún código C nativo que haga interfaz con el dispositivo USB que utiliza USBFS. El gran problema proviene de la falta de documentación de los usbfs de Linux. Básicamente todo tiene que hacerse a través de ioctls. Dicho esto, abres un dispositivo como lo harías normalmente desde Java. A continuación, pase el descriptor de archivo del USBDeviceConnection

Agregue a eso necesitará analizar todos los descriptores USB usted mismo. Puede llegar a ellos, nuevamente desde el USBDeviceConnection. Saltar del descriptor al descriptor es simple, encontrar la documentación de lo que significa cada descriptor es un dolor de cabeza MASIVO, pero puede encontrar la mayoría de la documentación en www.usb.org.

He escrito la mayor parte del código que se requiere para hacer el análisis sintáctico para dispositivos de audio y llegué hasta intentar enviar una transferencia isócrona y luego empecé a recibir errores.

Después de cambiar a libusb descubrí que el problema, en mi caso, era porque el dispositivo de audio también tenía controladores HID y el controlador predeterminado atacaba a esos y robaba todo el ancho de banda de la transferencia isócrona. Si hubiera sabido esto antes, podría haber perseverado con el método no raíz no libusb. Como era me hizo llegar las transferencias isócronas de trabajo a través del USB lib pero requiere un dispositivo arraigada :(

En algún momento voy a volver a ella.

En resumen, estoy bastante seguro de su posible pero su no va a ser fácil !!

+0

Wou ¿Desea compartir su código, por incompleto que sea? – JellicleCat

6

he escrito una clase Java para la transferencia de datos isócrona USB en Android (o Linux):. UsbIso

Se utiliza JNA para acceder a la API a través de USBFS IOCTL llama

+0

¿Puede decirme cómo determinar qué valor proporcionar como 'altSetting' para la función' setInterface'? – JellicleCat

+1

@JellicleCat Puede usar 'lsusb -v -d xxxx: xxxx' (Linux) o' USBView' (Windows) para listar el descriptor de dispositivo de su dispositivo USB. Allí encontrará los valores AlternateSetting admitidos por el dispositivo. Si tiene Android 5.0 o posterior, puede usar UsbInterface.getAlternateSetting(). –

+0

Gracias. Me pregunto si podría proporcionar algún consejo sobre el mensaje de error "Dispositivo o recurso ocupado" que recibo cuando intento crear una instancia de 'UsbIso'. He escrito los detalles de este problema como un hilo separado: http://stackoverflow.com/questions/37356148/android-app-device-or-resource-busy-when-accessing-usb-device-via-jna – JellicleCat

Cuestiones relacionadas