glyph5
glyph5

Reputation: 121

Android USB isochronous data transfer

I am currently trying to find a way to handle USB data transfer on an isochronous endpoint on my Android 3.2 tablet (Host Mode supported). After writing some prototype code, I noticed that in the constants file for USB_ENDPOINT_XFER_ISOC states that "Isochronous endpoint type (currently not supported)".

Is this possible without rooting the device? If so how would I go about doing this?

Ideally I was hoping to stay within the java API, but if this is possible only via the NDK I would have to pursue that instead. I also understand that there might be some USB bandwidth issues based on the following post: User mode USB isochronous transfer from device-to-host

Upvotes: 6

Views: 6936

Answers (3)

Peter Stoiber
Peter Stoiber

Reputation: 11

you can find a runnable Solution of the UsbIso 64 bit on my git hub repo: https://github.com/Peter-St/Android-UVC-Camera/tree/master/app/src/main/java/humer/uvc_camera/UsbIso64

You need all 5 files of the UsbIso64 folder and can use the USBIso like following:

USBIso usbIso64 = new USBIso(camDeviceConnection.getFileDescriptor(), packetsPerRequest, maxPacketSize, (byte) camStreamingEndpoint.getAddress());
usbIso64.preallocateRequests(activeUrbs);

usbdevice_fs_util.setInterface(camDeviceConnection.getFileDescriptor(), camStreamingInterface.getId(), altSetting);
usbIso64.submitUrbs();
// While loop //
USBIso.Request req = usbIso64.reapRequest(true);
req.initialize();
req.submit();

You can use this version of UsbIso with 32 and 64 bit devices.

So far,

Peter

Upvotes: 1

Christian d'Heureuse
Christian d'Heureuse

Reputation: 5630

I have written a Java class for USB isochronous data transfer under Android (or Linux): UsbIso

It uses JNA to access the USBFS API via IOCTL calls.

Upvotes: 7

Goz
Goz

Reputation: 62323

You "can" do it without root, I believe.

You'll need to do it all using some native C code interfacing with the USB device using USBFS. The big issue comes from the lack of documentation of linux's usbfs. Basically everything has to be done through ioctls. That said you do open a device as you would normally from Java. Then you pass the file descriptor from the USBDeviceConnection

Add to that you will need to parse all the USB descriptors yourself. You can get at them, again from the USBDeviceConnection. Jumping from descriptor to descriptor is simple finding the documentation for what each descriptor means is a MASSIVE headache but you can find most of the documentation on www.usb.org.

I've written most of the code that is required to do the parsing for audio devices and I got all the way up to trying to submit an isochronous transfer and then started getting errors.

After switching to libusb I discovered that the problem, in my case, was because the audio device also had HID controllers and the default driver was atatching to those and stealing all the bandwidth away from the isochronous transfer. Had I known this earlier I might have persevered with the non-root non-libusb method. As it was I did get isochronous transfers working through lib usb but it required a rooted device :(

At some point I'll go back to it.

In summary, I'm pretty sure its possible but its not gonna be easy!!

Upvotes: 6

Related Questions