Informatik und Kram

Da wir lange nicht wußten, wo wir das für die Uni ausgearbeitete Material unterbringen sollten und auch einen schrecklichen Drang hatten der Welt diverse Sachen aufzudrücken...

Fonera Hacks
de-flagge aktiviert en-flagge aktiviert

Mir is bewusst, dass dieser Artikel für manche ein alter Schuh ist, aber da ich mich jetzt fast 4h durch irgendwelche wikis, howto's etc. wühlen musste, bringe ich mal alles auf den Punkt.
In diesem Artikel erfährt man, wie
  • man den ssh-zugriff freischaltet
  • die gpio-module installiert
  • dafür sorgt, dass sie immer geladen werden
  • buildroot einrichtet und Progs für die Fonera kompiliert
  • Allgemeine Infos

    Das Teil hat nen 183Mhz-Prozessor, 8Mb Flash, 16Mb RAM, 5 GPIO-Pins und eine serielle Schnittstelle. Als Betriebssystem kommt hier Open-Wrt zum Einsatz, allerdings von Fonera modifiziert (z.B. geht der client-mode der netzwerk-interfaces nicht). Ansonsten verhält sich das Betriebssystem wie ein herkömmliches Linux.

    Out of the box

    Nicht mit dem i-net verbinden! Sonst könnte es sein, dass neue firmware aufgespielt wird, das wollen wir nicht! Einfach mal den Ethernetport offen lassen, und sich per WLAN auf "MyPlace" verbinden (der WPA-Key ist aufm Aufkleber, S/N).
    Jetzt solltet ihr auf der Startseite eures Foneras landen. Dort könnt ihr unter "Status" kucken, welche Firmware denn drauf ist. Glück haben Besitzer der Firmware-Versionen 0.7.0r4 bis 0.7.1r1, die können nämlich ganz easy per html-injection den ssh-zugang aktivieren:http://k0k0.k1k2.de/ssh/open-ssh-access-to-fonera.htmDenkt auch daran, die config-Dateien zu ändern, sonst wird die firmware doch ge-updated, sobald ihr die fonera mit dem i-net verbindet!
    Alle anderen sollten sich mal die Seite http://stefans.datenbruch.de/lafonera/ ankucken, dort werden auch andere Methoden beschrieben.

    SSH

    Jetzt kann man sich mit
    ssh root@192.168.10.1
    
    auf das Fonera-Teil verbinden, als Passwort "admin" eingeben. ROOT!
    Nachdem wir nun SSH-Zugriff haben, können wir erstmal die Startseite ein bisschen umgestalten, sie liegt in /var/www. Have fun!

    GPIO

    Das Fonera-Teil verfügt über einige GPIO-Pins (General Purpose Input Output), die wollen wir natürlich auch benutzen! Dafür einfach mal bei http://fghhgh.150m.com/ das Modul "kernel module 2.4 ipkg package" auf den PC ziehen (hab mittlerweile auch auf den 2.6.21-5 Kernel geupdatet. Die kmod-gpio-packages dazu findet man hier: http://fon.testbox.dk/packages/2.6.21.5/). Anschliessend mit
    scp kmod-gpio_2.4.33.4-ar531x-1_mips.ipk root@192.168.10.1:/jffs
    
    auf den Fonera kopieren.
    Jetzt wieder mit SSH drauf connecten, und das Modul mit
    root@OpenWrt:~# ipkg install /jffs/kmod-gpio_2.4.33.4-ar531x-1_mips.ipk
    
    installieren.
    Für einen ersten Funktionstest das Modul laden:
    root@OpenWrt:~# insmod /lib/modules/2.4.33.4/proc_gpio.o
    
    und mal in /proc nachschauen, ob das Verzeichnis "gpio" angelegt wurde.
    Man kann jetzt mal kurz die WLAN-LED ausschalten:
    root@OpenWrt:~# echo "0" > /proc/gpio/2_out
    
    Wenn alles funktioniert, kann man einstellen, dass das Modul immer geladen wird, dazu legt man einfach eine Datei names /etc/init.d/S50gpio an, mit folgendem Inhalt:
    #!/bin/sh
    #Copyright (C) 2006 OpenWrt.org
    
    insmod /lib/modules/2.4.33.4/proc_gpio.o
    

    Löten!

    Jetzt will man natürlich die Pins nach aussen führen. Dazu erstmal das Gehäuse aufschrauben. Es gibt nur zwei Schrauben, die befinden sich unter den vorderen Gummi-Füßen. Einfach aufschrauben, dann kann man den Gehäuse-Deckel abnehmen!
    Und hier jetzt nochmal grob die Pin-Locations ->Leider sind die GPIO-Pins nicht im Standard-Raster-Maß angeordnet,
    die Lötstellen liegen etwas enger. Ich werd mir morgen mal ne "kleine" Stiftleise besorgen, das ganze sauber löten und nach aussen führen, soll ja schliesslich bald meinen Robo fernsteuern!
    Das hier ist die serielle Schnittstelle der Fonera, ich hab die Pins mal für euch beschriftet. Hier greife ich übrigens auch GND ab.
    Und hier dann noch die Belegung der GPIO-Pins. Für die Messungen und Tests habe ich überall an SW1 Kabel angelötet, aber es stellte sich heraus, dass man mit dem GPIO-Modul nur vier davon schalten kann, nämlich 1,2,5,6.

    Code compilen

    Da auf der Fonera kein compiler vorhanden ist, müssen wir die Programme dafür auf dem PC compilen und dann rüberkopieren. Daher müssen wir uns eine build-Umgebung einrichten, mit der wir cross-compilen können, so dass die compilierten Progs auf der Fonera laufen.
    Im folgenden gibt es zwei Abschnitte, der erste funktioniert für originale Fonera-Kernel, da muss man also nur irgendwie die Programme draufschieben und sie laufen.
    Der zweite Abschnitt ist dann für OpenWrt-Kernel.

    Buildroot einrichten und compilen (original-Fonera)

    Das hier hat den Vorteil, dass man keinen neuen Kernel auf die Fonera flashen muss, man kann einfache Programme direkt gegen den bereits existierenden Kernel kompilieren!
    Hier die Anleitung fürs Einrichten eines buildroots (funktioniert nur für Fonera!):
    Folgende Pakete werden für unser Vorhaben benötigt:
    gcc, binutils, patch, bzip2, flex, bison, make, gettext, pkg-config, 
    unzip, libz-dev und die libc-header
    
    Jetzt noch die firmware von Fonera ziehen, ein Verzeichnis dafür erstellen und entpacken:
    $> mkdir /wherever/fonera-src/
    $> cd /wherever/fonera-src/
    $> wget http://download.fon.com/firmware/fonera/latest/fonera.tar.bz2
    $> tar jxvf fonera.tar.bz2
    
    Konfigurieren mit
    $> make V=99 config
    
    Ich hab hier einfach mal alle Standards beibehalten, aber zusätzlich noch die jffs-filesystem-option mit-ausgewählt.
    Und jetzt kompilieren, nehmt euch nen Kaffee, raucht ein paar, bei mir hats ca. 45 Minuten gedauert:
    $> make V=99
    
    Bei mir hats wegen nem Fehler wegen irgend einem "ftello64" mit Fehler 2 abgebrochen, aber ich konnte trotzdem danach Programme kompilieren, womit wir schon beim nächsten Schritt wären:

    Kompilieren und kopieren!

    So, jetzt kanns endlich losgehn. Wir legen mal folgendes Testprogramm als test.c an:
    /* test.c - Test my buildroot for Fonera */
    #include <stdio.h>
    
    int main(int argc, char *argv[])
    {
        printf("Yeahah, mein binary läuft!\n");
    }
    
    Vor dem kompilieren müssen wir noch die Umgebungsvariable PATH setzen:
    $> PATH=$PATH:/wherever/fonera-src/staging_dir_mips/bin
    $> export PATH
    $> mips-linux-uclibc-gcc test.c -o test
    
    Das kompilierte Programm kopieren wir jetzt auf die Fonera:
    $> scp ./test root@192.168.10.1:/tmp/
    
    Jetzt noch per ssh auf der Fonera einloggen und das Programm starten:
    $> ssh root@192.168.10.1
    root@OpenWrt:~# cd /tmp
    root@OpenWrt:~# ./test
    Yeahah, mein binary läuft!
    

    UPDATE 19.10.2008: C-Server, Video

    Mittlerweile hab ich mal mit der buildroot und nem c++-Programm einen server auf der fonera und nen client auf meinem laptop gebaut. Jetzt kann ich auf dem Lappy Tasten drücken, und die GPIO-Pins der Fonera werden in realtime getoggelt:

    Buildroot einrichten und compilen (OpenWrt Kamikaze)

    OpenWrt kann dann aber doch mehr als der "beschnittene" Fonera-Kernel, und bietet einem somit viel mehr Freiheiten und Möglichkeiten, deshalb hier noch die Beschreibung, wie man sich selbst einen OpenWrt-Kernel kompiliert und gleichzeitig eine buildroot erstellt, um für diesen Kernel dann Programme zu erstellen und zu benutzen.
    Ich brauch jetzt unbedingt den I2C-Bus, da der Router ja als Server auf meinem Robo fungieren soll, deshalb bau ich mir jetzt doch nochmal nen kompletten kernel mit den i2c-modulen neu, nach folgenden Anleitungen: Buildroot für OpenWrt und zum flashen: Open-Wrt auf der Fonera:
    svn co https://svn.openwrt.org/openwrt/branches/8.09/
    
    Um die i2c-tools mit zu compilen einen Ordner packages/i2c-tools erstellen, dort einfach nur dieses Makefile anlegen: i2c-tools-makefile.
    Dran denken, bei 'make menuconfig' dann unter Utilities die i2c-utils auszuwählen!
    Jetzt noch die Architektur einstellen, für die man compilen will, bei der Fonera ist es Atheros AR2315:
    make menuconfig
    
    Und dann den compile-vorgang starten:
    make V=99
    
    Sooo, einige Stunden später (um genau zu sein, satte 4h kompiliert!). Der Kernel wurde erfolgreich gebaut, i2c-module sollten drin sein. Das Filesystem und den neuen Kernel findet man jetzt unter bin/.

    Flash

    ACHTUNG!! Das hier funktioniert nur, wenn man bereits open-wrt auf der kiste hat! Aus dem jungfräulichen Fonera-Kernel raus geht das net! Da muss man dann seriell flashen!So, wieder da! Ich hab diesmal im laufenden Betrieb geflasht (per ssh eingeloggt):
    cd /tmp
    scp host:/path/to/openwrt-atheros-vmlinux.lzma .
    scp host:/path/to/openwrt-atheros-root.jffs2-64k .
    
    mtd -e vmlinux.bin.l7 write openwrt-atheros-vmlinux.lzma vmlinux.bin.l7
    mtd -e rootfs write openwrt-atheros-root.jffs2-64k rootfs
    reboot
    

    WiFi Clientmode

    Hat super funktioniert! Nach dem reboot sind natürlich erstmal alle Netzwerk-Einstellungen weg, deshalb (mehr für mich als für euch) nochmal die Schritte, um Fonera in den client-mode zu versetzen und im wlan anzumelden (hier natürlich seriell verbinden, ACHTUNG: machnmal bootet die Fonera nicht mit angestecktem seriellen Kabel. Also, Kabel ab, einschalten, ca. 5sek. warten, Kabel wieder dran, minicom verbinden und Enter drücken, das aktiviert die Konsole!):
  • firewall ausschalten (brauchen wir net, robo-steuerung!): /etc/init.d/firewall umbennenen
  • /etc/config/network anpassen:
  • config interface lan
            option ifname   wifi0
            option proto    dhcp
            option netmask  255.255.255.0
    
  • /etc/config/wireless anpassen:
  • config wifi-device  wifi0
            option type     atheros
            option channel  auto
    
    config wifi-iface
            option device   wifi0
            option network  lan
            option mode     sta
            option proto    dhcp
            option ssid     skynet
            option encryption       "wep"
            option key      "s:DEIN_KEY_IN_ASCII"
    
    Jetzt noch ein root-passwort setzen, dann kann man sich mit ssh einloggen!

    I²C

    Beim booten kommt immer noch ein fehler, dass die Module nicht geladen werden konnten, aber es funktioniert endlich!!!
    root@Open-Wrt:/# insmod /lib/modules/2.6.26.8/i2c-gpio-custom.ko bus3=0,1,3
    root@Open-Wrt:/# insmod /lib/modules/2.6.26.8/i2c-gpio.ko
    
    root@Open-Wrt:/# i2cdetect -l
    i2c-0   i2c             i2c-gpio0                               I2C adapter
    
    root@OpenWrt:/lib/modules/2.6.26.8# i2cdetect -a 0
    WARNING! This program can confuse your I2C bus, cause data loss and worse!
    I will probe file /dev/i2c-0.
    I will probe address range 0x00-0x7f.
    Continue? [Y/n] Y
         0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
    00: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
    10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
    20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
    30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
    40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
    50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
    60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
    70: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
    
    Das sieht jetzt vllt blöd aus, aber is auch logisch, da noch nix am bus hängt! Jedenfalls gibts jetzt mit dmesg keine Fehler, im Gegenteil:
    root@Open-Wrt:/#dmesg
    ...
    Custom GPIO-based I2C driver version 0.1.1
    i2c-gpio i2c-gpio.0: using pins 1 (SDA) and 3 (SCL)
    
    Yeahah! Jetzt nur noch nen level-shifter, dann sollte man da nen Atmega dranhängen können!

    Kommentare

    was hat das V=99 auf sich? erfüllt das irgend ne relevante funktion? :)

    ich konnte sie auch weglassen, beim Tobi hat es aber wohl geholfen, der hatte vorher probleme.
    Hat wohl was mit dem Verboselevel zu tun. Probiers mal ohne, gehts dann nicht, einfach mal anhängen. kann nie schaden :D

    Welche Architektur muss ich auswählen?
    Atheros 231x/5312 oder Atheros AR71xx?
    schon mal danke im voraus.
    mfg Gerrit

    auf jeden Fall Atheros231x/5312 für die fonera!

    Kommentar schreiben