u-boot-2014.10移植第19天----添加nand flash命令支持(一)

今天继续移植nand flash,对于很多情况而言,u-boot从nand flash启动是一个至关重要的功能,毕竟NOR flash成本太高,不是所有开发板都会添加NOR flash。

u-boot中的SMDK2410模板是没有支持从nand flash启动的功能的,但是却有支持操作nand_flash的操作命令,2410和2440在nand flash支持上的区别有:

1、2410仅支持小块nandflash,2440则同时支持大块nandflash;
2、为支持大块nandflash,2440增加了许多寄存器;
3、2440增加了一个控制寄存器NFCONT,原2410中config寄存器NFCONF中的部分功能被转移到NFCONT;

添加2440的nand驱动文件

由易到难的原则,我们先完成nand flash操作命令支持。首先在驱动目录中加入基于2440的nand驱动文件,同样以2410的nand驱动文件为模板,如下:

u-boot-2014.10]$ cp drivers/mtd/nand/s3c2410_nand.c drivers/mtd/nand/s3c2440_nand.c

修改s3c2440_nand.c文件

并将s3c2440_nand.c文件中所有的2410改为2440。ps:如果你是vim用户可以用命令完成替换

:%s/2410/2440/g

修改NFCONF寄存器的操作代码:

#define S3C2440_NFCONF_nFCE        (1<<1)
#define S3C2440_NFCONF_TACLS(x)    ((x)<<12)
#define S3C2440_NFCONF_TWRPH0(x)   ((x)<<8)
#define S3C2440_NFCONF_TWRPH1(x)   ((x)<<4)
                               
#define S3C2440_ADDR_NALE 8
#define S3C2440_ADDR_NCLE 0x0c

在board_nand_init函数中:

#else
    tacls = 0;
    twrph0 = 1;
    twrph1 = 0;
#endif
    //cfg = S3C2440_NFCONF_EN;
    cfg = S3C2440_NFCONF_TACLS(tacls);
    cfg |= S3C2440_NFCONF_TWRPH0(twrph0);
    cfg |= S3C2440_NFCONF_TWRPH1(twrph1);
    writel(cfg, &nand_reg->nfconf);
    /* 初始化ECC、禁止片选、使能NAND FLASH控制器 */
    writel((1 << 4)|(1 << 1)|(1 << 0), &nand_reg->nfcont);

修改nand_base.c文件

在drivers/mtd/nand/nand_base.c文件中修改nand_select_chip函数:

case 0: /* 选中 */
        chip->cmd_ctrl(mtd, NAND_CMD_NONE, NAND_CTRL_CLE|NAND_CTRL_CHANGE);
        break;

在s3c2440_hwcontrol函数中:

        if (!(ctrl & NAND_ALE))
            IO_ADDR_W |= S3C2440_ADDR_NALE;

        if(cmd == NAND_CMD_NONE)
            IO_ADDR_W = (ulong)&nand->nfdata;
                               
        chip->IO_ADDR_W = (void *)IO_ADDR_W;
                               
        if (ctrl & NAND_NCE) /* 使能选中 */
            writel(readl(&nand->nfconf) & ~S3C2440_NFCONF_nFCE,
                   &nand->nfconf);        
        else /* 取消选中 */
            writel(readl(&nand->nfconf) | S3C2440_NFCONF_nFCE,
                   &nand->nfconf); 
    }

修改Makefile文件

同时将该文件加入驱动目录中的Makefile文件中:

obj-$(CONFIG_NAND_S3C2410) += s3c2410_nand.o
+ obj-$(CONFIG_NAND_S3C2440) += s3c2440_nand.o

修改tq2440.h文件

加入了驱动文件后,在tq2440.h(include/configs)文件中使能nandflash操作命令,首先在命令配置一栏中定义使能nand flash操作命令宏:

#define CONFIG_CMD_PING
+ #define CONFIG_CMD_NAND

我们的u-boot除了前面使能了ping命令功能外暂时还没有使能其他命令,在tq2440.h头文件中使能的一些事扩展的命令,一些基本命令时默认使能的,如cp和md命令。

再在nand flash配置一栏中做修改:

#ifdef CONFIG_CMD_NAND
+ #ifdef CONFIG_S3C2440
+ #define CONFIG_NAND_S3C2440
+ #define CONFIG_SYS_S3C2440_NAND_HWECC
+ #elif CONFIG_NAND_S3C2410
#define CONFIG_NAND_S3C2410
#define CONFIG_SYS_S3C2410_NAND_HWECC
+ #endif
#define CONFIG_SYS_MAX_NAND_DEVICE  1
#define CONFIG_SYS_NAND_BASE        0x4E000000
#endif

使能debug宏:

nand_base.c文件

编译,烧录运行:

明天继续

时间: 2024-10-25 05:45:47

u-boot-2014.10移植第19天----添加nand flash命令支持(一)的相关文章

