Hinzufügen eines SD-Kartenlesers an den Linksys WRT54G

From DD-WRT Wiki

(Difference between revisions)
Jump to: navigation, search
Revision as of 16:03, 27 December 2006 (edit)
CaScAdE (Talk | contribs)
m (Welche SD Karten funktionieren?)
← Previous diff
Revision as of 16:08, 27 December 2006 (edit) (undo)
Daa531 (Talk | contribs)

Next diff →
Line 173: Line 173:
| ScanDisk | ScanDisk
| 512MB | 512MB
-| +| unbekannt
-| +| Foto Laden
|- |-
| PHOTO PORST | PHOTO PORST
| 256MB | 256MB
-| +| 009700483205
-| +| Foto Laden
|} |}

Revision as of 16:08, 27 December 2006

Contents

Tutorial: Hinzufügen eines SD-Kartenlesers an den Linksys WRT54G

von Rasmus Rohde und Mads Ulrik Kristoffersen - übersetzt ins Deutsche von gammelgemse


Dieses Projekt ist für diejenigen gedacht die gern ihren WRT54G um etwas mehr Speicher ergänzen würden, zusätzlich zu den 4 MB eingebauten Flash-RAM. Was wir tun werden ist, ein SD-Kartenleser an einigen GPIO-Pins, die sich im Inneren an der CPU befinden, anzuschließen. Mittels eines kleinen Treibers kann man ihn dann unter Linux nutzen. Das heißt, wenn man seinen Kernel für den Linksys beispielsweise mit Unterstützung für MS-DOS Partitionen und VFAT kompiliert, wird es möglich sein, den Speicher der jeweiligen SD-Karte als lese- und schreibbare Partition zu mounten. Die erreichbare Schreib-/ Lesegeschwindigkeit liegt bei etwa 200 KB/s.

Bilder


Was man braucht

  • ein Lötkolben und etwas Lötzinn (und etwas Löterfahrung)
  • ein SD-Kartenleser, es sei denn man lötet die SD-Karte direkt an
  • 6 kleine Drahtstücke
  • ein Linksys WRT54G (Hardware Revision < v5)

Wie man vorgeht


  1. Damit die SD-Karte funktioniert, müssen 6 Drähte angelötet werden. Folgendes Bild sollte eine Übersicht über die Pins geben, die dafür in Frage kommen.

  2. http://kiel.kool.dk/SD_card.png
    1. CS - Chip-Select Leitung
    2. DI - Data-In Leitung zur SD-Karte
    3. VSS - Masse 1
    4. VDD - 3,3-V-Leitung für die Stromversorgung
    5. CLK - Taktleitung für die SD-Karte
    6. VSS2 - Masse 2
    7. DO - Data-Out-Leitung von der SD-Karte

    Die SD-Karte wird im SPI-Mode betrieben, das heißt dass nur einer (Pin 7) der 4 Data-Out-Pins zur Datenübertragung genutzt wird. Spezifikationen, um die Karte im nativen SD-Mode zu betreiben sind SEHR kostenaufwändig zu beschaffen und außerdem zwingt die eingeschränkte Anzahl an GPIO-Pins, die im Router verfügbar sind, zur Nutzung eines seriellen Protokolls. Die zwei VSS-Pins können in diesem Fall einfach zusammengelötet werden (VSS2 kontroliert den Sleep-Mode der Karte). Das berücksichtigend betrachten wir weiter die einzelnen Lötstellen im Router.

    * die ersten drei Lötstellen liegen bei RP3
    * die nächsten zwei Lötstellen sind bei JP1
    * die letzte Lötstelle ist an der DMZ-LED

    Besonders ist darauf zu achten die RP3 Pins nicht kurzzuschließen, denn obwohl diese Lötstellen ausgesucht wurden, weil die den meisten Platz um die betreffenden GPIO-Leitungen beim Löten bieten, ist es trotzdem ziemlich eng - also aufpassen!

  3. Nachdem die Leitungen auf der Routerseite sauber angelötet sind, werden sie als nächstes mit der SD-Karte bzw. dem SD-Kartenleser verbunden. Dieses Bild zeigt den SD-Kartenleser. Daran kann man sie besonders einfach anlöten.
  4. Befestige den SD-Kartenleser irgendwo innerhalb des Gehäuses. Wir haben uns für die rechte Gehäuse-Vorderseite entschieden und benutzten doppelseitiges Klebeband zum Befestigen und bohrten einen schmalen Schlitz ins Gehäuse, um SD-Karten bei geschlossenem Gehäuse bequem von aussen ein- und ausstecken zu können. Auf den Bilder-Links am Anfang der Seite sieht man wie es aussieht, ebenso auf diesem Bild vom Schlitz.
  5. So weit, so einfach. Jetzt folgt der Software-Teil.


GPIO Pins, hä?

Die integrierte Broadco-BCM4712-CPU stellt eine Reihe von General Purpose Input/Output Pins (oder GPIO-Pins) zur Verfügung, die für verschiedene Zwecke im Router genutzt werden. Wir konnten bislang 8 dieser Pins identifizieren, die die folgenden zugewiesenen Funktionen haben:

