Problem mit dem Zugriff auf USB-Device in Ubuntu 9.04
-
Hallo,
Ich habe ein einfaches programm zur Verbindung zu einem USB-gerät (in dem Fall ein Usb-stick) geschrieben.
Der Code compiliert einwandfrei und kann problemlos ausgeführt werden.
Der main-Code ist:usb_dev_handle *find_lvr_winusb(); usb_dev_handle* setup_libusb_access() { usb_dev_handle *lvr_winusb; usb_set_debug(255); usb_init(); usb_find_busses(); usb_find_devices(); if(!(lvr_winusb = find_lvr_winusb())) { printf("Couldn't find the USB device, Exiting\n"); } if (usb_set_configuration(lvr_winusb, 1) < 0) { printf("Could not set configuration 1 : \n"); } if (usb_claim_interface(lvr_winusb, INTERFACE) < 0) { printf("Could not claim interface: \n"); } return lvr_winusb; } usb_dev_handle *find_lvr_winusb() { struct usb_bus *bus; struct usb_device *dev; for (bus = usb_busses; bus; bus = bus->next) { for (dev = bus->devices; dev; dev = dev->next) { if (dev->descriptor.idVendor == VENDOR_ID && dev->descriptor.idProduct == PRODUCT_ID ) { usb_dev_handle *handle; printf("lvr_winusb with Vendor Id: %x and Product Id: %x found.\n", VENDOR_ID, PRODUCT_ID); if (!(handle = usb_open(dev))) { printf("Could not open USB device\n"); return NULL; } return handle; } } } return NULL; } int main( int argc, char **argv) { usb_dev_handle *lvr_winusb; if ((lvr_winusb = setup_libusb_access()) == NULL) exit(-1); return 0; }
Nach dem Ausführen des Programms findet er zwar das Device entsprechend des VendorID und ProductID aber er kann das Interface des usb-gerät nicht ansprechen
die makros VendorID, ProductID sowie INTERFACE sind in main.h definiert; Die nötige Header-Dateien auch.Hier ist die Ausgabe des Console:
usb_set_debug: Setting debugging level to 255 (on) usb_os_init: Found USB VFS at /dev/bus/usb usb_os_find_busses: Found 001 usb_os_find_busses: Found 005 usb_os_find_busses: Found 004 usb_os_find_busses: Found 003 usb_os_find_busses: Found 002 usb_os_find_devices: Found 027 on 001 usb_os_find_devices: couldn't get connect info usb_os_find_devices: Found 025 on 001 skipped 1 class/vendor specific interface descriptors usb_os_find_devices: Found 005 on 001 usb_os_find_devices: Found 002 on 001 skipping descriptor 0x21 skipped 1 class/vendor specific endpoint descriptors usb_os_find_devices: Found 001 on 001 error obtaining child information: Inappropriate ioctl for device error obtaining child information: Operation not permitted error obtaining child information: Inappropriate ioctl for device usb_os_find_devices: Found 011 on 005 skipped 1 class/vendor specific interface descriptors usb_os_find_devices: Found 001 on 005 error obtaining child information: Inappropriate ioctl for device usb_os_find_devices: Found 002 on 004 skipped 1 class/vendor specific interface descriptors usb_os_find_devices: Found 001 on 004 error obtaining child information: Inappropriate ioctl for device usb_os_find_devices: Found 002 on 003 skipped 1 class/vendor specific interface descriptors usb_os_find_devices: Found 001 on 003 error obtaining child information: Inappropriate ioctl for device lvr_winusb with Vendor Id: 13fe and Product Id: 3123 found. Could not set configuration 1 : Could not claim interface: usb_os_find_devices: Found 001 on 002 USB error: could not set config 1: Device or resource busy Check that you have permissions to write to 001/027 and, if you don't, that you set up hotplug (http://linux-hotplug.sourceforge.net/) correctly. USB error: could not claim interface 0: Device or resource busy
Ich mir dann gedacht dass es sich um Zugriffrechte handelt um mir dann dieses Befehl im Terminal ausführen lassen:
sudo chown a+w /dev/bus/usb/001/027
Es zeigt aber keine Wirkung! Hat jemand hier ein Idee wie ich das Problem gelöst werden könnte??
Die programmierumgebung ist eclipse.Vielen Dank!!
-
Ist der USB-Stick gemountet?
-
Bei Ubuntu 9.04 lauft automatisch ein Prozess der den USb-Stick mountet denn ein Fenster mit Inhalt vom USB-Stick wird automatisch angezeigt. Mit Recht-Click auf das Fenster könnte ich den USB Stick unmounten.
Hat Irgenjemand ein Idee? Bitte um Hilfe
-
alfonsokame schrieb:
Mit Recht-Click auf das Fenster könnte ich den USB Stick unmounten.
Und wenn du das getan hast, kriegst du dann Zugriff?
-
Hallo,
Erstmal vielen Dank an Rüdiger für die schnelle Reaktion.
Das Problem habe ich gelöst.
Man sollte mehfach (mindestens 2 mal) usb_claim_interface ausführen und wenn es ein negative wert zurückgibt dann sollte man den Device-Treiber für sich behaupten dann klappts!!Ubuntu greift automatich auf das Device in Hintergrund zu. Deswegen ist die Verbindung dann belegt!const int nRetries = 3; int nRet = -1; for( int i = 0; i < nRetries; i++) { if( bClaim) { nRet = usb_claim_interface( h_dev, g_nInterfaceNumber); if( nRet < 0) { cerr << "openUSBDevice: try to claim interface again..." << endl; if( usb_detach_kernel_driver_np( h_dev, g_nInterfaceNumber) < 0) { printf( "failed to detach kernel driver from USB device %s...", g_szIdent); return NULL; } } else { cerr << "openUSBDevice: claimed interface successfully" << endl; break; } }
-
Hallo alfonsokame,
ich versuche gerade mich in den USB zugriff unter ubuntu einzuarbeiten.
Könntest du mir deinen Sourcecode, oder halt den USB-Teil zeigen? Es ist sehr schweer einen übersichtlichen Einstieg in das themazu finden..Gruß
Rumit