u-boot-2014.10移植第21天----添加nand flash命令支持(三)

硬件平台:tq2440 开发环境:Ubuntu-3.11 u-boot版本:2014.10 本文允许转载,请注明出处:http://blog.csdn.net/fulinus 虽说nand flash读写操作是可以了,但是我使用nand markbad命令将一个块标记为坏块时,再用nand scrub命令恢复出厂设置时,却出现了下面的错误: nand0: MTD Erase failure: -5 说明我们的nand flash移植是不完全正确的. 下面查找原因 在文件drivers/mtd/n

u-boot-2014.10移植第20天----添加nand flash命令支持(二)

继前一天移植的情况,运行后发现: Flash: 2 MiBNAND:  0 MiB 说明Nand flash没有移植成功,在文件drivers/mtd/nand/s3c2440_nand.c 中发现board_nand_init函数中: nand->select_chip = NULL 选择芯片函数为NULL,我们在board_nand_init函数上面加上s3c2440_nand_select函数,代码如下: static void s3c2440_nand_select(struct mtd

u-boot-2014.10移植第22天----添加nand flash命令支持(四)

解决问题: nand0: MTD Erase failure: -5 drivers/mtd/nand/nand_bbt.c文件中初始化bbt /* * Allocate memory (2bit per block) and clear the memory bad block * table. */ this->bbt = kzalloc(len, GFP_KERNEL); if (!this->bbt) return -ENOMEM; 每个block用2个比特表示是否为坏块. nand_

u-boot-2014.10移植第17天----添加DM9000网卡支持(一)

很多读者的2440的板子应该都有DM9000网卡.在移植之前看看这几篇文档: DM9000中文手册(详细) 这篇文章告诉我们DM9000的一些硬件知识. DM9000和MINI2440深入理解 这篇文章告诉我们2440是如何实现对DM9000的访问. 2440 dm9000 到底咋确定地址 这篇文章告诉我们如何确定地址端口的地址和数据端口的地址. DM9000 datasheet datasheet上说dm9000有4K Dword(就是4K双字,即16Kbytes). DM9000网卡驱动位于

u-boot-2014.10移植第14天----在SDRAM中运行

昨天遇到编译错误,我们从错误提示中寻找解决方法: 信息1:CHK     include/config.h /* Automatically generated - do not edit */ #define CONFIG_BOARDDIR board/samsung/tq2440 #include <config_defaults.h> #include <configs/tq2440.h> #include <asm/config.h> #include <

u-boot-2014.10移植第3天----LED裸机程序

硬件平台:tq2440 开发环境:Ubuntu-3.11 u-boot版本:2014.10 本文允许转载,请注明出处:http://blog.csdn.net/fulinus 在移植u-boot之前我们先熟悉一下硬件,以及如何控制硬件: 情况一: 这个情况是你的开发板中有了可以运行的u-boot.因为裸机程序能运行的前提条件是系统初始化了. 下面led.S是一位高人写的代码,完全是用ARM汇编编写的,短小精悍,主要是实现跑马灯的功能: /*****************************

u-boot-2014.10移植第29天----nand flash的SPL启动(一)

硬件平台:tq2440 开发环境:Ubuntu-3.11 u-boot版本:2014.10 本文允许转载,请注明出处:http://blog.csdn.net/fulinus 前面在移植nand flash启动时做了很多探索性的工作,但是后来发现在relocate.S文件中调用的函数中有调用大部分的库函数,牵扯到的文件较多,很难将它们一一包含到前面4K空间中去.正在想其他方法时,突然意识到SPL功能.我初步了解了一下SPL的功能,简而言之是一个将u-boot从nand flash拷贝到SDRAM

“指付通”还是“支付痛”?-【软件和信息服务】2014.10

维权的最终目标是希望违规者得到惩处,从而推动行业规范,让"指付通"方便万户千家,永远不要变成用户的"支付痛". 2014年9月19日,阿里巴巴在美国纽交所成功上市,这是阿里巴巴的一个里程碑,也是中国互联网经济的一个里程碑.对于阿里巴巴的支付宝,大家赞誉有加,当然与之相关的各新型支付手段,包括指纹支付也甚嚣尘上 想阅读全文,请到http://www.qikan.com.cn/article/rxfw20141029.html. 注:本文已经发表在<软件和信息服务

u-boot-2014.10移植第25天----nand flash启动(三)

硬件平台:tq2440 开发环境:Ubuntu-3.11 u-boot版本:2014.10 本文允许转载,请注明出处:http://blog.csdn.net/fulinus 在实现u-boot从nand flash启动之前,我们将前面asm_led程序放在nand flash第一个块的前4Kbit之中,因为asm_led没有系统初始化功能,所以还需要将bootstrap程序,放在nand flash的0地址处.bootstrap初始化完2440后,跳转到asm_led程序去执行.这对于掌握从n