转载请注明出处:http://blog.csdn.net/wang_zheng_kai
七、如何调试新的NAND FLASH芯片
调试新的NAND FLASH芯片步骤如下:
一、驱动程序的修改,例如:jz4780_nand.c中的修改
(1)加入NAND flash 名称和 Nand flash 设备id
在 *******************************************************
* NAND flash chip name & ID
*******************************************************
加入NAND flash 名称 和 Nand flash 设备id
例如:
#defineNAND_FLASH_MT29F32G08CBACAWP_NAME "MT29F32G08CBACAWP“
#defineNAND_FLASH_MT29F32G08CBACAWP_ID 0x68
(2)加入 NAND flash 匹配信息(这里用的是重载)
在 *******************************************************
* Supported NAND flash chips
*******************************************************
中builtin_nand_flash_table[]加入 NAND flash匹配信息
例如:
{ NAND_FLASH_MT29F32G08CBACAWP_NAME,NAND_FLASH_MT29F32G08CBACAWP_ID, 0,4096, 0, LP_OPTIONS },
(3)加入NAND flash 芯片信息
在 *******************************************************
* Supported NAND flash chips
*******************************************************
中加入NAND flash芯片信息
例如:
{ /*
* Datasheet of MT29F32G08CBACA, Rev-E, P109,Table-17
* ECC : 24bit/1080bytes
*/ COMMON_NAND_CHIP_INFO(NAND_FLASH_MT29F32G08CBACA3W_NAME,NAND_MFR_MICRON, NAND_FLASH_MT29F32G08CBACA3W_ID,1024, 24, 0,
10,5, 10, 5, 15, 5, 7, 5, 10, 7,
20, 20, 70, 200, 100, 60, 200,10, 20, 0, 100,
100, 100 *1000, 0, 0, 0, 5, BUS_WIDTH_8,
NAND_OUTPUT_NORMAL_DRIVER, NAND_RB_DOWN_FULL_DRIVER,
micron_nand_pre_init)
},
其中包含了针对特定Nandflash的:
.ECC 强度
.时序信息
.驱动力调整
.预初始化函数
更具体的定义请参考arch/mips/xburst/soc-4780/include/mach/jz4780_nand.h
(4)修改于预始化函数
根据目标芯片的芯片手册,配置Timing mode 、Programmable output drive strength以及ProgrammableRB# pull-down strength等等。
例如:
根据MT29F32G08CBCAC手册中的ConfigurationOperations
在函数micron_nand_pre_init(structjz4780_nand *nand)中进行相关配置
二、修改mtd/nand/nand_ids.c文件
定义了两个全局类型的结构体:
structnand_flash_devnand_flash_ids[ ]
structnand_manufacturersnand_manuf_ids[ ]
其中前者定义了一些NAND芯片的类型,后者定义了NAND芯片的几个厂商。NAND芯片的ID至少包含两项内容:厂商ID和厂商为自己的NAND芯片定义的芯片ID。
当NAND驱动被加载的时候,它会去读取具体NAND芯片的ID,然后根据读取的内容到上述定义的nand_manuf_ids[ ]和nand_flash_ids[ ]两个结构体中去查找,以此判断该NAND芯片是那个厂商的产品,以及该NAND芯片的类型。若查找不到,则NAND驱动就会加载失败,因此在开发NAND驱动前必须事先将你的NAND芯片添加到这两个结构体中去(其实这两个结构体中已经定义了市场上绝大多数的NAND芯片,所以除非你的NAND芯片实在比较特殊,否则一般不需要额外添加)。
例如:
nand_manuf_ids[]
{NAND_MFR_MICRON, "Micron"},
nand_flash_ids[]
{"NAND 4GiB 3,3V 8-bit",0x68, 0,4096, 0, LP_OPTIONS},
三、对bootloader中相关文件的修改
(1)在bootable/bootloader/xboot/boot/nand/nand_ids.c中添加相应的nand的相关信息,这里以MT29F32G08为例:
{"MICRON_MT29F32G08CBADAWP",0x2C44, 0x00A94B44, 2, 1, 10, 5, 15, 15, 100, 60, 200, 20, 100, 70, 0, 8192,2048*1024, 744, 3, 74, 2128, 1024, 40,8, 0, MICRON_NAND, 0x03, 0x02, 0x01, 0x00, 0x04},
以上关于nand的信息,包括id,extid,plane的个数,页大小,块大小,冗余区大小,采用多少位的ecc,以及对应的几个时间参数都要按照芯片手册上的说明进行填写,这样才可以进行nand的读取写入等操作
(2)在bootable/bootloader/xboot/include/asm/jz_mem_nand_configs/目录下添加新增nand对应的头文件:NAND_MT29F32G08CBACA.h,内容如下:
#ifndef __NAND_CONFIG_H#define__NAND_CONFIG_H
/* * *This file contains the nand configuration parameters for thecygnusboard. * */
/*-----------------------------------------------------------------------
* * NAND FLASH configuration * */
#define CONFIG_NAND_K9GAG08U0D#defineCFG_NAND_BCH_BIT 24 /*Speif () {
y the hardware BCH algorithm for nand(4|8) */
#define CFG_NAND_BW8 1 /* Data bus width: 0-16bit, 1-8bit */
#define CFG_NAND_PAGE_SIZE 4096
#define CFG_NAND_OOB_SIZE 224 /* Size of OOB space per page (e.g. 64 128 etc.) */
#define CFG_NAND_ROW_CYCLE 3
#define CFG_NAND_BLOCK_SIZE (1024 << 10) /* NAND chip block size*/
#define CFG_NAND_BADBLOCK_PAGE 0 /* NAND bad block was marked at this page in a block, starting from 0 */
#define CFG_NAND_TOTAL_BLOCKS (1024*4) /*4Gnand*/
#define X_DELAY_TRR 20
#define X_DELAY_TADL 70
#define X_DELAY_TWHR 60
#endif /* __NAND_CONFIG_H */~
这里同样要正确设置nand的相关信息,比如ecc是多少位,页大小,块大小,冗余区大小等,如果这里设置的不对,在启动时候会出错。
(3)在bootable/bootloader/xboot/include/configs/grus.h中包含新加的头文件:#include“asm/jz_mem_nand_configs/NAND_MT29F32G08CBACA.h”