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.
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.
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
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>
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.
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.
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
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…