Android & libusb 提交 ISOC 传输错误

标签 android usb libusb

我使用 libusb-1.0.9 和 NDK (Android 4.0.4+) 编写 Android 应用程序,它必须从 USB 声卡读取音频数据。 libusb 中的 USB 设备成功打开,并且可以接收所有接口(interface)/端点列表。但是在进行 ISOC 传输时,我遇到了以下不清楚的错误:

调试传输的C代码:

static uint8_t buf[12];

static void cb_xfr(struct libusb_transfer *xfr)
{
     LOGD("USB callback\n");
     libusb_free_transfer(xfr);
}

JNIEXPORT jlong JNICALL
Java_com_usbtest_libusb_Libusb_makeISOCTransfer(JNIEnv *env, jobject this, jlong ms) 
{
      static struct libusb_transfer *xfr;
      int num_iso_pack = 1;
      unsigned char ep = 0x84;

       xfr = libusb_alloc_transfer(num_iso_pack);
       if (!xfr)  {
               LOGD("libusb_alloc_transfer: errno=%d\n", errno);
               return -1000;
       }

       LOGD("libusb_fill_iso_transfer: ep=%x, buf=%d, num iso=%d\n", ep, sizeof(buf), num_iso_pack);
       libusb_fill_iso_transfer(xfr, handle, ep, buf, sizeof(buf), num_iso_pack, cb_xfr, NULL, 0);
       libusb_set_iso_packet_lengths(xfr, sizeof(buf)/num_iso_pack);
       int res = libusb_submit_transfer(xfr);
       LOGD("libusb_submit_transfer: %d, errno=%d\n", res, errno);
       struct timeval tv;
       tv.tv_sec = 1;
       tv.tv_usec = 0;
       libusb_handle_events_timeout(NULL, &tv);
       return res;
}

调用 libusb_submit_transfer 后,我收到一个错误:libusb_submit_transfer: -1, errno -2 和短信:

 need 1 32k URBs for transfer
 first URB failed, easy peasy

EndPoint 0x84 对于音频输入来说是正确的。 buf[] size = 12 - 对应于该 EndPoint 的字段 wMaxPacketSize。我请求 1 次转账。 xfr->status字段=0,但不引起回调。 我认为有必要将buf缓冲区增加到32K - 我增加了,但没有帮助。 我尝试增加转账数量。同样的错误。 请提示我哪里可能有错误?

最佳答案

我找到了这个问题的解决方案。 在本主题中http://en.it-usenet.org/thread/14995/14985/有一个类似的问题,并且决定似乎对设备 HID USB 接口(interface)进行分离。

I've used libusb_detach_kernel to detach the 2 hid drivers and submit transfer returned 0!!

在设备打开后,我为设备的所有接口(interface)(0..3)制作了libusb_detach_kernel_driver(handle, interface),并且由于libusb_submit_transfer返回>转移成功

关于Android & libusb 提交 ISOC 传输错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16958257/

相关文章:

linux - libusb 无法声明设备

Java usb4java在Windows 10平台上从USB设备读取

android - Libgdx - 最大 Sprite 数

Android - 使用 xml 绘制复选图标

format - Google Play的FT311D配件启动应用程序

windows - 当您插入新的 USB 设备时会发生什么?

c - 为什么 `libusb_bulk_transfer'返回0?

android - 在 IMAP 中存储邮件的附加数据

javascript - 在 react native 应用程序中保留 Firebase 数据

android - 致命信号 11 (SIGSEGV)、代码 1 (SEGV_MAPERR)、故障地址 0xe9103aa560080 in tid 31072 (ReferenceQueueD)、pid 31058