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


Anmelden zum Antworten