2

libusb-1.0.9 と NDK (Android 4.0.4+) を使用して Android アプリケーションを作成し、USB オーディオカードからオーディオ データを読み取る必要があります。libusb からの USB デバイスが正常に開き、すべてのインターフェイス/EndPoint リストを受け取ることができます。しかし、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[] サイズ = 12 - この EndPoint のフィールド wMaxPacketSize に対応します。1回の振込をお願いします。xfr->status = 0 のフィールドですが、コールバックは発生しません。buf バッファを 32K に増やす必要があると思いました - 増やしましたが、役に立ちませんでした。転送量を増やしてみました。同じエラー。エラーが発生する可能性があることを教えてください。

4

1 に答える 1

1

この問題の解決策を見つけました。このトピックhttp://en.it-usenet.org/thread/14995/14985/にも同様の質問があり、デバイス HID USB インターフェイスのデタッチを決定したようです。

libusb_detach_kernel を使用して 2 つの hid ドライバーを切り離し、0 を返した転送を送信しました!!

デバイスオープン後、デバイス(0..3)の全てのインターフェースに対してlibusb_detach_kernel_driver(handle, interface)を作成し、libusb_submit_transferの結果、転送成功返しました。

于 2013-06-07T09:47:21.377 に答える