Weiter Zurück Inhalt

4. notes

4.1 Watchdog

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 ...

4.2 rdev

      rdev /croot/vmlinuz # Anschauen welche disk als / gemountet wird 
      rdev /croot/vmlinuz /dev/hdc2 # anderes Device als / dem Kernel beibringen 
    

4.3 ramdisk

      dd bs=1M count=40 if=/dev/zero of=/cuser/dev/ramdisk 
      mke2fs /cuser/dev/ramdisk 
      mount /cuser/dev/ramdisk 
    

4.4 Pakages

      /var/lib/lrpkg ......... here you find the pakages on the flashdisk
    


Weiter Zurück Inhalt