2012-01-17 2 views
6

В настоящее время я пытаюсь найти способ обработки передачи данных через USB на изохронной конечной точке на моем планшете Android 3.2 (поддерживается режим хоста). После написания кода прототипа я заметил, что в файле констант для USB_ENDPOINT_XFER_ISOC указано, что «Тип изохронной конечной точки (в настоящее время не поддерживается)».Android isochronous data transfer

Возможно ли это без укорачивания устройства? Если да, то как мне это сделать?

В идеале я надеялся остаться в java API, но если это возможно только через NDK, я должен был бы это сделать. Я также понимаю, что могут возникнуть некоторые проблемы с пропускной способностью USB, основанные на следующем сообщении: User mode USB isochronous transfer from device-to-host

ответ

5

Вы «можете» сделать это без корня, я верю.

Вам нужно будет сделать все это, используя собственный интерфейс кода C с USB-устройством с использованием USBFS. Большая проблема связана с отсутствием документации по USB-файлам linux. В основном все должно быть сделано через ioctls. Тем не менее, вы открываете устройство, как обычно, с Java. Затем вы передаете дескриптор файла из USBDeviceConnection

Добавьте к этому, что вам нужно будет разобрать все дескрипторы USB самостоятельно. Вы можете получить их, снова от USBDeviceConnection. Переход от дескриптора к дескриптору - это простой поиск документации, для которой каждый дескриптор означает МАССИВНУЮ головную боль, но вы можете найти большую часть документации на www.usb.org.

Я написал большую часть кода, который требуется для синтаксического анализа аудиоустройств, и я добрался до попытки отправить изохронную передачу, а затем начал получать ошибки.

После перехода на libusb я обнаружил, что проблема в моем случае заключалась в том, что в аудиоустройстве также были контроллеры HID и драйвер по умолчанию, и он крал всю полосу пропускания от изохронной передачи. Если бы я знал это раньше, я мог бы продолжать использовать метод non-root non-libusb. Как это было, я действительно получал изохронными переводы работающих через Lib USB, но это требуется корневое устройство :(

В какой-то момент я вернусь к нему.

В общем, я уверен, что его можно, но его не будет легко !!

+0

Wou Не хотите ли вы поделиться своим кодом, каким бы неполным он ни был? – JellicleCat

6

Я написал класс Java для передачи USB изохронны данных под Android (или Linux):. UsbIso

Он использует JNA для доступа к API USBFS через IOCTL называет

+0

Можете ли вы рассказать мне, как определить, какое значение следует предоставлять как 'altSetting' для функции' setInterface'? – JellicleCat

+1

@JellicleCat Вы можете использовать 'lsusb -v -d xxxx: xxxx' (Linux) или' USBView' (Windows), чтобы отобразить дескриптор устройства вашего USB-устройства. Там вы найдете значения AlternateSetting, поддерживаемые устройством. Если у вас Android 5.0 или новее, вы можете использовать UsbInterface.getAlternateSetting(). –

+0

Спасибо. Интересно, можете ли вы предоставить какие-либо рекомендации по сообщению об ошибке «Device or resource busy», которое я получаю при попытке создать экземпляр 'UsbIso'. Я написал подробности этой проблемы как отдельный поток: http://stackoverflow.com/questions/37356148/android-app-device-or-resource-busy-when-accessing-usb-device-via-jna – JellicleCat