Forum: FPGA, VHDL & Co. Nios II uClinux SD als root-file-system


von Jan E. (royalopino)


Lesenswert?

Hallo,

auf meinem DE2-114 Board läuft uClinux für den Nios II. Ich kann eine 
SD-Karte mounten und Dateien lesen und schreiben. Nun möchte ich gerne, 
dass die SD-Karte als root-file-system fungiert.

Dazu habe ich die Schritte aus dem Altera-Wiki befolgt 
(http://www.alterawiki.com/wiki/Root_Device).

In Schritt 7 sthet nun:
[ ] Initial RAM filesystem and RAM disk (initramfs/initrd) support <== 
unselect

Wenn ich nun "make" mache, dann wird das "vmImage" erstellt aber kein 
"zImage". Fehlermeldung:
"*** No rule to make target `image.zimage.all'"

Wie bekomme ich nun den Kernel auf das Bord? Irgendwie muss die cpu ja 
den Kernel laden und die SD-Karte mounten. Ich bin ganz neu in dem Thema 
und weiß nicht wie ich nun weiter vorgehen soll.

Ich hoffe Ihr könnt mir irgendwie weiter helfen.

Mit freundlichem Gruß Jan

von Marius W. (mw1987)


Lesenswert?

Eine RAM-Disk brauchst du dafür nicht zwangsläufig. Wichtig ist nur, 
dass die SD/MMC-Treiber fest in den Kernel mit einkompiliert sind. Sonst 
hast du das Henne-Ei-Problem. Also in der Kernel-Konfiguration gucken, 
dass ein Stern (*) vor den Treibern steht und kein "M".

Gruß
Marius

von Jan E. (royalopino)


Lesenswert?

Danke schon mal für deine Antwort! :)

Die treiber habe ich fest im Kernel:

<*> SPI support ->
   <*> Altera SPI Controler
   -*- Utilities for Bitbanging SPI masters

<*> MMC/SD/SDIO card support ->
   <*> MMC block device driver
   (8) Number of minors per block device
   [*] Use bounce buffer for simple hosts
   <*> MMC/SD/SDIO over SPI

Die SD-Karte habe ich so formatiert:
$ mke2fs /dev/sdb
$ mount /dev/sdb /mnt
$ cd /mnt
$ zcat /path/to/initramfs_data.cpio | cpio -id
$ cd /
$ umount /mnt

Muss ich in Qsys ein onchip-ram implementieren und ein .hex-file 
zuweisen, dass irgendwie den Kernel in das sdram kopiert? Ein "zImage" 
genneriert er mir ja nicht :/

: Bearbeitet durch User
von Marius W. (mw1987)


Lesenswert?

Du brauchst natürlich eine Art Bootloader, der den Kernel in den SDRAM 
kopiert.

Gruß
Marius

von Jan E. (royalopino)


Lesenswert?

Ich kopiere das zImage momentan direkt in den sdram, also brauche ich im 
Moment keinen BootLoader.

Das Problem ist, dass die Kernel Commands (bootargs = "debug 
console=ttyAL0,115200 rootfstype=ext3 root=/dev/mmcblk0p1 rootwait rw") 
nur ausgeführt werden wenn keine init-Datei im initramfs vorhanden ist.
Wenn ich vor dem Build des Kernels den ordner "INI" in "INI_" umbennene, 
dann kann er diesen nicht mit kompilieren und die SD-Karte wird als 
rootfs eingebunden. Das kann ja aber nicht die "saubere" Lösung sein. 
Wie kann ich also das erzeugen der INI-Datei unterbinden?

mfG Jan

von Marius W. (mw1987)


Lesenswert?

Wofür brauchst du denn eigentlich eine initrd? Dass die 
Kernel-Commandline komplett ignoriert wird, ist mir eigentlich noch 
nicht untergekommen. Was passiert, wenn du dem Kernel per Commandline 
das "noinitrd" als Parameter übergibst?

Gruß
Marius

von derguteweka (Gast)


Lesenswert?

Moin,

Das scheint mir irgendein alteraspezifisches Problem zu sein. Wenn man 
das nicht loesen will, dann wuerd' mir noch die Moeglichkeit einfallen, 
mittels "switch_root" (busybox oder auch util-linux)  Kommando aus dem 
initramfs auf ein anderes rootfs "umzuschalten".

Gruss
WK

von Jan E. (royalopino)


Lesenswert?

Er ignoriert die Kernel-Commandline nicht komplett, aber er guckt halt 
ob ein init-file vorhanden ist und nur wenn das nicht da ist verwendet 
er "root=/dev/mmcblk0p1". Das habe ich hier gelesen 
(http://famschmid.net/uclinuxtutorial_nios.html#initramfs) und das 
stimmt auch. Die frage ist nun, wie stelle ich ein, dass kein init-file 
erstellt wird?
In der Kernel-Config gibt es unter "Core Applications" die Option 
"init", jedoch macht es keinen Unterschied ob ich diese aktiviere oder 
nicht.

von Jan E. (royalopino)


Lesenswert?

Ich habe es jetzt hinbekommen :)

ich musst zwischendurch mal "make clean" machen, da er sonst die 
einstellung "[ ] init" nicht beachtet hat.

Der nächste Schritt ist nun einen Bootloader zu implementirern, welcher 
das "zImage" von der SD-Karte in den SDRAM schiebt und startet..

von Jan E. (royalopino)


Lesenswert?

Nachtrag:

Der schöne Weg ist:

[ ] Initial RAM filesystem and RAM disk (initramfs/initrd) support <==
unselect

Wenn dann kein zImage erzeugt wird -> "LINUXTARGET=zImage make linux".

Wichtig, bei mmc over spi "rootwait" in den Kernal Command String 
setzen, da die SD-Karte lange braucht um zu regieren..

Nur falls mal jemand das gleiche Problem haben sollte ;)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.