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!