2017-01-25 15 views
0

Я пытаюсь связаться с оценочной панелью AD9913 (Analog Devices) с USB-контроллером Cypress FX-2. Я написал полностью функциональную библиотеку Python, которая работает безупречно в Windows 7 (с использованием драйвера, созданного с помощью lib-lib32-1.2.6.0's inf-wizard.exe), но теперь я пытаюсь запустить такое же программное обеспечение из малины Pi 3 с Raspbian Jessie и, похоже, не может писать или читать.pyusb - [Ошибка 5] в Linux, но не Windows

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

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

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

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

ответ

0

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

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