LCD-Display als Statusanzeige unter Linux
Aus BraLUG-Wiki
(→Kernel-Modul fdti_sio) |
K |
||
(45 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
[[Kategorie:Hardware]] | [[Kategorie:Hardware]] | ||
+ | [[Category:Tcl/Tk]] | ||
[[Bild:Ula200.jpg|thumb|250px|ELV-Bausatz ULA-200]] | [[Bild:Ula200.jpg|thumb|250px|ELV-Bausatz ULA-200]] | ||
Zeile 6: | Zeile 7: | ||
Wer kennt nicht das Problem -> irgendwo in der Ecke steht ein Server ohne Tastatur und Monitor. Plötzlich funktioniert die Kiste nicht mehr, ist zu langsam o.ä.. Warum? | Wer kennt nicht das Problem -> irgendwo in der Ecke steht ein Server ohne Tastatur und Monitor. Plötzlich funktioniert die Kiste nicht mehr, ist zu langsam o.ä.. Warum? | ||
− | Gut man könnte jetzt Monitor, Tastatur anschliessen und nachschauen... Viel schöner ist es doch aber eine kleine Statusanzeige zu haben, auf der man mit einem Blick sehen kann, in welchem Zustand sich der Rechner befindet. Die | + | Gut, man könnte jetzt Monitor, Tastatur anschliessen und nachschauen... Viel schöner ist es doch aber eine kleine Statusanzeige zu haben, auf der man mit einem Blick sehen kann, in welchem Zustand sich der Rechner befindet. Die Krönung wäre es, wenn man noch ein paar Tasten zur Verfügung hätte, mit denen einige, vordefinierte, Aktionen ausführen kann. |
Im Internet und diversen Zeitschriften sind eine Menge Lösungen zu finden. Nach einiger Suche habe ich mich für den ELV-Bausatz ULA-200 entschieden. In diesem Artikel wird beschrieben, was zu tun ist, dieses Modul auch unter Linux anzusteuern. | Im Internet und diversen Zeitschriften sind eine Menge Lösungen zu finden. Nach einiger Suche habe ich mich für den ELV-Bausatz ULA-200 entschieden. In diesem Artikel wird beschrieben, was zu tun ist, dieses Modul auch unter Linux anzusteuern. | ||
Zeile 52: | Zeile 53: | ||
{ USB_DEVICE(FTDI_VID, FTDI_ELV_ULA200_PID) }, | { USB_DEVICE(FTDI_VID, FTDI_ELV_ULA200_PID) }, | ||
... | ... | ||
+ | |||
+ | |||
+ | '''Hinweis:''' letztens habe ich auf einem Rechner einen Kernel 2.6.15 installiert und mir auch gleich mal die Quellen von ftdi_sio angesehen -> hier ist schon alles für ULA-200 vorbereitet. In ftdi_sio.h muß nichts gemacht werden, in ftdi_sio.c eine entsprechende Zeile (nach ULA200 suchen) auskommentiert werden. (Der nachfolgende Test verlief erfolgreich.) | ||
Zeile 57: | Zeile 61: | ||
− | Nach erfolgreicher Kernelübersetzung kopiert man einfach die Datei ftdi_sio.o (bzw. bei Kernelversion >= 2.6.x ftdi:sio.ko) aus dem Verzeichnis /usr/src/linux/drivers/usb/serial/ in das Verzeichnis /lib/modules/<kernel-version>/kernel/drivers/usb/serial/. | + | Nach erfolgreicher Kernelübersetzung kopiert man einfach die Datei ftdi_sio.o (bzw. bei Kernelversion >= 2.6.x ftdi:sio.ko) aus dem Verzeichnis /usr/src/linux/drivers/usb/serial/ in das Verzeichnis /lib/modules/<kernel-version>/kernel/drivers/usb/serial/. Rechner einmal durchbooten bzw. setzt den Befehl ''depmod -a'' ab und dann solltes es das gewesen sein. Schließt man nun das LCD-Modul an den USB-Port an sollten folgende Meldungen im Syslog erscheinen: |
Dec 20 08:44:26 tecra kernel: hub.c: new USB device 00:05.2-1, assigned address 5 | Dec 20 08:44:26 tecra kernel: hub.c: new USB device 00:05.2-1, assigned address 5 | ||
Zeile 68: | Zeile 72: | ||
===Wie steuert man ULA-200 nun unter Linux an?=== | ===Wie steuert man ULA-200 nun unter Linux an?=== | ||
====Prinzipielles==== | ====Prinzipielles==== | ||
+ | Die Kommunikation zwischen Rechner und LCD-Modul ist nicht weiter kompliziert. Beim dem FTDI-Chip handelt es sich um einen USB-Seriell-Umsetzer, was nichts anderes heißt, dass man die ganze Sache wie eine serielle Schnittstelle betrachten kann. Das entsprechende Device ist das, was auch im Syslog beim Laden des Kernel-Modules angegeben wird (im oberen Beispiel also /dev/ttyUSB0). | ||
+ | |||
+ | Die [http://de.wikipedia.org/wiki/EIA-232#Timing einzustellenden Parameter] zur Initialisierung der seriellen Schnittstelle sind ebenfalls fest vorgegeben: | ||
+ | |||
+ | 19200,e,8,1 | ||
+ | |||
+ | Mit anderen Einstellungen hat man keinen Erfolg (zumindestens beim sicheren Einlesen von Daten vom LCD-Modul...)! | ||
+ | |||
+ | |||
+ | Die Kommunikation mit dem Modul erfolgt in beiden Richtungen. Das dabei zu verwendende Protokoll (Bytefolgen die über die Schnittstelle gesendet werden) sind der Beschreibung von ELV zu entnehmen. | ||
+ | |||
====Textausgaben auf dem Display==== | ====Textausgaben auf dem Display==== | ||
+ | |||
+ | Da ich bekennender TCL-Fan bin, habe ich verschiedene Tools in dieser Script-Sprache geschrieben, um das LCD-Modul anzusprechen. Hier ein Stück TCL-Quelltext, um z.B. die Hintergrundbeleuchtung des Displays anzuschalten, den Cursor auf die Position 1, 11 (y, x) zu setzen und an dieser Stelle ein "a" auszugeben: | ||
+ | |||
+ | #!/usr/bin/tclsh | ||
+ | # | ||
+ | set port /dev/ttyUSB0 | ||
+ | # | ||
+ | # Device oeffnen und initialisieren | ||
+ | if {[catch {set com [open $port RDWR] }]==1 } { puts "no device on $port"} | ||
+ | fconfigure $com -translation binary | ||
+ | fconfigure $com -mode 19200,e,8,1 | ||
+ | fconfigure $com -buffering none | ||
+ | fconfigure $com -blocking 0 | ||
+ | # | ||
+ | # Hintergrundbeleuchtung einschalten | ||
+ | puts -nonewline $com \x02 | ||
+ | puts -nonewline $com \x68 | ||
+ | puts -nonewline $com \x31 | ||
+ | puts -nonewline $com \x03 | ||
+ | # | ||
+ | # Cursorposition x=11 y=1 setzen | ||
+ | puts -nonewline $com \x02 | ||
+ | puts -nonewline $com \x70 | ||
+ | puts -nonewline $com \x0A | ||
+ | puts -nonewline $com \x01 | ||
+ | puts -nonewline $com \x03 | ||
+ | # | ||
+ | # ein 'a' an aktueller Cursorposition ausgeben | ||
+ | puts -nonewline $com \x02 | ||
+ | puts -nonewline $com \x63 | ||
+ | puts -nonewline $com \x61 | ||
+ | puts -nonewline $com \x03 | ||
+ | # | ||
+ | # Device wieder schliessen | ||
+ | close $com | ||
+ | exit | ||
+ | |||
+ | Eventuell muß nach jedem Senden eines Bytes (''puts -nonewline $com ...'') über die serielle Schnittstelle ein ''after 1'' (1ms Pause) eingebaut werden. Bei schnellen Rechnern ist die Pause u.U. noch größer zu wählen, einfach mal ausprobieren. | ||
+ | |||
====Tastenabfrage==== | ====Tastenabfrage==== | ||
+ | Wie schon eingangs erwähnt, kann man an das LCD-Modul 6 Tasten anschließen. Bei Tastenbetätigung wird eine [http://www.elv-downloads.de/service/manuals/ULA200/ULA200_KM_G_040602.pdf definierte Bytefolge] über die Schnittstelle zum angeschlossenen Rechner gesendet. Hier ein kleines TCL-Programm, dass auswertet, welche Taste(n) gedrückt wurde(n): | ||
+ | |||
+ | #!/usr/bin/tclsh | ||
+ | # | ||
+ | set device /dev/ttyUSB0 | ||
+ | # | ||
+ | # ein Byte einlesen, wenn "t", dann ist im naechsten Byte | ||
+ | # die Tastenbelegung kodiert... | ||
+ | proc einlesen dev { | ||
+ | if {[read $dev 1] == "t"} { | ||
+ | after 3 | ||
+ | scan [read $dev 1] %c taste | ||
+ | if {$taste & 1 } {puts "Taste 1"} | ||
+ | if {$taste & 2 } {puts "Taste 2"} | ||
+ | if {$taste & 4 } {puts "Taste 3"} | ||
+ | if {$taste & 8 } {puts "Taste 4"} | ||
+ | if {$taste & 16} {puts "Taste 5"} | ||
+ | if {$taste & 32} {puts "Taste 6"} | ||
+ | puts "-------" | ||
+ | } | ||
+ | } | ||
+ | # | ||
+ | # Device oeffnen und initialisieren | ||
+ | if {[catch {set com [open $device RDWR] }]==1 } { | ||
+ | puts "no device on $device" | ||
+ | exit | ||
+ | } else { | ||
+ | fconfigure $com -translation binary | ||
+ | fconfigure $com -mode 19200,e,8,1 | ||
+ | fconfigure $com -buffering none | ||
+ | fconfigure $com -blocking 0 | ||
+ | } | ||
+ | # | ||
+ | # wenn etwas an Schnittstelle anliegt, dann einlesen... | ||
+ | fileevent $com readable [list einlesen $com] | ||
+ | # | ||
+ | # Endlos-Loop... | ||
+ | vwait enter-mainloop | ||
+ | |||
+ | ====... und ein Programm dazu ...==== | ||
+ | |||
+ | Unter diesem [http://www.bralug.de/wiki-common/images/f/fe/Ula200.tar.gz Link] ist eine kleiner Toolsammlung (neuere Version...) zur Ansteuerung des LCD-Modules zu finden. Es ist dort ein Daemon zu finden, der einige Systeminformationen auf dem Display darstellt und in dem weitere Scripte zur Ausführung eingebunden werden können. Desweiteren ist ein Kommandozeilentool zu finden, mit dem einzelne Befehle zum Display gesendet werden können. In allen Programmen werden die Tasten des Modules ULA-200 unterstützt. | ||
+ | |||
+ | ====lcdproc==== | ||
+ | Es existiert ein (noch inoffizieller) Devicetreiber für [http://www.lcdproc.org lcdproc] von Bernhard Walle für dieses Modul. Bernhard hatte diesen Artikel gelesen und sich dann ans Programmieren eines Treibers gemacht...(super :-)). Er hat auch die 6 Tasten des Moduls integriert. | ||
+ | |||
+ | Bisher ist dieser Treiber aber noch nicht in der ofiziellen Version von lcdproc enthalten. Im momentan aktuell verfügbaren [http://lcdproc.sourceforge.net/nightly/ "Nightly Build"] von lcdproc ist der Patch aufgenommen worden. | ||
+ | |||
+ | Einige Hinweise dazu: | ||
+ | * natürlich erstmal die mitgelieferten Dokus lesen | ||
+ | * zum erfolgreichen Übersetzen von lcdproc für ula200 benötigt man eine aktuelle Version der [http://www.intra2net.com/de/produkte/opensource/ftdi/ libftdi] (momentan Version 0.7) | ||
+ | * ansonsten sollten natürlich alle gemeldeten Abhängigkeiten bei Aufruf von ''./configure'' erfüllt werden | ||
+ | * um nur den ula200-Treiber zu übersetzen einfach ein ''./configure --enable-devices=ula200'' absetzen | ||
+ | * Übersetzen von lcdproc mit ''make' | ||
+ | * es brauchen erstmal keine speziellen Anpassungen in der LCDd.conf für ula200 gemacht werden (das Device muß natürlich auf ula200 gesetzt werden...) | ||
+ | * da der ula200-lcdproc-Treiber ohne ftdi_sio arbeitet, muß dieser vorher entladen werden, wenn er beim Erkennen des Modules automatisch geladen wird (''rmmod ftdi_sio'') bzw. oben beschriebene Anpassungen an dem Kernel-Modul brauchen nicht gemacht werden | ||
+ | * LCDd muß als root gestartet werden, bei den lcdproc-Clients reichen normale Userrechte | ||
+ | |||
+ | ===ULA-200 für [http://www.eisfair.org EisFair-Server]=== | ||
+ | ====EisFair?==== | ||
+ | Bei [http://www.eisfair.org EisFair] handelt es sich um eine Linux-Distribution von Frank Meyer und seinem Team. Nach der Installation erhält man einen Dienste-Server der einfach zu administrieren ist. Es werden solche Dienste wie Mail, UseNet, Samba, NFS, FTP, DHCP, DNS usw. angeboten. | ||
+ | |||
+ | Nun weis man ja, dass ein solcher Server keine Tastatur, Monitor usw. braucht, sondern einfach nur in der Ecke steht und läuft. Bei Problemen ist es aber hilfreich schnell ein paar Infos über den Zustand des Rechners zu haben. Also ist ein kleines Display (und vielleicht ein paar Tasten) gar nicht so schlecht. Aus diesem Grund habe ich mich mal damit beschäftigt das LC-Display ULA-200 an einen EisFair zu betreiben. Was dabei zu beachten und zu tun ist, kann man in der Folge lesen. | ||
+ | |||
+ | ====Voraussetzungen==== | ||
+ | Um das LC-Display an einem EisFair-Server betreiben zu können, sind einige Voraussetzungen zu schaffen: | ||
+ | * Quelltexte des Kernel-Moduls ftdi_sio, wie oben beschrieben, anpassen und neu übersetzen: | ||
+ | ** developer-Paket auf EisFair installieren | ||
+ | ** Kernel-Sources (derzeit 2.4.26) auf EisFair installieren | ||
+ | ** Quelltexte modifizieren (siehe entsprechend weiter oben) | ||
+ | ** Module neu übersetzen mit ''make modules'' (mal im Newsgroup-Archiv von www.eisfair.org nach Einzelheiten dazu suchen...) | ||
+ | ** neues ''ftdi_sio.o'' an die richtige Stelle unter /lib/modules/... auf dem EisFair-Rechner kopieren | ||
+ | ** Device /dev/ttyUSB0 via Befehl ''mknode c 188 0 /dev/ttyUSB0'' anlegen | ||
+ | |||
+ | * mal ausprobieren, ob alles von dieser Seite auf dem EisFair-Rechner funktioniert: | ||
+ | ** die Module ''usbcore, usbserial, ftdi_sio, usb-uhci'' (in dieser Reihenfolge) via ''insmod'' laden | ||
+ | ** wenn alles richtig läuft, sollten ähnliche Meldungen im Syslog erscheinen, wie oben (wichtig ist wieder die Meldung, dass /dev/ttyUSB0 von ftdi_sio eingebunden wird) | ||
+ | |||
+ | * will man den kleinen TCL-Daemon (siehe oben) verwenden: | ||
+ | ** auf dem EisFair-Server das tcl-Paket installieren (Achtung: die TCL-Shell in diesem Packet muss mit /usr/bin/tclsh8.4 gestartet werden; in meinen TCL-Scripten muß man die 1.Zeile eventuell dahingehend anpassen bzw. einen entsprechenden Link setzen.) | ||
+ | ** die Quellen des Daemon in ein geeignetes Verzeichnis auf dem EisFair kopieren (z.B. ''/usr/local/ula200d/'') | ||
+ | ** ein Startscript schreiben und einbinden (siehe nächstes Kapitel...), um den Start der Ausgaben auf dem LC-Display zu automatisieren | ||
+ | |||
+ | * ... und sich freuen, dass es funktioniert... ;-) | ||
+ | |||
+ | ====Startscript für EisFair==== | ||
+ | Hier ein Script zum Starten/Stoppen des Anzeige-Daemons, welches entweder manuell aufbar ist (''/etc/init.d/ula200d start'' bzw. ''/etc/init.d/ula200d stop'') und/oder auch im Systemstart eingebunden werden kann. Es werden die notwendigen Kernelmodule in der korrekten Reihenfolge geladen sowie der Daemon selbst gestartet bzw. auch wieder gestoppt. | ||
+ | |||
+ | |||
+ | '''/etc/init.d/ula200d''' | ||
+ | #! /bin/sh | ||
+ | #---------------------------------------------------------------------------- | ||
+ | # /etc/rc.d/ula200d - startet alles Notwendige zum Betrieb von ULA-200 | ||
+ | # | ||
+ | # erstellt: 03.01.2006 Uwe Berger | ||
+ | # geaendert: - | ||
+ | # | ||
+ | # Uwe Berger (bergeruw@gmx.net); 2006 | ||
+ | #---------------------------------------------------------------------------- | ||
+ | case $1 | ||
+ | in | ||
+ | start) | ||
+ | /usr/local/bin/colecho "loading ula200d ..." gn | ||
+ | /sbin/insmod usbcore 2>/dev/null | ||
+ | /sbin/insmod usbserial 2>/dev/null | ||
+ | /sbin/insmod ftdi_sio 2>/dev/null | ||
+ | /sbin/insmod usb-uhci 2>/dev/null | ||
+ | sleep 3 | ||
+ | /usr/local/ula200d/ula200d.tcl -f /usr/local/ula200d/ula200.conf & | ||
+ | ;; | ||
+ | stop) | ||
+ | /usr/local/bin/colecho "unloading ide ula200d ..." gn | ||
+ | killall ula200d.tcl | ||
+ | /sbin/rmmod usb-uhci 2>/dev/null | ||
+ | /sbin/rmmod ftdi_sio 2>/dev/null | ||
+ | /sbin/rmmod usbserial 2>/dev/null | ||
+ | /sbin/rmmod usbcore 2>/dev/null | ||
+ | ;; | ||
+ | esac | ||
+ | |||
+ | |||
+ | |||
+ | Natürlich kann dieses Script auch auf anderen Systemen, als ein EisFair-Server eingesetzt werden. U.U. sind kleine Anpassungen notwendig. Innerhalb des Scriptes wird vorausgesetzt, dass sich das Daemon-Programm und seine Konfigurationsdatei im Verzeichnis ''/usr/local/ula200d'' befindet. | ||
+ | |||
+ | Im Verzeichnis ''/etc/rc2.d'' ist ein symbolischer Link (z.B. S91ula200d) auf ''/etc/init.d/ula200d'' anzulegen, um beim Systemstart die Anzeige automatisch starten zu lassen. Bei anderen Distributionen ist u.U. anders zu verfahren. | ||
+ | |||
+ | |||
+ | ==Kontakt== | ||
+ | Bei Fragen zu diesem Thema stehe ich (Uwe Berger) natürlich gern zur Verfügung. Ich bin unter der Mail-Adresse [mailto:bergeruw@gmx.net bergeruw@gmx.net] erreichbar. | ||
==Weitere interessante Links zum Thema== | ==Weitere interessante Links zum Thema== | ||
Zeile 83: | Zeile 266: | ||
* [http://ssl.bulix.org/projects/lcd4linux/ LCD4Linux] | * [http://ssl.bulix.org/projects/lcd4linux/ LCD4Linux] | ||
* [http://www.intra2net.com/de/produkte/opensource/ftdi/ libftdi - A library (using libusb) to talk to FTDI's ] | * [http://www.intra2net.com/de/produkte/opensource/ftdi/ libftdi - A library (using libusb) to talk to FTDI's ] | ||
+ | * [http://www.fh-augsburg.de/~hhoegl/proj/siox-u/ SIOX-U - Serieller I/O eXpander für Usb] | ||
+ | * [http://www.lcdproc.org lcdproc] |
Aktuelle Version vom 24. März 2010, 08:27 Uhr
Inhaltsverzeichnis |
[Bearbeiten] Motivation
Wer kennt nicht das Problem -> irgendwo in der Ecke steht ein Server ohne Tastatur und Monitor. Plötzlich funktioniert die Kiste nicht mehr, ist zu langsam o.ä.. Warum?
Gut, man könnte jetzt Monitor, Tastatur anschliessen und nachschauen... Viel schöner ist es doch aber eine kleine Statusanzeige zu haben, auf der man mit einem Blick sehen kann, in welchem Zustand sich der Rechner befindet. Die Krönung wäre es, wenn man noch ein paar Tasten zur Verfügung hätte, mit denen einige, vordefinierte, Aktionen ausführen kann.
Im Internet und diversen Zeitschriften sind eine Menge Lösungen zu finden. Nach einiger Suche habe ich mich für den ELV-Bausatz ULA-200 entschieden. In diesem Artikel wird beschrieben, was zu tun ist, dieses Modul auch unter Linux anzusteuern.
[Bearbeiten] ULA-200 von ELV
[Bearbeiten] Technische Daten ULA-200
Innerhalb dieses Abschnittes soll es nicht darum gehen, den Bausatz ULA-200 (Artikel-Nr.: 68-572-39) von ELV in allen Einzelheiten zu besprechen. Es sollen nur kurz die wichtigsten Merkmale genannt werden, die dann u.a. auch der ausschlaggebenden Punkte für meine Wahl gewesen waren. Detailiertere Informationen sind aus der entsprechenden Bedienungsanleitung zu ziehen.
Merkmale:
- Der Bausatz beinhaltet eigentlich nur die Ansteuereinheit für ein HD-44780-kompatibel LC-Display. Angeschlossen wird das Teil an einem USB-Port. Als USB-Seriell-Wandler wird ein Chip vom Typ FTU232 verwendet. Es existiert hierzu ein Kernel-Modul (ftdi_sio) in den aktuellen Kernels (siehe weiter unten dazu). Dahinter befindet sich noch ein Micro-Controller, welcher speziell definierte Befehle (siehe Bedienungsanleitung) versteht und diese entsprechend auf die Datenleitungen der HD-44780-kompatiblen LC-Displays umsetzt.
- Stromversorgung erfolgt über die USB-Schnittstelle -> ein wichtiges Kriterium für mich.
- Neben dem LCD können auch bis zu 6 Taster angeschlossen werden, welche einzeln abgefragt werden können.
- Preis 28,50 Euro (ohne eigentliches Display, weiterhin sind noch einige Kleinmaterialien zum sinnvollen Aufbau hilfreich)
[Bearbeiten] Einige Hinweise zum Bausatz
Bei der Bestellung des Bausatzes sollte man nicht vergessen gleich ein entsprechendes LC-Display sowie den dafür geeigneten Kabelsatz mitzubestellen (wird aber auch auf der entsprechenden ELV-Shop-Seite gleich mit vorgeschlagen).
Der Aufbau der Schaltung ist relativ einfach. Es wird bei ELV zwar darauf hingewiesen, dass ein Großteil der Bauelemente im SMD-Format vorliegen, aber gerade diese sind im Auslieferungszustand bereits auf der Leiterplatte bestückt. Also keine Angst...! Die eigenen Lötarbeiten beschränken sich also auf das Bestücken der LEDs, Widerstände, Steckverbinder usw.. Man benötigt ca. 1 Stunde, wenn man sich etwas Zeit läßt.
Zum Bausatz gehört auch ein wenig Software (auf 3,5"-Diskette...;-)). Das beiliegende Testprogramm liegt aber nur als Windowsprogramm vor. Da man davon ausgehen kann, dass dieses Testprogramm funktioniert, habe ich den ersten Funktionstest mit diesem durchgeführt. Funktioniert alles, kann man sich mit der Ansteuerung unter Linux beschäftigen...
Nebenbei, auf der Diskette ist auch eine Library des FTDI-Chip-Herstellers zur Ansteuerung des selbigen enthalten. Allerdings liegt das Zeug nur als closed source vor...
[Bearbeiten] Kernel-Modul fdti_sio
Innerhalb der Quellen des Kernel-Modules fdti_sio sind einige Änderungen vorzunehmen. Es geht dabei um die Bekanntgabe der Ventor- und Produkt-ID. Die beiden entsprechenden Dateien sind unter /usr/src/linux/drivers/usb/serial/ zu finden (Kernelquellen sollten installiert sein). In den Quelle verschiedener Kernelversionen gab es bereits einen Eintrag für das ELV-Modul UO100. Ich habe meine Einträge jeweils hinter diesen Stellen vorgenommen:
fdti_sio.h:
#define FTDI_ELV_ULA200_PID 0xF06D /* USB-LCD-Ansteuerung (ULA 200) */
fdti_sio.c
static struct usb_device_id id_table_8U232AM [] = { ... { USB_DEVICE_VER(FTDI_VID, FTDI_ELV_ULA200_PID, 0, 0x3ff) }, ...
static struct usb_device_id id_table_FT232BM [] = { ... { USB_DEVICE_VER(FTDI_VID, FTDI_ELV_ULA200_PID, 0x400, 0xffff) }, ...
static struct usb_device_id id_table_combined [] = { ... { USB_DEVICE(FTDI_VID, FTDI_ELV_ULA200_PID) }, ...
Hinweis: letztens habe ich auf einem Rechner einen Kernel 2.6.15 installiert und mir auch gleich mal die Quellen von ftdi_sio angesehen -> hier ist schon alles für ULA-200 vorbereitet. In ftdi_sio.h muß nichts gemacht werden, in ftdi_sio.c eine entsprechende Zeile (nach ULA200 suchen) auskommentiert werden. (Der nachfolgende Test verlief erfolgreich.)
Dann ist der Kernel mit seinen Modulen (eigentlich ja nur das modifizierte Modul...) zu übersetzen. Die Verfahrensweise ist bei den verschiedenen Kernelversionen teilweise unterschiedlich, also einfach mal nachlesen (im Root-Verzeichnis der Kernelquellen gibt es dazu eine README).
Nach erfolgreicher Kernelübersetzung kopiert man einfach die Datei ftdi_sio.o (bzw. bei Kernelversion >= 2.6.x ftdi:sio.ko) aus dem Verzeichnis /usr/src/linux/drivers/usb/serial/ in das Verzeichnis /lib/modules/<kernel-version>/kernel/drivers/usb/serial/. Rechner einmal durchbooten bzw. setzt den Befehl depmod -a ab und dann solltes es das gewesen sein. Schließt man nun das LCD-Modul an den USB-Port an sollten folgende Meldungen im Syslog erscheinen:
Dec 20 08:44:26 tecra kernel: hub.c: new USB device 00:05.2-1, assigned address 5 Dec 20 08:44:26 tecra kernel: usb.c: USB device 5 (vend/prod 0x403/0xf06d) is not claimed by any active driver. Dec 20 08:44:30 tecra kernel: usbserial.c: USB Serial support registered for FTDI SIO Dec 20 08:44:30 tecra kernel: usbserial.c: USB Serial support registered for FTDI 8U232AM Compatible Dec 20 08:44:30 tecra kernel: usbserial.c: FTDI 8U232AM Compatible converter detected Dec 20 08:44:30 tecra kernel: usbserial.c: FTDI 8U232AM Compatible converter now attached to ttyUSB0 (or usb/tts/0 for devfs)
[Bearbeiten] Wie steuert man ULA-200 nun unter Linux an?
[Bearbeiten] Prinzipielles
Die Kommunikation zwischen Rechner und LCD-Modul ist nicht weiter kompliziert. Beim dem FTDI-Chip handelt es sich um einen USB-Seriell-Umsetzer, was nichts anderes heißt, dass man die ganze Sache wie eine serielle Schnittstelle betrachten kann. Das entsprechende Device ist das, was auch im Syslog beim Laden des Kernel-Modules angegeben wird (im oberen Beispiel also /dev/ttyUSB0).
Die einzustellenden Parameter zur Initialisierung der seriellen Schnittstelle sind ebenfalls fest vorgegeben:
19200,e,8,1
Mit anderen Einstellungen hat man keinen Erfolg (zumindestens beim sicheren Einlesen von Daten vom LCD-Modul...)!
Die Kommunikation mit dem Modul erfolgt in beiden Richtungen. Das dabei zu verwendende Protokoll (Bytefolgen die über die Schnittstelle gesendet werden) sind der Beschreibung von ELV zu entnehmen.
[Bearbeiten] Textausgaben auf dem Display
Da ich bekennender TCL-Fan bin, habe ich verschiedene Tools in dieser Script-Sprache geschrieben, um das LCD-Modul anzusprechen. Hier ein Stück TCL-Quelltext, um z.B. die Hintergrundbeleuchtung des Displays anzuschalten, den Cursor auf die Position 1, 11 (y, x) zu setzen und an dieser Stelle ein "a" auszugeben:
#!/usr/bin/tclsh # set port /dev/ttyUSB0 # # Device oeffnen und initialisieren if {[catch {set com [open $port RDWR] }]==1 } { puts "no device on $port"} fconfigure $com -translation binary fconfigure $com -mode 19200,e,8,1 fconfigure $com -buffering none fconfigure $com -blocking 0 # # Hintergrundbeleuchtung einschalten puts -nonewline $com \x02 puts -nonewline $com \x68 puts -nonewline $com \x31 puts -nonewline $com \x03 # # Cursorposition x=11 y=1 setzen puts -nonewline $com \x02 puts -nonewline $com \x70 puts -nonewline $com \x0A puts -nonewline $com \x01 puts -nonewline $com \x03 # # ein 'a' an aktueller Cursorposition ausgeben puts -nonewline $com \x02 puts -nonewline $com \x63 puts -nonewline $com \x61 puts -nonewline $com \x03 # # Device wieder schliessen close $com exit
Eventuell muß nach jedem Senden eines Bytes (puts -nonewline $com ...) über die serielle Schnittstelle ein after 1 (1ms Pause) eingebaut werden. Bei schnellen Rechnern ist die Pause u.U. noch größer zu wählen, einfach mal ausprobieren.
[Bearbeiten] Tastenabfrage
Wie schon eingangs erwähnt, kann man an das LCD-Modul 6 Tasten anschließen. Bei Tastenbetätigung wird eine definierte Bytefolge über die Schnittstelle zum angeschlossenen Rechner gesendet. Hier ein kleines TCL-Programm, dass auswertet, welche Taste(n) gedrückt wurde(n):
#!/usr/bin/tclsh # set device /dev/ttyUSB0 # # ein Byte einlesen, wenn "t", dann ist im naechsten Byte # die Tastenbelegung kodiert... proc einlesen dev { if {[read $dev 1] == "t"} { after 3 scan [read $dev 1] %c taste if {$taste & 1 } {puts "Taste 1"} if {$taste & 2 } {puts "Taste 2"} if {$taste & 4 } {puts "Taste 3"} if {$taste & 8 } {puts "Taste 4"} if {$taste & 16} {puts "Taste 5"} if {$taste & 32} {puts "Taste 6"} puts "-------" } } # # Device oeffnen und initialisieren if {[catch {set com [open $device RDWR] }]==1 } { puts "no device on $device" exit } else { fconfigure $com -translation binary fconfigure $com -mode 19200,e,8,1 fconfigure $com -buffering none fconfigure $com -blocking 0 } # # wenn etwas an Schnittstelle anliegt, dann einlesen... fileevent $com readable [list einlesen $com] # # Endlos-Loop... vwait enter-mainloop
[Bearbeiten] ... und ein Programm dazu ...
Unter diesem Link ist eine kleiner Toolsammlung (neuere Version...) zur Ansteuerung des LCD-Modules zu finden. Es ist dort ein Daemon zu finden, der einige Systeminformationen auf dem Display darstellt und in dem weitere Scripte zur Ausführung eingebunden werden können. Desweiteren ist ein Kommandozeilentool zu finden, mit dem einzelne Befehle zum Display gesendet werden können. In allen Programmen werden die Tasten des Modules ULA-200 unterstützt.
[Bearbeiten] lcdproc
Es existiert ein (noch inoffizieller) Devicetreiber für lcdproc von Bernhard Walle für dieses Modul. Bernhard hatte diesen Artikel gelesen und sich dann ans Programmieren eines Treibers gemacht...(super :-)). Er hat auch die 6 Tasten des Moduls integriert.
Bisher ist dieser Treiber aber noch nicht in der ofiziellen Version von lcdproc enthalten. Im momentan aktuell verfügbaren "Nightly Build" von lcdproc ist der Patch aufgenommen worden.
Einige Hinweise dazu:
- natürlich erstmal die mitgelieferten Dokus lesen
- zum erfolgreichen Übersetzen von lcdproc für ula200 benötigt man eine aktuelle Version der libftdi (momentan Version 0.7)
- ansonsten sollten natürlich alle gemeldeten Abhängigkeiten bei Aufruf von ./configure erfüllt werden
- um nur den ula200-Treiber zu übersetzen einfach ein ./configure --enable-devices=ula200 absetzen
- Übersetzen von lcdproc mit make'
- es brauchen erstmal keine speziellen Anpassungen in der LCDd.conf für ula200 gemacht werden (das Device muß natürlich auf ula200 gesetzt werden...)
- da der ula200-lcdproc-Treiber ohne ftdi_sio arbeitet, muß dieser vorher entladen werden, wenn er beim Erkennen des Modules automatisch geladen wird (rmmod ftdi_sio) bzw. oben beschriebene Anpassungen an dem Kernel-Modul brauchen nicht gemacht werden
- LCDd muß als root gestartet werden, bei den lcdproc-Clients reichen normale Userrechte
[Bearbeiten] ULA-200 für EisFair-Server
[Bearbeiten] EisFair?
Bei EisFair handelt es sich um eine Linux-Distribution von Frank Meyer und seinem Team. Nach der Installation erhält man einen Dienste-Server der einfach zu administrieren ist. Es werden solche Dienste wie Mail, UseNet, Samba, NFS, FTP, DHCP, DNS usw. angeboten.
Nun weis man ja, dass ein solcher Server keine Tastatur, Monitor usw. braucht, sondern einfach nur in der Ecke steht und läuft. Bei Problemen ist es aber hilfreich schnell ein paar Infos über den Zustand des Rechners zu haben. Also ist ein kleines Display (und vielleicht ein paar Tasten) gar nicht so schlecht. Aus diesem Grund habe ich mich mal damit beschäftigt das LC-Display ULA-200 an einen EisFair zu betreiben. Was dabei zu beachten und zu tun ist, kann man in der Folge lesen.
[Bearbeiten] Voraussetzungen
Um das LC-Display an einem EisFair-Server betreiben zu können, sind einige Voraussetzungen zu schaffen:
- Quelltexte des Kernel-Moduls ftdi_sio, wie oben beschrieben, anpassen und neu übersetzen:
- developer-Paket auf EisFair installieren
- Kernel-Sources (derzeit 2.4.26) auf EisFair installieren
- Quelltexte modifizieren (siehe entsprechend weiter oben)
- Module neu übersetzen mit make modules (mal im Newsgroup-Archiv von www.eisfair.org nach Einzelheiten dazu suchen...)
- neues ftdi_sio.o an die richtige Stelle unter /lib/modules/... auf dem EisFair-Rechner kopieren
- Device /dev/ttyUSB0 via Befehl mknode c 188 0 /dev/ttyUSB0 anlegen
- mal ausprobieren, ob alles von dieser Seite auf dem EisFair-Rechner funktioniert:
- die Module usbcore, usbserial, ftdi_sio, usb-uhci (in dieser Reihenfolge) via insmod laden
- wenn alles richtig läuft, sollten ähnliche Meldungen im Syslog erscheinen, wie oben (wichtig ist wieder die Meldung, dass /dev/ttyUSB0 von ftdi_sio eingebunden wird)
- will man den kleinen TCL-Daemon (siehe oben) verwenden:
- auf dem EisFair-Server das tcl-Paket installieren (Achtung: die TCL-Shell in diesem Packet muss mit /usr/bin/tclsh8.4 gestartet werden; in meinen TCL-Scripten muß man die 1.Zeile eventuell dahingehend anpassen bzw. einen entsprechenden Link setzen.)
- die Quellen des Daemon in ein geeignetes Verzeichnis auf dem EisFair kopieren (z.B. /usr/local/ula200d/)
- ein Startscript schreiben und einbinden (siehe nächstes Kapitel...), um den Start der Ausgaben auf dem LC-Display zu automatisieren
- ... und sich freuen, dass es funktioniert... ;-)
[Bearbeiten] Startscript für EisFair
Hier ein Script zum Starten/Stoppen des Anzeige-Daemons, welches entweder manuell aufbar ist (/etc/init.d/ula200d start bzw. /etc/init.d/ula200d stop) und/oder auch im Systemstart eingebunden werden kann. Es werden die notwendigen Kernelmodule in der korrekten Reihenfolge geladen sowie der Daemon selbst gestartet bzw. auch wieder gestoppt.
/etc/init.d/ula200d
#! /bin/sh #---------------------------------------------------------------------------- # /etc/rc.d/ula200d - startet alles Notwendige zum Betrieb von ULA-200 # # erstellt: 03.01.2006 Uwe Berger # geaendert: - # # Uwe Berger (bergeruw@gmx.net); 2006 #---------------------------------------------------------------------------- case $1 in start) /usr/local/bin/colecho "loading ula200d ..." gn /sbin/insmod usbcore 2>/dev/null /sbin/insmod usbserial 2>/dev/null /sbin/insmod ftdi_sio 2>/dev/null /sbin/insmod usb-uhci 2>/dev/null sleep 3 /usr/local/ula200d/ula200d.tcl -f /usr/local/ula200d/ula200.conf & ;; stop) /usr/local/bin/colecho "unloading ide ula200d ..." gn killall ula200d.tcl /sbin/rmmod usb-uhci 2>/dev/null /sbin/rmmod ftdi_sio 2>/dev/null /sbin/rmmod usbserial 2>/dev/null /sbin/rmmod usbcore 2>/dev/null ;; esac
Natürlich kann dieses Script auch auf anderen Systemen, als ein EisFair-Server eingesetzt werden. U.U. sind kleine Anpassungen notwendig. Innerhalb des Scriptes wird vorausgesetzt, dass sich das Daemon-Programm und seine Konfigurationsdatei im Verzeichnis /usr/local/ula200d befindet.
Im Verzeichnis /etc/rc2.d ist ein symbolischer Link (z.B. S91ula200d) auf /etc/init.d/ula200d anzulegen, um beim Systemstart die Anzeige automatisch starten zu lassen. Bei anderen Distributionen ist u.U. anders zu verfahren.
[Bearbeiten] Kontakt
Bei Fragen zu diesem Thema stehe ich (Uwe Berger) natürlich gern zur Verfügung. Ich bin unter der Mail-Adresse bergeruw@gmx.net erreichbar.
[Bearbeiten] Weitere interessante Links zum Thema
- Linux USB LCD Display mit Watchdog und Tasten
- USBLCD
- FT232BM, FT245BM, FT8U232AM and FT8U245AM Drivers
- FTDI-Chip
- Using an FT232 BM Chip in an embedded system and a Linux OS
- FTDI SIO, 8U232AM and 245 Linux USB Serial Converter Driver
- HD44780 kompatible LCD-Displays verstehen
- How to control a HD44780-based Character-LCD
- HD44780-Based LCD Modules
- LCD4Linux
- libftdi - A library (using libusb) to talk to FTDI's
- SIOX-U - Serieller I/O eXpander für Usb
- lcdproc