U-Boot installieren

:!: Achtung in diesem Teil der Anleitung werden kritische Änderungen am FriendlyARM vorgenommen, die dazu führen können, dass das Gerät nicht mehr wie gewünscht funktioniert. Es ist prinzipiell möglich, einen durch Aufspielen eines neuen Bootloaders kaputten FriendlyARM wieder zu reparieren, aber dazu muss man per JTAG an das Gerät. Eigentlich sollte sich U-Boot problemlos installieren lassen, aber ich übernehme keine Verantwortung, wenn ihr mit meiner Anleitung euer Gerät gehimmelt habt.

Auch hier stütze ich mich wieder auf diverse Anleitungen die im Internet kursieren1) 2) 3). Grundsätzlich spricht nichts dagegen, einen fertig kompilierten U-Boot zu nehmen, wie ihn z. B. FriendlyARM direkt anbietet. Wer es aktueller will oder auf kompilieren steht, kann ihn sich auch selbst bauen. Ich habe mich nachdem das selbst kompilierte U-Boot nicht funktionieren wollte, dafür entschieden den fertigen aus dem FriendlyARM-Downloadbereich zu nehmen. Ich dokumentiere aber das selbst kompilieren ebenfalls, empfehle es aber nicht unbedingt.

Selbst kompilieren

Zunächst muss sichergestellt sein, dass das Paket „git“ auf dem Rechner installiert ist. Falls nicht lässt es sich auf debianbasierenden Systemen einfach mittels Apt nachinstallieren.

apt-get install git-core

Nun wechselt man in das Heimatverzeichnis und erstellen uns ein neues Unterverzeichnis in dem man U-Boot bauen wird.

cd ~; mkdir -p mini2440/uboot; cd mini2440/uboot

Jetzt holt man die Sourcen mittels Git. Dies kann ein Moment dauern, da ca. 25 MB heruntergeladen werden.

git clone git://repo.or.cz/u-boot-openmoko/mini2440.git

Abschließend übersetzt man den Quelltext. Vorher sollten die entsprechenden Umgebungsvariablen aber gesetzt werden, wie hier beschrieben.

export PATH=$PATH:/home/<benutzername>/bin/arm-cc/bin
export CROSS_COMPILE=arm-none-linux-gnueabi-
cd mini2440
make mini2440_config
make all

Nach dem Kompilieren steht der Bootloader als Datei „u-boot.bin“ zu Verfügung.

Werkzeuge vorbereiten

Auch wenn man den Bootloader selbst kompiliert hat, benötigt man das passende USB-Upload-Tool. Dieses Findet sich im U-Boot-Paket auf der Herstellerseite. Dazu lädt man bei FriendlyARM unter dem Punkt Bootloader das U-Boot-Paket herunter. Das ZIP-Archiv entpackt man ebenfalls in das mini2440-Hauptverzeichnis im Heimatverzeichnis. Ich habe das Verzeichnis von „u-boot_XXXXXXX“ in „u-boot-pre“ umbenannt. Im Verzeichnis „u-boot-pre“ befinden sich drei verschiedene U-boot-Varianten, die für meinen FriendlyARM richtige ist die „u-boot-256M.bin“. Das 256 im Namen steht für die Größe des Flashspeichers in Megabyte. Im Unterverzeichnis „tools“ befindet sich das gesuchte USB-Uploadtool „s3c2410_boot_usb“. Diese muss noch ausführbar gemacht werden.

chmod +x ~/mini2440/u-boot-pre/tools/s3c2410_boot_usb

FriendlyARM vorbereiten

Der FriendlyARM muß wie hier dargestellt verbunden sein. Picocom muss laufen und der untere Wahlschalter muss auf „NOR“ eingestellt sein, so dass man ins BIOS des FriendlyARM gelangt. Nun wir der FriendlyARM angeschaltet. Im Hauptmenü wählt man den Punkt „q“.

##### FriendlyARM BIOS 2.0 for 2440 #####
[x] format NAND FLASH for Linux
[v] Download vivi 
[k] Download linux kernel 
[y] Download root_yaffs image 
[a] Absolute User Application
[n] Download Nboot for WinCE 
[l] Download WinCE boot-logo
[w] Download WinCE NK.bin 
[d] Download & Run 
[z] Download zImage into RAM 
[g] Boot linux from RAM 
[f] Format the nand flash 
[b] Boot the system 
[s] Set the boot parameters 
[u] Backup NAND Flash to HOST through USB(upload) 
[r] Restore NAND Flash from HOST through USB 
[q] Goto shell of vivi 
[i] Version: 0945-2K
Enter your selection: q
Supervivi>

