Hardware-Watchdog mit serieller Schnittstelle


Bleibt ein Server aus welchen Gründen auch immer stehen, führt dies meist zu Problemen im gesamten Netzwerk. Kommerzielle Server-Hardware hat für diesen Zweck meist eine umfangreiche Überwachung (z.B. IPMI) eingebaut, die bei einem Ausfall den Server-Rechner neu startet, um einen möglichst unterbrechungsfreien Betrieb zu erreichen. So eine Überwachungsschaltung enthält dann einen sog. Watchdog, der für den Reset-Vorgang zuständig ist. Baut man sich einen Server aus gewöhnlichen PC-Komponenten zusammen, leidet darunter meist nicht nur die Stabilität, sondern es ist in der Regel auch keine derartige Watchdog-Schaltung auf dem Mainboard vorhanden. Abhilfe soll diese kleine Schaltung schaffen, die man sich für weniger als 10 Euro selbst bauen kann. Zusätzlich erledigt sie auch gleich noch das automatische Einschalten des Rechners ähnlich dem hier vorgestellten Automatischen ATX-Einschalter.

 

Inhaltsverzeichnis

 

Designvorgaben

Ziel dieser Schaltung ist das automatische Zurücksetzen eines Rechners, wenn ein bestimmtes regelmäßiges Signal ausbleibt. Dies ist dann der Fall, wenn das Betriebssystem sich aus welchen Gründen auch immer aufgehängt hat. Zum Zurücksetzen gibt es zwei Möglichkeiten: entweder mit Hilfe der Reset-Leitung des Mainboards, oder durch kurzfristiges Aus- und wieder Einschalten des Rechners. In dieser Schaltung wurde das zweite Verfahren gewählt, um gleichzeitig auch eine Auto-Power-On-Funktion zu ermöglichen. Nachteil ist allerdings, daß dadurch auch die Festplatten kurzzeitig ausgeschaltet werden. Allerdings sollte ein Neustart durch diese Schaltung eine absolute Ausnahme sein, so daß dieser Nachteil in Kauf genommen wurde. Bleibt der Rechner öfter als ein oder zwei Mal im Jahr stehen, sollte man sich besser ernsthafte Gedanken über die Stabilität der Hard- und Software machen, als diese Schaltung dafür einzusetzen. Ein gut zusammengestellter Server mit einem Unix-Betriebssystem sollte eigentlich ohne Probleme länger als ein Jahr ohne einen einzigen Absturz durchlaufen. Diese Schaltung ist nur ein absoluter Notnagel, der einen unterbrechungsfreien Betrieb des Servers ermöglichen soll.

Folgende Vorgaben waren durch die Schaltung zu erfüllen:

Aufgrund dieser Vorgaben kommt eigentlich nur eine Steuerung der Watchdog-Schaltung mit Hilfe eines Mikroprozessors in Frage.

 

Schaltungsbeschreibung

Als Basis für die Schaltung wurde ein PIC-Prozessor der Firma Microchip vom Typ PIC12F629 ausgewählt. Dieser Prozessor hat eine ausreichende Anzahl an I/O-Ports, einen internen kalibrierten Oszillator und mit 4 MHz eine ausreichende Rechenleistung. Die Gesamtschaltung ist im folgenden Bild zu sehen:
Schaltplan
Die Spannungsversorgung erfolgt über die Standby-Leitung des ATX-Netzteils. Dadurch startet der PIC, sobald das Netzteil mit Netzspannung versorgt wird. Um die Programmierung des PIC mit einem einfachen JDM-Programmer zu ermöglichen, wurde Pin 4 dauerhaft auf +5V gelegt und dieser Pin mit der MCLR-Funktion programmiert. Damit bleiben noch 5 I/O-Ports übrig.

GP4 stellt die Verbindung zum Mainboard her. Durch die Diode D1 wird dieser Pin zu einem Open-Collector-Ausgang, der den Power-Anschluss am Mainboard zum Ein- und Aussschalten des Rechners kurzfristig auf Masse legt. Da es sich also hierbei nicht um einen echten Schalter handelt, darf man die Anschlüsse am Mainboard nicht vertauschen. Einer der Pins des Power-Anschlusses ist immer mit Masse verbunden, der andere ist dann der Signal-Eingang. Hat man für sein Mainboard keine ausreichende Dokumentation, muss man eben mit einem Durchgangsprüfer nachmessen. Vertauscht man aus Versehen die Anschlüsse TP1 und TP2, schadet das dem Mainboard zwar nicht, aber die Schaltung funktioniert auch nicht.

