2015-07-07 9 views
6

mam problem wyłączania czysto mojej aplikacji systemu Linux, który wykorzystuje libusb (jądro nie odzyskać interfejs):`nie libusb_attach_kernel_driver` pracy

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); 

Problem polega na tym, że doczepić sterownik jądra nie działa . Właściwie libusb_kernel_driver_active nie zwraca 1, ale nawet jeśli skomentuję to i zawsze zadzwonię pod numer libusb_attach_kernel_driver, nigdy nie otrzymam mojego urządzenia /dev/ttyACM0. W takim przypadku otrzymam LIBUSB_ERROR_NOT_FOUND.

+0

użyj libusb_set_debug(), aby uzyskać szczegółowość. –

Odpowiedz

1

Mam debugowane kodowanie sterownika cdc-acm dla Linux-a i znalazłem przyczynę problemu. Powodem, dla którego ponowne podłączenie nie działa, jest to, że żądałem zarówno interfejsu kontrolnego, jak i danych urządzenia CDC ACM. Jeśli odłączę/dołączę tylko interfejs kontrolny (ifnum == 0), wszystko działa zgodnie z oczekiwaniami. To powinno być udokumentowane gdzieś.