从NAND闪存中启动U-BOOT的设计
发布时间:2008/5/26 0:00:00 访问次数:640
    
    
    来源:电子设计应用 作者:南昌大学信息工程学院 刘晔 汪灿华 范静辉
    
    摘 要:本文介绍了s3c2410中nand闪存的工作原理,分析了从nand闪存启动u-boot的设计思路,并着重描述了nand闪存支持u-boot的程序设计,移植后u-boot在嵌入式系统中运行良好。
    关键词:u-boot;nand闪存;s3c2410;嵌入式系统
    
    引言
    随着嵌入式系统的日趋复杂,它对大容量数据存储的需求越来越紧迫。而嵌入式设备低功耗、小体积以及低成本的要求,使硬盘无法得到广泛的应用。nand闪存设备就是为了满足这种需求而迅速发展起来的。目前关于u-boot的移植解决方案主要面向的是微处理器中的nor 闪存,如果能在微处理器上的nand 闪存中实现u-boot的启动,则会给实际应用带来极大的方便。
    
    u-boot简介
    u-boot 支持arm、 powerpc等多种架构的处理器,也支持linux、netbsd和vxworks等多种操作系统,主要用来开发嵌入式系统初始化代码bootloader。bootloader是芯片复位后进入操作系统之前执行的一段代码,完成由硬件启动到操作系统启动的过渡,为运行操作系统提供基本的运行环境,如初始化cpu、堆栈、初始化存储器系统等,其功能类似于pc机的bios。
    
    nand闪存工作原理
    s3c2410开发板的nand闪存由nand闪存控制器(集成在s3c2410 cpu中)和nand闪存芯片(k9f1208u0a)两大部分组成。当要访问nand闪存芯片中的数据时,必须通过nand闪存控制器发送命令才能完成。所以, nand闪存相当于s3c2410的一个外设,而不位于它的内存地址区。
    
    nand闪存(k9f1208u0a)的数据存储结构分层为:1设备(device) = 4096 块(block);1块= 32页/行(page/row);1页= 528b = 数据块 (512b) + oob块 (16b)
    在每一页中,最后16个字节(又称oob)在nand闪存命令执行完毕后设置状态,剩余512个字节又分为前半部分和后半部分。可以通过nand闪存命令00h/01h/50h分别对前半部、后半部、oob进行定位,通过nand闪存内置的指针指向各自的首地址。
    nand闪存的操作特点为:擦除操作的最小单位是块;nand闪存芯片每一位只能从1变为0,而不能从0变为1,所以在对其进行写入操作之前一定要将相应块擦除;oob部分的第6字节为坏快标志,即如果不是坏块该值为ff,否则为坏块;除oob第6字节外,通常用oob的前3个字节存放nand闪存的硬件ecc(校验寄存器)码;
    
    从nand闪存启动u-boot的设计思路
    如果s3c2410被配置成从nand闪存启动,上电后,s3c2410的nand闪存控制器会自动把nand闪存中的前4k数据搬移到内部ram中, 并把0x00000000设置为内部ram的起始地址, cpu从内部ram的0x00000000位置开始启动。因此要把最核心的启动程序放在nand闪存的前4k中。
    
    由于nand闪存控制器从nand闪存中搬移到内部ram的代码是有限的,所以, 在启动代码的前4k里,必须完成s3c2410的核心配置,并把启动代码的剩余部分搬到ram中运行。在u-boot中, 前4k完成的主要工作就是u-boot启动的第一个阶段(stage1)。
    根据u-boot的执行流程图,可知要实现从nand闪存中启动u-boot,首先需要初始化nand闪存,并从nand闪存中把u-boot搬移到ram中,最后需要让u-boot支持nand闪存的命令操作。
    
    开发环境
    本设计中目标板硬件环境如下:cpu为s3c2410,sdram为hy57v561620,nand闪存为64mb的k9f1208u0a。
    
    主机软件环境为redhat9.0、 u-boot-1.1.3、gcc 2.95.3。修改u-boot的makefile,加入:
    wch2410_config : unconfig
    @./mkconfig $(@:_config=) arm arm920t wch2410 null s3c24x0
    
    即将开发板起名为wch2410,接下来依次进行如下操作:
    mkdir board/wch2410
    cp board/smdk2410 board/wch2410
    mv smdk2410.c wch2410.c
    cp include/co
    
    
    来源:电子设计应用 作者:南昌大学信息工程学院 刘晔 汪灿华 范静辉
    
    摘 要:本文介绍了s3c2410中nand闪存的工作原理,分析了从nand闪存启动u-boot的设计思路,并着重描述了nand闪存支持u-boot的程序设计,移植后u-boot在嵌入式系统中运行良好。
    关键词:u-boot;nand闪存;s3c2410;嵌入式系统
    
    引言
    随着嵌入式系统的日趋复杂,它对大容量数据存储的需求越来越紧迫。而嵌入式设备低功耗、小体积以及低成本的要求,使硬盘无法得到广泛的应用。nand闪存设备就是为了满足这种需求而迅速发展起来的。目前关于u-boot的移植解决方案主要面向的是微处理器中的nor 闪存,如果能在微处理器上的nand 闪存中实现u-boot的启动,则会给实际应用带来极大的方便。
    
    u-boot简介
    u-boot 支持arm、 powerpc等多种架构的处理器,也支持linux、netbsd和vxworks等多种操作系统,主要用来开发嵌入式系统初始化代码bootloader。bootloader是芯片复位后进入操作系统之前执行的一段代码,完成由硬件启动到操作系统启动的过渡,为运行操作系统提供基本的运行环境,如初始化cpu、堆栈、初始化存储器系统等,其功能类似于pc机的bios。
    
    nand闪存工作原理
    s3c2410开发板的nand闪存由nand闪存控制器(集成在s3c2410 cpu中)和nand闪存芯片(k9f1208u0a)两大部分组成。当要访问nand闪存芯片中的数据时,必须通过nand闪存控制器发送命令才能完成。所以, nand闪存相当于s3c2410的一个外设,而不位于它的内存地址区。
    
    nand闪存(k9f1208u0a)的数据存储结构分层为:1设备(device) = 4096 块(block);1块= 32页/行(page/row);1页= 528b = 数据块 (512b) + oob块 (16b)
    在每一页中,最后16个字节(又称oob)在nand闪存命令执行完毕后设置状态,剩余512个字节又分为前半部分和后半部分。可以通过nand闪存命令00h/01h/50h分别对前半部、后半部、oob进行定位,通过nand闪存内置的指针指向各自的首地址。
    nand闪存的操作特点为:擦除操作的最小单位是块;nand闪存芯片每一位只能从1变为0,而不能从0变为1,所以在对其进行写入操作之前一定要将相应块擦除;oob部分的第6字节为坏快标志,即如果不是坏块该值为ff,否则为坏块;除oob第6字节外,通常用oob的前3个字节存放nand闪存的硬件ecc(校验寄存器)码;
    
    从nand闪存启动u-boot的设计思路
    如果s3c2410被配置成从nand闪存启动,上电后,s3c2410的nand闪存控制器会自动把nand闪存中的前4k数据搬移到内部ram中, 并把0x00000000设置为内部ram的起始地址, cpu从内部ram的0x00000000位置开始启动。因此要把最核心的启动程序放在nand闪存的前4k中。
    
    由于nand闪存控制器从nand闪存中搬移到内部ram的代码是有限的,所以, 在启动代码的前4k里,必须完成s3c2410的核心配置,并把启动代码的剩余部分搬到ram中运行。在u-boot中, 前4k完成的主要工作就是u-boot启动的第一个阶段(stage1)。
    根据u-boot的执行流程图,可知要实现从nand闪存中启动u-boot,首先需要初始化nand闪存,并从nand闪存中把u-boot搬移到ram中,最后需要让u-boot支持nand闪存的命令操作。
    
    开发环境
    本设计中目标板硬件环境如下:cpu为s3c2410,sdram为hy57v561620,nand闪存为64mb的k9f1208u0a。
    
    主机软件环境为redhat9.0、 u-boot-1.1.3、gcc 2.95.3。修改u-boot的makefile,加入:
    wch2410_config : unconfig
    @./mkconfig $(@:_config=) arm arm920t wch2410 null s3c24x0
    
    即将开发板起名为wch2410,接下来依次进行如下操作:
    mkdir board/wch2410
    cp board/smdk2410 board/wch2410
    mv smdk2410.c wch2410.c
    cp include/co