Siemens SE515 Router Firmware

Firmware flashen

Normalerweise flasht man die Firmware über die Weboberfläche; die Firmware ist dabei in einem proprietären Format von Broadcom mit der Endung *.bin. Falls durch das flashen die Firmware zerstört wurde, und der Router nicht mehr geht, braucht man ein serielles Kabel, um den Bootloader (genannt CFE) zu erreichen.

Serielles Kabel beschaffen

Der Router hat eine serielle Schnittstelle, mit vier Pins (+3,3V, GND, RX, TX). Dazu muss man das Gehäuse öffnen. Die Schnittstelle hat eine weisse Buchse, wie sie auch für das Analog-In von Soundkarten benutzt wurde, die den Ton vom CD-Laufwerk bekommen. Die Belegung sieht so aus:

-----------
| 1 2 3 4 |J034
----   ----

J034 ist die Beschriftung auf dem Board zur Orientierung. Die Belegung:

1 = +3,3V
2 = GND
3 = RX
4 = TX

Diesen Anschluss kann man mit der seriellen Schnittstelle eines PCs verbinden. Da diese Schnittstelle mit 12V Pegeln arbeitet, der Router aber TTL-Pegel mit 3,3V erwartet, würde man den Router bei direkter Verbindung zerstören. Man braucht also einen Pegelwandler. Dieses kann man mit einem MAX232 IC selber bauen (⇒googeln!) oder man benutzt ein Handykabel, da sich dort die gleiche Problemstellung ergibt. Ich habe mir um 1€ ein Siemens C55 Handykabel gekauft (Noname), in der Mitte abgeschnitten, dort waren drei Adern: schwarz, blau, weiss. Schwarz habe ich mit Pin 2 verbunden (Masse), blau mit Pin 3 (RX) und weiss mit Pin 4. Die Pegelwandler-Schaltung sitzt bei mir im Gehäuse des Steckers am PC und bezieht seine Versorgungsspannung aus der seriellen Schnittstelle. Dies ist gerne bei Noname-Kabeln so, bei Original-Siemens-Kabeln bezieht die Schaltung die Versorgungsspannung gerne aus dem Handy, hier müsste also auch noch Pin 1 angeschlossen werden. Der IC, der in meinem Kabel verbaut ist, trägt die Aufschrift: HIN232CP und P0336ACNA. Wenn man sich nicht sicher ist, welches Kabel an RX und welches an TX muss, kann man auch mal probieren. Ich habe bei meinem Kabel nach Anschliessen an den PC folgendes festgestellt: Die Adern blau und weiss lagen auf 0V. Nach konfigurieren und starten von minicom unter Linux waren es bei blau 3,3V und bei weiss 4,8V (gemessen gegen die schwarze Masse Ader), was mir aber egal war. Ich habe es trotzdem angesteckt und es ist nix passiert.

Verbindung herstellen

Nachdem alles verkabelt ist, kann man versuchen, sich mit dem Bootloader des SE515, dem CFE, zu verbinden. Dass habe ich mal unter Windows mit Hyperterm probiert. Einstellungen:

8N1 (Das bedeutet: 8 Datenbitts, kein Paritätsbit, 1 Stoppbit)
Hardwareflusskontrolle - nein
Speed 115200

Force 7bit ascii: no

Function arrow and ctrl keys act as: terminal keys

Backspace key sends CTRL+H
Emulation: Auto detect
TerminalID: Ansi
Backscroll buffer lines: 500
Input translation: shiftJIS

ASCII Setup:
Die ersten zwei Haken nicht gesetzt.
Die beiden Delays auf 0.

ASCII Recieving: 
Die ersten beiden Haken nicht gesetzt, der dritte schon

Anschliessend auf Call gehen, um die Verbindung aufzubauen, dann den Router einschalten. Wenn nun gar nix kommt, liegts an der Verkabelung. Wenn nur Hieroglyphen kommen, liegts an fehlerhaften Einstellungen.

Unter Linux geht das ganze z.B. mit dem Befehl cu. (Unter Gentoo: emerge taylor-uucp). Genauer: cu -l /dev/ttyS0 -s 115200. Anschliessend Router einschalten. Es sollte sinnvoller Text erscheinen. Falls eine Fehlermeldung kommt, die Rechte des Verzeichnisses /var/lock/uucp anpassen und als root ausführen.

Wenn es geht sollte die Ausgabe in etwa so aussehen:


CFE version 1.0.37-5.5.22 fïr BCM96345 (32bit,SP,BE)

