Ein Treiber für das USB-Thermometer



Wie programmiert man einen USB-Treiber? Informationen finden sich z.B. in der DDK98 von Microsoft, bei Craig Peacock und in den Beispiel-Quelltexten von Anchorchips/Cypress zum EYUSB-Chip. Ich finde es trotzdem recht schwierig und stoße immer wieder an Grenzen, u.a. weil ich kein erfahrener C-Programmierer bin. Andere mögen zwar C und die Geheimnisse des Windows kennen, aber nicht den Anfang mit der DDK finden. Ich möchte deshalb hier detailliert den Umbau eines vorhandenen Treibers beschreiben. Ich verbinde damit die Hoffnung, dass sich vielleicht jemand findet, der die noch offenen Fragen klären kann.

Aufgabe: Entwicklung eines Treibers für das USB-Thermometer

Ausgangspunkt waren die Quelltexte zum EZUSB-Treiber aus dem Starterkit zum EZUSB-Chip. Die gesamte Software kann von Cypress geladen werden. Die entscheidenden Einzelheiten zur Ansteuerung des Thermometers hat Craig Peacock offengelegt, der ebenfalls einen Treiber für das Gerät entwickelt hat. Teile aus den Quelltexten von Peacock wurden nun in die Daten ezusbsys.c eingebaut. Damit sollte ein Treiber entstehen, der sowohl den EXUSB-Chip als auch das Thermometer ansteuern kann. Das ist sicher kein guter Stil, sollte aber auch nur ein erster Versuch sein. Das ganze wurde mit VC++ 5.0 und der DDK98 übersetzt. Hier sind die einzelnen Arbeitsschritte zum Kompilieren des SYS-Treibers:

Nun kamen viele Meldungen und zum Glück am Ende eine Erfolgsmeldung. Der neue Treiber ezusb.sys wird gefunden unter c:/98ddk/ezusbdrv/lib/i386/free/ezusb.sys. Der Treiber konnte nun in USBTherm.sys umbenannt werden und den alten Thermometerttreiber ersetzen.

Der fertige Treiber: Usbtherm.sys (therm.zip, 8 K) (erneuert 7.12.00, vorher: Tippfehler im Dateinamen)

Das komplette Verzeichnis eztherm mit den angepassten Quelltexten (eztherm.zip, 142 K)


Wenn es allgemein um Thermometer geht: http://www.warensortiment.de/messtechnik/messgeraete/thermometer.htm


Testen des neuen Treibers:

Man kann den neuen Treiber unter Windows98 einfach über den alten kopieren. Er befindet sich entweder in Windows\System oder in Windows\System32\Drivers. Wenn dann das Thermometer angeschlossen wird, wird automatisch der neue Treiber geladen. Die andere Art ist: Man kopiert die alte INF-Datei zusammen mit dem Treiber auf eine Diskette und aktualisiert den Treiber über die Systemsteuerung.

Und was bringts?

Eine Menge! Mit USB kann man ja bekanntlich mehrere Geräte der gleichen Art zusammen betreiben, so dass einem praktisch nie die Schnittstellen ausgehen. Nur der bisherige Thermometertreiber kam nicht damit zurecht. Der Grund: Es wurde immer der symbolische Gerätename Thermometer_0 verwendet. Der EZUSB-Treiber war da schon weiter. Er bildete mit jedem neuen Gerät eine neue Instanz und einen neuen Gerätenamen. Damit konnten mehrere Gräte nebeneinander betrieben werden. Diese schöne Eigenschaft geht jetzt auch auf das Thermometer über.

Das erste angeschlossene Thermometer heißt wie bisher: Thermometer_0. Unter diesem Namen wird der Threiber von dem Programm thermometer.exe aus dem Starterkit von Cypress angesprochen.

Das zweite angeschlossene Gerät hat den Namen Thermometer_1, das dritte Thermometer_2 usw. Bei Thermometer_9 dürfte Schluß sein. Der folgende Versuch mit zwei Geräten führte zum Erfolg: Das erste Thermometer wurde mit thermometer.exe angesprochen, das zweite mit dem VB-Programm usbElektor.frm, aber mit dem veränderten Gerätenamen. Hier der entscheidende Ausschnitt aus dem Programm:

Sub USB_IO()
sFileName = "\\.\Thermometer_1"
hgDrvrHnd = CreateFile(sFileName, GENERIC_WRITE Or GENERIC_READ, FILE_SHARE_WRITE
Or FILE_SHARE_READ, Security, OPEN_EXISTING, 0, 0)
lTemp = DeviceIoControl(hgDrvrHnd, 4&, lIn, lInSize, lOut, lOutSize, lSize, gOverlapped)
htemp = CloseHandle(hgDrvrHnd)
End Sub

Es funktioniert: Nun können also mehrere Thermometer am USB betrieben werden. Das bedeutet zugleich auch, dann man über eine Menge IO-Leitungen verfügt.


Treiber für Windows 2000

