上一节我们移植了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网卡程序。

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

S3C2440移植uboot之支持NANDFLASH操作的更多相关文章

  1. 1.ok6410移植bootloader,移植u-boot,学习u-boot命令

    ok6410移植u-boot 既然是移植u-boot当然首先需要u-boot源码,这里的u-boot代码是由国嵌提供的. 一.配置编译u-boot A. 解压 u-boot 压缩文件 B. 进入解压生 ...

  2. 04.移植u-boot

    1.读readme获取信息    1.1 由Building the Software可知,需修改顶层makefile,指定架构和编译器    ifeq ($(HOSTARCH),$(ARCH))   ...

  3. Linux主机上使用交叉编译移植u-boot到树莓派

    0环境 Linux主机OS:Ubuntu14.04 64位,运行在wmware workstation 10虚拟机 树莓派版本:raspberry pi 2 B型. 树莓派OS: Debian Jes ...

  4. S5PV210之Sate210-F DIY硬件,移植uboot,kernel,android 活动现在已经进入实施阶段吗,欢迎广大网友参与 !

    大家一起来diy 超低价四核的exynos4412或者Cortex A8S5pv210开源开发板 商业版Sate210已经完成了好久了.Sate4412 也已经出来.但是这两个接口非常全,主要是针对企 ...

  5. 3.移植uboot-使板卡支持nor、nand

    在上一章,我们添加了nor,nand启动后,uboot启动出如下图所示: 上面的Flash: *** failed *** 是属于uboot第二阶段函数board_init_r()里的代码, 代码如下 ...

  6. 移植U-Boot时遇到的问题

    1. 在lowlevel_init过程中,本来想实现一个串口直接打印字符串的过程,编译的时候出现了问题,说是发现代码执行段没有对齐:“unaligned opcodes detected in exe ...

  7. 基于S3C2440的U-BOOT的start.S分析

    基于S3C2440的U-BOOT的start.S分析 在了解了ARM相关的汇编指令后,同时结合网上各位大虾的提点开始阅读u-boot的启动代码,现将分析过程记录如下 可执行文件及内存映射 我们可以把可 ...

  8. mini2440移植uboot 2014.04(一)

    最新版的uboot添加了很多新功能,我决定在最新版代码基础上重新移植一遍加深理解. 我修改的代码已经上传到github上,地址:https://github.com/qiaoyuguo/u-boot- ...

  9. mini2440移植uboot 2014.04(二)

    我修改的代码已经上传到github上,地址:https://github.com/qiaoyuguo/u-boot-2014.04-mini2440.git 参考文章: <u-boot-2011 ...

  10. mini2440移植uboot 2014.04(三)

    我修改的代码已经上传到github上,地址:https://github.com/qiaoyuguo/u-boot-2014.04-mini2440.git 参考文档: s3c2440手册(下载地址) ...

随机推荐

  1. VO、DTO、Entity的区别

    只能说从实际用法的一般习惯上进行区分: 1.entity 里的每一个字段,与数据库相对应,注意:entity与对应的实际数据库表的字段 没有强制要求但是一般建议保持一致(包括字段数据类型),当然,从实 ...

  2. springMVC特点与优势

    1 SpringMVC和Struts2的优略分析 (面试) 共同点: 它们都是表现层框架,都是基于MVC模型编写的. 它们的底层都离不开原始ServletAPI(HttpServletRequest. ...

  3. vivo 容器平台资源运营实践

    作者:vivo 互联网服务器团队 - Chen Han 容器平台针对业务资源申请值偏大的运营问题,通过静态超卖和动态超卖两种技术方案,使业务资源申请值趋于合理化,提高平台资源装箱率和资源利用率. 一. ...

  4. MacOS Sonoma14.2.1系统SSH免密登录

    摘要:MacOS下免密登录的一些注意事项. 系统环境 操作系统:macOS Sonoma 14.2.1 SSH免密登录 ssh免密登录的原理是在本机生成本机的ssh公钥和私钥,将公钥上传至待连接的主机 ...

  5. 春秋云镜 - CVE-2022-28512

    Fantastic Blog (CMS)是一个绝对出色的博客/文章网络内容管理系统.它使您可以轻松地管理您的网站或博客,它为您提供了广泛的功能来定制您的博客以满足您的需求.它具有强大的功能,您无需接触 ...

  6. OpenGL纹理转换谜团:纹理写入FRAMEBUFFER后的镜像现象

    在OpenGL中,最近将一个 GL_TEXTURE_2D 纹理写入到 GL_FRAMEBUFFER ,然后从GL_FRAMEBUFFER读取为GL_TEXTURE_2D纹理后,发现GL_TEXTURE ...

  7. Python——第四章:函数的递归调用

    递归:  函数自己调用自己 递归如果没有任何东西拦截的话. 它默认就是一个死循环 def func() func() func() 因此递归调用的时候需要有判断,来退出循环 def func() if ...

  8. MySQL篇:bug1_navicat添加外键保存后不起作用(消失)

    问题 在Nacicat premium中添加外键一保存就消失 用SQL语句也显示创建成功,没有报错,可是在INSERT中又起不到约束作用 解决办法 参考一下资料发现可能是表的类型不支持外键 要在 My ...

  9. 云图说|新一代Serverless应用托管引擎——CAE

    本文分享自华为云社区<云图说|新一代Serverless应用托管引擎--CAE>,作者:阅识风云. 开发运营一个应用软件,面临种种挑战:软件栈厚重.开发上线慢.资源易浪费.运维投入高.突发 ...

  10. 优化了MYSQL大量写入问题,老板奖励了1000块给我

    摘要:大家提到Mysql的性能优化都是注重于优化sql以及索引来提升查询性能,大多数产品或者网站面临的更多的高并发数据读取问题.然而在大量写入数据场景该如何优化呢? 今天这里主要给大家介绍,在有大量写 ...