An GP5 wird der Gehäusetaster angeschlossen, der vorher für das Einschalten des Rechners zuständig war. Auf diese Weise kann der Rechner auch weiterhin manuell ein- und ausgeschaltet werden. Da der Taster nunmehr über den PIC verwaltet wird, kann man durch Änderung der PIC-Firmware dem Taster leicht neue Funktionen beibringen. Die weiter unten beschriebene Firmware schaltet den Rechner erst aus, wenn man länger als 4 Sekunden auf den Taster drückt. Drückt man kürzer drauf, wird ein Signal an das Betriebssystem geschickt, mit dem dann eine beliebige Funktion ausgeslöst werden kann. Der Taster wird direkt an den I/O-Pin des PIC angeschlossen. Da der Pin GP5 einen internen programmierbaren Pull-Up-Widerstand besitzt, braucht man einen solchen nicht mehr extern.

Die serielle Schnittstelle ist einfach gehalten, da die Schaltung direkt in den Rechner eingebaut wird, und die Länge der Verbindug zum seriellen Port des Mainboards nicht länger als 30 - 40 cm betragen wird. Normalerweise beträgt die Spannung auf der seriellen Schnittstelle für eine logische Null +3 bis +15 Volt, und für eine logische Eins -3 bis -15 Volt. Zum seriellen Empfang wird mit R1 und D2 die Spannung einfach auf 0 - 5 Volt begrenzt. Aufgrund der geringen Kabellänge ist der Signal-Rausch-Abstand dadurch immer noch ausreichend. Im Prinzip könnte man sogar auf D2 verzichten, da der PIC an allen Eingängen Clamping-Dioden besitzt. Allerdings erscheint die Benutzung einer Zener-Diode sicherer. Für den seriellen Ausgang ist eigentlich ein Treiber-Baustein wie z.B. ein MAX232 notwendig. Die meisten auf den Mainboards eingebauten seriellen Schnittstellen kommen aber auch mit einer Spannung von 0 - 5 Volt zurecht, so dass hier aufgrund der geringen Kabellänge auf einen Ausgangstreiber verzichtet wurde. Experimente haben gezeigt, dass dies bis zu einer Länge von 50 cm problemlos funktioniert. Für den seriellen Empfang (Leitung RX) wurde Pin GP2 benutzt, da dieser einen flankengetriggerten Interrupt im PIC auslösen kann. Die Sendeleitung (TX) kann ein beliebiger Ausgang sein, hier wurde GP0 benutzt. Zu beachten ist bei dieser einfachen Interface-Schaltung, dass der Sendeausgang im Gegensatz zu einer echten RS232-Schnittstelle nicht kurzschlussfest ist, und auch nicht aus Versehen an einen spannungsführenden Pin der seriellen Schnittstelle angeschlossen wird. Liegt nämlich an diesem I/O-Pin versehentlich +/-12 Volt, kann man den Netzstecker gar nicht so schnell herausziehen wie der PIC zu Tode gebraten wird.

Etwas Erklärung bedarf wohl auch die DTR-Leitung. Sie dient dazu festzustellen, ob der Rechner eingeschaltet ist oder nicht. Liegt die Spannung auf dieser Leitung nämlich nahe bei 0 Volt, ist der Rechner ausgeschaltet. Liegt sie dagegen auf einem RS232-Logikpegel, ist der Rechner eingeschaltet - und zwar unabhängig davon, ob irgendeine Software auf den seriellen Port zugreift oder nicht. Zusätzlich kann aber aufgrund des Logikpegels noch bestimmt werden, ob der Hostrechner seine serielle Schnittstelle aktiviert hat oder nicht, und der PIC kann entsprechend sein Interface aktivieren. Die Widerstände R2 bis R4 dienen dazu, die Spannung auf der DTR-Leitung aus dem Bereich -15 bis +15 Volt in den Bereich 0 bis +5 Volt umzusetzen. Damit ergeben sich drei Zustände für die DTR-Leitung:

Diese drei Zustände lassen sich im PIC mit Hilfe des internen Komparators und dem externen Widerstandsnetzwerk problemlos erkennen. Der Komparatoreingang liegt auf I/O-Pin GP1. Als Schaltschwellen für den Komparator werden 1,9 Volt und 3,1 Volt aufgrund der Dimensionierung des Widerstandsnetzwerkes benutzt.

 

Schaltungsaufbau

