首页 > 范文大全 > 正文

从NAND闪存中启动U-BOOT的设计

开篇:润墨网以专业的文秘视角,为您筛选了一篇从NAND闪存中启动U-BOOT的设计范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!

摘要:本文介绍了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。U-BOOT执行流程图如图1所示。

NAND闪存工作原理

S3C2410开发板的NAND闪存由NAND闪存控制器(集成在S3C2410 CPU中)和NAND闪存芯片(K9F1208UOA)两大部分组成。当要访问NAND闪存芯片中的数据时,必须通过NAND闪存控制器发送命令才能完成。所以,NAND闪存相当于S3C2410的一个外设,而不位于它的内存地址区。

NAND闪存(K9F1208UOA)的数据存储结构分层为:1设备(Device)=4096块(Block);1块:32页/行(Page/row);1页:528B=数据块(512B)+OOB块(16B)

在每一页中,最后16个字节(又称OOB)在NAND闪存命令执行完毕后设置状态,剩余512个字节又分为前半部分和后半部分。可以通过NAND闪存命令OOh/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启动的第一个阶段(stagel)。

根据u―BOOT的执行流程图,可知要实现从NAND闪存中启动u―BOOT,首先需要初始化NAND闪存,并从NAND闪存中把U-BOOT搬移到RAM中,最后需要让u―BOOT支持NAND闪存的命令操作。

结语

以往将U-BOOT移植到ARM9平台中的解决方案主要针对的是ARM9中的NOR闪存,因为NOR闪存的结构特点致使应用程序可以直接在其内部运行,不用把代码读到RAM中,移植过程相对简单。从NAND闪存中启动U-BOOT的设计难点在于NAND闪存需要把u―BOOT的代码搬移到RAM中,并要让U-BOOT支持NAND闪存的命令操作。本文介绍了实现这一设计的思路及具体程序。移植后,U-BOOT在嵌入式系统中运行良好。

注:“本文中所涉及的注解、图表、公式等请以PDF格式阅读原文。”