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