Implementação do NBOOT para Bootloader WinCE 6.0 em S3C2410

O WinCE 6.0 utiliza dois arquivos binários principais para inicialização: eboot.nb0 e nk.bin. O eboot atua como bootloader, inicializando registradores e periféricos como SDRAM, UART e intrefaces de rede, além de copiar o nk.bin da memória flash para SDRAM. O nk.bin contém a imagem do kernel do sistema.

Em sistemas com NOR Flash e S3C2410, o conteúdo da flash é mapeado diretamente no endereço 0x00000000, permitindo execução imediata do eboot. Já em configurações com NAND Flash (mais econômica), a ausência de linhas de endereço exige que os primeiros 4KB sejam copiados para RAM interna (steppingstone) via hardware. Como o eboot padrão não inclui rotinas para copiar dados adicionasi da NAND Flash, implementa-se um carregador secundário chamado NBOOT.

As funções do NBOOT incluem: 1) Inicialização da CPU (desativação de watchdog, configuração de clock e controladores); 2) Cópia do eboot da flash para SDRAM e execução.

Configuração do Projeto no VS2005

No diretório BSP do S3C2410, crie uma pasta nboot em \src\bootloader\ e copie estes arquivos do eboot: source, boot.bib, makefile, makefile.inc, startup.s, main.c.

1. Arquivo SOURCE


TARGETNAME=loader_nboot
TARGETLIBS= \
    $(_COMMONOAKROOT)\lib\$(_CPUINDPATH)\fulllibc.lib
SOURCES= \
    startup.s \
    main.c

2. Configuração boot.bib


MEMORY
;   Nome         Início    Tamanho   Tipo
;   -----------  --------  --------  ----
    LOADER        30000000  00004000  RAMIMAGE
    PILHA         30004000  00004000  RESERVED
    RAM_UTIL      30008000  00004000  RAM

CONFIG
    COMPRESSION=OFF
    PROFILE=OFF
    KERNELFIXUPS=ON
    SRE=ON
    ROMSTART=30001000
    ROMWIDTH=32
    ROMSIZE=00002000

MODULES
;   Nome    Caminho                                                  Tipo
;   ------  -------------------------------------------------------  ------
    nk.exe  $(_TARGETPLATROOT)\target\$(_TGTCPU)\$(WINCEDEBUG)\loader_nboot.exe  LOADER

3. Ajustes makefile.inc


!IF "$(NOLINK)" == ""
    romimage boot.bib
!IF "$(WINCEREL)"=="1"
    copy $(_PLATFORMROOT)\$(_TGTPLAT)\target\$(_TGTCPU)\$(WINCEDEBUG)\loader_nboot.nb0 $(_FLATRELEASEDIR)
    copy $(_PLATFORMROOT)\$(_TGTPLAT)\target\$(_TGTCPU)\$(WINCEDEBUG)\loader_nboot.bin $(_FLATRELEASEDIR)
!ENDIF
!ENDIF

4. Implementação main.c


#include <windows.h>
#include <blcommon.h>

ROMHDR * volatile const pTOC = (ROMHDR *)-1;

void main(void) {
    // Lógica a ser implementada
}

Inicialização da CPU via startup.s

Remova as seções de MMU e ajuste o endereço base para 0x30000000 (início da RAMIMAGE). O código abaixo realiza a cópia enicial e configura a pilha:


; Cópia do carregador para SDRAM
ldr     r0, =0x1000
add     r0, r0, #0x30000000
mov     r1, r0
ldr     r2, =0x0
ldr     r3, =0x10000
loop_copia:
    ldr     r4, [r2], #4
    str     r4, [r1], #4
    subs    r3, r3, #1
    bne     loop_copia

; Redirecionamento para SDRAM
add     pc, pc, r0
nop
nop

; Configuração da pilha
mov     sp, #0x30000000
add     sp, sp, #0x4000
b       main

Tags: WinCE6.0 S3C2410 bootloader NAND-Flash VS2005

Publicado em 7-13 09:37