S3C2410 && WINCE6.0 && NBOOT

    技术2024-12-01  48

    转自:    http://www.cnblogs.com/we-hjb/archive/2008/09/27/1299901.html

          S3C2410处理器支持将启动代码存储在 NAND Flash中。为了实现这一功能, 2410配备了一个名为“ Steppingstone”的内部 SRAM。在启动时, NAND Flash中第一个 4K字节的内容将被加载到 Steppingstone中并执行。这个工作由 MCU主动完成,而我们只需将 NAND Flash配置为 Auto Boot模式即可。

           一般来说,启动代码会拷贝存储在 NAND Flash中的内容至 SDRAM中。在使用 ECC校验时, NAND Flash中数据的有效性将被确认。在完成拷贝的工作后,启动代码将跳转到已加载到 SDRAM中的主程序中,这时启动代码的使命完成, MCU由主程序来控制。

           WinCE操作系统从文件的组成来看一般分为两部分: BOOTLOADER NK.bin。在 WinCE中, BOOTLOADER一般为 EBOOT。它的主要功能是初始化硬件设备,主要包括 CPU内部的相关控制器、内存、网络、串口甚至 USB口和 LCD。在初始化完成后,它将通过网络或 USB从外部下载 NK.bin,或从本地 Flash中加载 NK.bin并执行,从而启动 WinCE操作系统。可以看到 Eboot虽然是启动代码,但它得完成相当多的工作,最终的映像文件也将超过 4K。所以,我们不能直接将 Eboot存放在 NAND Flash的第一个 4K字节中。我们需要一个更小的启动代码,这就是通常所说的 NBOOT(NAND BOOT)

           通过上面的介绍,我们知道了 NBOOT在整个系统中扮演的角色,它负责将 EBOOT加载到内存并运行。在 EBOOT开始执行后, NBOOT就退出了历史的舞台,事实上也不再有上场的机会。

           NBOOT的代码实现中,我们必须完成以下几个部分。

    1.       初始化 CPU内部相关控制器,如设置 GPIO,关闭 Watch Dog,关闭中断,设置系统时钟。

    2.       初始化内存。

    3.       初始化串口,主要用来输出调试信息。

    4.       初始化 NAND Flash,因为在 MCU启动时默认是 Auto Boot模式,为了从 NAND Flash中读取 EBOOT,需要将其配置成 NAND Flash Mode

    5.       读取 NAND Flash中的 EBOOT映像文件,并放在内存指定的位置,这个地址是跟 EBOOT有关,介绍 EBOOT时再详细说明。

    6.       完成读取之后,跳转到 EBOOT的起始位置,执行 EBOOT代码。

    一般来说,前面两个功能在 startup.s中实现, WinCE6.0下可以参考文件 C:"WINCE600"PLATFORM"DEVICEEMULATOR"SRC"BOOTLOADER"EBOOT"startup.s的相关代码。后面四个功能可在 main.c中实现。总之,在实现必备功能的情况下,尽可能减少代码量,以将最后的 NBOOT映像文件控制在 4K以内。

    NBOOT的编译环境一般有两种, ADS1.2(或 RVDS)、 Platform Builder。用 ADS1.2编译 NBOOT是比较方便的,需要注意的就是 RO Base RW Base的设置, RO Base必须设置为 0x0。否则,系统启动时 NBOOT将不被运行。在 Post-Linker中选择 ARM from ELF,在 Linker—— ARM fromELF—— Output Format中选择 Plain Binary,这样,编译完成后最终生成 NBoot.bin。该文件就可以固化在 NAND Flash的第 0 BLOCK中。 Platform Builder 6.0是作为 VS2005的插件来用的,所以,我们现在也可以用 VS2005来编译 NBOOT,这样就免得再安装 ADS RVDS等软件。用 VS2005来编译 NBOOT也有两种方法,第一种跟编译 EBOOT映像文件类似,第二种是自己写 makefile文件,然后用命令行的方式调用 ARM编译器来编译。两种方法各有优点,第一种方法在编译 OS时,会自动编译生成映像,而第二种方法可由 ADS下的程序直接移植过来,不过,要写好 makefile文件是相当困难的事情。一般还是少用为好。

    下面就介绍如何用 VS2005来编译 NBOOT

    首先修改 BSP的目录 2410"SRC"Bootloader" dir文件,添加 NBOOT,dir 文件的内容 :

     

    DIRS =             /         Nboot     /          eboot    /          bootpart

    在bootloader下创建 NBOOT目录,并创建 makefile makefile.inc sources nboot.bib文件,也可从 EBOOT的目录下拷贝对应文件过来进行修改。

    Makefile.inc文件的内容 :

    nboot_romimage: ! IF  " $(NOLINK) "   ==   ""     romimage $(ROMIMAGE_FLAGS) nboot.bib ! IF  " $(WINCEREL) " == " 1 "     copy $(_PLATFORMROOT) " $(_TGTPLAT) " target " $(_TGTCPU) " $(WINCEDEBUG) " nboot.* $(_FLATRELEASEDIR) ! ENDIF ! ENDIF

    Nboot.bib文件的内容 :

    MEMORY ;   Name      Start     Size      Type ;    -------     --------   --------   ----     NBOOT    00000000   00003000  RAMIMAGE     STACK    31400000   00001000  RESERVED     RAM      31500000   00010000  RAM CONFIG        COMPRESSION = ON        PROFILE = OFF        KERNELFIXUPS = ON        ROMSTART = 00000000        ROMWIDTH = 32        ROMSIZE = 00001000 MODULES ;   Name        Path                                                               Memory Type ;    ----------   --------------------------------------------------------------       -----------     nk.exe      $(_TARGETPLATROOT) " target " $(_TGTCPU) " $(WINCEDEBUG) " nboot.exe        NBOOT

     sources文件的内容:  

    TARGETNAME = nboot TARGETTYPE = PROGRAM RELEASETYPE = PLATFORM EXEENTRY = StartUp NOMIPS16CODE = 1 LDEFINES =- subsystem:native  / DEBUG  / DEBUGTYPE:CV  / FIXED:NO TARGETLIBS = $(_COMMONOAKROOT)/lib/$(_CPUINDPATH)/fulllibc.lib SOURCES =           /         startup.s /         main.c    /         nand.s WINCETARGETFILES = nboot_romimage

    再将对应的代码文件拷贝到 NBOOT的目录下,这里需要提醒一点的是,在 main.c中需要添加一个全局变量的定义,这在 ADS1.2的工程代码中是没有的,也是不须的。

    //  Globals variables. // ROMHDR  *   volatile   const  pTOC  =  (ROMHDR  * ) - 1 ;

    否则,最终生成的 Nboot.bin就只有一个文件头。做完相关代码的修改之后,就可以编译 NBOOT了。

                   

       

    可以看到,最终编译生成了 Nboot.bin NBOOT.nb0 NBOOT.nb1 NBOOT.nb2。上面我们提到用 ADS1.2编译最后可用的 NBOOT映像为 NBOOT.bin,但这里我们却得用 NBOOT.nb1。对比一下 ADS下生成的 Nboot.bin Nboot.nb1文件。      

          

         最后,再看一下反汇编 nboot.exe的样子,将其跟 startup.s对比一下,一样!            

          

         至此,我们就完成了用 VS2005编译得到 NBOOT的映像文件, NBOOT.nb1,应该来说还是比较简单的,但这中间还有些小的问题需要考虑,下次再整理。

           当然, S3C2410&&WinCE6.0也可以用 Nor Flash存储启动代码,这种情况下,就不必用 NBOOT,直接用 Eboot.nb0就行。

    最新回复(0)