乐趣区

关于c:S3C2440移植uboot之支持NANDFLASH操作

  上一节咱们移植了 uboot,S3C2440 移植 uboot 之反对 NORFLASH。这节咱们持续移植,反对 NANDFLASH。
@[TOC]

编译报错

  之前因为 nand 局部报错,间接正文了 u-boot-
2012.04.01\include\configs\smdk2440.h 中的 #define CONFIG_CMD_NAND。当初咱们去掉正文,从新编译。报错如下

  咱们没有定义 CONFIG_S3C2410 导致的

  能够看到上面有 2440 的 NAND 构造体

拷贝 s3c2410_nand.c,批改宏定义反对 SC32440

  所以咱们能够拷贝一份 s3c2410_nand.c 给 2440 应用 2410 的 NandFlash 位于 drivers/mtd/nand/s3c2410_nand.c, 首先复制 s3c2410_nand.c, 改为 s3c2440_nand.c, 改 Makefile, 如下图所示:

  在上一章剖析过 CONFIG_NAND_S3C2410 宏, 位于 include/configs/smdk2440.h:

  如上图所示, 其中 CONFIG_CMD_NAND 宏: 示意 uboot 是否反对 nand, 在上章里, 咱们把它屏蔽了, 接下来便勾销屏蔽 CONFIG_CMD_NAND 宏。
持续增加对 CONFIG_NAND_S3C2440 宏的反对, 将:

#ifdef CONFIG_CMD_NAND
#define CONFIG_NAND_S3C2410
#define CONFIG_SYS_S3C2410_NAND_HWECC
#define CONFIG_SYS_MAX_NAND_DEVICE  1
#define CONFIG_SYS_NAND_BASE              0x4E000000
#endif

改为

#ifdef CONFIG_CMD_NAND

 
#ifdef CONFIG_S3C2410          
#define CONFIG_NAND_S3C2410
#define CONFIG_SYS_S3C2410_NAND_HWECC
#else                                                                   // CONFIG_S3C2440      
#define CONFIG_NAND_S3C2440    
#define CONFIG_SYS_S3C2440_NAND_HWECC
#endif

#define CONFIG_SYS_MAX_NAND_DEVICE      1
#define CONFIG_SYS_NAND_BASE            0x4E000000
#endif

  因为 smdk2410.h 中定义的是 CONFIG_S3C2410, 而 smdk2440.h 中定义的是 CONFIG_S3C2440, 所以便会依据下面的 #ifdef 来动静定义宏

批改 s3c2440_nand.c 中的 NFCONF,NFCONT,反对 S3C2440

  往下看代码发现原来的 NFCONF 设置并不能匹配咱们的 2440


  2440 的 NFCONF 的 15 位是保留的

  所以正文掉这部分代码

  2410 NFCONF 的其余位设置也不匹配咱们的 2440

  2440NFCONF 时序参数设置

  s3c2440_hwcontrol 中使能选中

  对照 2440 手册批改为反对 2440 的

  批改为

/*2440 的 NAND 时序设置 */
    cfg = ((tacls-1)<<12)|((twrph0-1)<<8)|((twrph1-1)<<4);

    nand_reg->nfcont=(1<<1)|(1<<0); // bit1: 敞开片选 (),       bit0: 开启 nand flash 控制器
    nand_reg->nfconf = (tacls<<12) | (twrph0<<8) | (twrph1<<4); // 设置时序

    writel(cfg, &nand_reg->nfconf);
    /* 使能 NAND Flash 控制器, 初始化 ECC, 禁止片选 */
    writel((1<<4)|(1<<1)|(1<<0), &nand_reg->nfcont);
    
    /* initialize nand_chip data structure */
    nand->IO_ADDR_R= (void *)&nand_reg->nfdata;
    nand->IO_ADDR_W = (void *)&nand_reg->nfdata;

    nand->select_chip = s3c2440_select_chip;             // 设置 CE ;

批改 s3c2440_hwcontrol 辨别命令和地址

/*ctrl: 示意做什么,选中芯片 / 勾销选中,发命令还是发地址
* cmd : 命令值或者地址值
*/
static void s3c2440_hwcontrol(struct mtd_info *mtd, int dat, unsigned int ctrl)
{
    struct nand_chip *chip = mtd->priv;        
    struct s3c2440_nand *nand = s3c2440_get_base_nand();   // 获取 nand 寄存器地址
     
    if (ctrl & NAND_CLE)  
         // 传输的是命令    
       writeb(dat,&nand->nfcmd);  
    else if (ctrl & NAND_ALE)     
         // 传输的是地址
       writeb(dat,&nand->nfaddr);  
}

  批改实现

增加选中芯片函数

  批改选中芯片函数

nand->select_chip = NULL;             // 设置 CE ;

  改为

nand->select_chip = s3c2440_select_chip;             // 设置 CE ;

  选中芯片函数如下

static void s3c2440_select_chip(struct mtd_info *mtd, int chipnr)
{struct s3c2440_nand *nand = s3c2440_get_base_nand();

    switch (chipnr) {
    case -1:
        /* 勾销选中 */
        nand->nfcont |=(1<<1);
        break;
    case 0:
        /* 选中 */
        nand->nfcont &=~(1<<1);
        break;

    default:
        BUG();}
}

  编译烧写
  如下图所示, 能够看到已反对 Nand Flash:

  试验 nand 是否能读写:

nand erase 0 2000                      // 擦除
mw.b 30000000 0x55 2000               // 向 30000000 写入 0x55,长度为 2000
nand write 30000000 0 2000        // 将 0x55 写入 nand,
nand dump 0 2000        // 打印 

  如下图所示, 能够看到读写 nand 都没问题

  下一节 S3C2440 移植 uboot 之反对 DM9000 咱们将移植 DM9000 网卡程序。

如遇到排版错乱的问题,能够通过以下链接拜访我的 CSDN。

**CSDN:[CSDN 搜寻“嵌入式与 Linux 那些事”]

退出移动版