Ich bin im Moment dabei, mir ein Linux From Scratch für ein ARM9 Board
zu compilieren. U-Boot schient soweit zu funktionieren. Das rootfs liegt
im NAND flash und der Kernel auch. Das ist die Ausgabe während des
Bootvorgangs:
1
U-Boot 2011.12 (Feb 18 2012 - 23:28:44)<\r><\n>
2
<\r><\n>
3
CPU: AT91SAM9G20<\r><\n>
4
Crystal frequency: 18.432 MHz<\r><\n>
5
CPU clock : 396.288 MHz<\r><\n>
6
Master clock : 132.096 MHz<\r><\n>
7
DRAM: 64 MiB<\r><\n>
8
WARNING: Caches not enabled<\r><\n>
9
NAND: 128 MiB<\r><\n>
10
*** Warning - bad CRC, using default environment<\r><\n>
11
<\r><\n>
12
In: serial<\r><\n>
13
Out: serial<\r><\n>
14
Err: serial<\r><\n>
15
Net: macb0<\r><\n>
16
Warning: failed to set MAC address<\r><\n>
17
<\r><\n>
18
Hit any key to stop autoboot: 3 <\b><\b><\b> 2 <\b><\b><\b> 1 <\b><\b><\b> 0 <\r><\n>
Könnte sein, dass der Kernel seine Meldungen woanders hinschreibt. Mach
mal printenv in u-boot und poste das Ergebnis. Prüfe auch, ob evtl. eine
command line fest im Kernel eincompiliert ist.
Ansonsten: Maschinennummer richtig gesetzt? Die ist im Bootloader
eincompiliert und wird für den Kernel an eine bestimmte Speicherstelle
geschrieben, wo dieser sie als eine der ersten Aktionen ausliest. Wenn
die Nummern von Kernel und Bootloader nicht übereinstimmen, hängt es an
dieser Stelle.
Wenn sich ein Linux 3.1-er Kernel booten lässt aber ein 3.2-er nicht,
könnte es daran liegen, dass schon u-boot den (Level-2) Cache aktiviert.
Das mögen die 3.2-er Kernel überhaupt nicht, da der Kernel beim Laden
(also zur Laufzeit) gepatched wird. Das funktioniert bei eingeschaltetem
Cache nicht.
Ob das beim AT91SAM9G20 auch so ist kann ich nicht sagen. Jedenfalls ist
es ein Problem bei der Kirkwood Architektur (z.B. Dockstar mit dem
u-boot von Jeff Doozan)
@Werner
Ich hab bei meinem selbstgeschriebenen ersten Bootloader, der U-Boot vom
Nand flash liest, den instruction cache aktiviert. Meinst du den
Instruction oder Data cache?
Das ist die environment von U-Boot. Ich hab bei diesem Versuch mal ttyS2
probiert, aber da kommt auch keine weitere Ausgabe. Ich hab das serielle
Kabel an USART2 angeschlossen. (Zählung beginnt ab 0) Gibts da irgendwo
eine Zuordnung USART <-> ttySx oder ist ttyS0 immer USART0?
Die Zeile "Uncompressing Linux... done, booting the kernel" gehört doch
schon zum Linux-Kernel, oder? Es gibt bei der Kernelkonfiguration die
Möglichkeit, eine frühe Konsole einzuschalten. Das hab ich gemacht. Dort
kann man auch direkt den USART auswählen. Ich vermute mal, das diese
Ausgabe über diese frühe Konsole geschickt wird.
Ich hab irgendwo noch gelesen, das die Startadresse des Kernel ab
Version 3 ein Vielfaches von 16MByte sein soll. Weiß da jemand
genaueres? Ich hab die Startadresse nicht geändert und standardmäßig ist
die 0x20008000 eingestellt, also kein Vielfaches von 16MByte. Macht es
überhaupt Sinn, vorn ein paar Byte freizulassen, wenn ich die gar nicht
selbst benötige?
Kann man beim Kernel irgendwo mehr Debug-Ausgaben einstellen?
Deine frühe Konsole musst du noch mit "earlyprintk" in den bootargs
aktivieren, in dem geposteten environment ist das nicht dabei.
Ja, die Meldung "Uncompressing..." kommt vom Kernel. Deshalb:
Machine ID überprüft? Der Hänger an der Stelle ist dafür typisch!
Auch typisch wäre falsches Speicherlayout. Probier mal, das dem Kernel
mit "mem=" in den bootargs mitzugeben.
@Oliver
In der Kernelkonfiguration kann ich genau das Board auswählen welches
ich habe. Da müsste doch die Machine ID auch richtig sein, oder? Wo kann
ich die überprüfen? Muss die Machine ID auch bei U-Boot irgendwo
angegeben werden und muss die gleich sein mit der beim Kernel?
Wenn ich das Board und den richtigen Prozessor auswähle, dann müsste
doch eigentlich auch das Speicherlayout stimmen, oder nicht?
"Müsste". Das ist das Stichwort, das einen immer die meiste Zeit kostet.
Wenn du ein Board von der Stange hast und dieses explizit im Kernel
unterstützt wird, sollte die Mach ID stimmen. Im U-Boot ist sie auch
eincompiliert, wenn du es für genau dieses Board konfiguriert und gebaut
hast. Wenn es ein generischer Build für den Controller, nicht aber für
das Board war, vielleicht nicht.
Das gilt beides auch entsprechend für das Speicherlayout.
Probier trotzdem mal "mem=", kostet dich ein paar Sekunden, vielleicht
hilft's.
Bei U-Boot gibts ein "MACH_TYPE_xxx". Muss das gleich sein mit der
Machine ID beim Kernel? U-Boot hab ich selbst angepasst, da waren nur
paar kleine Änderungen zu einem bestehenden Board nötig. Der Kernel
unterstützt das Board direkt.
U-Boot übergibt die Maschinen-ID an den Kernel und der vergleicht es mit
seinen eincompilierten IDs (können mehrere sein). Wenn der Kernel das
Board nicht kennt, macht er... nichts.
Sollte dein Problem beheben.
[ 1.150000] No filesystem could mount root, tried: ubifs<\r><\n>
9
[ 1.150000] Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(31,5)<\r><\n>
Kann mir jemand sagen, was das mit dem FTL header zu bedeuten hat? Der
NAND flash wird ja richtig erkannt, also funktioniert der Treiber
richtig aber bei den Partitionen steht (driver?), das ist doch
eigentlich nicht gut,oder?