Der Aufbau der Schaltung ist zeimlich einfach. In dem TAR-Archiv, das man weiter unten herunterladen kann, ist eine Eagle-Platine enthalten, wenn man denn unbedingt eine Platine ätzen möchte. Der Aufbau auf einer Lochrasterplatine ist aber vermutlich einfacher und schneller. Das folgende Bild zeigt einen Probeaufbau:
Platine
Auf diesem Bild erkennt man, dass der Power-Ausgang zum Mainboard für Testzwecke mit einer LED simultiert wurde. Die serielle Verbindung erfolgte mit einem handelsüblichen seriellen 1:1-Kabel. Nach Einbau der Schaltung in das Rechnergehäuse wird an die serielle Buchse der Schaltung direkt das Kabel des Slotblech-Adapters vom seriellen Port des Mainboards angeschlossen. Zum Anschluß an die Standby-Versorgung kann man das violette Kabel am ATX-Netzteil auftrennen, eine Lüsterklemme zwischensetzen und dann noch diese Schaltung daran anschließen. Sollte das Mainboard über einen Anschluß für Wake-On-Lan verfügen, kann man sich die Standby-Spannung auch daher holen. Schließlich misst man noch den Power-On-Anschluss am Mainboard aus und schließt ihn an die Platine an. Wenn alles richtig verkabelt wurde, muss der Rechner automatisch anlaufen, sobald man das Netzteil mit Netzspannung versorgt.

Kleiner Hinweis am Rande: Ich habe weder Zeit noch Lust, für irgendjemanden die Plantinen herzustellen. Wer also eine geätzte Platine haben möchte, muss dies bitte selbst machen oder jemanden anderes damit beauftragen.

Noch ein Hinweis: Ich habe ebenfalls keine Zeit, für irgendjemanden den PIC zu brennen. Billige JDM-Programmer gibt es für wenige Euronen beim großen Auktionshaus.

Wichtig: Der Nachbau dieser Schaltung geschieht auf eigene Verantwortung. Der Autor dieser Seite übernimmt keinerlei Haftung, insbesondere nicht dafür, dass die oben genannte Schaltung wie beschrieben funktioniert. Es wird auch keine Haftung für eventuell durch diese Schaltung entstandene Schäden übernommen.

 

PIC-Firmware

Die Firmware des PIC belegt aufgrund des Funktionsumfanges fast den gesamten Flash-Speicher von 1023 Befehlsworten. Das PIC-eigene EEPROM wird benutzt, um verschiedene Einstellparameter dauerhaft abzuspeichern. Da der PIC12F629 nicht über einen UART verfügt, muss die serielle Schnittstelle zur Kommunikation mit dem Host-Rechner in Software nachgebildet werden. Aufgrund der geringen Rechenkapazität des kleinen PIC ist die Geschwindigkeit der seriellen Kommunikation auf 1200 Baud eingestellt. Da jedoch keine großen Datenmengen übertragen werden müssen, ist dies mehr als ausreichend. Das Kommunikationsprotokoll ist 8N2, also mit 2 Stop-Bits. Jedes Byte, das an den Watchdog gesendet wird, zeigt, dass der Host-Rechner noch aktiv ist. Deshalb wird bei jedem Byte der Watchdog-Timeout zurückgesetzt. Um also einen Rechner-Neustart zu verhindern, muss der Host-Rechner in regelmäßigen Abständen zumindest ein Byte an den Watchdog senden.

Nach dem Einschalten der Standby-Versorgungsspannung initialisiert der PIC zunächst seine interne Peripherie, und wartet dann ein Weilchen. Danach wird über die DTR-Leitung nachgesehen, ob der Host-Rechner sich selbst eingeschaltet hat. Wenn nicht, wird kurzfristig die Power-On-Leitung aktiviert, um den Rechner einzuschalten (Auto-Power-On). Danach läft die Firmware in eine Endlosschleife, in der ständig die serielle Schnittstelle, der Status des Gehäusetasters und der Zeitablauf des Watchdogs überprüft werden. Der Timer 1 des PIC wird als globaler Zeitgeber mit einer Frequenz von 10 Hz benutzt. Insofern sind alle Timeout-Werte und Zeitangaben in Vielfachen dieser Frequenz anzugeben. Für die serielle Schnittstelle wird der Interrupt-Pin GP2 verwendet. Bei einer positiven Flanke an diesem Pin wird gerade ein Start-Bit empfangen und der weitere Empfangsprozess mit Timer 0 gesteuert. Zum Senden wird ebenfalls Timer 0 benutzt. Deshalb ist die Kommunikation nur im Simplex-Betrieb möglich - der PIC kann nicht gleichzeitig senden und empfangen. Dies ist aber auch nicht nötig: gesendet wird erst, nachdem ein Kommando vollständig empfangen wurde. Und der Host-Rechner darf selbst erst senden, nachdem er eine Antwort auf sein vorheriges Kommando erhalten hat. Der Status des Tasters wird ebenfalls per Interrupt erfasst. Hierzu wird die Interrupt-On-Change-Funktion des Pins GP5 verwendet.

Die PIC-Firmware ist in C geschrieben. Zum Übersetzen wurde der SDCC verwendet. Eine bereits übersetzte HEX-Datei der Firmware findet sich im TAR-Archiv.