Board IP address                : 192.168.1.1:ffffff00  
Host IP áddress                 : 192.168.1.2  
Gateway IP address              :   
Run from flash/host (f/h)       : f  
ŠDefault host run file name      º   
Default host flash file name    : bcmRTA770W_fs_kernel  
Boot delay (1-9 seconds)        : 1  
Board Id Name                   : RTA770BW  
Psi size in KB                  : 16
Number of MAC Addresses (1-32)  : 1  
Ethernet MAC Address            : 00º01:e³:07:ee:f4  
Wireless 11g MAC Address        : 00:00:00º00:00:00  
Memory size in MB               : 16

==== Press space key to stop auto run (1 seconds) ====
Auto run second count down(before hit space key): 11°
Code Address: 0x80010000, Entry Address: 0x8001046c
Decompression OK!
Entry at 0x8001046c
Starting program at 0x8001046c
Total Flash size: 4096K with 67 sectors,nvram start block at 0

Scratch pad is not used for this flash part.

RTA770BW prom init

BP_MEMORY_16MB_1_CHIP

CPU revision is: 00028000

Primary instruction cache 8kb, linesize 16 bytes (2 ways)

Primary data cache 4kb, linesize 16 bytes (2 ways)

Linux version 2.4.17 (wilson@AndrewLinux) (gcc version 3.1) #1 Mon Jan 3 15:50:02 CST 2005

Determined physical RAM map:

 memory: 00fc0000 @ 00000000 (usable)

On node 0 totalpages: 4032

zone(0): 4032 pages.

zone(1): 0 pages.

zone(2): 0 pages.

Kernel command line: root=/dev/mtdblock0 ro

bcm_console_setup

Calibrating delay loop... 92.97 BogoMIPS

Memory: 14020k/16128k available (1476k kernel code, 2108k reserved, 80k data, 44k init, 0k highmem)

Dentry-cache hash table entries: 2048 (order: 2, 16384 bytes)

Inode-cache hash table entries: 1024 (order: 1, 8192 bytes)

Mount-cache hash table entries: 512 (order: 0, 4096 bytes)

Buffer-cache hash table entries: 1024 (order: 0, 4096 bytes)

Page-cache hash table entries: 4096 (order: 2, 16384 bytes)

Checking for 'wait' instruction...  unavailable.

POSIX conformance testing by UNIFIX

Linux NET4.0 for Linux 2.4

Based upon Swansea University Computer Society NET3.039

Initializing RT netlink socket

Starting kswapd

brcmboard: brcm_board_init entry

BP_MEMORY_16MB_1_CHIP

Module bcm63xx_cons.c v1.1 Jan  3 2005 15:50:16

block: 64 slots per queue, batch=16

PPP generic driver version 2.4.1

blaadd: blaa_detect entry

adsl: adsl_init entry

NET4: Linux TCP/IP 1.0 for NET4.0

IP Protocols: ICMP, UDP, TCP, IGMP

IP: routing cache hash table of 512 buckets, 4Kbytes

TCP: Hash tables configured (established 512 bind 1024)

Linux IP multicast router 0.06 plus PIM-SM

NET4: Unix domain sockets 1.0/SMP for Linux NET4.0.

Ebtables v2.0 registered<6>NET4: Ethernet Bridge 008 for NET4.0

VFS: Mounted root (cramfs filesystem) readonly.

Freeing unused kernel memory: 44k freed


Error while decompressing!

Error while decompressing!

Kernel panic: No init found.  Try passing init= option to kernel.

Rebooting in 180 seconds..

Da ist auch schon das Problem: Kernel Panic: Es konnte kein Dateisystem gemountet werden.

Das Firmware Image ist also kaputt

Der Bootloader

Dieser sollte eigentlich immer funktionieren, auch bei defekter Firmware. Die IP ist 192.168.1.1, man kann sie aber auch im Bootloader schon ändern. Am Anfang muss man Leertaste drücken, um in den Bootloader reinzukommen. Das Prompt sieht so aus:

CFE>

Wenn man im Bootloader ist, hat man über das Netzwerk Zugriff auf: http://192.168.1.1, dort kann man dann wieder eine Firmware-Datei angeben und in den Flash laden. Auf der seriellen Konsole hat man etwas Feedback, ob alles hinhaut. Firmwares gibt es unter http://heinz.hippenstiel.org/familie/hp/hobby/se515/se515-firmware-archiv.html

Zugriff per Telnet/SSH

Haut die Firmware wieder hin, kommt man mit telnet 192.168.1.1 in den Router rein, username=admin.

Wenns nicht geht (von hph's Forum):

Warum geht Telnet mit einer neuen Firmware nicht? Telnet geht sehr wohl noch, allerdings nicht mehr mit dem admin User. Dafür funktioniert jetzt der Zugriff über SSH. Wer weiterhin Telnet verwenden will muss einen eigenen User aktivieren. Dazu geht man mit dem admin User per SSH auf den Router, im Menu 9 eingeben, dann 1 und einen User mit Passwort angeben. Dieser User kann nur per Telnet auf den Router gehen. Johannes R. brachte mich auf die Idee, weil er das gute alte TeraTerm TeraTerm mit SSH2,Original TeraTerm] verwendet um Makros auszuführen.

