SC6800H平台Bootloader和Nandflash学习交流Author:车国盛Date:2012.04.11内容提纲1.Bootloader简介2.为什么需要Bootloader?3.Bootloader存放在哪里?为什么?4.Bootloader运行在哪里?5.Bootloader代码构架是怎样的?6.Bootparameter如何设定的?7.Bootloader代码解读8.Nandflash简介9.Nandflash和Norflash比较10.Nandflash工作原理11.Nandflash的ECC简介12.Nandflash常用的软件管理方案13.6800H平台NandInterface简介14.6800H平台Nandflash驱动配置15.6800H平台Nandflash分区Bootloader简介Bootloader就是一段小程序,它在系统上电时开始执行,初始化硬件设备、准备好软件环境,最后调用系统内核。典型的嵌入式系统Bootloader有Blob(bootloadobject)和U-boot(universalbootloader),其中U-boot支持ARM,MIPS,X86,Nios,可启动VxWorks,QNX,Linux什么是Bootloader?为什么需要BootloaderNand与Nor的区别Nand不能runinplace,Nand不支持即时的读写操作,需要将代码拷贝到RAM执行;Nand会有坏块,需要一个坏块管理模块,这个模块相对来说还是比较复杂的。Nand的坏块特性决定了从Nand拷贝代码到RAM是一个相对比较复杂的动作。SDRAMSDRAM需要初始化,这意味着最早的一些代码不能在SDRAM中执行,需要先在IRAM中运行;IRAM很小。Bootloader存放在哪里?为什么?在nand的第一个blockNAND_PartTable_XXX.c配置文件NBL_OFFSET即是Bootloader的位置,可以看到是0。为什么在这里:Nand的第一个block永远不会损坏的特性决定了可以很简单的读取这个块。Bootloader运行在哪里?boot0运行在IRAM,boot1运行在SDRAM。boot0的运行地址可以从scatter0.scf中找到如下:ROM_EXEC0x400000000x8000{boot0_entry.o(Reset,+First)sdram_init.o(+RO,+RW,+ZI)prod_cfg.o(+RO,+RW,+ZI)*.o(+RO,+RW)}Bootloader运行在哪里?boot1的运行地址可以从scatter1.scf中找到如下:ROM_EXEC0x10000000x14000{boot1_entry.o(Reset,+First)*.o(+RO,+RW)}Bootloader代码构架是怎样的?Bootloader分两部分:boot0和boot1。boot0引导boot1,boot1引导EXEC_KERNEL_IMAGE.bin。boot0不超过16K,boot1不超过128K。boot0为什么不超过16K?(Nand第一个block永远不会坏,不做坏块管理。一个block可能是16K或者128K,为了统一处理,当16K来使用。)boot1为什么不超过128K?(暂时不确定)在scatter中boot0和boot1的大小设置为:scatter0.scf:ROM_LOAD0x400000000x4000;0x4000-16Kscatter1.scf:ROM_LOAD0x10000000x14000;0x14000-80KBootloader代码构架是怎样的?boot0入口地址:0x40000000(IRAM起始地址)boot0主要工作:boot0_entry.s:Remap-初始化SDRAM-__main-声明bootparameter并分配空间boot0_main.c:将boot1拷贝到SDRAM-set_pc到SDRAM执行boot1。Bootloader代码构架是怎样的?boot1入口地址:0x01000000(SDRAM)boot1主要工作:boot1_entry.s__main-声明bootparameter并分配空间。boot1_main.c将EXEC_KERNEL_IMAGE.bin拷贝到SDRAM,并set_pc到SDRAM执行EXEC_KERNEL_IMAGE.bin。Kernel的运行地址:由函数PUBLICvoidcall_kernel(void){set_pc(SDRAM_BASE_ADDR);}可以看出,SDRAM_BASE_ADDR为0地址,即EXEC_KERNEL_IMAGE.bin存放的起始地址。Bootparameter如何设定的?bootparameter(nand分区表等相关信息)的设定在fdl相关代码中,该部分代码已封装。在函数BOOLEANcopyKernelImg(void)中,可以看出,从flash中读取出来bootparameter存放在bootParam中。_copyImg(ftlHandle,SDRAM_BASE_ADDR,osInfo-offset,osInfo-size,ftlPartitionInfo.sctSize)这里可以看到一部分bootparameter参数。Bootloader代码解读主要文件:目录fdl_bootloader\bootloader\srcboot0_entry.sboot0_main.cboot1_entry.sboot1_main.cNandFlash简介Flash存储器又称闪存,是一种可在线多次擦除的非易失性存储器,即掉电后数据不会丢失。Flash存储器还具有体积小、功耗低、抗振性强等优点。Flash存储器主要分为两种:一种为Nor型Flash,另一种为Nand型Flash。Nand内部采用非线性宏单元模式,为固态大容量内存的实现提供了廉价有效的解决方案。Nand存储器具有容量较大,改写速度快等优点,适用于大量数据的存储,因而在业界得到了越来越广泛的应用。Nandflash和Norflash比较接口比较:Nor带有SRAM接口,有足够的地址引脚来寻址,可以很容易地存取其内部的每一个字节。Nor的特点是芯片内执行(XIP,eXecuteInPlace),这样应用程序可以直接在Norflash内运行,可以不把代码读到系统RAM中。例如uboot中的ro段可以直接在Norflash上运行,只需要把rw和zi段拷贝到RAM中运行即可。Nand器件使用复杂的I/O口来串行地存取数据,I/O引脚用来传送控制、地址和数据信息,由于时序较为复杂,所以一般CPU集成Nand控制器。Nand读和写操作采用512字节的块,这一点有点像硬盘管理此类操作。Nand是非线性存储器,不支持eXecuteInPlace。Nandflash和Norflash比较容量和成本比较:相比起Nand来说,Nor的容量要小,一般在1-16MByte左右,一些新工艺采用了芯片叠加技术可以把Nor的容量做得大一些。在价格方面,Nor相比Nand来说要高一些。Nand生产过程更为简单,结构可以在给定的模具尺寸内提供更高的容量,这样也就相应地降低了价格。Nandflash和Norflash比较其他方面如可靠性,耐用性等方面的比较,在这里就不一一详述了。Nandflash工作原理-组成结构Nand的数据是以bit的方式保存在memorycell,一般来说,一个cell中只能存储一个bit。这些cell以8个或者16个为单位,连成bitline,形成所谓的byte(x8)/word(x16),这就是NandDevice的位宽(当然还有32bit或更大的位宽的)。若干个Line会再组成Page。若干个Page组成block。若干个block组成Plane。若干个Plane组成Device。Nandflash工作原理-组成结构这里以三星的Nand型号K9F1208为例子说明Nand的组成结构。Nandflash工作原理-组成结构对于上图的Nand芯片K9F1208:每页528Bytes:512byte(MainArea)+16byte(SpareArea)。每32个page形成一个Block(32*528B)。4096个block组成一片Nand芯片K9F1208。故总容量为4096*(32*528B)=66MB,其中的2MB是用来保存ECC校验码等额外数据的,实际中可使用的为64MB。说明:这只是针对芯片K9F1208的组成结构,不同的芯片可以根据datasheet确定。Nandflash工作原理-组成结构对于上图的Nand芯片K9F1208:1Page=528Byte,其中512byte为MainArea,16byte为SpareArea。1Block=32Page*528Byte。1Device=4096(块)*32(页)*528(字节)*8(位)=528Mbit=66Mbyte总容量为66Mbyte,其中的2Mbyte是用来保存ECC校验码等额外数据的,实际中可使用的为64Mbyte。说明:这只是针对芯片K9F1208的组成结构,不同的芯片可以根据datasheet确定。Nandflash工作原理-组成结构Page分为main和spare区。main是用来保存数据的,spare区一般用来标记坏块以及保存对main区数据的ECC校验码等。spare区大小:(每512+16)byte就有16byte作为spare区。spare区这16byte格式:不同厂家的格式可能有所区别,没有统一的标准格式。Nandflash工作原理-组成结构以下是spare区的一个例子:LSN0LSN1LSN2RESERVEDRESERVEDBIECC0ECC1ECC2S-ECC0S-ECC1RESERVEDRESERVEDRESERVEDRESERVEDRESERVED其中:LSN:LogicalSectorNumber(跟坏块管理有关)ECCa,ECCb,ECCc:ECCcodeforMainareadata(ErrorCheckingandCorrection)S_ECCa,S_ECCb:ECCcodeforLSNdataBI:BadblockInformationNandflash工作原理-寻址刚才算的容量是有64Mbyte的空间,225bit64Mbyte226bit也就是说需要26位地址传送,可是看Nand的原理图发现有IO0-IO7,它是怎么寻址的呢?Nandflash工作原理-寻址看看下面完整的ArrayOrganizationNandflash工作原理-寻址原来Nand并不是直接通过里面的存储物理层,而是有一个专门的页寄存器来管理的。不论是什么操作都要首先通过pageregsiter。从上图来看,A0-A7是页内寻址,也叫列寻址,也就是512寻址,不过A0-A7才8位,最大也就寻址256?实质上还有一位A8,A8是由Nand里面的某个硬件电路根据相关的命令而置为1或者0,这不用软件来操作。例如说要寻址0~255字节,这样的话8位IO搞定了,这时候硬件电路就会把A8置为0;如果说要寻址第484字节,8位就不够了,硬件电路就会把A8置1,完成所谓的第484个字节寻址。484的二进制是111100100,需要9位才行,A8此时就充当第9位,其余8位还是由IO完成的,这样就可以完成512字节内的任何寻址了。Nandflash工作原理-寻址A9~A25是用来进行页寻址的,也叫行寻址,4096块*32页=131072页,用A9~A25就可以搞定这么多页了。基于以上可知,A9~A25是进行多达上万页寻址的,其实还可以细分的,A9~A13是块内的32页寻址,正好5位,2的5次方=32,一块由32页组成,A14~A25是用来进行块寻址的,4096块,也足够了。其实A14~A25还可以细分,还有个叫“层”的概念。