Alle Kommandos an den Watchdog haben eine Länge von 9 Bytes und folgenden Aufbau:

  1. Fester Wert: 0x57 (ASCII-Zeichen 'W')
  2. Fester Wert: 0x44 (ASCII-Zeichen 'D')
  3. Kommando-Wert in Hex - höherwertiges Nibble
  4. Kommando-Wert in Hex - niederwertiges Nibble
  5. Argumenten-Wert in Hex - höherwertiges Nibble
  6. Argumenten-Wert in Hex - niederwertiges Nibble
  7. Checksumme in Hex - höherwertiges Nibble
  8. Checksumme in Hex - niederwertiges Nibble
  9. Fester Wert: 0x0D
Ist der Checksummen-Wert Null, wird die Checksumme nicht geprüft. Anderenfalls werden die drei Bytes Kommando, Argument und Checksumme zusammenaddiert. Ihre Summe modulo 256 muss dann Null ergeben.

Die Firmware versteht folgende Kommandos:

Bei den Funktionen 0x04 und 0x05 gibt das Argument die Zeit in Zehntel-Sekunden an, nach der der Host-Rechner neu gestartet bzw. ausgeschaltet werden soll.
Die EEPROM-Adressen sind wie folgt definiert:
Eine Besonderheit der Watchdog-Schaltung ist der Reset-Zähler. Er wird bei jedem Neustart aufgrund eines Ablaufs der Watchdog-Zeit um eins erhöht. Wird ein maximaler Wert erreicht, dann erfolgt bei einem weiteren Zeitablauf des Watchdog-Timers kein Neustart mehr, sondern der Host-Rechner wird komplett ausgeschaltet. Diese Funktion dient dazu, dass der Host-Rechner nicht bei immer wiederkehrenden Ausfällen zu häufig neu gestartet wird. Dies könnte nämlich dann zu Lasten der Festplatten gehen. Der Reset-Zähler wird nur bei einem Watchdog-Timeout erhöht, nicht aber bei einem Neustart mittels des Kommandos 0x04.

Die Antwort des Watchdog ist immer 7 Bytes lang und wie folgt aufgebaut:

  1. Fester Wert: 0x57 (ASCII-Zeichen 'W')
  2. Fester Wert: 0x44 (ASCII-Zeichen 'D')
  3. Kommando-Code oder Fehler-Code in Hex - höherwertiges Nibble
  4. Kommando-Code oder Fehler-Code in Hex - niederwertiges Nibble
  5. Ergebnis-Wert in Hex - höherwertiges Nibble
  6. Ergebnis-Wert in Hex - niederwertiges Nibble
  7. Fester Wert: 0x0D
Der Ergebnis-Wert ist für alle Kommandos, die keinen Wert zurückgeben, Null. Fehler-Codes zeichnen sich dadurch aus, dass bei ihnen das oberste Bit im Gegensatz zu Kommando-Codes gesetzt ist. Folgende Fehler-Codes sind definiert:
Ein Alarm-Interrupt wird ausgelöst, wenn die Power-Taste eine bestimmte Zeit gedrückt wurde. Diese Zeit muss kleiner sein als diejenige, mit der der Host-Rechner ausgeschaltet wird. Der Alarm-Interrupt kann beispielsweise benutzt werden, um einen geordneten Shutdown des Rechners auszuführen, oder sonst irgendeine andere Funktion auszulösen.

Folgendes Beispiel soll die Programmierung des Watchdog verdeutlichen:
Kommando an den Watchdog: WD244000
Dieses Kommando setzt das EEPROM-Register Nummer 4 (die Watchdog-Timeout-Zeit) auf den Wert 0x40, also 6,4 Sekunden. Eine Checksummenprüfung wurde nicht angegeben.
Antwort vom Watchdog: WD2404
Dies bedeutet, dass der Befehl korrekt ausgeführt wurde.

 

Host-Software

Die Host-Software implementiert die meisten Möglichkeiten des Watchdog. Insbesondere ist es damit möglich, die EEPROM-Werte zu setzen und abzufragen. Die wichtigste Funktion ist aber wohl der Daemon-Mode. Er sorgt dafür, dass der Watchdog regelmäßig ein NOP-Kommando gesendet bekommt, um den internen Watchdog-Timer zurückzusetzen und damit einen Neustart des Rechners zu verhinden. Die Host-Software sollte auf jedem aktuellen Unix-Rechner laufen. Getestet wurde die Software unter Linux. Eine Portierung auf Windows ist von mir weder geplant noch jemals zu erwarten, da ich keinen Testrechner mit Windows besitze und auch niemals besitzen werde.

 

Download


Zurück zu Gero's Homepage

gero@gkminix.han.de