2012-06-18 41 views
8

Tôi đang cố gắng sử dụng libusb, nhưng tôi nhận được thông báo lỗi sau:Thông báo lỗi 'Giao diện không tuyên bố' từ libusb

usbfs: quá trình 24.665 (myprogram) không tuyên bố giao diện 0 trước khi sử dụng

Tôi thực sự không hiểu tại sao, bởi vì theo như tôi có thể nói, tôi đang làm theo mô tả được tìm thấy trong thư viện. Đây là mã của tôi:

#include <stdio.h> 
#include <stdlib.h> 
#include <sys/types.h> 

#include <libusb.h> 

int main(void) 
{ 
    int result; 
    struct libusb_device_descriptor desc; 
    libusb_device **list; 
    libusb_device *my_device = NULL; 

    result = libusb_init(NULL); 
    libusb_set_debug(NULL, 3); 

    ssize_t count = libusb_get_device_list(NULL, &list); 
    for (int i = 0; i < count; i++) { 
     libusb_device *device = list[i]; 
     result = libusb_get_device_descriptor(device, &desc); 
     if((desc.idVendor == 0x03f0) && (desc.idProduct == 0x241d)) { 
      my_device = device; 
      break; 
     } 
    } 

    if(my_device != NULL) { 
     libusb_device_handle *handle; 
     result = libusb_open(my_device, &handle); 
     int kernelActive = libusb_kernel_driver_active(handle, 0); 
     if(kernelActive == 1) { 
      result = libusb_detach_kernel_driver(handle, 0); 
     } 
     result = libusb_claim_interface (handle, 0); 
     result = libusb_control_transfer(handle,0x21,34,0x0003,0,NULL,0,0); 
     result = libusb_release_interface (handle, 0); 

     if(kernelActive == 1) { 
      result = libusb_attach_kernel_driver(handle, 0); 
     } 
     libusb_close(handle); 
    } 
    libusb_free_device_list(list, 1); 
    libusb_exit(NULL); 
    return EXIT_SUCCESS; 
} 

Như bạn thấy, tôi yêu cầu giao diện trước khi chuyển. (Tôi cũng đã thử cùng một mã với các thiết bị USB khác, chỉ trong trường hợp có liên quan đến nó.)

Tôi đang sử dụng libusb-1.0.9, đây là bản phát hành mới nhất mà tôi có thể tìm thấy. Tôi đang chạy điều này trên Ubuntu12.04_64 (Chính xác tê tê).

+0

Có thể là sự cố về quyền không? Bạn đã thử chạy chương trình của bạn với 'sudo' chưa? – gfour

+0

Vâng, tôi đã thử sudo. Khi nó quay ra, tất cả mọi thứ dường như làm việc ok, vì vậy tôi giả định rằng tin nhắn chỉ là thông tin trình bày xấu, chứ không phải là một lỗi hoặc một cảnh báo. Tôi vẫn rất muốn hiểu tại sao tôi nhận được tin nhắn, mặc dù. – Robert

+0

[Xem giải pháp này] (http://stackoverflow.com/questions/22011760/libusb-claim-interface-access-denied-java/39269489#39269489). Nó có thể giúp. –

Trả lời

1

Bạn nên kiểm tra tất cả các giá trị kết quả, sau đó bạn có thể dễ dàng tìm ra những gì đang xảy ra. Chỉ cần kiểm tra tất cả các giá trị kết quả nếu chúng trả về những gì bạn mong đợi.

Verify:

  • Liệu libusb_open trở LIBUSB_SUCCESS?
  • libusb_kernel_driver_active có trả về 0 hoặc 1, không phải mã lỗi không?
  • libusb_detach_kernel_driver có trả về LIBUSB_SUCCESS không?
  • Libusb_claim_interface có trả về LIBUSB_SUCCESS không?
+0

libusb_detach_kernel trả về LIBUSB_ERROR_OTHER. Không phải là thông báo lỗi rất hữu ích. – Robert

+1

Đặc quyền của bạn là oke? Bạn có chạy chương trình của bạn như là người chủ hoặc là một người dùng bình thường? Trong trường hợp bạn chạy chương trình của mình với tư cách là người dùng bình thường, hãy đảm bảo bạn có quyền truy cập vào tệp thiết bị. – Reinder

3

Hãy thử calling libusb_set_debug(context, where_to) để nhận thêm một số thông tin gỡ lỗi từ libusb. Nơi_đối với các tin nhắn là một số nguyên:

Level 0: no messages ever printed by the library (default) 
Level 1: error messages are printed to stderr 
Level 2: warning and error messages are printed to stderr 
Level 3: informational messages are printed to stdout, warning and error messages are printed to stderr 

Đây là từ libusb documentation, điều này khá tốt.

Tôi chạy mã nơi các thông báo lỗi có vẻ tốt, nhưng nội bộ nó báo cáo rằng một số quy trình khác có một yêu cầu độc quyền về nó, vì vậy tôi không thể sử dụng nó.

3

Chỉ gặp vấn đề tương tự với libusb-1.0; Tôi ban đầu đã có chuỗi này:

libusb_init 
libusb_open_device_with_vid_pid 
libusb_reset_device 
libusb_get_device 
libusb_reset_device 
libusb_set_configuration 
libusb_claim_interface 
libusb_set_interface_alt_setting 
libusb_get_device_descriptor 
libusb_get_bus_number 
libusb_get_device_address 
libusb_get_string_descriptor_ascii 
if(libusb_kernel_driver_active..) 
    if(libusb_detach_kernel_driver..) 
libusb_bulk_transfer 
... 

... và cho nó, "giao diện không tuyên bố" đã được tạo ra khi các libusb_bulk_transfer đầu tiên thực hiện (nhưng không phải những người tiếp theo, không hiển thị ở trên), mà tôi khẳng định bởi bước trong gdb. (btw, mà thông báo lỗi xuất phát từ /linux/drivers/usb/core/devio.c)

trang này: USB Hid Issue · Yubico/yubikey-personalization Wiki · GitHub đề cập đến một bản sửa lỗi cho libusb-0.1 mà gọi là "detach_driver" chức năng tương ứng; vì vậy tôi bắt đầu di chuyển "detach_driver" phần xung quanh trong mã của tôi quá - và cuối cùng trình tự này dường như để thoát khỏi "giao diện không tuyên bố" tin nhắn:

libusb_init 
libusb_open_device_with_vid_pid 
if(libusb_kernel_driver_active..) 
    if(libusb_detach_kernel_driver..) 
libusb_reset_device 
libusb_get_device 
libusb_set_configuration 
libusb_claim_interface 
libusb_set_interface_alt_setting 
libusb_get_device_descriptor 
libusb_get_bus_number 
libusb_get_device_address 
libusb_get_string_descriptor_ascii 
libusb_bulk_transfer 
... 

Rõ ràng, nếu người lái xe đầu tiên được tách ra, và sau đó giao diện được xác nhận - sau đó không có lỗi nào được tạo.Nhưng đó cũng là những gì bạn có trong OP có - vì vậy tôi nghĩ rằng, các trick cho OP sẽ có detach, sau đó set configuration, và sau đó claim interface ...

Hope this helps,
Cheers!

Các vấn đề liên quan