Hallo,
viele USB-Geräte implementieren die HID-Klasse, da hierfür keine
signierten Treiber in 64-Bit Windows-Versionen notwendig sind. Bei
kleineren Datenraten ist das auch ausreichend.
Allerdings scheint es "über" HID nichts zu geben, was mit einem 64-Bit
Windows ohne Treibersignierung läuft. Also nichts, was generisch ist und
eben Bulk-Transfers unterstützt oder mehr als die 64kB schaufeln kann,
wie es bei den HID-Interrupt-Transfers maximal möglich ist.
Für WinUSB von Microsoft selbst braucht es eine Signierung, es sei denn
man hat WinXP SP3 und aufwärts, dann geht es wohl über die
WinUSB-Requests.
Für EasyUSB gibt's keine Signierung, für libusb32/.net muss ich erst
noch schauen, was (L)GPL für "Konsequenzen" nach sich zieht, wann darf
man die Sourcen geschlossen halten, etc.
Natürlich gibt's diverse kommerzielle Treiberpakete, aber die sind im
Prinzip auch wieder an eine Signierung gebunden. Alternativ die
altbekannten USB-UART-Brücken, doch die möchte ich aussen vor lassen.
Weiss jemand, ob's noch andere Möglichkeiten gibt?
Ralf
Für WinUSB brauchst du nicht zwingend eine Signierung. Wenn du gar keine
hast, klappt das meines Wissens trotzdem, da keine Dateien ins
Systemverzeichnis kopiert werden. Die WInUSB.sys ist ja eh drauf. Du
bekommst dann halt das rote UAC Fenster, dass der Treiber nicht signiert
ist, kannst ihn aber auf Wunsch trotzdem installieren. Wir nutzen WinUSB
auch, haben aber eine Code Signing Signatur von Verisign, die kostet
nicht viel, und wenn man die dran pappt, kommt nur noch das blaue UAC
Fenster, ob man dem Hersteller vertrauen will, und wenn ja, ob immer.
Dann ist Ruhe. WHQL ist nicht erforderlich. Mit Windows 8 kannst du im
OS String Descriptor des USB Gerätes gleich WinUSB angeben, dann
brauchst du überhaupt gar keine Dateien mehr, nicht mal die Inf.
@Christian:
Das hört sich gut an. Ich möchte mich näher mit der USB-Implementierung
auf Controllern beschäftigen und arbeite mich gerade entsprechend ein.
Darf ich fragen, auf welchen Controller du es implementiert hast? Kannst
du evtl. ein WinUSB-Beispiel posten? Ich suche noch die Infos zusammen,
wie ein WinUSB-Gerät zu implementieren ist.
Anfangen werde ich trotzdem erstmal mit HID, aber ich finde es praktisch
von anfang an soviele Infos wie möglich zu haben.
Ralf
WinUSB hat rein gar nichts mit dem Controller und dessen Firmware zu
tun, WinUSB kann mit allen (außer isochron) USB Geräten kommuzieren,
ähnlich der LibUSB. Konkret haben wir den Cypress FX2 und FX3 im
Einsatz. Im einfachsten Fall jeweils ein BULK Endpoint für IN und OUT.
HID ist schon schön, aber viel zu langsam, USB Test and Measurement
Class ist schon besser, aber komplex und schafft nur 24MB/s bei
HighSpeed. Geht dafür aber meines Wissens auch als Standard Klasse.
> WinUSB hat rein gar nichts mit dem Controller und dessen Firmware zu> tun, WinUSB kann mit allen (außer isochron) USB Geräten kommuzieren,> ähnlich der LibUSB.
Die Frage war wohl etwas ungünstig formuliert, sorry. Das ist mir klar,
dass es unabhängig vom Controller ist, es kommt ja drauf an, ob die
WinUSB-bzw. die OS-Requests implementiert sind.
> Konkret haben wir den Cypress FX2 und FX3 im Einsatz. Im einfachsten Fall> jeweils ein BULK Endpoint für IN und OUT.
Okay. Hmmm... ich schau mal auf der Cypress-Seite vorbei, vielleicht
find ich da ja ein Beispiel.
> HID ist schon schön, aber viel zu langsam, ...
Deswegen hatte ich nach einer Alternative gefragt :)
> USB Test and Measurement Class ist schon besser, aber komplex und schafft> nur 24MB/s bei HighSpeed. Geht dafür aber meines Wissens auch als Standard> Klasse.
Mein Controller kann nur Full-Speed, das fällt also leider raus.
Ralf
Ralf schrieb:> es kommt ja drauf an, ob die> WinUSB-bzw. die OS-Requests implementiert sind.
Im einfachsten Fall ein BULK OUT Endpoint und ein BULK IN Endpoint.
Fertig. Im Descriptor keine der Standard-Device Klassen nehmen, sondern
0xFF für Vendor Class und dann kannst du WinUSB oder LibUSB zum
Datentransfer nutzen. Spezielle WinUSB Request gibts da keine.
@Christian R.:
> Im einfachsten Fall ein BULK OUT Endpoint und ein BULK IN Endpoint.> Fertig. Im Descriptor keine der Standard-Device Klassen nehmen, sondern> 0xFF für Vendor Class und dann kannst du WinUSB oder LibUSB zum> Datentransfer nutzen.
Das ist klar, aber soweit ich die MS-Doku zu WinUSB verstanden braucht's
auch hier ein signiertes INF-File um auf Win 64-Bit arbeiten zu können.
> Spezielle WinUSB Request gibts da keine.
Ab WinXP SP3 gibt's die Möglichkeit spezielle WinUSB-Requests zu
implementieren, so dass keine INF-Datei nötig ist. Das müsste man sich
dann eben mal angucken. Ich schau mal nach dem Link zu den Infos.
@ bluppdidupp:
Ich war schon am Überlegen, mir eins der Bücher von J.Axelson zu kaufen
:)
Ralf
Ich müsste es auf einem Testrechner mal probieren, aber ich bin ziemlich
sicher, dass das inf file nicht zwingend signiert sein muss (ist ja eh
nur das CAT File signiert).
Die Requests du du meinst sind einfach OS String Descriptoren, gibts die
wirklich schon bei XP?.
Ich hatte mal diesen Descriptor für WinUSB testweise implementiert, aber
Windows 7 hat die ignoriert. Vielleicht war da auch noch ein Bug drin...
Edit: Es gibt ab Windows 8 einen extra WinUSB Teil im OS String
Descriptor, der dann ohne Inf WinUSB lädt...aber eben erst ab Windows 8.