S3C2410 && WINCE6.0 && NBOOT

本文详细介绍S3C2410处理器如何利用NANDFlash存储启动代码,包括NANDBoot的工作原理、功能实现及使用VS2005编译NANDBoot的过程。

转自:    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就行。

linuxdriver_code_tool |-- 03 | `-- 2.6内核升级工具 | |-- device-mapper-1.00.19-2.i386.rpm | |-- lvm2-2.00.25-1.01.i386.rpm | |-- mkinitrd-4.2.0.3.tar.tar | |-- module-init-tools-3.2.2.tar.bz2 | `-- modutils-2.4.5-1.src.rpm |-- 04 | |-- 内核模块参数范例 | | `-- book.c | |-- 内核模块导出符号 | | `-- export_symb.c | `-- 最简单的内核模块 | `-- hello.c |-- 05 | `-- udev源代码 | `-- udev-114.tar.gz |-- 06 | |-- globalmem驱动 | | `-- globalmem.c | `-- 包含2个globalmem设备的驱动 | `-- globalmem_two.c |-- 07 | `-- 含并发控制的globalmem驱动 | `-- globalmem_lock.c |-- 08 | |-- globalfifo驱动 | | `-- globalfifo.c | `-- poll应用程序范例 | `-- pollmonitor.c |-- 09 | |-- 异步通知应用程序范例 | | `-- asyncmonitor.c | `-- 支持异步通知的globalfifo | `-- globalfifo_async.c |-- 10 | |-- S3C2410实时钟驱动 | | `-- s3c2410-rtc.c | `-- 秒设备驱动与应用程序 | |-- second.c | `-- second_test.c |-- 11 | |-- DMA范例 | | |-- 3c505.c | | |-- 3c505.h | | `-- dma.h | `-- 静态映射范例 | `-- mach-smdk2440.c |-- 12 | |-- NVRAM驱动 | | `-- generic_nvram.c | |-- 触摸屏驱动 | | |-- 作为input设备 | | | |-- s3c2410_ts.c | | | `-- s3c2410_ts.h | | `-- 作为普通字符设备 | | `-- s3c2410-ts.c | |-- 看门狗驱动 | | `-- s3c2410_wdt.c | `-- 平台设备 | `-- devs.c |-- 13 | |-- IDE驱动 | | |-- ide-disk.c | | `-- ide-h8300.c | `-- RAMDISK驱动 | `-- rd.c |-- 14 | |-- S3C2410串口驱动 | | |-- regs-gpio.h | | |-- regs-serial.h | | `-- s3c2410.c | `-- 串口核心层 | |-- serial_core.c | `-- serial_core.h |-- 15 | |-- S3C2410 I2C主机驱动 | | |-- i2c-s3c2410.c | | |-- iic.h | | |-- regs-gpio.h | | `-- regs-iic.h | `-- SAA711x I2C设备驱动 | `-- saa711x.c |-- 16 | `-- CS8900以太网设备驱动 | |-- cs89x0.c | `-- cs89x0.h |-- 17 | |-- ALSA工具及库 | | |-- alsa-driver-1.0.15.tar.bz2 | | |-- alsa-firmware-1.0.15.tar.bz2 | | |-- alsa-lib-1.0.15.tar.bz2 | | |-- alsa-oss-1.0.15.tar.bz2 | | |-- alsa-tools-1.0.15.tar.bz2 | | |-- alsa-utils-1.0.13.tar.bz2 | | `-- pyalsa-1.0.15.tar.bz2 | |-- ALSA驱动范例 | | |-- sa11xx-uda1341.c | | `-- uda1341.h | |-- ALSA应用程序范例 | | |-- pcm.c | | `-- pcm_min.c | |-- OSS驱动范例 | | `-- s3c2410-uda1341.c | `-- OSS应用程序范例 | |-- mixer.c | `-- sound.c |-- 18 | |-- FRAMEBUFFER应用程序范例 | | `-- fb_display | | |-- fb_display.c | | |-- fb_display.h | | |-- Makefile | | |-- README | | `-- test.c | `-- S3C2410 LCD驱动 | |-- s3c2410fb.c | `-- s3c2410fb.h |-- 19 | |-- busybox源代码 | | `-- busybox-1.2.1.tar.bz2 | |-- MTD工具 | | `-- mtd-utils-1.0.0.tar.gz | |-- nand驱动范例 | | `-- s3c2410.c | |-- nor驱动范例 | | `-- s3c2410nor.c | `-- yaffs&yaffs2源代码 | |-- yaffs.tar.gz | `-- yaffs2.tar.gz |-- 20 | |-- USB串口驱动 | | |-- usb-serial.c | | `-- usb-serial.h | |-- USB工具 | | `-- usbview-1.0.tar.tar | |-- USB骨架程序 | | `-- usb-skeleton.c | |-- USB键盘驱动 | | |-- input.h | | |-- usb_input.h | | `-- usbkbd.c | `-- usb主机控制器驱动范例 | |-- ohci-s3c2410.c | `-- usb-control.h |-- 21 | |-- PCI骨架程序 | | `-- pci-skeleton.c | `-- PCI驱动范例 | `-- i810_audio.c `-- 22 |-- 范例代码 | |-- oops范例 | | |-- oops_example.asm | | `-- oops_example.c | `-- proc范例 | `-- sim_proc.c `-- 内核调试工具 |-- ddd-3.3.11.tar.gz |-- gdbmod-2.4.bz2 |-- kdb-v4.4-2.6.15-rc5-common-1.bz2 |-- kdb-v4.4-2.6.15-rc5-common-2.bz2 |-- kdb-v4.4-2.6.15-rc5-i386-1.bz2 `-- linux-2.6.15.5-kgdb-2.4.tar.tar 73 directories, 91 files
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值