S3C2440移植uboot之支持NANDFLASH操作

S3C2440移植uboot之支持NANDFLASH操作上一节我们移植了uboot,S3C2440移植uboot之支持NORFLASH。这节我们继续移植,支持NANDFLASH。之前由于nand部分报错,直接注释了 u-boot-2012.04.01\include\configs\smdk2440.h中的#defineCONFIG_CMD_NAND。现在我们去掉注释,重新编译。报错如下是我们没有定义CONFIG_S3C2410导致的可以…

大家好,又见面了,我是你们的朋友全栈君。

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

移植Uboot其他文章链接:

S3C2440移植uboot之编译烧写uboot

S3C2440移植uboot之新建单板_时钟_SDRAM_串口

S3C2440移植uboot之启动过程概述

S3C2440移植uboot之支持NAND启动

S3C2440移植uboot之支持NORFLASH

S3C2440移植uboot之支持NANDFLASH操作

S3C2440移植uboot之支持DM9000

S3C2440移植uboot之裁剪和修改默认参数

S3C2440移植uboot之支持烧写yaffs映像及制作补丁

编译报错

  之前由于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网卡程序。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/136695.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • c语言入门教程–16字符串常见操作

    c语言入门教程–16字符串常见操作

    2021年3月12日
    145
  • RJ45 网线接口介绍

    RJ45接口通常用于数据传输,最常见的应用为网卡接口。  RJ45是各种不同接头的一种类型(例如:RJ11也是接头的一种类型,不过它是电话上用的);RJ45头根据线的排序不同,分为有两种,一种是橙白、橙、绿白、蓝、蓝白、绿、棕白、棕;另一种是绿白、绿、橙白、蓝、蓝白、橙、棕白、棕;因此使用RJ45接头的线也有两种即:直通线、交叉线。RJ45型网卡接口  10100basetxRJ

    2022年4月9日
    50
  • windows安装kafka教程

    windows安装kafka教程1、官网下载kafka【解压之后如图所示】2、修改zookeeper的配置文件dataDir=D:/zookeeper/datadataLogDir=D:/zookeeper/log3、启动zookeepercdD:\software\kafka\kafka_2.11-2.2.0\bin\windows在此目录下打开cmd,执行命令zookeeper-server…

    2022年10月16日
    0
  • pca算法matlab代码(单因素方差分析原理)

    PCA主成分分析原理分析和Matlab实现方法(三)PCA算法主要用于降维,就是将样本数据从高维空间投影到低维空间中,并尽可能的在低维空间中表示原始数据。PCA的几何意义可简单解释为:0维-PCA:将所有样本信息都投影到一个点,因此无法反应样本之间的差异;要想用一个点来尽可能的表示所有样本数据,则这个点必定是样本的均值。1维-PCA:相当于将所有样本信息向样本均值的直线投影;2维-PCA:将样本的平面分布看作椭圆形分布,求出椭圆形的长短轴方向,然后将样本信息投

    2022年4月15日
    49
  • 论坛提问智慧

    论坛提问智慧本文转载自http://bbs.weblogicfans.net/thread-3628-1-1.html.一、确定你自己无法解决该问题 首先你至少应该解决问题花费1个小时以上的时间,并最终确定自己无力解决。问题的解决并不能够完全依靠他人。二、查看论坛精华文章 你遇到的问题很有可能已经有文章详细的论述如何解决了,精华文章往往是大家最需要留心关注的地方。 三、使用

    2022年7月26日
    4
  • USB3.0接口定义浅析

    USB3.0接口定义浅析https://www.bilibili.com/read/cv372294数码4-11357阅读14点赞3评论USB谁都见过、用过,作为世界上最常见的接口之一,USB早就走进了我们的生活。那么USB的接口定义是怎样的呢?让我来简单分析一下。因为USB3.0包括USB2.0的引脚,USB3.1和3.0引脚相同,所以本文以USB3.0(即USB3.1Gen1)为例来讲解。USB3.1一…

    2022年5月9日
    48

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号