码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2014-12-31 20:11:13      阅读:217      评论:0      收藏:0      [点我收藏+]

标签:u-boot   2014.10   arm   2440   移植   

今天继续移植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,2440增加了许多寄存器;
3、2440增加了一个控制寄存器NFCONT,原2410中config寄存器NFCONF中的部分功能被转移到NFCONT;

添加2440的nand驱动文件

由易到难的原则,我们先完成nand flash操作命令支持。首先在驱动目录中加入基于2440的nand驱动文件,同样以2410的nand驱动文件为模板,如下:

u-boot-2014.10]$ cp drivers/mtd/nand/s3c2410_nand.c drivers/mtd/nand/s3c2440_nand.c

修改s3c2440_nand.c文件

并将s3c2440_nand.c文件中所有的2410改为2440ps:如果你是vim用户可以用命令完成替换

:%s/2410/2440/g

修改NFCONF寄存器的操作代码:

#define S3C2440_NFCONF_nFCE        (1<<1)
#define S3C2440_NFCONF_TACLS(x)    ((x)<<12)
#define S3C2440_NFCONF_TWRPH0(x)   ((x)<<8)
#define S3C2440_NFCONF_TWRPH1(x)   ((x)<<4)
                               
#define S3C2440_ADDR_NALE 8
#define S3C2440_ADDR_NCLE 0x0c


在board_nand_init函数中:

#else
    tacls = 0;
    twrph0 = 1;
    twrph1 = 0;
#endif
    //cfg = S3C2440_NFCONF_EN;
    cfg = S3C2440_NFCONF_TACLS(tacls);
    cfg |= S3C2440_NFCONF_TWRPH0(twrph0);
    cfg |= S3C2440_NFCONF_TWRPH1(twrph1);
    writel(cfg, &nand_reg->nfconf);
    /* 初始化ECC、禁止片选、使能NAND FLASH控制器 */
    writel((1 << 4)|(1 << 1)|(1 << 0), &nand_reg->nfcont);


修改nand_base.c文件

在drivers/mtd/nand/nand_base.c文件中修改nand_select_chip函数:

case 0: /* 选中 */
        chip->cmd_ctrl(mtd, NAND_CMD_NONE, NAND_CTRL_CLE|NAND_CTRL_CHANGE);
        break;

在s3c2440_hwcontrol函数中:

        if (!(ctrl & NAND_ALE))
            IO_ADDR_W |= S3C2440_ADDR_NALE;

        if(cmd == NAND_CMD_NONE)
            IO_ADDR_W = (ulong)&nand->nfdata;
                               
        chip->IO_ADDR_W = (void *)IO_ADDR_W;
                               
        if (ctrl & NAND_NCE) /* 使能选中 */
            writel(readl(&nand->nfconf) & ~S3C2440_NFCONF_nFCE,
                   &nand->nfconf);        
        else /* 取消选中 */
            writel(readl(&nand->nfconf) | S3C2440_NFCONF_nFCE,
                   &nand->nfconf); 
    }


修改Makefile文件

同时将该文件加入驱动目录中的Makefile文件中:

obj-$(CONFIG_NAND_S3C2410) += s3c2410_nand.o
+ obj-$(CONFIG_NAND_S3C2440) += s3c2440_nand.o

修改tq2440.h文件

加入了驱动文件后,在tq2440.h(include/configs)文件中使能nandflash操作命令,首先在命令配置一栏中定义使能nand flash操作命令宏:

#define CONFIG_CMD_PING
+ #define CONFIG_CMD_NAND
我们的u-boot除了前面使能了ping命令功能外暂时还没有使能其他命令,在tq2440.h头文件中使能的一些事扩展的命令,一些基本命令时默认使能的,如cp和md命令。

再在nand flash配置一栏中做修改:

#ifdef CONFIG_CMD_NAND
+ #ifdef CONFIG_S3C2440
+ #define CONFIG_NAND_S3C2440
+ #define CONFIG_SYS_S3C2440_NAND_HWECC
+ #elif CONFIG_NAND_S3C2410
#define CONFIG_NAND_S3C2410
#define CONFIG_SYS_S3C2410_NAND_HWECC
+ #endif
#define CONFIG_SYS_MAX_NAND_DEVICE  1
#define CONFIG_SYS_NAND_BASE        0x4E000000
#endif
使能debug宏:

nand_base.c文件

编译,烧录运行:



明天继续

 

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

标签:u-boot   2014.10   arm   2440   移植   

原文地址:http://blog.csdn.net/fulinus/article/details/41172493

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!