U-BOOT 对 Nand Flash 命令的支持

U-BOOT Nand Flash 命令的支持

在 U­BOOT 下对 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 主要数据结构介绍

  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:否 */

};

  1. 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 支持的命令函数说明

  1. nand info/nand device 功能:显示当前 nand flash 芯片信息。 函数调用关系如下(按先后顺序):

static void
nand_print(struct nand_chip *nand) ;

  1. nand erase 功能:擦除指定块上的数据。 函数调用关系如下(按先后顺序):

int
nand_erase(struct nand_chip* nand, size_t ofs, size_t len, int clean);

  1. nand bad

功能:显示坏块。 函数调用关系如下(按先后顺序):

static void
nand_print_bad(struct nand_chip* nand);

int check_block
(struct nand_chip *nand, unsigned long pos);

  1. 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);

  1. 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 字节的页块地址, A9­A25*/

#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()调用.

原文地址:https://www.cnblogs.com/fanweisheng/p/11106190.html

时间: 2024-10-16 08:35:53

U-BOOT 对 Nand Flash 命令的支持的相关文章

u-boot-2014.10移植第19天----添加nand flash命令支持(一)

今天继续移植nand flash,对于很多情况而言,u-boot从nand flash启动是一个至关重要的功能,毕竟NOR flash成本太高,不是所有开发板都会添加NOR flash. u-boot中的SMDK2410模板是没有支持从nand flash启动的功能的,但是却有支持操作nand_flash的操作命令,2410和2440在nand flash支持上的区别有: 1.2410仅支持小块nandflash,2440则同时支持大块nandflash:2.为支持大块nandflash,244

u-boot-2014.10移植第21天----添加nand flash命令支持(三)

硬件平台:tq2440 开发环境:Ubuntu-3.11 u-boot版本:2014.10 本文允许转载,请注明出处:http://blog.csdn.net/fulinus 虽说nand flash读写操作是可以了,但是我使用nand markbad命令将一个块标记为坏块时,再用nand scrub命令恢复出厂设置时,却出现了下面的错误: nand0: MTD Erase failure: -5 说明我们的nand flash移植是不完全正确的. 下面查找原因 在文件drivers/mtd/n

u-boot-2014.10移植第20天----添加nand flash命令支持(二)

继前一天移植的情况,运行后发现: Flash: 2 MiBNAND:  0 MiB 说明Nand flash没有移植成功,在文件drivers/mtd/nand/s3c2440_nand.c 中发现board_nand_init函数中: nand->select_chip = NULL 选择芯片函数为NULL,我们在board_nand_init函数上面加上s3c2440_nand_select函数,代码如下: static void s3c2440_nand_select(struct mtd

u-boot-2014.10移植第22天----添加nand flash命令支持(四)

解决问题: nand0: MTD Erase failure: -5 drivers/mtd/nand/nand_bbt.c文件中初始化bbt /* * Allocate memory (2bit per block) and clear the memory bad block * table. */ this->bbt = kzalloc(len, GFP_KERNEL); if (!this->bbt) return -ENOMEM; 每个block用2个比特表示是否为坏块. nand_

在 U-BOOT 对 Nand Flash 的支持

1.1    U-BOOT 对从 Nand Flash 启动的支持 1.1.1   从 Nand Flash 启动 U-BOOT 的基本原理 1. 前 4K 的问题 如果 S3C2410 被配置成从 Nand Flash 启动(配置由硬件工程师在电路板设置), S3C2410 的 Nand Flash 控制器 有一个特殊的功能, 在 S3C2410 上电后, Nand Flash 控制器会自动的把 Nand Flash 上的前 4K 数据搬移到 4K 内部 RAM 中, 并把 0x0000000

Nand Flash原理(二)

K9F2G08U0B的存储阵列 图 2-1 K9F2G08U0B的存储阵列 由图2-1,我们可以知道:K9F2G08U0B的一页为(2K+64)字节(2K 表示的是 main 区容量,64表示的是 spare 区容量),它的一块为 64 页,而整个设备包括了2048个块.这样算下来一共有 2112M 位容量,如果只算 main 区容量则有256M 字节(即 256M×8 位). 要实现用 8 个 IO 口来要访问这么大的容量,如图 2-1 所示:K9F2G08U0A 规定了用 5 个周期来实现.

NAND Flash操作技术详解

NAND Flash是构成固态存储的基本存储单元其采用IO的接口方式与控制器相连.控制器对NAND Flash进行操作时需要通过命令交互的方式对NAND Flash进行操作.下面对NAND Flash的操作进行解析可以发现在研发FTL的时候可以充分发掘NAND Flash提供的操作命令来优化读写性能.分析介绍的NAND Flash以Micron提供的MT29F16G08AA为蓝本.该芯片能够提供16Gb 的存储容量具体性能指标如下所示 Organization –     Page size:

Tiny6410之NAND FLASH驱动

一.NAND FLASH的特点 S3C6410的NAND FLASH控制器有如下特点 1.自导入模式:复位后,引导代码被送入到8KB的STEPPINGSTONE中,引导代码移动完毕,引导代码将在STEPPINGSTONE中执行.导入期间,NAND FLASH控制器不支持ECC矫正. 2.NAND FLSH 控制器I/F:支持512字节和2KB页 3.软件模式:用户可以直接访问nand flash 控制器,该特性可以用于读/檫/编程nand flash 存储器. 1)写命令寄存器=NAND FLA

【详解】如何编写Linux下Nand Flash驱动

From: http://www.crifan.com/files/doc/docbook/linux_nand_driver/release/html/linux_nand_driver.html 版本:v2.2 Crifan Li 摘要 本文先解释了Nand Flash相关的一些名词,再从Flash硬件机制开始,介绍到Nand Flash的常见的物理特性,且深入介绍了Nand Flash的一些高级功能,然后开始介绍Linux下面和Nand Flash相关的软件架构MTD的相关知识,最后介绍了