Я пытаюсь установить связь с оценочной платой 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.
Я рад предоставить дополнительную информацию, если это необходимо, и приветствую все подсказки и предложения.