S3C2410&&WINCE6.0&&NBOOT

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

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

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

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

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

ContractedBlock.gif ExpandedBlockStart.gif Code
DIRS=            \
        Nboot     \
         eboot    \
         bootpart

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

Makefile.inc文件的内容:

ContractedBlock.gif ExpandedBlockStart.gif Code
nboot_romimage:

!IF "$(NOLINK)" == ""

    romimage $(ROMIMAGE_FLAGS) nboot.bib

!IF "$(WINCEREL)"=="1"
    copy $(_PLATFORMROOT)
"$(_TGTPLAT)"target"$(_TGTCPU)"$(WINCEDEBUG)"nboot.* $(_FLATRELEASEDIR)
!ENDIF

!ENDIF

Nboot.bib文件的内容:

ContractedBlock.gif ExpandedBlockStart.gif Code
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文件的内容: 

ContractedBlock.gif ExpandedBlockStart.gif Code
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的工程代码中是没有的,也是不须的。

ContractedBlock.gif ExpandedBlockStart.gif Code
// Globals variables.
//
ROMHDR * volatile const pTOC = (ROMHDR *)-1;

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

               

  

可以看到,最终编译生成了Nboot.binNBOOT.nb0NBOOT.nb1NBOOT.nb2。上面我们提到用ADS1.2编译最后可用的NBOOT映像为NBOOT.bin,但这里我们却得用NBOOT.nb1。对比一下ADS下生成的Nboot.binNboot.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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值