Заявленное устройство PyUSB, detach_kernel_driver возвращает объект не найден

Я пытаюсь выполнить массовое чтение и запись с USB-устройства в Ubuntu с помощью PyUSB. Однако мне не удалось зайти так далеко.

import usb.core
import usb.util

dev = usb.core.find(idVendor=0xXXXX,idProduct=0xYYYY)
if dev is None:
    raise ValueError('Device not found.')

try:
    dev.detach_kernel_driver(0)
except:
    print "exception dev.detach_kernel_driver(0)"
    pass

dev.set_configuration()
print "all done"

Это простой скрипт, который я использую. Я создал /etc/udev/rules.d/40-basic-rules.rulesкоторый содержит

SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device",SYSFS{idVendor}=="XXXX" , SYSFS{idProduct}=="YYYY", MODE="0666"

для моего подходящего устройства.

Запуск сценария как root вызывает usb.core.USBError: [Errno 16] Resource busy ошибка, потому что dev.detach_kernel_driver(0) бросает исключение usb.core.USBError: [Errno 2] Entity not found

в dmesg я вижу эти сообщения,

[  638.007886] usb 1-1: usbfs: interface 1 claimed by usb-storage while 'python' sets config #1
[  643.425802] usb 1-1: usbfs: interface 1 claimed by usb-storage while 'python' sets config #1
[  647.957932] usb 1-1: usbfs: interface 1 claimed by usb-storage while 'python' sets config #1

Есть мысли о том, что мне не хватает, чтобы получить доступ к этому устройству?

1 ответ

Решение

Ваша проблема, как и моя, заключается в том, что вам нужно отсоединить ядро ​​от каждого интерфейса, прежде чем вы сможете set_configuration(), Вот код, который я сейчас использую (включая некоторые леса) для подключения к аудиоустройству USB:

import usb.core
import usb.util

scarlet = usb.core.find(idVendor = 0x1235)  # Focusrite
if not scarlet: print"No Scarlet"

c = 1
for config in scarlet:
    print 'config', c
    print 'Interfaces', config.bNumInterfaces
    for i in range(config.bNumInterfaces):
        if scarlet.is_kernel_driver_active(i):
            scarlet.detach_kernel_driver(i)
        print i
    c+=1

scarlet.set_configuration()
Другие вопросы по тегам