2015-07-07 8 views
6
Arbeits

Ich habe ein Problem sauber Anwendung meine Linux herunterzufahren, die libusb verwendet (der Kernel zurückzufordern nicht die Schnittstelle):`libusb_attach_kernel_driver` nicht

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

Das Problem ist, dass die der Kernel-Treiber reattaching funktioniert nicht . Eigentlich libusb_kernel_driver_active nicht zurück 1, aber selbst wenn ich es auskommen und immer libusb_attach_kernel_driver aufrufen, bekomme ich nie mein /dev/ttyACM0 Gerät zurück. In diesem Fall bekomme ich LIBUSB_ERROR_NOT_FOUND.

+0

Verwenden Sie bitte libusb_set_debug() für die Ausführlichkeit. –

Antwort

1

Ich habe den Linux-CDC-Acm-Treiber-Attach-Code debugged und ich habe die Ursache des Problems herausgefunden. Der Grund für die Nichtanbringung ist, dass ich sowohl die Kontroll- als auch die Datenschnittstelle des CDC ACM-Geräts beanspruche. Wenn ich nur die Steuerschnittstelle abtrenne/anhänge (ifnum == 0), dann funktioniert alles wie erwartet. Dies sollte irgendwo dokumentiert werden.