S3C2440移植uboot之支持NANDFLASH操作
上一节我们移植了uboot,S3C2440移植uboot之支持NORFLASH。这节我们继续移植,支持NANDFLASH。
编译报错
之前由于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网卡程序。
有任何问题,均可通过公告中的二维码联系我
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架