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 с Raspbian Jessie и, кажется, не может ни писать, ни читать.

Следующий минимальный пример работает в 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])

Однако на Raspberry возникает несколько проблем. Во-первых, идентификатор продукта 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, тогда как в Linux Interface 0 не имеет конечных точек, но есть дополнительные интерфейсы Interface 0, 1, Interface 0, 2 и Interface 0,3, первый из которых идентичен единственному интерфейсу, показанному Windows.

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

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

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


person IonicSolutions    schedule 25.01.2017    source источник


Ответы (2)


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

person hujiaodigua    schedule 05.03.2019
comment
Спасибо, что раскопал это. Да, отсутствие правильной прошивки было одной из многих проблем, которые привели к этим проблемам. Хотя мне удалось загрузить прошивку и решить множество последующих проблем, я с тех пор отказался от проекта, так как оказалось, что даже вариант Windows с проприетарным драйвером не работает достаточно надежно для предполагаемого приложения. Теперь мы взаимодействуем с AD9913 и подобными микросхемами напрямую через Arduino. - person IonicSolutions; 06.03.2019

Хотя я по-прежнему не могу связаться с устройством на 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.

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

person IonicSolutions    schedule 26.01.2017