2013-06-06 2 views
2

Я пишу приложение Android, используя libusb-1.0.9 и NDK (Android 4.0.4+), которые должны считывать аудиоданные с USB-аудиокарты. Устройство USB из libusb открывается успешно, и для него можно получить все интерфейсы/список EndPoint. Но, делая передачу ISOC я столкнулся со следующей неясную ошибку мне:Android и libusb отправить Ошибка передачи ISOC

Debugging 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, -2 ERRNO И текстовые сообщения:

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

EndPoint 0x84 подходит для аудио-входа. Размер buf [] = 12 - соответствует полю wMaxPacketSize этого EndPoint. Я прошу 1 передачу. Поле xfr-> status = 0, но обратный вызов не вызван. Я думал, что нужно увеличить буфер буфера до 32K - я увеличился, но это не помогло. Я пытался увеличить количество переводов. Такая же ошибка. Подскажите, пожалуйста, в чем может быть ошибка?

ответ

1

Я нашел решение этой проблемы. В этом топике http://en.it-usenet.org/thread/14995/14985/ был аналогичный вопрос, и, как выяснилось, было принято решение отсоединиться для интерфейсов USB HID устройства.

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

Я сделал libusb_detach_kernel_driver (ручка, интерфейс) для всех интерфейсов устройства (0..3) после открытия устройства, а также в результате libusb_submit_transfer возврата УСПЕХ передачи.

Смежные вопросы