pyusb - [Ошибка 5] в Linux, но не в Windows

Я пытаюсь связаться с оценочной платой AD9913 (Analog Devices), которая имеет USB-контроллер Cypress FX-2. Я написал полнофункциональную библиотеку Python, которая безупречно работает в Windows 7 (используя драйвер, сгенерированный с помощью inf-wizard.exe в libusb-win32-1.2.6.0), но сейчас я пытаюсь запустить то же программное обеспечение из Raspberry Pi 3 с Распби и Джесси не может писать или читать.

Следующий минимальный пример работает на Windows 7:

import os
os.environ['PYUSB_DEBUG'] = 'debug'

import usb.core
print "usb.core file:", usb.core.__file__

# get device
dev = usb.core.find(idVendor=0x0456, idProduct=0xEE25)
if dev is None:
    raise ValueError("Device not found")
dev.set_configuration()

# get the firmware version
print "Write: ", dev.write(0x01, [0x00])
print "Read: ", dev.read(0x81, 7)

Выход здесь:

usb.core file: C:\Python27\lib\site-packages\usb\core.pyc
Write:  1
Read:  array('B', [1, 0])

Однако на Малине возникает несколько проблем. Во-первых, идентификатор продукта 0xEE24 (который я узнал через dmesg), а во-вторых, приведенный выше пример кода дает

usb.core file: /usr/local/lib/python2.7/dist-packages/usb/core.pyc
Write:
Traceback (most recent call last):
    File "usbtesting_minimal_linux.py", line 29, in <module>
      print "Write: ", dev.write(0x01, [0x00])
    File "/usr/local/lib/python2.7/dist-packages/usb/core.py", line 948, in write
self.__get_timeout(timeout)
    File "/usr/local/lib/python2.7/dist-packages/usb/backend/libusb1.py", line 824, in bulk_write
timeout)
    File "/usr/local/lib/python2.7/dist-packages/usb/backend/libusb1.py", line 920, in __write
_check(retval)
    File "/usr/local/lib/python2.7/dist-packages/usb/backend/libusb1.py", line 595, in _check
     raise USBError(_strerror(ret), ret, _libusb_errno[ret])
usb.core.USBError: [Errno 5] Input/Output Error

Я выполняю сценарий по телефону sudo python minimal_example.pyиначе (как положено) получаю usb.core.USBError: [Errno 13] Access denied (insufficient permissions), (Для тестирования, описанного выше, я удалил правила udev, которые я добавил, чтобы разрешить доступ к своей учетной записи обычного пользователя, а затем перезагрузил и переподключил устройство.)

Я также заметил, что в Windows Configuration 1 (которая является единственной конфигурацией), как показано путем добавления

cfg = dev.get_active_configuration()

к вышеупомянутому примеру скрипта, имеет только один Interface 0где как на линуксе Interface 0 не имеет конечных точек, но есть дополнительные интерфейсы Interface 0, 1, Interface 0, 2 а также Interface 0,3первый из которых идентичен единственному интерфейсу, показанному Windows.

Отключение драйверов ядра, как описано в этом посте - который, учитывая мое текущее понимание новичка в USB, здесь не требуется, - не решает проблему.

Я подозреваю, что проблема связана с различием между реализацией / бэкендом USB-интерфейса для Windows / libusb и Linux (на что уже намекает тот факт, что показанный product ID отличается для того же подключенного оборудования), что может потребовать некоторого меняет способ записи на конечную точку USB.

Я рад предоставить больше информации, если это необходимо, и приветствую все советы и предложения.

1 ответ

Скорее всего, эта ошибка, вызванная прошивкой, не загружается. Обычно USB-контроллер FX-2 не сохраняет прошивку.

Хотя я по-прежнему не могу связаться с устройством на Raspberry Pi, проблема с ошибкой 5 решается путем явного выбора подходящего альтернативного параметра с соответствующими конечными точками, например

dev.set_interface_altsetting(interface = 0, alternate_setting = 1)

Тогда запросы на чтение / запись больше не будут с ошибкой Error 5, но с ошибкой тайм-аута (который Error 110 за libusb1 а также None за libusb0).

Теперь я подозреваю, что существует проблема с тем, как устройство определяется операционной системой, так как меняется не только productID между Windows и Linux, но и wMaxPacketSize для интересующих меня конечных точек - 64 байта в Windows и 512 байтов в Linux.

Как только я продолжу свою работу по устранению неполадок, я либо открою новый вопрос и добавлю ссылку в качестве комментария к этому ответу (или опубликую полное решение здесь, на случай, если я смогу решить все сразу).

Другие вопросы по тегам