Testlauf

Der FriendlyARM erwartet nun unsere Befehle. Nun ist es an der Zeit festzustellen, wie groß das von uns hochzuladende U-Boot-Image ist, die Größe in Byte müssen wir nämlich bei der Programmierung mit angeben. Dies ermittelt man am leichtesten mit dem Befehl „ls -l“ auf der Kommandozeile. Die Selbstkompilierer gucken die Datei „~/mini2440/u-boot.bin“ an die Downloader die Datei „~/mini2440/u-boot-pre/u-boot256M.bin“. Die Dateigröße liegt üblicherweise bei ca. 230 - 250 kB.

Nun teilt man dem FriedlyARM mit, dass per USB-Kabel gleich ein neuer Bootloader kommt und er diesen in den RAM an die Speicherstelle 32000000 schreiben soll.

load ram 0x32000000 <u-boot.bin Dateigröße in Bytes> u

Er teilt uns nun mit, dass das USB-Upload-Kabel noch nicht angeschlossen ist.

USB host is not connected yet.

Wir stecken also das USB-Kabel (Typ B) in den FriendlyARM und verbinden es mit dem Rechner. Das wird vom FriendlyARM bestätigt.

USB host is connected. Waiting a download.

Nun muss man als root das USB-Upload-Tool starten und ihm als Parameter das gewünschte „u-boot.bin“-File übergeben.

Selbstkompilierer:

cd ~/mini2440
u-boot-pre/tools/s3c2410_boot_usb uboot/mini2440/u-boot.bin
csum = 0x991e
send_file: addr = 0x33f80000, len = 0x00039e24
Error downloading program

Downloader:

cd ~/mini2440
u-boot-pre/tools/s3c2410_boot_usb u-boot-pre/u-boot256M.bin
csum = 0x991e
send_file: addr = 0x33f80000, len = 0x00039e24
Error downloading program

Die Fehlermeldung am Ende gehört zum guten Ton und kann ignoriert werden. ;-) Auf der FriendlyARM-Konsole sieht man dass der Upload geklappt hat.

Now, Downloading [ADDRESS:32000000h,TOTAL:237102]
RECEIVED FILE SIZE:  237102 (115KB/S, 2S)
Downloaded file at 0x32000000, size = 237092 bytes

Nun wollen wir noch testen, ob der Upload auch erfolgreich war und sagen dem FriendlyARM er soll an die Speicherstelle springen und U-Boot starten.

go 0x32000000

Wenn alles geklappt hat, sieht die Ausgabe wie folgt aus.

  argument 0 = 0x00000000
  argument 1 = 0x00000000
  argument 2 = 0x00000000
  argument 3 = 0x00000000

U-Boot 1.3.2-mini2440 (Feb 24 2010 - 13:04:49)

I2C:   ready
DRAM:  64 MB
Flash:  2 MB
NAND:  256 MiB
Found Environment offset in OOB..
USB:   S3C2410 USB Deviced
In:    serial
Out:   serial
Err:   serial
MAC: 08:00:2f:00:ca:fe
Hit any key to stop autoboot:  0 
MINI2440 #

Dies bedeutet, dass U-Boot funktioniert. Das USB-Upload-Kabel kann nun entfernt werden. Wenn es mit dem selbstkompiliertem U-Boot nicht geklappt hat und man nur die ersten drei Zeilen der Nachricht sieht, empfehle ich es nach einem Reset einmal mit den vorgefertigten von FriendlyARM mal zu probieren. ;-)

NAND putzen

Es ist empfohlen den Flash-Speicher (NAND) komplett zu leeren und nach defekten Blöcken suchen zu lassen. NAND-Flash hat immer kaputte Blöcke, näheres dazu findet sich im Internet4). Zunächst sehen wir uns an welche Blöcke ab Werk als defekt markiert sind.

MINI2440 # nand bad

