2011-11-21 17 views
6

Sto provando a creare uno script (su linux) che può accendere o spegnere una luce nel mio mouse.pyusb: impossibile impostare la configurazione

Questo è il codice che ho finora:

import usb.core 
import usb.util 
import sys 
interface = 0 
dev = usb.core.find(idVendor=0x1532, idProduct=0x0017) 

def main(): 

     if dev is None: 
      print "device not found" 

     else: 
     print "device found" 
     if dev.is_kernel_driver_active(interface) is True: 
      print "but we need to detach kernel driver" 
      dev.detach_kernel_driver(interface) 
      print "claiming device" 
      usb.util.claim_interface(dev, interface) 


      print "release claimed interface" 
      usb.util.release_interface(dev, interface) 
      print "now attaching the kernel driver again" 
      dev.attach_kernel_driver(interface) 
      print "all done" 
return 0 

if __name__ == '__main__': 
    main() 

Questo funziona bene, ma se provo a fare un: dev.set_configuration ()

dopo la claim_interface (dev, l'interfaccia)

lo script restituisce l'errore: usb.core.USBError: risorsa occupata

Perché è ancora occupato dopo che ho staccato il suo driver del kernel?

risposta

6

Non sono sicuro se questo risolverà, ma le regole udev per il tuo mouse sono state configurate correttamente? Ho avuto un problema simile con un dispositivo personalizzato un amico ha fatto per me e ho risolto con l'aggiunta di una regola come:

SUBSYSTEM !="usb_device", ACTION !="add", GOTO="device_rules_end" 
SYSFS{idVendor} =="1532", SYSFS{idProduct} =="0017", SYMLINK+="mydevice" 
MODE="0666", OWNER="<your-username-here>", GROUP="root" 
LABEL="device_rules_end" 

nella mia cartella /etc/udev/rules.d.

HTH!

MODIFICA: prima di aggiungere la regola, provare a eseguire lo script con sudo. Se funzionerà in questo modo è quasi certamente un'impostazione di autorizzazione che verrà risolta dalla regola precedente.

+0

Ho ancora "usb.core.USBError: risorsa occupata" quando si esegue questo come root e con la regola aggiunta. Ma la tua risposta mi consente di eseguire lo script come utente normale :) – IronMonkey

+0

@IronMonkey - Sì. Questa è l'idea della regola: assegnare il controllo del dispositivo a te! :) Se questa risposta ti è stata utile, non dimenticarti di inversione e alla fine accettala se risolve il problema per sempre. – mac

4

Ho avuto anche questo problema. Il tuo codice funziona bene se "set_configuration" è impostato per primo e solo dopo richiedi l'interfaccia. Questo è anche l'ordine suggerito qui: http://libusb.sourceforge.net/api-1.0/caveats.html

+0

Avendo lo stesso identico problema, questo risolve il problema per me. Citando dal link nella risposta: _Il metodo precedente [config di configurazione, quindi interfaccia di rivendicazione] funziona perché una volta che un'interfaccia è richiesta, nessuna applicazione o driver è in grado di selezionare un'altra configurazione. Questo spiega anche perché l'errore è stato generato: l'originale codice rivendicato il dispositivo, bloccando così la sua configurazione. – jro