Ich versuche mit einem AD9913 Evaluierungsboard (Analog Devices) zu kommunizieren, welches einen Cypress FX-2 USB Controller hat. Ich schrieb eine voll funktionsfähige Python-Bibliothek, die fehlerfrei auf Windows 7 funktioniert (mit einem Treiber, der durch libusb-win32-1.2.6.0's inf-wizard.exe generiert wurde), aber jetzt versuche ich, die gleiche Software von einem Raspberry Pi 3 mit zu starten Raspbian Jessie und kann nicht scheinen zu schreiben oder zu lesen.pyusb - [Fehler 5] unter Linux, aber nicht Windows
Die folgende minimal Beispiel funktioniert auf 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)
Die ouput hier:
usb.core file: C:\Python27\lib\site-packages\usb\core.pyc
Write: 1
Read: array('B', [1, 0])
Doch auf der Himbeere mehrere Probleme auftreten. Erstens ist die Produkt-ID 0xEE24 (die ich durch dmesg fand heraus), und zweitens gibt das Codebeispiel oben
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
ich das Skript bin Ausführung von sudo python minimal_example.py
Aufruf, sonst (wie erwartet) bekomme ich usb.core.USBError: [Errno 13] Access denied (insufficient permissions)
. (Für das oben beschriebene Testen habe ich die udev-Regeln entfernt, die ich hinzugefügt habe, um Zugriff auf mein normales Benutzerkonto zu ermöglichen, und danach neu gestartet und das Gerät neu angeschlossen.)
Ich habe auch festgestellt, dass unter Windows Configuration 1
(das ist die einzige Konfiguration wie offenbart) von
cfg = dev.get_active_configuration()
zu oben genannten Beispielskript hinzufügen, hat nur ein Interface 0
, wo wie auf Linux Interface 0
hat keine Endpunkte, aber es gibt zusätzliche Schnittstellen Interface 0, 1
, Interface 0, 2
und Interface 0,3
, von denen die erste auf die identisch ist einzige von Windows angezeigte Schnittstelle.
Das Entfernen der Kernel-Treiber wie beschrieben in this post - die mein gegenwärtiges Verständnis als USB-Neuling hier nicht erforderlich sein sollte - löst das Problem nicht.
Ich vermute, dass das Problem aus einer Differenz zwischen den Windows/libusb und Linux-Implementierung/Backend der USB-Kommunikation ergibt sich (bereits angedeutet durch die Tatsache, dass die ProduktID gezeigt für das gleiche Stück Hardware gebunden ist anders), Dies könnte einige Änderungen an der Art und Weise erfordern, wie ich auf den USB-Endpunkt schreibe.
Ich bin glücklich, weitere Informationen zur Verfügung zu stellen, wenn nötig und begrüßen alle Hinweise und Vorschläge.