上一节咱们移植了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,长度为2000nand write 30000000 0 2000        //将0x55写入nand,nand dump 0 2000        //打印

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

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

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

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