2012-06-18 48 views
8
libusb

मैं libusb उपयोग करने के लिए कोशिश कर रहा हूँ से 'इंटरफ़ेस का दावा नहीं किया', लेकिन मैं निम्नलिखित त्रुटि संदेश प्राप्त कर रहा हूँ:त्रुटि संदेश

usbfs: प्रक्रिया 24,665 (MyProgram) इंटरफेस 0 दावा नहीं किया था उपयोग

से पहले

मुझे वास्तव में समझ में नहीं आता है, क्योंकि जहां तक ​​मैं कह सकता हूं, मैं पुस्तकालय में दिए गए विवरण के अनुसार कर रहा हूं। यहां मेरा कोड है:

#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; 
} 

जैसा कि आप देख सकते हैं, मैं स्थानांतरण से पहले इंटरफ़ेस का दावा करता हूं। (मैंने अन्य यूएसबी उपकरणों के साथ एक ही कोड की कोशिश की है, बस अगर उसके साथ कुछ करने के लिए कुछ होगा।)

मैं libusb-1.0.9 का उपयोग कर रहा हूं, जो नवीनतम रिलीज है जो मुझे मिल सकता है। मैं इस बात को Ubuntu12.04_64 (सटीक पांगोलिन) पर चला रहा हूं।

+0

क्या यह अनुमति समस्या हो सकती है? क्या आपने अपने कार्यक्रम को 'सुडो' के साथ चलाने की कोशिश की है? – gfour

+0

हां, मैंने सुडो की कोशिश की। जैसे-जैसे यह निकलता है, सबकुछ ठीक काम करता प्रतीत होता है, इसलिए मुझे लगता है कि संदेश त्रुटि या चेतावनी के बजाए जानकारी को बुरी तरह से प्रस्तुत किया गया है। मैं अभी भी समझना चाहता हूं कि मुझे संदेश क्यों मिलता है, हालांकि। – Robert

+0

[इस समाधान को देखें] (http://stackoverflow.com/questions/22011760/libusb-claim-interface-access-denied-java/39269489#39269489)। यह मदद कर सकता है। –

उत्तर

1

आपको सभी परिणाम मूल्यों की जांच करनी चाहिए, तो आप आसानी से पता लगा सकते हैं कि क्या गलत हो रहा है। यदि वे आपकी अपेक्षाओं को वापस लौटते हैं तो बस सभी परिणाम मूल्यों की जांच करें।

सत्यापित करें:

  • libusb_open LIBUSB_SUCCESS वापसी करता है?
  • क्या libusb_kernel_driver_active वापसी 0 या 1, त्रुटि कोड नहीं है?
  • क्या libusb_detach_kernel_driver LIBUSB_SUCCESS लौटाता है?
  • क्या libusb_claim_interface वापस LIBUSB_SUCCESS है?
+0

libusb_detach_ कर्नेल रिटर्न LIBUSB_ERROR_OTHER। बहुत उपयोगी त्रुटि संदेश नहीं है। – Robert

+1

क्या आपके विशेषाधिकार ओके हैं? क्या आप अपना प्रोग्राम रूट या सामान्य उपयोगकर्ता के रूप में चलाते हैं? यदि आप अपने प्रोग्राम को सामान्य उपयोगकर्ता के रूप में चलाते हैं तो सुनिश्चित करें कि आपके पास डिवाइस फ़ाइल तक पहुंच है। – Reinder

3

libusb से कुछ और डीबग जानकारी प्राप्त करने के लिए calling libusb_set_debug(context, where_to) आज़माएं।

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 

यह libusb documentation जो काफी अच्छा है से है: संदेशों के लिए where_to एक पूर्णांक है।

मैं कोड जहां त्रुटि संदेश देखा ठीक भाग गया, लेकिन आंतरिक रूप से यह खबर दी है कि किसी अन्य प्रक्रिया उस पर एक विशेष दावा किया था, इसलिए मैं इसका इस्तेमाल नहीं कर सका।

3

बस libusb-1.0 के साथ एक ही समस्या थी; मैं मूल रूप से इस अनुक्रम था:

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 
... 

... और इसके लिए, जब पहली libusb_bulk_transfer मार डाला (लेकिन बाद में नहीं हैं, ऊपर नहीं दिखाया गया है) "का दावा नहीं किया इंटरफेस" जनरेट किया गया था, मैं में कदम से इसकी पुष्टि जो gdb। (btw, कि त्रुटि संदेश /linux/drivers/usb/core/devio.c से आता है)

यह पृष्ठ: USB Hid Issue · Yubico/yubikey-personalization Wiki · GitHub जो इसी "detach_driver" समारोह कहा जाता libusb-0.1 के लिए एक ठीक करने के लिए संदर्भित करता है; तो मैं भी मेरे कोड में चारों ओर "detach_driver" भाग में बढ़ने लगी - और अंत में इस क्रम संदेश "दावा नहीं किया इंटरफेस" से छुटकारा पाने के लिए लगता है:

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 
... 

जाहिर है, अगर चालक पहले अलग है, और उसके बाद इंटरफेस का दावा किया जाता है - तब कोई त्रुटि उत्पन्न नहीं होती है।लेकिन वह भी है कि क्या तुम वहाँ ओपी में है - इसलिए मुझे लगता है, ओ पी के लिए चाल तो detach है, set configuration होगा, और कि claim interface ...

आशा के बाद यह मदद करता है,
चीयर्स!

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^