当前位置: 代码迷 >> WinCE >> 开个帖子记要一下uboot 启动WinCE的全过程
  详细解决方案

开个帖子记要一下uboot 启动WinCE的全过程

热度:170   发布时间:2016-04-28 12:01:29.0
开个帖子记录一下uboot 启动WinCE的全过程
硬件: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
  相关解决方案