上一个笔记中Uboot已经正常的从SDRAM中启动,后续的工作的是给u-boot添加Nand驱动。
1.修改/include/configs/smdk6410.h,填写正确的nand信息。
/* NAND chip page size */
#define CONFIG_SYS_NAND_PAGE_SIZE 4096//2048
/* NAND chip block size */
#define CONFIG_SYS_NAND_BLOCK_SIZE (512 * 1024)//128
/* NAND chip page per block count */
#define CONFIG_SYS_NAND_PAGE_COUNT 128//64
2.修改/drivers/mtd/nand/nand_ids.c
{"NAND 2GiB 3,3V 8-bit", 0xD5, 0, 2048, 0, LP_OPTIONS}改为:
{"NAND 2GiB 3,3V 8-bit", 0xD5, 4096, 2048, 512*1024, LP_OPTIONS}
3.修改/drivers/mtd/nand/nand_base.c
之前的程序启动后有一个对应的错误No oob scheme defined for oobsize 218
因此在该文件添加
static struct nand_ecclayout nand_oob_218 = {
.eccbytes = 104,
.eccpos = {
24,25,26,27,28,29,30,31,32,33,
34,35,36,37,38,39,40,41,42,43,
44,45,46,47,48,49,50,51,52,53,
54,55,56,57,58,59,60,61,62,63,
64,65,66,67,68,69,70,71,72,73,
74,75,76,77,78,79,80,81,82,83,
84,85,86,87,88,89,90,91,92,93,
94,95,96,97,98,99,100,101,102,103,
104,105,106,107,108,109,110,111,112,113,
114,115,116,117,118,119,120,121,122,123,
124,125,126,127},
.oobfree =
{
{.offset = 2,
.length = 22
}
}
};
这里说明一下nand_ecclayout结构体
其中,.eccbytes = 40,跟初始化有关系,我们一般这样初始化:
nand->ecc.size = 512;
nand->ecc.bytes = 10;
每512个字节产生10个ecc字节,因此对4kbyte页面的flash来说,一页就是8个512,因此需要8*10=80个ecc字节。
.eccpos就是告诉驱动,这些ecc字节放在哪里,一般是按顺序存放,不要覆盖芯片默认的坏块标记位,对2kbyte的flash来说,厂家说是前两个即第0、1个字节是坏块标志。
所以分配为eccbytes和eccpos后,后面有个oobfree,这样看来也很明白了:
offset=2表示从第2个字节开始(因为前面2个是坏块标志啊~~),length=22表示(从offset开始)共22个ecc字节可以用户随便用。
这下一目了然了吧。
在上面这个文件中找到nand_scan_tail()函数,增加:
case 218:
chip->ecc.layout = &nand_oob_218;
break;
修改后运行起来测试NAND 的读写看看是否正常:
Hit any key to stop autoboot: 0
SMDK6410 # dnw 50008000
Insert a 218OTG cable into the connector!
OTG cable Connected!
Now, Waiting for DNW to transmit data
Download Done!! Download Address: 0x50008000, Download Filesize:0x401f0
Checksum is being calculated.
Checksum O.K.
SMDK6410 #
至此只是通过内存运行uboot,nand的驱动正常了,到时其实与nand启动还没有多大的关系。其中nand_ecclayout的结构体也没有非常了解,以后有时间再单独理解这个结构内容。