Bisher gab es für das USB-Thermometer nur einen Treiber für Windows98. Auch in dem Artikel zum Elektor-USB-Interface wurde darauf hingewiesen, dass Windows 2000 noch nicht unterstützt wird. Aber es ist nicht hoffnungslos.

Treiber, die nach dem Windows Driver Model WDM geschrieben wurden, sollten grundsätzlich unter Windows 98 und Windows 2000 funktionieren. Der entscheidende Unterschied: Windows 2000 erwartet eine digitale Signatur, die nach gründlicher Prüfung des Treibers von Microsoft vergeben wird. Das kann sich allerdings nur eine große Firma leisten. Die Frage ist also: Geht es auch ohne diese Signatur?

Es geht! Unter Systemeigenschaften/Hardware/Gerätemanager/Treibersignierung findet man Einstellungen, die es einem Anwender erlauben, Treiber ohne eine Signatur zu installieren. Die Idee ist wohl, dass normalerweise kein Treiber-Müll in das System gelassen wird. Aber im Falle älterer Treiber oder für neue Versuche geht es eben nicht anders.

Auch der oben vorgestellte experimentelle Treiber für das Thermometer sollte unter Windows2000 funktionieren. Ich konnte es aber selbst noch nicht ausprobieren, da ich nur Windows 98 verwende. Falls jemand es probieren möchte, würde ich mich über eine Rückmeldung freuen.

B.Kainka@t-online.de

31.1.01: Die erste positive Rückmeldung kam von Reiner Stein. Bei ihm funktioniert der Treiber unter Windows 2000.


Der Thermometertreiber von BlueWater Systems, Inc.

www.bluewatersystems.com

Diese Firma bietet Entwicklungswerkzeuge für die Treiberentwicklung an. Als Referenz-Design wurde ein Treiber für das Cypress-Thermometerkit geschrieben, der auch mit dem Elektor-USB-Interface arbeitet. Mit dem Treiber werden auch umfangreiche Quelltexte, ein Anwenderprogramm und weitere Informationen geliefert. Und der Treiber hat eine digitale Signatur für Windows 2000.

Der Treiber: ThermUsb (Bluewatr.zip, 281 kB)

Das mitgelieferte Anwenderprogramm dient der Abfrage der Temperatur und der Einstellung der LED-Helligkeit auf den System. Alle Quelltexte (C++) sind vorhanden. Deshalb findet man hier auch Informationen, wie der Treiber angesprochen wird.

Alle Control-Codes und Aufrufkonventionen lassen sich in den Quelltexten erkennen. Damit ist es möglich, auch diesen Treiber aus Visual Basic oder Delphi heraus anzusprechen.


Der generische Device Treiber von Thesycon

http://www.thesycon.de/

Herr Hildebrandt von der Firma Thesycon schrieb:

"Unsere Firma hat einen generischen USB Device Treiber entwickelt. Mit diesem kann man mit jedem USB Gerät kommunizieren. Für viele Elektronik Bastler stellt sicher die Entwicklung eines USB Treibers die größte Hürde dar. Für die private Anwendung bieten wir eine kostenlose Light Version des Treibers auf unserer Homepage: www.thesycon.de an."

Außer der freien Version gibt es auf der Seite auch eine kostenlose Vollversion mit einer Zeitbeschränkung. Ich konnte es selbst noch nicht ausprobieren, würde mich aber über eine Rückmeldung freuen, wenn jemand das USB-Thermometer mit diesem Treiber ansteuern kann.

Anwendung in Visual Basic

Joachim Bonath hat´s ausprobiert und freundlicherweise seinen VB-Quelltext zur Verfügung gestellt. Das Programm funktioniert mit der DEMO-Version des Thesycon-Treibers (siehe README.TXT): usbtherm.zip (6 kB).


WinDriver von JUNGO

Herr Jonak von der Firma IMCOR GmbH schickte den folgenden Hinweis: Da Sie sich in Ihre Büchern / Web-Seiten auch mit Treiberentwicklung (u.a. USB) auseinandergesetzt haben, möchte ich Sie gerne noch auf das Tool WinDriver der Fa. JUNGO hinweisen. Es könnte für den einen oder anderen (nicht so versierten) Entwickler hilfreich sein, da man Kernel Programmierung weitgehend vermeiden kann. Wir vertreiben in Deutschland das Produkt. Ein Blick auf die homepages www.imcor.de oder www.jungo.com gibt sicher einen ersten Eindruck.


CompuLAB-USB-Treiber für das Thermometer

Christian Marx hatte das Problem, dass der ursprüngliche Treiber für das Thermometerbeispiel von Cyprress nicht unter Windows 2000 läuft. Er hat dann auf meinen Vorschlag hin einfach den kompatiblen und erweiterten Treiber für das CompuLAB-USB (www.ak-modul-bus.de) verwendet. Dazu musste nur die Inf-Datei angepasst werden. Es reichte, VID und PID auszutauschen. Und siehe da, es klappt. Hier der Treiber und die angepasste Inf-Datei: thermdrv.zip (10 k)