Adesso arriva il bello.
Da tutte le altre parti ho visto che la gente riusciva a fare l'upload di kernel e ramdisk senza problemi direttamente nella flash. Però, non so perchè, a me il flashing si interrompe in posizioni casuali senza motivo particolare. So solo che il flashing tramite web funziona egregiamente e se provo a scrivere nella MTD tramite
dd funziona altrettanto bene. Quindi mi verrebbe da pensare che il problema risieda in U-Boot.
A me il flashing tramite U-Boot non funziona. Quindi non posso usare U-Boot per flashare.E allora ho dovuto pensare ad un'alternativa. Pensa che ti pensa la soluzione è stata abbastanza semplice: caricare un'immagine alla volta nell'indirizzo di memoria predefinito di
loadb (0x00100000) e poi spostarle in un indirizzo di memoria più alta. Per esempio, per prima cosa carico il kernel:
loadb 00100000 [Invio]
Ctrl+\ - c
send <pathname>/uImage [Invio]***Una piccola parentesi per loadb***loadb carica in una porzione di memoria dei dati in arrivo tramite il protocollo
kermit. Toh, che bello.
Il comando usa degli indirizzi di default. Se è usato senza argomento (o se l'argomento è un qualsiasi indirizzo di memoria) carica per default in
0x00100000. Se l'argomento è
k carica per default in
0xFF820000. Se l'argomento è
r carica per default in
0xFF9A0000.
loadb <argomento>
***Chiusa parentesi***Attendo il caricamento via seriale e poi torno nel menu di U-Boot per spostare l'immagine del kernel. Uso il comando
cp per copiare i dati da una zona di memoria all'altra.
c [Invio]
cp 00100000 02000000 <dimensione del kernel> [Invio]La sintassi di
cp:
cp [da] [a] [dimensione]
Ogni indirizzo e dimensione di memoria deve essere espresso in base esadecimale.
Trovo la dimensione dell'immagine caricata appena mi riconnetto con kermit, in alto a destra, tra la dicitura "Total Size" e la dimensione in Bytes decimale. Poi ripeto il procedimento con il ramdisk.
loadb 00100000 [Invio]
Ctrl+\ - c (ovvero: tenere premuto Ctrl, premere backslash e poi premere 'c')
send <pathname>/uRamdisk [Invio]
c [Invio]
cp 00100000 03000000 <dimensione del ramdisk> [Invio]Di solito uso sempre indirizzi abbastanza distanti tra loro, mai troppo in alto nella memoria. Ricordate che tutta la memoria da
FF800000 a
FF7FFFFF è riservata alla NAND del DNS, e se volete lavorare in RAM come vi suggerisco di fare,
NON usate
MAI la memoria della NAND da U-Boot.
Quando ho caricato il kernel e il ramdisk li posso avviare con il comando
bootm.
Sintassi di bootm:
bootm [addr0] [addr1]
[addr0] è l'indirizzo di memoria dove sta il kernel.
[addr1] è la locazione del ramdisk. E' molto semplice: U-Boot legge le regioni di memoria dove risiedono il kernel e il ramdisk, esegue il kernel, apre il ramdisk e trasferisce il controllo al kernel, che poi legge
init, se c'è... e il firmware si avvia.
Nel mio caso:
bootm 02000000 03000000Se tutto è andato bene il DNS si avvierà ed entrerà nella shell. Se avete ancora il vecchio BusyBox non corretto (quello che non vi fa entrare nella shell, non importa che cosa facciate) basta che inseriate il codice
5784468.
A questo punto non vi resta che vedere se il firmware che avete modificato vi va bene così com'è. Se non vi va bene basta che torniate in U-Boot con un semplice
reboot (ricordatevi di premere
spazio al conto alla rovescia) e ripetiate il procedimento di caricamento delle immagini. Se comincia a lamentersi di immagini corrotte o memoria insufficiente spegnete brutalmente il DNS staccandone l'alimentazione e riattaccatela. Cancellerete la RAM e potrete ricominciare a cuor leggero. Solo per la RAM non succede nulla.
Se vi vanno bene vi conviene usare una chiavetta USB per trasferire manualmente le immagini dal PC al DNS (formattatela con ext2 o ext3), accedete tramite seriale e montate la chiavetta. Poi usate il buon vecchio
dd per trasferire i dati. Prima è più prudente cancellare le partizioni flash dove risiedevano i vecchi dati.
dd if=/dev/zero of=/dev/mtdblock2 bs=1k count=1536
dd if=/dev/zero of=/dev/mtdblock3 bs=1k count=6016
dd if=<path>/uImage of=/dev/mtdblock2 bs=1k
dd if=<path>/uRamdisk of=/dev/mtdblock3 bs=1k
Flashate le immagini
SOLO se siete assolutamente sicuri che funzionino e che vogliate effettivamente flashare le nuove funzionalità che avete implementato, o che vogliate cancellare delle cose che non vi vanno bene.
Creare le immagini U-BootSia che vogliate inserire uImage o uRamdisk avete bisogno di
mkimage. Lo trovate nei sorgenti del DNS, nella directory di u-boot. Troverete le istruzioni di compilazione nei sorgenti, dovrebbe essere abbastanza semplice.
mkimage si troverà nella directory
tools dell'albero dei sorgenti di U-Boot. Copiatelo da root in /usr/sbin (o dovunque voi vogliate, basta che compaia nella variabile di ambiente
PATH).
Per creare
uImage è abbastanza semplice, sempre nei sorgenti del DNS troverete i sorgenti modificati del kernel Linux dove potrete compilare una variante ARM. Dopo averlo configurato con
make menuconfig potrete generare direttamente
uImage:
make uImage
Dategli da fare anche un
make modules se avete creato dei moduli, ma vi consiglierei di tenere tutto built-in, sarà più facile e non dovrete poi dire al DNS di caricare moduli che magari non userete nemmeno. Un'eccezione si può fare per moduli particolarmente voluminosi come
xfs.ko, e allora li separate e li mettete nel ramdisk caricandoli poi durante l'avvio con una riga in
rc.sh.
Per installare i moduli in una directory interna all'albero dei sorgenti (come consiglio) create la directory di destinazione dei moduli e usate la variabile INSTALL_MOD_PATH con la directory appena creata:
make INSTALL_MOD_PATH=<directory> modules_install
e dovrebbe installare tutti i moduli nella directory. E anche se dice che "non esiste la directory /lib/modules" eccetera voi potete strafregarvene perchè l'unica cosa che vi interessa è strappare i moduli e metterli dove volete, perchè poi tanto li caricherete a mano.
uImage sta in
arch/arm/boot nella directory dei sorgenti di Linux, pronta per essere usata. Riferitevi alle dimensioni massime delle immagini riportate sotto per avere un'idea di che cosa mettere o che cosa non mettere nel kernel.
Un suggerimento: per rendere il ramdisk più "leggero" (che consiglio, dato che poi potrete far fare al vostro DNS bene o male quello che vorrete) cercate di integrare nel vostro kernel più cose possibili, lasciandone fuori solo lo stretto indispensabile o le cose più grosse.Questo per quanto riguarda il kernel.
uRamdisk si fa in modo diverso.
Se avete seguito quanto vi ho detto adesso
mkimage sta in una directory elencata in
PATH. Allora potete direttamente eseguire il seguente comando:
mkimage -a 0x800000 -e 0x800000 -A arm -O linux -T ramdisk -n 'boot ramdisk' -C gzip -d <ramdisk gzippato> uRamdisk
e avrete il vostro uRamdisk bello e pronto. Però prima bisogna fare due cose, non semplici. Una è generare il filesystem
cramfs in cui metterete le applicazioni non essenziali, e l'altra è generare il filesystem ext2 su file in cui copiare la struttura del firmware, e gzipparlo.
Continua...
Dimensioni massime immagini:- uImage: 1572864 byte -> 0x180000 byte
- uRamdisk: 6160384 byte -> 0x5e0000 byte