PinRichtungName
GPIO 0(Output)WLAN LED
GPIO 1 Output Power LED
GPIO 2 Output ADM_EECS
GPIO 3 Output ADM_EESK
GPIO 4 Input ADM_EEDO
GPIO 5 Output ADM_EEDI
GPIO 6 Input Reset button
GPIO 7 Output DMZ LED


Die Pins, die in diesem Projekt genutzt werden, sind ADM_EESK, ADM_EEDO, ADM_EEDI und die DMZ-LED. Die ADM_*-Pins stellen normalerweise ein Interface dar um den ADMTek-Switch-Chip zu konfigurieren. Da das aber nur während des Boot-Vorgangs passiert können wir die Pins dannach für unsere Zwecke nutzen (die entsprechenden Pins auf dem Switch-Chip haben dannach 3 logische Zustände). Die Bezeichnung der anderen Pins sollte selbsterklärend sein. Die Richtung der Pins kann individuell programmiert werden (selbst wenn das nicht für jeden einzelnen Pin Sinn macht).

Die Pins bei einem WRT54GL v1.1

http://cascade.dyndns.org/~datagarbage/linksys-wrt54gl-v1.1-3.3v+GND.jpg

http://cascade.dyndns.org/~datagarbage/linksys-wrt54gl-v1.1-gpio-2+3.jpg

http://cascade.dyndns.org/~datagarbage/linksys-wrt54gl-v1.1-gpio-4+7.jpg


Software

Aktuelle Methode

Bei DD-WRT in aktuellen Versionen ist KEIN neu kompilieren des Kernels notwendig, es reicht unter Administration -> Managment -> MMC/SD Card Support den Haken auf enabled zu setzen:

http://cascade.dyndns.org/~datagarbage/dd-wrt-enable-mmc.png

Beim ersten start wird, sofern nicht vorhanden, ein ext2 (NICHT vfat!!!!) Dateisystem erzeugt, dies kann einige Zeit dauern, aber nur wenns noch nicht vorhanden ist, also keine Angst, in zukunft startet der Router wieder schneller.

Alte Methode

Erstmal empfehlen wir, einen Kernel zu kompilieren, der MS-DOS-Partitionen und VFAT unterstützt. Die Unterstützung für Partitionen muss im Kernel eingebaut sein, die für VFAT kann auch als Modul in den Kernel eingebunden werden. Es wäre vielleicht nützlich folgende Dinge ins .config aufzunehmen:

CONFIG_PARTITION_ADVANCED=y
CONFIG_MSDOS_PARTITION=y
CONFIG_FAT_FS=y
CONFIG_MSDOS_FS=y
CONFIG_VFAT_FS=y

Jetzt besorgt man sich den Treiber und das Makefile. Das Makefile muss angepasst werden, um an die Stelle zu zeigen wo die OpenWRT-Header liegen und wo sich der mipsel-Compiler befindet. Wenn das gemacht wurde, einfach nur noch 'make' eintippen (die Warnungen können ignoriert werden).

Das Modul ist nun einsatzbereit. Vergewissere dich, dass im Kartenleser eine SD-Karte steckt und lade dann das Modul. Prüfe mit 'dmesg', ob soweit alles in Ordnung ist. Wenn das der Fall ist, solltest du hoffenlich einige neue Laufwerke in /dev/mmc/... finden. Folgendes ist ein kleiner Auszug aus der "Unterhaltung" mit dem Router:

root@radio:~# ls -al /lib/modules/2.4.20/
drwxr-xr-x    1 root     root            0 Jan  1 00:08 .
drwxr-xr-x    1 root     root            0 Jan  1 00:01 ..
lrwxrwxrwx    1 root     root           28 Jan  1 00:01 et.o -> /rom/lib/modules/2.4.20/et.o
-rw-r--r--    1 root     root        50616 Jan  1 00:02 fat.o
-rw-r--r--    1 root     root        12780 Jan  1 00:08 mmc.o
-rw-r--r--    1 root     root        11244 Jan  1 00:03 msdos.o
-rw-r--r--    1 root     root        19156 Jan  1 00:05 vfat.o
lrwxrwxrwx    1 root     root           28 Jan  1 00:01 wl.o -> /rom/lib/modules/2.4.20/wl.o
root@radio:~# insmod mmc
Using /lib/modules/2.4.20/mmc.o
root@radio:~# dmesg | tail -7
mmc Hardware init
mmc Card init
mmc Card init *1*
mmc Card init *2*
Size = 249856, hardsectsize = 512, sectors = 499712
Partition check:
 mmca: p1
