• S3C2440移植uboot之支持NANDFLASH操作


      上一节我们移植了uboot,S3C2440移植uboot之支持NORFLASH。这节我们继续移植,支持NANDFLASH。

    编译报错

      之前由于nand部分报错,直接注释了 u-boot-
    2012.04.01includeconfigssmdk2440.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网卡程序。

    有任何问题,均可通过公告中的二维码联系我

  • 相关阅读:
    CUDA实例练习(十二):矩阵相乘
    CUDA实例练习(十一):零拷贝内存
    CUDA实例练习(十):多个cuda流
    CUDA实例练习(九):页锁定主机内存
    CUDA实例练习(八):原子操作(直方图)
    算法实例(三):快速排序
    算法实例(二):冒泡排序
    算法实例(一):简单桶排序
    CUDA实例练习(七):点积运算
    CUDA实例练习(六):矢量求和
  • 原文地址:https://www.cnblogs.com/dongxb/p/14193360.html
Copyright © 2020-2023  润新知