PCM5820 & LRP HOWTO <author> <name> Heimo Schön <htmlurl url="mailto:heimo.schoen@gmx.at" name="<heimo.schoen@gmx.at>"> </author> <date>Version 0.1 , 1. November 1999 <abstract> Setup a <htmlurl url="http://www.advantech.com/products/sbc/pcm5820.htm" name="5820/L"> with <htmlurl url="http://www.psychosis.com/linux-router/" name="LRP"> the Linux-router-project </abstract> </titlepag> <sect>Overview <sect1>About this HOWTO <p> This document describes how to setup your <htmlurl url="http://www.advantech.com/products/sbc/pcm5820.htm" name="5820/L"> with <htmlurl url="http://www.psychosis.com/linux-router/" name="LRP"> the Linux-router-project <p> If you have any suggestions to this document, than feel free to contact me: <p> <itemize> <item>Heimo Schön <htmlurl url="mailto:heimo.schoen@gmx.at" name="<heimo.schoen@gmx.at>"> <item><htmlurl url="http://fly.to/heimo.schoen" name="http://fly.to/heimo.schoen"> </itemize> <p> Have a lot of fun with your PCM5820/L. <p> <sect1>Version History <p> <itemize> <item> 0.1 01 Nov 1999 first trial </itemize> <p> <sect>Introduction <p> In this chapter I want to discribe what you can do with LRP on a PCM5820. I try to give you a overview from my test equipment. <sect1>Target <p> I started to look for small computer solutions when I had to calculate a tender for a passanger-information-system project in 1999. There was the need for translating different protocols between different proprietary protocols. <p> In the past our company did this job by developing microcontroller boards and developing the applications on this boards for different projects. There was a lot of work to manage the hardware- and software-releases. <p> the idea was to use small and cheap standard hardware and a releable cheap operating system. After consulting the internet searchmachines I decided that the best choice would be a PC/104 compatible Intel-processor board and a small linux-kernel. Therefore I use the PCM5820/L board and the fantastic small Linux Kernel from the Linux-Router-Project. <sect1>HW-Configuration PCM5820/L <p> For the PCM5920/L onboard features refer to : <htmlurl url="http://www.advantech.com/products/sbc/pcm5820.htm" name="5820/L"> <p> In the PCM5820/L I installed 16 MB Memory, a 20 MB Flashdisk (Sandisk), a 10MBit HUB for a connection to my Linux-Server at home, and a 3 1/2 " Floppy Drive for booting the lrp system. <sect1>SW-Configuration LRP <p> You should refer to <htmlurl url="http://www.psychosis.com/linux-router/" name="LRP"> for more details about how LRP works. <sect>Installing LRP on PCM5820/L <sect1>Partitions <p> In this step we create partitions on the flashdisk installed in the PCM5820/L. <p> The partitions are named /dev/hdc, /dev/hdc1, ... on yor PCM-5820L. You should create the following partitions on your flashdisk: <tscreen><verb> root@ternitz60:/croot/etc > fdisk /dev/hdc Command (m for help): p Disk /dev/hdc: 2 heads, 32 sectors, 612 cylinders Units = cylinders of 64 * 512 bytes Device Boot Start End Blocks Id System /dev/hdc1 * 1 150 4784 83 Linux native /dev/hdc2 151 612 14784 5 Extended /dev/hdc5 151 612 14768 83 Linux native Command (m for help): </verb></tscreen> <sect1>PCM-5820 Bootfloppy <p> Create a PCM5820 bootfloppy and the PCM-5820 LRP-Floppy (you need two floppies) <tscreen><verb> cp pcm5820_dos_floppy.image /dev/fd0 cp pcm5820_lrp_floppy.image /dev/fd0 </verb></tscreen> You can download this floppy-images here: <p> <htmlurl url="http://insel.heim.at/madeira/340050/pcm5820_lrp_floppy.image" name="pcm5820_lrp_floppy.image"> <p> <htmlurl url="http://insel.heim.at/madeira/340050/pcm5820_dos_floppy.image" name="pcm5820_dos_floppy.image"> <p> <sect1>Boot from my PCM-5820 Bootfloppy <p> Now you made your Floppies and can boot now with your dos-floppy <sect1>format flashdisk <p> Now you can format the boot partition of the flashdisk <tscreen><verb> format c: </verb></tscreen> <sect1>bootsector on flashdisk <p> Now create a bootsektor on the flashdisk. Don´t foreget to unlock the flashdisk before writing the bootsektor. <tscreen><verb> lock c: (note: answer the question with y) syslinux c: </verb></tscreen> <sect1>Files to flashdisk <p> Now insert the lrp-files floppy and copy all lrp files to the flashdisk: <tscreen><verb> copy a:*.* c: </verb></tscreen> <sect1>LRP installed <p> Remove floppy from floppydrive and reboot the 5820. Now 5820 is booting from your new flashdisk!!! You should see lrp booting. <sect>notes <sect1>Watchdog <p> 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: <tscreen><verb> #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); } } </verb></tscreen> 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. <tscreen><verb> echo 1 > /dev/watchdog </verb></tscreen> und einem sleep 1 in einer Endlosschleife den Watchdog am Leben zu erhalten muß man zuerst in der Datei /etc/modconf folgende Zeile <tscreen><verb> alias char-major-10-130 softdog </verb></tscreen> auskommentieren und gegen den Start des advantechwdt ersetzen. Statt der Zeile sollte das ganze dann so aussehen: <tscreen><verb> alias char-major-10-130 advantechwdt </verb></tscreen> Nun sind wir so weit, daß wir nur durch ein <tscreen><verb> echo 1 > /dev/watchdog </verb></tscreen> 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. ;-) <p> 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 <p> Suchen Sie nach einer Zeile die lautet: <tscreen><verb> #define WD_TIMO 60 /* 1 Minute */ </verb></tscreen> und ändern Sie diese Zeile in : <tscreen><verb> #define WD_TIMO 1 /* 1 second */ </verb></tscreen> Danach bauen Sie Ihre module neu und installieren diese, indem Sie die Befehle: <tscreen><verb> make modules make modules_install </verb></tscreen> in Ihrem Kernel-Source Diretory eingeben. Danach entfernen Sie den gerade laufenden advantechwdt Modul und laden ihn neu mit: <tscreen><verb> rmmod advantechwdt modprobe advantechwdt </verb></tscreen> 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. <p> Have a lot of fun ... <sect1>rdev <p> <tscreen><verb> rdev /croot/vmlinuz # Anschauen welche disk als / gemountet wird rdev /croot/vmlinuz /dev/hdc2 # anderes Device als / dem Kernel beibringen </verb></tscreen> <sect1>ramdisk <p> <tscreen><verb> dd bs=1M count=40 if=/dev/zero of=/cuser/dev/ramdisk mke2fs /cuser/dev/ramdisk mount /cuser/dev/ramdisk </verb></tscreen> <sect1>Pakages <p> <tscreen><verb> /var/lib/lrpkg ......... here you find the pakages on the flashdisk </verb></tscreen> <p> <sect>Allgemeines <sect1>Copyright <p> Dieses Dokument ist urheberrechtlich geschützt. Das Copyright liegt bei Heimo Schön. <p> Das Dokument darf gemäß der GNU General Public License verbreitet werden. Insbesondere bedeutet dieses, daß der Text sowohl über elektronische wie auch physikalische Medien ohne die Zahlung von Lizenzgebühren verbreitet werden darf, solange dieser Copyright Hinweis nicht entfernt wird. Eine kommerzielle Verbreitung ist erlaubt und ausdrücklich erwünscht. Bei einer Publikation in Papierform ist der Autor zu informieren. <p> This howto is free documentation; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. <p> This document is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. <p> You should have received a copy of the GNU General Public License along with this document; if not, write to the: Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. <p> </article> <!-- Keep this comment at the end of the file Local variables: mode: sgml sgml-omittag:t sgml-shorttag:t sgml-minimize-attributes:nil sgml-always-quote-attributes:t sgml-indent-step:1 sgml-indent-data:t sgml-parent-document:nil sgml-exposed-tags:nil sgml-local-catalogs:("/usr/lib/sgml-tools/dtd/catalog") sgml-local-ecat-files:nil End: -->