root@radio:~# insmod fat
Using /lib/modules/2.4.20/fat.o
root@radio:~# insmod msdos
Using /lib/modules/2.4.20/msdos.o
root@radio:~# mount /dev/mmc/disc0/part1 /mnt -tmsdos
root@radio:~# ls -al /mnt
drwxr-xr-x    2 root     root        16384 Jan  1  1970 .
drwxr-xr-x    1 root     root            0 Jan  1 00:01 ..
-rwxr-xr-x    1 root     root            0 Jan  1 00:07 bossepr0.pic
-rwxr-xr-x    1 root     root        22646 Jan  1 00:02 ld-uclib.so
-rwxr-xr-x    1 root     root        12780 Jan  1  2000 mmc.o
-rwxr-xr-x    1 root     root      1048576 Jan  1  2000 temp.bin
-rwxr-xr-x    1 root     root     16777216 Jan  1  2000 temp2.bin
-rwxr-xr-x    1 root     root     16777216 Jan  1  2000 temp3.bin
-rwxr-xr-x    1 root     root          693 Jan  1  2000 temp4.bin
root@radio:~# df
Filesystem           1k-blocks      Used Available Use% Mounted on
/dev/root                  896       896         0 100% /rom
/dev/mtdblock/4           2176      1580       596  73% /
/dev/mmc/disc0/part1    249728     33856    215872  14% /mnt


Etwas Hilfe beim Kernel kompilieren

Der einfachste Weg, um einen lauffähigen Kernel mit der gewünschten Dateisystem-Unterstützung zu erstellen, ist vermutlich, sich OpenWRT runterzuladen und das Flash-Image erstellen. Wenn man sich damit auskennt ist es ziemlich einfach, die Einstellungen für den eigenen Kernel anzupassen. Einfach ins buildroot/build_mipsel/linux Verzeichnis wechseln und 'make menuconfig' eintippen. Dann nach File Systems -> Partition Types wechseln und 'Advanced partition selection' und 'PC BIOS (MSDOS partition tables) support' anklicken. In 'File systems' sollte ebenfalls 'DOS FAT fs support' aktiviert werden, optional auch noch 'VFAT (Windows 95) fs support'. Dannach die Änderungen speichern und das Menü verlassen. Mit 'make dep zImage' den Kernel erstellen. Zum Schluss nur noch das OpenWRT-Image erstellen und der neue Kernel wird automatisch integriert.

Welche SD Karten funktionieren?

Da nicht alle SD Karten im Router funktionieren (>2GB geht aus Adressierungsgruenden generell nicht) hier eine Liste (bitte ergaenzen bei wem ne Karte funktionier!!!) von Karten die Funktionieren:

Hersteller Größe Seriennummer Wo gekauft
HAMA 256MB GH0607008cH0608Pb Media Markt
ScanDisk 512MB unbekannt Foto Laden
PHOTO PORST 256MB 009700483205 Foto Laden



Version herausfinden

Die ersten 4 Stellen der Seriennummer (Zu finden auf der Unterseite des Routers) repräsentieren die Hardware-Version:

CDF0 = WRT54G v1.0
CDF1 = WRT54G v1.1
CDF3 = WRT54G v1.1
CDF5 = WRT54G v2.0
CDF7 = WRT54G v2.2
CDF8 = WRT54G v3.0
CDF9 = WRT54G v3.1
CDFA = WRT54G v4.0

CGN0 = WRT54GS v1.0
CGN1 = WRT54GS v1.0
CGN2 = WRT54GS v1.1
CGN3 = WRT54GS v2.0
CGN4 = WRT54GS v2.1
CGN5 = WRT54GS v3.0
CGN6 = WRT54GS v4.0

Informationen über Hardware

Infos über die Hardware erhaltet ihr auf folgenden Seiten:
http://Router-IP/SysInfo.htm (die Versionsangabe hier ist nicht immer zuverlässig)
http://Router-IP/Cysaja.asp
http://Router-IP/Info.htm (Um diese Seite als Startseite unter http://Router-IP/ zu sehen, kann man sie im GUI unter "Administration ->Management ->Remote Router Access -> "Enable Status Site" aktivieren.)

Overclocking der CPU

Mit folgendem Befehl wird die CPU übertaktet (hier auf 240 MHz):

nvram set clkfreq=240
nvram commit

Um die aktuelle MHz-Einstellung zu erhalten, folgenden Befehl eingeben:

nvram get clkfreq ODER cat /proc/cpuinfo ODER nvram show | grep clkfreq

Nicht alle Frequenzen sind zulässig! Mit 216 MHz läuft die CPU synchron mit der Onboard-Peripherie und behebt einige Probleme. Weiter Frequenzen: 192, 200, 216, 222, 228, 240, 252, 264, 272, 280, 288 und 300 MHz. Auch bei korrekter Frequenz sind Ausfälle aufgetreten. In diesem Fall hilft nur noch ein Jtag-Interface. Näheres auf http://wiki.openwrt.org/.

Werte ab 264 MHz sollen angeblich keine Auswirkungen haben und in /proc/cpuinfo ist dann immer der selbe BogoMIPS-Wert zu sehen. Ein schöner Erfahrungsbericht/HowTo ist hier zu lesen.