2012-04-26 12 views
8

Come posso riservare una porzione di SDRAM, ad esempio 4 byte, per passare un flag tra U-Boot e il kernel Linux in modo che questa posizione di memoria riservata non è inizializzato dal linker e il valore mantenuto dopo un avvio a caldo? Sto cercando di evitare l'uso di bootarg per minimizzare l'usura del flash NAND utilizzato in un'applicazione incorporata. La mia domanda potrebbe essere considerata un'estensione alla soluzione fornita da: u-boot.lds How to detect cold boot versus warm boot on an ARM processor?Prenotazione di una porzione di SDRAM per passare i dati tra U-Boot e il kernel Linux

ho costruito con lo script del linker qui sotto e costruito con: -fno-zero-inizializzato-in-BSS senza successo .

OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") 
OUTPUT_ARCH(arm) 
ENTRY(_start) 
SECTIONS 
{ 
. = 0x00000000; 
. = ALIGN(4); 
.text : 
{ 
    cpu/arm926ejs/start.o (.text) 
    *(.text) 
} 
. = ALIGN(4); 
.rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) } 
. = ALIGN(4); 
.data : { *(.data) } 
. = ALIGN(4); 
.got : { *(.got) } 
. = .; 
__u_boot_cmd_start = .; 
.u_boot_cmd : { *(.u_boot_cmd) } 
__u_boot_cmd_end = .; 
. = ALIGN(4); 
__bss_start = .; 
_U_BOOT_FLAG = .; . = . + 4; 
.bss (NOLOAD) : { *(.bss) . = ALIGN(4); } 
_end = .; 
} 

Qualche idea?

+0

Che scheda utilizzi? Una scheda versatile o una scheda personalizzata? Di quale SRAM stai parlando? –

+0

La scheda è una at91sam9g45 ed è in realtà DDR2-SDRAM. – user1357493

+0

Upvote solo per sapere come si scrive correttamente U-Boot. – sawdust

risposta

0

Se si vuole andare da un approccio globale variabile in How to detect cold boot versus warm boot on an ARM processor?:

Puoi forza che variabile globale di essere in una sezione ELF specifica (vedi http://gcc.gnu.org/onlinedocs/gcc-3.1/gcc/Variable-Attributes.html), e poi nello script del linker impostare tale sezione per un indirizzo specifico

Se si dispone di una buona capacità di LD-di script, si potrebbe anche ottenere il linker per inizializzare tutte le sezioni BSS, tranne che uno :)

3

C'è già un metodo per passare i dati tra U-Boot e il kernel di Linux ARM . Si chiama la lista di memoria ATAG. Informazioni come le regioni di memoria utilizzabili e le informazioni sulla scheda vengono passate da U-Boot al kernel ARM di Linux utilizzando questo elenco di dati. Potresti definire un ATAG personalizzato per i tuoi dati. In U-Boot, aggiungi la tua routine per creare il tuo tag ARM in lib_arm/armlinux.c. Quindi gli ATAG vengono elaborati in arch/arm/kernel/setup.c.

Per la documentazione, vedere la Sezione 8 di this o this alt site.

ADDENDUM
collegamenti alla documentazione ATAG si fa riferimento sono tenue (anche Google ha un cattivo collegamento).
Prova a cercare il nome effettivo del documento, che è "Booting ARM Linux" di Vincent Sanders.
Attualmente c'è una copia nella cache di Google del sito simtec e una ricerca più ampia ha ottenuto un translation in Korean (?).

Un'altra o una versione precedente (?) (Ma sembra essere stata aggiornata) da Russel King su avvio ARM è here.

+0

sono interrotti – kakeh

+0

@kakeh - Nessun sito sembra ospitare quel documento più. Vedi addendum. – sawdust