前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >S3C2440移植uboot之支持NANDFLASH操作

S3C2440移植uboot之支持NANDFLASH操作

作者头像
嵌入式与Linux那些事
发布2021-05-20 10:34:32
6720
发布2021-05-20 10:34:32
举报

编译报错

  之前由于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宏的支持,将:

代码语言:javascript
复制
#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

改为

代码语言:javascript
复制
#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的

在这里插入图片描述
在这里插入图片描述

  修改为

代码语言:javascript
复制
/*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区分命令和地址

代码语言:javascript
复制
/*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);  
}

  修改完成

添加选中芯片函数

  修改选中芯片函数

代码语言:javascript
复制
nand->select_chip = NULL;             //设置CE ;

  改为

代码语言:javascript
复制
nand->select_chip = s3c2440_select_chip;             //设置CE ;

  选中芯片函数如下

代码语言:javascript
复制
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是否能读写:

代码语言:javascript
复制
nand erase 0 2000                      //擦除
mw.b 30000000 0x55 2000               //向30000000 写入0x55,长度为2000
nand write 30000000 0 2000        //将0x55写入nand,
nand dump 0 2000        //打印

  如下图所示, 可以看到读写nand都没问题

在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-04-28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 编译报错
  • 拷贝s3c2410_nand.c,修改宏定义支持SC32440
  • 修改s3c2440_nand.c 中的NFCONF,NFCONT,支持S3C2440
  • 修改s3c2440_hwcontrol区分命令和地址
  • 添加选中芯片函数
相关产品与服务
命令行工具
腾讯云命令行工具 TCCLI 是管理腾讯云资源的统一工具。使用腾讯云命令行工具,您可以快速调用腾讯云 API 来管理您的腾讯云资源。此外,您还可以基于腾讯云的命令行工具来做自动化和脚本处理,以更多样的方式进行组合和重用。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档