Die Beschreibung des Watchdog in der 5820 Motherboardbeschreibung ist schlicht falsch. Hier ein User-Space-Programm das ich zum Laufen gebracht habe und das genau das macht was man sich davon erwartet:
#include <unistd.h>
#include <stdio.h>
#include <sys/io.h>
#define WD_VERSION "V0.1"
int main(int argc, char ** argv)
{
int count=0;
int retval=0;
// Allow the Process to access the watchdog-port
retval = iopl(3);
if (retval == 0) {
printf("watchdog " WD_VERSION " started!\n");
// TODO: print to Logfiles !!!
for (;;) {
outb_p(0xff ,0x443);
/* retval = inb(0x443); */
/* if ( ( retval != 0) || */
/* ( (argv[0][0] == '-') && */
/* (argv[0][1] == 'd') ) ) */
/* printf("%d. inb(0x443) says %d\n", count, retval); */
usleep(100000);
// be a little bit verbose all 10 minutes
count ++;
if (!(count % 6000)) {
// TODO: print to Logfiles !!!
printf("watchdog " WD_VERSION " running since 10 Minutes\n");
count = 0;
}
}
// Switch of Watchdog
outb(1, 0x043);
retval = inb(0x043);
if ( ( retval != 0) ||
( (argv[0][0] == '-') &&
(argv[0][1] == 'd') ) )
printf("inb(0x043) says %d\n", retval);
} else {
// TODO: print to Logfiles !!!
printf("watchdog " WD_VERSION " had problems with iopl(3)\n");
printf("iopl(3) returned %d\n", retval);
printf("perhaps watchdog didn't run with root privileges\n");
printf("Try to set sticky-bit on the watchdog executable\n");
exit(1);
}
}
Nun will man ja nicht jede Sekunde aus dem Userspace auf das Register 0x443 schreiben und dem Anwenderprozeß root-Rechte verpassen. Daher habe ich nach einer Kerneldriver-Lösung gesucht. Der advantechwdt.c der bei jeder gängigen Linux-Distribution enthalten ist, deutete stark auf einen 5820 kompatiblen Watchdog-Treiber hin. Dieser funktionierte auch nicht auf Anhieb. Um mit z.B.
echo 1 > /dev/watchdog
und einem sleep 1 in einer Endlosschleife den Watchdog am Leben zu erhalten
muß man zuerst in der Datei /etc/modconf folgende Zeile
alias char-major-10-130 softdog
auskommentieren und gegen den Start des advantechwdt ersetzen. Statt der
Zeile sollte das ganze dann so aussehen:
alias char-major-10-130 advantechwdt
Nun sind wir so weit, daß wir nur durch ein
echo 1 > /dev/watchdog
schon unseren advantechwdt geladen bekommen. Leider werden Sie vermutlich
auch feststellen, daß zwar der Modul geladen ist, in /var/log/messages
meldet wer brav seine Version, nur rebootet die PCM5820 Kiste leider nicht.
Nun auch das läßt sich beheben. ;-)
Wechseln Sie in das Directory /usr/src/linux (oder wo immer Sie ihre Kernel-Sourcen haben) und editieren Sie dort die Datei drivers/char/advantechwdt.c
Suchen Sie nach einer Zeile die lautet:
#define WD_TIMO 60 /* 1 Minute */
und ändern Sie diese Zeile in :
#define WD_TIMO 1 /* 1 second */
Danach bauen Sie Ihre module neu und installieren diese, indem Sie
die Befehle:
make modules
make modules_install
in Ihrem Kernel-Source Diretory eingeben. Danach entfernen Sie den gerade
laufenden advantechwdt Modul und laden ihn neu mit:
rmmod advantechwdt
modprobe advantechwdt
Nun sollten Sie in der Lage sein durch ein echo 1 > /dev/watchdog und
danach 1 Sekunde warten, den Rechner zum Rebooten zu bringen. Nun braucht
man nur noch in seiner Anwenderapplikation einen Subprozess starten, der
jede Sekunde ein Byte auf /dev/watchdog schreibt. Wenn dieser Prozess
für mehr als 1,6 Sekunden pausiert, wird der PCM5820 gebootet.
Have a lot of fun ...
rdev /croot/vmlinuz # Anschauen welche disk als / gemountet wird
rdev /croot/vmlinuz /dev/hdc2 # anderes Device als / dem Kernel beibringen
dd bs=1M count=40 if=/dev/zero of=/cuser/dev/ramdisk
mke2fs /cuser/dev/ramdisk
mount /cuser/dev/ramdisk
/var/lib/lrpkg ......... here you find the pakages on the flashdisk