U-BOOT 对 Nand Flash 命令的支持
U-BOOT 对 Nand Flash 命令的支持
在 UBOOT 下对 Nand Flash 的支持主要是在命令行下实现对 nand flash 的操作。对 nand flash 实现的命令 为:nand info、nand device、nand read、nand write、nand erease、nand bad。
用到的主要数据结构有:struct nand_flash_dev、struct nand_chip。前者包括主要的芯片型号、存储容量、
设备 ID、I/O 总线宽度等信息;后者是具体对 nand flash 进行操作时用到的信息。
3.2.1 主要数据结构介绍
- struct nand_flash_dev 数据结构
该数据结构在 include/linux/mtd/nand.h 中定义,在 include/linux/mtd/nand_ids.h 中赋初值。 struct nand_flash_dev {
char *name; /* 芯片名称 */ int manufacture_id; /* 厂商 ID */ int model_id; /* 模式 ID */
int chipshift; /* Nand Flash 地址位数 */
char page256; /* 表明是否时 256 字节一页。1:是;0:否。*/
char pageadrlen; /* 完成一次地址传送需要往 NFADDR 中传送几次。*/ unsigned long erasesize; /* 一次块擦除可以擦除多少字节 */
int bus16; /* 地址线是否是 16 位,1:是;0:否 */
};
- struct nand_chip 数据结构
该数据结构在 include/linux/mtd/nand.h 中定义. 该结构体定义出一个 Nand Flash 设备数组: struct nand_chip nand_dev_desc[CFG_MAX_NAND_DEVICE];
该数组在 nand_probe()中对其进行初始化.
struct nand_chip {
int |
page_shift; |
/* Page 地址位数 |
*/ |
u_char |
*data_buf; |
/* 本次读出的一页数据 |
*/ |
u_char |
*data_cache; |
/* 读出的一页数据 |
*/ |
int |
cache_page; |
/* 上次操作的页号 |
*/ |
u_char ecc_code_buf[6]; /* ECC 校验码 */ u_char reserved[2];
char ChipID; /* 芯片 ID 号 */
struct Nand *chips; /*
Nand Flash 芯片列表, 表示支持几个芯片为一个设备*/ int chipshift;
char* chips_name; /*
Nand Flash 芯片名称 */
unsigned long erasesize; /* 块擦写的大小 */
unsigned long mfr; /*
厂商 ID */
unsigned long id; /* 模式 ID */
char* name; /* 设备名称 */
int numchips; /*
有几块
Nand Flash 芯片 */
char page256; /* 一页是 256 字节, 还是 512 字节
*/ char pageadrlen; /* 页地址的长度 */
unsigned long IO_ADDR; /* 用于对 nand
flash 进行寻址的地址值存放处 */ unsigned long totlen; /*
Nand Flash 总共大小 */
uint oobblock; /* 一页的大小。本款 nand flash 为 512 */ uint oobsize; /*
spare array 大小。本款 nand flash 为 16 */
uint eccsize; /* ECC 大小 */
int bus16; /*
地址线是否是
16 位,1:是;0:否 */
};
3.2.2 支持的命令函数说明
- nand info/nand device 功能:显示当前 nand flash 芯片信息。 函数调用关系如下(按先后顺序):
static void
nand_print(struct nand_chip *nand) ;
- nand erase 功能:擦除指定块上的数据。 函数调用关系如下(按先后顺序):
int
nand_erase(struct nand_chip* nand, size_t ofs, size_t len, int clean);
- nand bad
功能:显示坏块。 函数调用关系如下(按先后顺序):
static void
nand_print_bad(struct nand_chip* nand);
int check_block
(struct nand_chip *nand, unsigned long pos);
- nand read
功能:读取 nand flash 信息到 SDRAM。
函数调用关系如下(按先后顺序):
int
nand_rw (struct nand_chip* nand, int cmd,size_t start, size_t len, size_t *
retlen, u_char * buf); static int nand_read_ecc(struct nand_chip *nand, size_t
start, size_t len,
size_t *
retlen, u_char *buf, u_char *ecc_code);
static
void NanD_ReadBuf (struct nand_chip *nand, u_char * data_buf, int cntr);
READ_NAND(adr);
- nand write
功能:从 SDRAM 写数据到 nand flash 中。
函数调用关系如下(按先后顺序):
int
nand_rw (struct nand_chip* nand, int cmd,size_t start, size_t len, size_t *
retlen, u_char * buf); static int nand_write_ecc (struct nand_chip* nand,
size_t to, size_t len,
size_t *
retlen, const u_char * buf, u_char * ecc_code);
static
int nand_write_page (struct nand_chip *nand, int page, int col, int last,
u_char * ecc_code); WRITE_NAND(d , adr);
3.2.3 U-BOOT 支持 Nand Flash 命令移植说明
1. 设置配置选项
在 CONFIG_COMMANDS 中, 打开 CFG_CMD_NAND 选项.
#define CONFIG_COMMANDS \
(CONFIG_CMD_DFL
| \ CFG_CMD_CACHE | \ CFG_CMD_NAND |
\
/*CFG_CMD_EEPROM
|*/ \
/*CFG_CMD_I2C |*/
\
/*CFG_CMD_USB |*/ \
CFG_CMD_PING | \ CFG_CMD_REGINFO | \
CFG_CMD_DATE | \
CFG_CMD_ELF)
#if
(CONFIG_COMMANDS & CFG_CMD_NAND)
#define CFG_NAND_BASE 0x4E000000 /* Nand Flash 控制器在 SFR 区中起始寄存器地址 */
#define CFG_MAX_NAND_DEVICE
1 /* 支持的最在 Nand Flash 数据 */
#define SECTORSIZE 512 /* 1 页的大小 */
#define NAND_SECTOR_SIZE SECTORSIZE
#define NAND_BLOCK_MASK (NAND_SECTOR_SIZE – 1) /* 页掩码 */
#define ADDR_COLUMN 1 /* 一个字节的 Column
地址 */
#define ADDR_PAGE 3 /* 3 字节的页块地址, A9A25*/
#define ADDR_COLUMN_PAGE 4
/* 总共 4 字节的页块地址 */
#define
NAND_ChipID_UNKNOWN 0x00 /* 未知芯片的 ID 号 */
#define NAND_MAX_FLOORS 1
#define NAND_MAX_CHIPS 1
/* Nand Flash
命令层底层接口函数
*/
#define
WRITE_NAND_COMMAND(d, adr) do {rNFCMD = d;} while(0)
#define
WRITE_NAND_ADDRESS(d, adr) do {rNFADDR = d;} while(0)
#define WRITE_NAND(d, adr) do
{rNFDATA = d;} while(0)
#define READ_NAND(adr) (rNFDATA)
#define NAND_WAIT_READY(nand) {while(!(rNFSTAT&(1<<0)));}
#define
NAND_DISABLE_CE(nand) {rNFCONF |= (1<<11);}
#define
NAND_ENABLE_CE(nand) {rNFCONF &= ~(1<<11);}
/* 下面一组操作对 Nand Flash 无效 */
#define NAND_CTL_CLRALE(nandptr)
#define
NAND_CTL_SETALE(nandptr)
#define
NAND_CTL_CLRCLE(nandptr)
#define
NAND_CTL_SETCLE(nandptr)
/* 允许 Nand Flash 写校验 */
#define
CONFIG_MTD_NAND_VERIFY_WRITE 1
#endif /* CONFIG_COMMANDS & CFG_CMD_NAND*/
2. 加入自己的 Nand Flash 芯片型号
在 include/linux/mtd/
nand_ids.h 中的对如下结构体赋值进行修改: static struct
nand_flash_dev nand_flash_ids[] = {
......
{"Samsung
K9F1208U0B", NAND_MFR_SAMSUNG,
0x76, 26, 0, 4, 0x4000, 0},
.......
}
这样对于该款 Nand Flash 芯片的操作才能正确执行。
3. 编写自己的 Nand Flash 初始化函数 在 board/crane2410/crane2410.c 中加入 nand_init()函数. void nand_init(void)
{
/* 初始化
Nand Flash 控制器, 以及 Nand Flash 芯片 */ nand_reset();
/* 调用 nand_probe()来检测芯片类型 */
printf
("%4lu MB\n", nand_probe(CFG_NAND_BASE) >> 20);
}
该函数在启动时被 start_armboot()调用.
U-BOOT 对 Nand Flash 命令的支持的更多相关文章
- 在 U-BOOT 对 Nand Flash 的支持
1.1 U-BOOT 对从 Nand Flash 启动的支持 1.1.1 从 Nand Flash 启动 U-BOOT 的基本原理 1. 前 4K 的问题 如果 S3C2410 被配置成从 ...
- u-boot移植总结(三)(转)S3C2440对Nand Flash操作和电路原理(基于K9F2G08U0A)
S3C2440对Nand Flash操作和电路原理(基于K9F2G08U0A) 转载自:http://www.cnblogs.com/idle_man/archive/2010/12/23/19153 ...
- Samsung K9F1G08U0D SLC NAND FLASH简介(待整理)
Samsung K9F1G08U0D,数据存储容量为128M,采用块页式存储管理.8个I/O引脚充当数据.地址.命令的复用端口.详细:http://www.linux-mtd.infradead.o ...
- Tiny6410之NAND FLASH驱动
一.NAND FLASH的特点 S3C6410的NAND FLASH控制器有如下特点 1.自导入模式:复位后,引导代码被送入到8KB的STEPPINGSTONE中,引导代码移动完毕,引导代码将在STE ...
- S5PV210 NAND Flash
NAND Flash 关于NAND FlashS5PV210的NAND Flash控制器有如下特点:1) 支持512byte,2k,4k,8k的页大小2) 通过各种软件模式来进行NAND Flash的 ...
- JZ2440 裸机驱动 第8章 NAND Flash控制器
本章目标 了解NAND Flash 芯片的接口 掌握通过NAND Flash控制器访问NAND Flash的方法 8.1 NAND Flash介绍和NAND Flash控制器使用 NAND ...
- nand flash详解及驱动编写
https://www.crifan.com/files/doc/docbook/linux_nand_driver/release/html/linux_nand_driver.html#nand_ ...
- 四、NAND Flash
4.1 nand flash启动u-boot nand flash 启动的时候,CPU 需要将 nand flash 中前面 4KB 的内容复制到 SRAM 中执行,然后将 NAND Flash 中的 ...
- Nand flash code
(1)流水灯 1>我们来看原理图 2>datasheet 3> ...
随机推荐
- django简单实现短url
一.短url的原理 什么是短url: 简单讲就是把普通正常访问的网址,转换成比较短的网址,例如:https://www.cnblogs.com/angelyan/articles/10667354.h ...
- 2018-2019-2-20175323 java实验二《Java面向对象程序设计》
单元测试 1.在IDEA中新建项目并输入单元测试的代码 2.在IDEA中下载Junit,我发现Junit已经存在了 3.新建test文件 遇到的问题 发现Junit红字解析不了 解决办法:查找到jun ...
- NetBeans简介和简单使用
1.什么是NetBeans? NetBeans IDE:可以使开发人员利用Java平台能够快速创建Web.企业.桌面以及移动的应用程序: 支持语言:PHP.Ruby.JavaScript.Groovy ...
- 剑指offer——08斐波那契数列
题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0). n<=39 有多种方法,简单的循环.递归.动态规划: class Solutio ...
- 转:CSS盒模型
W3C 组织建议把所有网页上的对像都放在一个盒(box)中,设计师可以通过创建定义来控制这个盒的属性,这些对像包括段落.列表.标题.图片以及层.盒模型主 要定义四个区域:内容(content).边框距 ...
- python 17 异常
自 http://www.cnblogs.com/BeginMan/p/3171445.html 一.什么是错误,什么是异常,它们两者区别 这里解释如下:个人觉得很通俗易懂 错误是指在执行代码过程中发 ...
- 【CF516D】Drazil and Morning Exercise
题目 首先我们知道,在树上距离一个点最远的点一定是直径的两个端点之一 首先两遍\(\rm dfs\)把直径求出来,定义\(d(u)\)表示点\(u\)距离其最远点的距离,有了直径我们就能求出\(d\) ...
- Error creating bean with name 'unMblTotController': 注入失败
今天新来的小伙子,进公司做项目,然后自己新建了包,出了以下错误 y.UnsatisfiedDependencyException: Error creating bean with name 'unM ...
- vue解决sass-loader的版本过高导致的编译错误
Module build failed: TypeError: this.getResolve is not a function at Object.loader (E:\appEx\PreRese ...
- Win32SDK应用程序
转自:https://blog.csdn.net/jxf_ioriyagami/article/details/1486626 1 说在前面 由于VC6及MFC的特点,我们许多人从标准C++学习 ...