WINCE6.0 + S3C2443的启动过程---nboot篇

WINCE6.0 + S3C2443的启动过程---nboot篇

 

我们启动WINCE6.0的方式是:nboot+eboot+NK。那么是如何启动WINCE6.0系统映像的呢?首先是nbooteboot拷贝到SDRAM中执行的地址处运行,接着ebootNK.bin拷贝到SDRAM指定的地址处运行。

 

首先,我们需要通过JTAG把我们nboot文件编译生成的stpldr.nb0文件烧录到nandflash的第0block中。那么系统复位或者上电启动的动作产生之后,是如何从nboot开始执行的呢?我们先看S3C2443datasheetnandflash控制器的相关部分:

WINCE6.0 + S3C2443的启动过程---nboot篇_第1张图片

 

 

 

当系统上电启动或者复位后,nand flash控制器会自动把nandflash0block中的前4KB的启动代码(也即nboot的代码)拷贝到S3C2443配备的名为“stepping stone”的SRAM中,然后在stepping stone启动代码就自动运行了,也就是nboot在这时候就开始运行了,那么入口点是哪里呢?从/Src/Bootloader/Stepldr/sources的如下内容

TARGETNAME=stepldr

TARGETTYPE=PROGRAM

RELEASETYPE=PLATFORM

EXEENTRY=StartUp

NOMIPS16CODE=1

可以看出nboot的入口函数是StartUp。

 

1.StartUp函数

这个函数就在/Src/Bootloader/Stepldr/startup.s中定义,如下所示:

WINCE6.0 + S3C2443的启动过程---nboot篇_第2张图片

也即nboot从StartUp开始执行,接着就直接跳转到ResetHandler执行了,这个函数主要是做了下面一些工作

设置GPIO,关闭watchdog,关闭所有的中断。

设置系统时钟,关于系统时钟的详细设置,我打算另外再写一篇来介绍。

初始化内存控制器。

通过寄存器RSTSTAT的值来判断当前的动作是正常的启动还是从睡眠中唤醒,如果是从睡眠中唤醒,就直接跳转到NK在SDRAM的开始地址处0x30200000(也即NK.bin在SDRAM中的存放地址处,也即0x80200000),然后会从NK.bin的start address处(假如是0x80205394),这个地址就是NK.exe,也即是Oal.exe的开始地址处,也就是从/Src/Oal/Oallib/startup.s下面的函数StartUp开始执行,而0x80205394 - 0x80200000 =0x5394这个偏移值应该是NK.bin打包各个文件之后NK.exe在NK.bin中的偏移值;如果是正常的启动,将会跳转到nboot的main(),其中关于睡眠和唤醒,可见我的另一篇博客:http://cky0612.blog.163.com/blog/static/27478916201051793355837/

 

2.main()

Main函数实现了下面的内容:

通过Uart_Init()函数来初始化串口,编译debug

通过NF_Init()函数来初始化nand flash控制器。

通过ReadFlashID()来读取当前nand flashID

WINCE6.0 + S3C2443的启动过程---nboot篇_第3张图片

其中0xECmaker code(厂家识别代码)0xA0device code(设备代码),这些值是在/Src/Common/Smartmedia/fmd/cfnand.h中的如下数组定义的:

WINCE6.0 + S3C2443的启动过程---nboot篇_第4张图片

上图我只是截了这个数组的一小部分,后面的nandflash驱动中会用到这个数组用于判断当前系统使用的nandflash是否在这个表中。

nandflash的第2block中把eboot的映像文件读取到SDRAM中指定的地址处(0x30038000),这个地址有eboot/boot.bib来指定,实现部分如下:

nandflash中读取ebootSDRAM之后,接着就在指定的地址处执行,也即eboot的起始地址处执行eboot,如下所示:

其中LOAD_ADDRESS_PHYSICAL=0x30038000,从此nboot的工作就完成,转而开始eboot的执行了。

 

你可能感兴趣的:(c,工作,WinCE,2010)