硬件:mini6410开发板
软件:友善自带uboot、nboot+Wince(nk.nb0)
友善给的nboot与以往的wince的bootloader不同,友善的nboot是bootloader的精简版本,基本上没用的都去除了,只剩下LCD驱动(用来显示内核加载进度)以及硬件初始化的部分代码,针对这部分代码,准备将nboot移植进入uboot,在uboot下通过命令的方式启动nk.nb0内核。
首先在uboot的common文件夹下新建命令:bootwince
[#include <common.h>
#include <command.h>
#include <config.h>
#include <s3c6410.h>
#include <bootwince/winceinit.h>
#define LOAD_ADDRESS_PHYSICAL (IMAGE_NK_PA_START)
#define IMAGE_NK_PA_START (DRAM_BASE_PA_START+IMAGE_NK_OFFSET)
#define DRAM_BASE_PA_START (0x50000000)
#define IMAGE_NK_OFFSET (0x00100000)
typedef void (*PFN_IMAGE_LAUNCH)();
extern void winceinit(void);
int do_bootwince(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
//winceinit();
//((PFN_IMAGE_LAUNCH)(LOAD_ADDRESS_PHYSICAL))();//boot from 0x50100000(0x50108298)
((PFN_IMAGE_LAUNCH)(0x50108298))();
return 0;
}
U_BOOT_CMD(
bootwince, 1, 1, do_bootwince,
"bootwince - boot wince OS\n",
"[arg] - this is a long message"
" - this is a long message II\n"
);/code]
nboot中内核的加载地址为0x50100000,而oal.exe也就是内核的startup.s程序的入口地址为50108298,所以在这里直接launch0x50108298,然后winceinit()是调用的winceinit.s汇编文件来完成硬件的初始化,其中代码来自nboot中的startup.s,再此给出源码:
[code=c][#include <command.h>
#include <config.h>
#include <s3c6410.h>
#include <bootwince/winceinit.h>
.global winceinit
@prepare for booting WinCE OS
winceinit:
@------------------------------------
@ LED
@------------------------------------
@ 设置GPKCON0
ldr r1, =0x7F008800
ldr r0, =0x11110000
str r0, [r1]
@ 设置GPKDAT,使GPK_7引脚输出低电平,LED亮
ldr r1, =0x7F008808
mov r0, #0x70
str r0, [r1]
@------------------------------------
@ Enable Instruction Cache
@------------------------------------
mov r0, #0
mcr p15, 0, r0, c7, c7, 0 @ Invalidate Entire I&D Cache
mrc p15, 0, r0, c1, c0, 0 @ Enable I Cache
@ orr r0, r0, #R1_I
orr r0, r0, #(0x1000)
mcr p15, 0, r0, c1, c0, 0
@------------------------------------
@ Interrupt Disable
@------------------------------------
@ ldr r0, =VIC0INTENCLEAR
ldr r0, =0x71200014
ldr r1, =0xFFFFFFFF
str r1, [r0]
@ldr r0, =VIC1INTENCLEAR
ldr r0, =0x71300014
ldr r1, =0xFFFFFFFF
str r1, [r0]
@--------------------------------------------------
@ Initialize Stack
@ Stack size and location information is in "image_cfg.inc"
@--------------------------------------------------
@ mrs r0, cpsr
@ bic r0, r0, #Mode_MASK
@ orr r1, r0, #Mode_IRQ | NOINT
@ msr cpsr_cxsf, r1 @ IRQMode
@ ldr sp, =IRQStack_PA @ IRQStack
@ bic r0, r0, #Mode_MASK | NOINT