Ein weiteres Problem ist, dass nach einem Upgrade die Anmeldung weder über Telnet noch SSH fuktioniert, obwohl die User sich eigentlich anmelden können sollten. Als praktikabler Workaround hat es sich erwiesen einen Downgrade zu machen, den/die User nochmal anzulegen und anschliessend einen Upgrade durchzuführen.

  • Zuerst die alte (höchstens 2.1402.16…) Firmware aufspielen.
  • Dann kann man per Telnet (User: admin , Passwort wie Web-Interface) drauf.
  • Anschliessend im Menü Punkt 9 Username und Passwort einrichten.
  • Danach im Menü Punkt 11 “Sichern und neustarten”.
  • Jetzt die neue Firmware aufspielen.
  • Nun geht's mit dem neuen Username und Passwort.
  • Bei Eingabe von “sh” im Menü bekommt man eine shell.

Anmerkung: Per SSH hat man dann keine Admin-Rechte. Per Telnet schon.

Eigene Firmware bauen

Nun geht es daran, sich selber am Bau einer Firmware zu versuchen. Dazu nehmen wir eine Ausgangsfirmware (z.B. die hp03 Firmware von hps's Seite, siehe Links) und bauen diese dann um. Die Firmware heisst *.bin und ist im proprietären Broadcom Format.Man braucht jetzt die Tools decompose (zum Zerlegen eines Firmware Images), cramfsck (zum Auspacken des komprimierten root-Dateisystems), mkcramfs (zum anschliessenden komprimieren) und recomp (neue Firmware wieder zusammenbauen). Alle diese Binaries kopieren wir mal in das Verzeichnis ~/routerBinaries. Ein Shellscript namens se515 ist auch dabei, dies hat die ganzen Paramter für recomp bereits drinnen, es kommt ebenfalls in dieses Verzeichnis. Die Dateien bekommt man hier: http://forum.2kuul.de/index.php?topic=160.0 (ganz unten). recomp und decompose sollten direkt gehen. cramfsck muss man auf einem i386-System kompilieren. mkcramfs habe ich von http://tclers.tk/SE515/ genommen. Dort gibt es ein Archiv zum Download, in dem ein Verzeichnis hostTools drin ist. Da drin ist auch die richtige Variante von mkcramfs, die ein funktionierends Dateisystem erzeugen kann, das der Router auch frisst.

Firmware zerlegen

~/routerBinaries/decompose firmware.bin

Erstellt im aktuellen Verzeichnis die Dateien kernel, header und root_fs (Hier ist das Dateisystem drin).

Firmware-Dateisystem auspacken

sudo ~/routerBinaries/cramfsck -x neuesVerzeichnis root_fs

Entkomprimiert das Dateisystem. Muss als root laufen. Man kann nun in neuesVerzeichnis wechseln und nach Herzenslust herumpfuschen, z.B. neue Dateien hinzufügen.

Man könnte das Dateisystem (zum reinen Betrachten, read-only) mounten mit:

sudo mount -o loop -t cramfs root_fs /mnt/cramfs

Firmware-Dateisystem wieder zusammenpacken

~/routerBinaries/mkcramfs -r neuesVerzeichnis root_fs_neu

Packt das Dateisystem wieder ein, in die neue Datei root_fs_neu. Diese Datei sollte ca. 3 MB haben, jedenfalls nicht nur 25KB.

Firmware wieder zusammenpacken

Dazu editiert man das Skript se515, passt die Einstellungen an (evtl. den Pfad zu recomp) und ruft das Skript auf, das die Dateien kernel und root_fs im aktuellen Vereichnis erwartet. Erstellt dann die Datei firmware.bin, die man jetzt wieder in den Router flashen kann.

Firmware wieder flashen

Geht ganz normal über die Weboberfläche

Eigene Userspace-Programme kompilieren

Da man nun neue Firmwares mit eigenen Dateien flashen kann, will man vielleicht auch selber Programme schreiben. Dazu braucht man eine MIPS-Toolchain. Diese gibt es auf der Siemens-Seite zum Download. Man packt die Archive aus, bis man zu *.rpm-Dateien kommt. Diese entpackt man mit rpm2targz nach /opt/toolchain/uclibc/. Nun hat man einen Crosscompiler, mit dem man auf einem normalen PC MIPS-Code mit uclibc erzeugen kann. Jetzt legt man noch einen Symlink an:

ln -s /opt/toolchains/uclibc/bin/mips-uclibc-gcc ~/routerBinaries/gcc

Schon kann man ein helloworld.c kompilieren, die resultierende Binary in das Firmware-Image packen, flashen, mit ssh verbinden, und dann mit ./hello starten. Hat bei mir funktioniert.

Programm zum Ein- und Ausschalten eines LEDs

ledtest.c

#include <stdio.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <fcntl.h>

#define BOARD_IOCTL_MAGIC       'B'
#define BOARD_IOCTL_LED_CTRL _IOWR(BOARD_IOCTL_MAGIC, 7, BOARD_IOCTL_PARMS)
#define BP_GPIO_7       0x0080

typedef enum
{
    PERSISTENT,
    NVRAM,
    BCM_IMAGE_CFE,
    BCM_IMAGE_FS,
    BCM_IMAGE_KERNEL,
    BCM_IMAGE_WHOLE,
    SCRATCH_PAD,
    FLASH_SIZE,
} BOARD_IOCTL_ACTION;

typedef enum
{
    kLedAdsl,
    kLedWireless,
    kLedUsb,
    kLedHpna,
    kLedWanData,
    kLedPPP,
    kLedVoip,
    kLedDiag,
    kPSTN,
    kLedPower,
    kLedEnd,                // NOTE: Insert the new led name before this one.  Alway stay at the end.
} BOARD_LED_NAME;           //Michael: this sequence also has to sync with conf45/inc/board_api.h

typedef enum
{
    kLedStateOff,                        /* turn led off */
    kLedStateOn,                         /* turn led on */
    kLedStateFail,                       /* turn led on red */
    kLedStateBlinkOnce,                  /* blink once, ~100ms and ignore the same call during the 100ms period */
    kLedStateSlowBlinkContinues,         /* slow blink continues at ~600ms interval */
    kLedStateFastBlinkContinues,         /* fast blink continues at ~200ms interval */
} BOARD_LED_STATE;

typedef struct boardIoctParms
{
    char *string;
    char *buf;
    int strLen;
    int offset;
    BOARD_IOCTL_ACTION  action;        /* flash read/write: nvram, persistent, bcm image */
    int result;
} BOARD_IOCTL_PARMS;


static int boardIoctl(int boardFd, int board_ioctl, BOARD_IOCTL_ACTION action, char *string, int strLen, int offset)
{
    BOARD_IOCTL_PARMS IoctlParms;
    IoctlParms.string = string;
    IoctlParms.strLen = strLen;
    IoctlParms.offset = offset;
    IoctlParms.action = action;
    ioctl(boardFd, board_ioctl, &IoctlParms);
    return (IoctlParms.result);
}

static void sysLedCtrl(BOARD_LED_NAME ledName, BOARD_LED_STATE ledState)
{
    int boardFd;
    if ((boardFd = open("/dev/brcmboard", O_RDWR)) == -1)
        printf("Unable to open device /dev/brcmboard.\n");
    boardIoctl(boardFd, BOARD_IOCTL_LED_CTRL, 0, "", (int)ledName, (int)ledState);
    close(boardFd);
}

int main(int argc, char * argv[]) {

  if (argc != 2) {
        printf("Error! Wrong number of arguments! 1 means on and 0 means off.\n");
  } else {
        if (strcmp(argv[1],"1") == 0)
                sysLedCtrl(kLedUsb, kLedStateOn);
        if (strcmp(argv[1],"0") == 0)
                sysLedCtrl(kLedUsb, kLedStateOff);
  }
  return 0;
}

Makefile

CC=/home/markus/routerBinaries/gcc
all:
        $(CC) ledtest.c -o ledtest -O2
clean:
        rm ledtest
        rm *~

Übrigens: Die verbauten LEDs brauchen genau +2V Spannung, man kann also selber eine Schaltung dranlöten, die 2V Ausgangsspannung benötigt.
Übrigens: Ich schalte somit nicht nur ein LED ein und aus, sondern meine Xbox, die als Mediacenter fungiert. Somit kann ich sie vom ganzen Internet aus einschalten und Aufnahmen vom TV veranlassen. Die c't treibt dieses Vorgehen noch auf die Spitze, und benutzt zwei LEDs eines DSL-Routers um Buskommunikation (I²C) nachzubauen. Details dazu in c't 10/08.

Links

  1. http://forum.2kuul.de Gutes Forum zum Thema Siemens SE515:
  2. http://tclers.tk/SE515/ Hier gibt es die angeblich vollständige Original-Firmware von Siemens, nicht die 2004 veröffentlichte von Siemens mit unvollständigem Quellcode.
  3. http://forum.2kuul.de/index.php?topic=160.0 Thread mit den cramfs und Firmware-Tools
hardware/siemens_se515_router_firmware.txt · Last modified: 2008/05/07 19:28 by markus
 
Except where otherwise noted, content on this wiki is licensed under the following license: CC Attribution-Noncommercial-Share Alike 3.0 Unported
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki