2015-07-07 6 views
6

У меня есть проблема выключая чисто мое приложение, которое использует Linux libusb (ядро не вернуть интерфейс):`не libusb_attach_kernel_driver` работает

int rc; 

rc = libusb_reset_device(handle_); 
if (rc < 0) { 
    cerr << "Error resetting the device: " << libusb_error_name(rc); 
} 

for (int ifnum = 0; ifnum < 2; ifnum++) { 
    rc = libusb_release_interface(handle_, ifnum); 
    if (rc < 0) { 
     cerr << "Error releasing interface: " << libusb_error_name(rc); 
    } 
    if (libusb_kernel_driver_active(handle_, ifnum)) { 
     cerr << "Reattaching CDC ACM kernel driver."; 
     rc = libusb_attach_kernel_driver(handle_, ifnum); 
     if (rc < 0) { 
      cerr << "Error reattaching CDC ACM kernel driver: " << libusb_error_name(rc); 
     } 
    } 
} 

libusb_close(handle_); 
libusb_exit(NULL); 

Проблема заключается в том, что реплантации драйвер ядра не работает , Фактически libusb_kernel_driver_active не возвращает 1, но даже если я прокомментирую его и всегда звоню libusb_attach_kernel_driver, я никогда не верну свое устройство /dev/ttyACM0. В этом случае я получаю LIBUSB_ERROR_NOT_FOUND.

+0

, пожалуйста, используйте libusb_set_debug() для многословия. –

ответ

1

Я отлаживал код прикрепления драйвера linux cdc-acm, и я выяснил причину проблемы. Причиной повторного подключения не является то, что я требовал как интерфейс управления, так и интерфейс данных устройства CDC ACM. Если я отсоединяю/присоединяю только интерфейс управления (ifnum == 0), тогда все работает так, как ожидалось. Это должно быть документировано где-то.