移植U-boot-2012.10到smdk6410(3)-nand驱动

上一个笔记中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的结构体也没有非常了解,以后有时间再单独理解这个结构内容。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值