2011-11-21 16 views
6

Estoy tratando de hacer un script (en Linux) que pueda encender o apagar una luz en mi mouse.pyusb: no se puede establecer la configuración

Este es el código que tengo hasta ahora:

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() 

Esto funciona bien, pero si trato de hacer: dev.set_configuration ()

después de la claim_interface (dev, la interfaz)

el script devuelve el error: usb.core.USBError: recursos ocupados

¿Por qué sigue ocupado después de haber desconectado el controlador del kernel?

Respuesta

6

No estoy seguro de si esto solucionará, pero ¿las reglas de udev para configurar el mouse son correctas? He tenido un problema similar con un dispositivo personalizado a un amigo hizo por mí y he resuelto mediante la adición de una regla como:

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" 

en mi carpeta /etc/udev/rules.d.

HTH!

EDITAR: Antes de agregar la regla, intente ejecutar su secuencia de comandos con sudo. Si funciona de esa manera, es casi seguro una configuración de permisos que será arreglada por la regla anterior.

+0

Todavía obtengo "usb.core.USBError: Recurso ocupado" cuando se ejecuta esto como root y con la regla añadida. Pero su respuesta me permite ejecutar el script como usuario normal :) – IronMonkey

+0

@IronMonkey - Sí. Esa es la idea de la regla: ¡asignarle el control del dispositivo! :) Si esta respuesta fue útil para usted, no se olvide de votar y finalmente aceptarlo si resuelve el problema para siempre. – mac

4

Tuve este problema también. Su código funciona bien si primero establece "set_configuration" y solo luego reclama la interfaz. Esta es también la orden sugerida aquí: http://libusb.sourceforge.net/api-1.0/caveats.html

+0

Teniendo exactamente el mismo problema, esto resuelve el problema para mí. Citando el enlace en la respuesta: _El método anterior [set config, luego claim interface] funciona porque una vez que se reclama una interfaz, ninguna aplicación o controlador puede seleccionar otra configuración._ Esto también explica por qué se produce el error: el original el código reclamó el dispositivo, bloqueando así su configuración. – jro

Cuestiones relacionadas