我目前正试图找到一种方法来处理我的Android 3.2平板电脑上的等时端点上的USB数据传输(支持主机模式)。在编写了一些原型代码之后,我注意到在USB_ENDPOINT_XFER_ISOC的常量文件中声明了“等时端点类型(当前不支持)”。
这可能在没有设备生根的情况下实现吗?如果是这样,我该如何做呢?
理想情况下,我希望保留在Java API中,但如果只能通过NDK实现这一点,我将不得不追求它。我也理解根据以下帖子可能存在一些USB带宽问题:User mode USB isochronous transfer from device-to-host
答案 0 :(得分:7)
答案 1 :(得分:6)
我相信,你可以“没有根”做到这一点。
您需要使用一些使用USBFS与USB设备连接的本机C代码来完成所有操作。最大的问题来自缺乏linux的usbfs文档。基本上一切都必须通过ioctls来完成。这就是说你打开设备就像通常用Java一样。然后从USBDeviceConnection
传递文件描述符除此之外,您还需要自己解析所有USB描述符。你可以再次从USBDeviceConnection获得它们。从描述符跳转到描述符很简单,找到每个描述符意味着什么是大量头痛的文档,但是你可以在www.usb.org上找到大部分文档。
我已经编写了解析音频设备所需的大部分代码,并且我一直试图提交等时传输然后开始出错。
在切换到libusb之后,我发现问题,在我的情况下,是因为音频设备也有HID控制器,默认驱动程序正在攻击那些并且从同步传输中窃取所有带宽。如果我早些知道这一点,我可能已经坚持使用非root非libusb方法。因为我确实通过lib usb获得同步传输,但它需要一个有根设备:(
在某些时候我会回到它。
总之,我很确定它有可能,但它并不容易!
答案 2 :(得分:1)
您可以在git hub仓库中找到UsbIso 64位的可运行解决方案: https://github.com/Peter-St/Android-UVC-Camera/tree/master/app/src/main/java/humer/uvc_camera/UsbIso64
您需要UsbIso64文件夹的全部5个文件,并且可以使用USBIso,如下所示:
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();
您可以将此版本的UsbIso与32位和64位设备一起使用。
到目前为止,
彼得