SIMtrace MITM/emulator

Tom Schouten tom at
Fri Aug 9 12:08:37 UTC 2013

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 =
# dh.detachKernelDriver(0)
dh.claimInterface(0) # -> usb.USBError: could not claim interface 0: 
Device or resource busy

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


More information about the simtrace mailing list