【问题标题】:Android USB isochronous data transferAndroid USB 同步数据传输
【发布时间】:2019-08-04 04:36:46
【问题描述】:

我目前正在尝试在我的 Android 3.2 平板电脑(支持主机模式)上的同步端点上找到一种处理 USB 数据传输的方法。在编写了一些原型代码后,我注意到在 USB_ENDPOINT_XFER_ISOC 的常量文件中声明“同步端点类型(当前不支持)”。

在不root设备的情况下这可能吗?如果是这样,我该怎么做?

理想情况下,我希望留在 java API 中,但如果这只能通过 NDK 实现,我将不得不这样做。根据以下帖子,我也了解到可能存在一些 USB 带宽问题:User mode USB isochronous transfer from device-to-host

【问题讨论】:

    标签: android usb


    【解决方案1】:

    我写了一个Java类,用于Android(或Linux)下的USB同步数据传输:UsbIso

    它使用JNA 通过IOCTL 调用访问USBFS API。

    【讨论】:

    • 你能告诉我如何确定为函数altSetting 提供什么值setInterface?
    • @JellicleCat 您可以使用lsusb -v -d xxxx:xxxx (Linux) 或USBView (Windows) 列出USB 设备的设备描述符。在那里您可以找到设备支持的 AlternateSetting 值。如果您有 Android 5.0 或更高版本,则可以使用 UsbInterface.getAlternateSetting()。
    • @Parth 您必须从android-arm.jar 中提取 libjnidispatch.so 并将其添加到您的 Android 项目中。
    • @Parth 您不能将bulkTransfer() 与同步端点一起使用。如果您有支持批量传输的设备,则不需要UsbIso。但是如果你想从一个同步端点读取,你必须使用UsbIso.getRequest()。这些步骤在UsbIso 和UsbIso.Request 的API 文档中进行了描述。
    • @moictab Peter Stoiber 和 Matthias Bläsing 已修改 UsbIso 以在 64 位环境中工作:UsbIso64
    【解决方案2】:

    我相信,你“可以”在没有 root 的情况下做到这一点。

    您需要使用一些使用 USBFS 与 USB 设备连接的本机 C 代码来完成这一切。最大的问题来自缺乏 linux 的 usbfs 的文档。基本上一切都必须通过 ioctl 完成。也就是说,您确实像通常从 Java 一样打开设备。然后你从USBDeviceConnection 传递文件描述符

    此外,您还需要自己解析所有 USB 描述符。您可以再次通过USBDeviceConnection 找到它们。从描述符跳转到描述符很简单,查找每个描述符的含义的文档非常令人头疼,但您可以在 www.usb.org 上找到大部分文档。

    我已经编写了解析音频设备所需的大部分代码,并且一直尝试提交同步传输,然后开始出现错误。

    切换到 libusb 后,我发现问题在于,在我的情况下,音频设备也有 HID 控制器,而默认驱动程序正在连接这些控制器并从同步传输中窃取所有带宽。如果我早点知道这一点,我可能会坚持使用非根非 libusb 方法。因为我确实通过 lib usb 进行了同步传输,但它需要一个有根设备:(

    在某个时候我会回到它。

    总之,我很确定它是可能的,但它并不容易!

    【讨论】:

    • 您是否愿意分享您的代码,尽管它可能不完整?
    【解决方案3】:

    你可以在我的 git hub repo 上找到一个可运行的 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 位设备。

    到目前为止,

    彼得

    【讨论】:

      猜你喜欢
      • 2013-11-04
      • 1970-01-01
      • 2012-05-12
      • 2013-05-31
      • 2014-02-13
      • 2010-11-23
      • 2012-12-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多