1、从 Nand Flash 启动 U-BOOT 的基本原理前 4K 的问题 如果 S3C2410 被配置成从 Nand Flash 启动(配置由硬件工程师在电路板设置), S3C2410的 Nand Flash 控制器有一个特殊的功能 ,在 S3C2410 上电后,Nand Flash 控制器会自动的把 Nand Flash 上的前 4K 数据搬移到 4K 内部 RAM 中,并把 0x00000000 设置内部 RAM 的起始地址,CPU 从内部 RAM 的 0x00000000 位置开 始启动。这个过程不需要程序干涉。 程序员需要完成的工作,是把最核心的启动程序放在 Nand Flash 的前
2、 4K 中。 启动程序的安排 由于 Nand Flash 控制器从 Nand Flash 中搬移到内部 RAM 的代码是有限的,所以在启动代码的前 4K 里,我们必须完成 S3C2410 的核心配置以及把启动代码(U-BOOT)剩余部分搬到RAM 中运行。 u-boot 源码不支持从 nand flash 启动,可是 s3c2410 支持从 nand flash 启动,开发板(sbc-2410x)加电后 s3c2410 将 nand flash 的前 4k(保存有 u-boot 的部分功能-拷贝功能-把 nand flash 中的内容拷贝到 SDRAM)拷贝到 sram(s3c2410 芯片内
3、的 sram)。这就需要修改 u-boot 源码,增加 u-boot 的功能: 使 u-boot 在得到执行权后能够将其自身拷贝到开发板上 SDRAM 中,以便处理器能够执行 u-boot .Nand Flash 的命令、地址、数据都通过 I/O 口发送,管脚复用,这样做做的好处是,可以明显减少 NAND FLASH 的管脚数目,将来如果设计者想将 NAND FLASH 更换为更高密度、更大容量的,也不必改动电路板。 NAND FLASH 不能够执行程序,本人总结其原因如下 : 1. NAND FLASH 本身是连接到了控制器上而不是系统总线上。CPU 启动后是要取指令执行的,如果是 SROM
4、、NOR FLASH 等之类的,CPU 发个地址就可以取得指令并执行,NAND FLASH 不行,因为 NAND FLASH 是管脚复用,它有自己的一套时序,这样 CPU 无法取得可以执行的代码,也就不能初始化系统了。 2. NAND FLASH 是顺序存取设备,不能够被随机访问,程序就不能够分支或跳转,这样你如何去设计程序。 U-BOOT 支持 ARM、 PowerPC 等多种架构的处理器,也支持 Linux、NetBSD 和VxWorks 等多种操作系统,主要用来开发嵌入式系统初始化代码 bootloader。bootloader是芯片复位后进入操作系统之前执行的一段代码,完成由硬件启动到
5、操作系统启动的过渡,为运行操作系统提供基本 的运行环境,如初始化 CPU、堆栈、初始化存储器系统等,其功能类似于 PC 机的 BIOS. 从 NAND 闪存中启动 U-BOOT 的设计 摘要:本文介绍了 S3C2410 中 NAND 闪存的工作原理,分析了从 NAND 闪存启动 U-BOOT的设计思路,并着重描述了 NAND 闪存支持 U-BOOT 的程序设计,移植后 U-BOOT 在嵌入式系统中运行良好。 关键词:U-BOOT ;NAND 闪存; S3C2410;嵌入式系统 引言 随着嵌入式系统的日趋复杂,它对大容量数据存储的需求越来越紧迫。而嵌入式设备低功耗、小体积以及低成本的要求,使硬盘
6、无法得到广泛的应用。NAND 闪存 设备就是为了满足这种需求而迅速发展起来的。目前关于 U-BOOT 的移植解决方案主要面向的是微处理器中的 NOR 闪存,如果能在微处理器上的 NAND 闪存中实现 U-BOOT 的启动,则会给实际应用带来极大的方便。U-BOOT 简介 U-BOOT 支持 ARM、 PowerPC 等多种架构的处理器,也支持 Linux、NetBSD 和VxWorks 等多种操作系统,主要用来开发嵌入式系统初始化代码 bootloader。bootloader是芯片复位后进入操作系统之前执行的一段代码,完成由硬件启动到操作系统启动的过渡,为运行操作系统提供基本 的运行环境,如
7、初始化 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
8、 页= 528B = 数据块 (512B) + OOB 块 (16B) 在每一页中,最后 16 个字节(又称 OOB)在 NAND 闪存命令执行完毕后设置状态,剩余 512个字节又分为前半部分和后半部分。可以通过 NAND 闪存命令 00h/01h/50h 分别对前半部、后半部、OOB 进行定位,通过 NAND 闪存内置的指针指向各自的首地址。 NAND 闪存的操作特点为:擦除操作的最小单位是块;NAND 闪存芯片每一位只能从 1 变为0,而不能从 0 变为 1,所以在对其进行写入操作之前一定要将相应块擦 除;OOB 部分的第6 字节为坏快标志,即如果不是坏块该值为 FF,否则为坏块;除 OO
9、B 第 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 的代码是有限的,所以,
10、在启动代码的前 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