Device 0 bad blocks:
  00880000
  05c60000
  09a80000
  0ff80000
  0ffa0000
  0ffc0000
  0ffe0000

Diese Blöcke sollte man sich notieren. Nun leeren wir den Flashspeicher komplett, also auch das vorinstallierte Qtopia wird danach weg sein mit allen Daten die im Flash lagen. Die Antwort „y“ auf die Sicherheitsfrage muss man blind eintippen und mit Enter bestätigen.

MINI2440 # nand scrub

NAND scrub: device 0 whole chip
Warning: scrub option will erase all factory set bad blocks!
         There is no reliable way to recover them.
         Use this command only for testing purposes if you
         are sure of what you are doing!

Really scrub this NAND flash? <y/N>
Erasing at 0x7a0000 --   3% complete.
NAND 256MiB 3,3V 8-bit: MTD Erase failure: -5
Erasing at 0x5c20000 --  36% complete.
NAND 256MiB 3,3V 8-bit: MTD Erase failure: -5
Erasing at 0x9980000 --  60% complete.
NAND 256MiB 3,3V 8-bit: MTD Erase failure: -5
Erasing at 0xffe0000 -- 100% complete.
Bad block table not found for chip 0
Bad block table not found for chip 0
OK

Der NAND-Speicher ist nun leer. Jetzt erstellen wir die Liste der defekten Blöcke neu. Achtung, dieser Vorgang kann mehrere Minuten dauern, nicht unruhig werden und abbrechen falls kein Fortschritt sichtbar ist. Dieser Schritt ist wichtig, macht man das nicht gibt es herrliche Fehlermeldungen. Ihr müsste das nicht extra testen, ich habe es selbst probiert. :-x Achja, auch hier muss man das „y“ wieder blind eintippen und mit Enter bestätigen.

MINI2440 # nand createbbt
Create BBT and erase everything ? <y/N>
createbbt aborted
MINI2440 # nand createbbt
Create BBT and erase everything ? <y/N>
Skipping bad block at  0x00880000                                            
Skipping bad block at  0x05c60000                                            
Skipping bad block at  0x09a80000                                            
Skipping bad block at  0x0ff80000                                            
Skipping bad block at  0x0ffa0000                                            
Skipping bad block at  0x0ffc0000                                            
Skipping bad block at  0x0ffe0000                                            

Creating BBT. Please wait ...Bad block table not found for chip 0
Bad block table not found for chip 0
Bad block table written to 0x0ffe0000, version 0x01
Bad block table written to 0x0ffc0000, version 0x01

U-Boot installieren

Jetzt erzeugen wir einen Speicherbereich in dem U-Boot die Konfiguration ablegt.

MINI2440 # dynenv set 40000
device 0 offset 0x40000, size 0xffc0000
45 4e 56 30 - 00 00 04 00

Die Hardware-Adresse der Netzwerkkarte (MAC) wird vom Bootloader gesetzt. Daher konfigurieren wir diese hier auch. Man verwendet dafür eine Adresse die frei ist5).

MINI2440 # set ethaddr 08:00:2f:00:AF:FE

Jetzt ist es an der Zeit den Bootloader U-Boot aus dem RAM auf den NAND-Flash des FriendlyARM zu schreiben. Auch hierzu muss man wieder die Größe des Bootloaders in Bytes angeben.

MINI2440 # nand write.e 0x32000000 0x0 <Dateigröße des Bootloaders in Byte>

NAND write: device 0 offset 0x0, size 0x242360

Writing data at 0x242000 -- 100% complete.
 2368352 bytes written: OK

Schließlich sorgen wir noch dafür, dass alle unsere Einstellungen ebenfalls auf dem NAND abgespeichert werden.

saveenv

Damit ist U-Boot installiert. Wenn man jetzt den unteren Schalter am FriendlyARM auf „NAND“ stellt und einen Reset ausführt sollte in der seriellen Konsole die Startmeldungen von U-Boot zu sehen sein. Die exakte Boot-Konfiguration zum Starten von der SD-Speicherkarte, nehmen wir während der Debian-Installation vor. Wer möchte, kann auch an dieser Stelle sich mit den verschiedenen Befehlen die U-Boot bietet auseinandersetzen und die Dokumentation6) lesen.

weiter zu SD-Speicherkarte

Anmelden