On 08/09/2013 02:59 AM, Peter Stuge wrote:
Tom Schouten wrote:
Another method would be type=vendor recipient=device control requests over the default endpoint.
Well... I tried this for the CDC and I get "Device or resource busy".
What did you try exactly?
# using pyusb 0.x # this is running while CDC is claimed by usb-serial
import usb
def find(idVendor, idProduct): busses = usb.busses() for bus in busses: devices = bus.devices for dev in devices: if ((dev.idVendor == idVendor) and (dev.idProduct == idProduct)): return dev return 'wrong'
dev = find(idVendor=0x03eb, idProduct=0x6119) dh = dev.open() # dh.detachKernelDriver(0) dh.claimInterface(0) # -> usb.USBError: could not claim interface 0: Device or resource busy dh.controlMsg(1,1,[0,0,0,0])
It doesn't work if the device is already opened by another process or a kernel driver.
There is always a kernel driver for every single interface, also when using libusb. It is just a different kernel driver. It is not possible to communicate with a USB device without a kernel driver, also using libusb.
"open the device" is not really a significant concept with USB, it is much more important what happens with individual interfaces. libccid uses libusb to claim the CCID interface, but that is distinct from the default endpoint.
It seems plausible a USB device can only be opened once,
That's not the case however.
I see. I'm confusing device and interface.
So basically, I would add another interface to the USB firmware, which then can be claimed by a different process. Since all control transfers use the default endpoint, this won't need extra endpoints which we don't have.
Neat. Thanks!