UBOOT-2011-03在S3C2440上的移植四-支持NANDFLASH
### U-Boot 2011.03 在 S3C2440 上的移植:支持 NAND Flash #### 概述 本文档是关于如何将 U-Boot 2011.03 移植到 S3C2440 平台上,并使其支持 NAND Flash 的详细指南。S3C2440 是一款基于 ARM920T 内核的应用处理器,广泛应用于嵌入式系统中。NAND Flash 作为低成本、高密度的存储介质,在许多嵌入式应用中被广泛应用。因此,让 U-Boot 支持 NAND Flash 对于提高系统的灵活性和功能至关重要。 #### 修改 NAND Flash 相关代码 在前一篇文章《UBOOT-2011-03 在 S3C2440 上的移植 <三> —— 自动识别启动模式 Nand Or Nor》的基础上,本部分将进一步讨论如何修改 NAND Flash 相关代码以实现对 NAND Flash 的支持。具体步骤如下: 1. **创建新的源文件**:在 `board/samsung/eilian240` 目录下新建一个名为 `nand_read.c` 的文件。 2. **编写 NAND 读取函数**:该文件将包含用于从 NAND Flash 读取数据的基本函数。这部分代码非常重要,因为它将被 U-Boot 的启动代码(位于 `cpu/arm920/start.S`)调用。 #### 代码详解 ##### 文件 `nand_read.c` ```c /* * nand_read.c: Simple NAND read functions for booting from NAND * * This is used by cpu/arm920/start.S assembler code, * and the board-specific linkerscript must make sure this * file is linked within the first 4kB of NAND flash. * * Taken from GPLv2 licensed vivi bootloader, * Copyright (C) 2002 MIZI Research, Inc. * * Author: Hwang, Chideok <hwang@mizi.com> * Date: $Date: 2004/02/04 10:37:37$ * * u-boot integration and bad-block skipping (C) 2006 by OpenMoko, Inc. * Author: Harald Welte <laforge@openmoko.org> */ #include <common.h> #include <linux/mtd/nand.h> #define __REGb(x) (*(volatile unsigned char*)(x)) #define __REGw(x) (*(volatile unsigned short*)(x)) #define __REGi(x) (*(volatile unsigned int*)(x)) #define NF_BASE 0x4e000000 #define NFCONF __REGi(NF_BASE + 0x0) /* NAND 配置寄存器 */ #define NFCONT __REGi(NF_BASE + 0x4) /* NAND 控制寄存器 */ #define NFCMD __REGb(NF_BASE + 0x8) /* NAND 命令寄存器 Bit7-0 存放芯片内部命令值 */ #define NFADDR __REGb(NF_BASE + 0xc) /* NAND 地址寄存器 Bit7-0 存放 */ #define NFDATA __REGb(NF_BASE + 0x10) /* NAND 数据寄存器 8 位 IO */ #define NFDATA16 __REGw(NF_BASE + 0x10) /* NAND 数据寄存器 16 位 IO */ #define NFSTAT __REGb(NF_BASE + 0x20) /* NAND 状态寄存器 */ #define NFSTAT_BUSY 1 #define nand_select() (NFCONT &= ~(1 << 1)) /* 芯片片选 */ #define nand_deselect() (NFCONT |= (1 << 1)) /* 取消芯片片选 */ #define nand_clear_RnB() (NFSTAT |= (1 << 2)) /* 清除中断,往 NFSTAT 状态寄存器的 Bit2 写 1 */ /* 以上为 S3C2440 NAND Flash 寄存器的定义,具体定义方式参见数据手册 */ static inline void nand_wait(void) { int i; while (!(NFSTAT & NFSTAT_BUSY)) for (i = 0; i < 10; i++); } struct boot_nand_t { int page_size; int block_size; int bad_block_offset; // unsigned long size; }; static int is_bad_block(struct boot_nand_t *nand, unsigned long i) { unsigned char data; unsigned long page_num; nand_clear_RnB(); if (nand->page_size == 512) { NFCMD = NAND_CMD_READOOB; /* 0x50 */ NFADDR = nand->bad_block_offset & 0xf; NFADDR = (i >> 9); ``` #### 解析 1. **NAND Flash 寄存器定义**: - `NFCONF`: NAND 配置寄存器,用于配置 NAND Flash 的工作参数。 - `NFCONT`: NAND 控制寄存器,用于控制 NAND Flash 的操作。 - `NFCMD`: NAND 命令寄存器,用于发送命令给 NAND Flash。 - `NFADDR`: NAND 地址寄存器,用于设置 NAND Flash 的地址。 - `NFDATA`: NAND 数据寄存器,用于读写数据。 - `NFDATA16`: NAND 数据寄存器,用于支持 16 位数据宽度。 - `NFSTAT`: NAND 状态寄存器,用于检查 NAND Flash 的当前状态。 2. **宏定义**: - `nand_select()` 和 `nand_deselect()` 用于选择或取消选择 NAND Flash 芯片。 - `nand_clear_RnB()` 用于清除状态寄存器中的忙标志。 3. **函数定义**: - `nand_wait()`:等待 NAND Flash 操作完成。 - `is_bad_block()`:检查给定的块是否为坏块。 #### 结论 通过以上步骤,我们成功地在 U-Boot 2011.03 中添加了对 NAND Flash 的支持。这对于提高系统的灵活性和功能至关重要,特别是在那些成本敏感的应用场景中。未来还可以进一步优化 NAND Flash 的读写性能,并增加错误校验等功能,以确保数据的完整性和可靠性。
剩余16页未读,继续阅读
- on1y0ne2012-09-17谢谢分享,写的很细心,下载几部分觉的有些费事,楼主其他文章也的很不错,拜读~
- Alex_lijian2013-03-18谢谢分享,写的很细心,拜读~
- 粉丝: 110
- 资源: 17
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助