S3C2440移植uboot之支持NANDFLASH操作

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

编译报错

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

有任何疑问,点击我的头像可以在主页的个人介绍中找到我的联系方式,欢迎一起交流学习

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容