移植新版本u-boot之五--- 支持nand flash

先给自己打个广告,本人的微信公众号正式上线了,搜索:张笑生的地盘,主要关注嵌入式软件开发,股票基金定投,足球等等,希望大家多多关注,有问题可以直接留言给我,一定尽心尽力回答大家的问题
在这里插入图片描述

本文主要实现nand flash,虽然之前我们的移植过程中能够从nand flash启动,但是并不表示uboot启动之后,可以支持nand flash的读写操作等等。

a. 修改文件,支持nand flash

修改 include/configs/smdk2440.h : #define CONFIG_CMD_NAND

b. 把drivers\mtd\nand\s3c2410_nand.c 复制为 s3c2440_nand.c,同时将还个文件中使用s3c2410的结构体改为使用s3c2440的结构体,并修改这个目录下的Makefile,编译的时候链接 s3c2440_nand.o

COBJS-$(CONFIG_NAND_S3C2440) += s3c2440_nand.o

c. 修改include/configs/smdk2440.h,如下

    #ifdef CONFIG_CMD_NAND

    #ifdef CONFIG_S3C2410
        #define CONFIG_NAND_S3C2410
        #define CONFIG_SYS_S3C2410_NAND_HWECC
    #else
        #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

d. 修改\drivers\mtd\nand\s3c2410_nand.c中的函数borad_nand_init

    #if 0   /* 这部分配置适用于s3c2410,不适用于s3c2440 */
	cfg = S3C2410_NFCONF_EN;
	cfg |= S3C2410_NFCONF_TACLS(tacls - 1);
	cfg |= S3C2410_NFCONF_TWRPH0(twrph0 - 1);
	cfg |= S3C2410_NFCONF_TWRPH1(twrph1 - 1);
    #endif
	/* 初始化时序 */
	cfg = ((tacls-1)<<12)|((twrph0-1)<<8)|((twrph1-1)<<4);	
	writel(cfg, &nand_reg->nfconf);

	/* 使能NAND   Flash控制器,初始化ECC */
	writel((1<<4)|(1<<1)|(1<<0), &nand_reg->nfcont);

e. 使能选中,修改\drivers\mtd\nand\s3c2410_nand.c中的函数s3c2440_nand_select

    case -1:    /* 取消选中 */
		nand->nfcont |= (1<<1);
		break;
	case 0:     /* 选中 */
		nand->nfcont &= ~(1<<1);
		break;

f. 修改\drivers\mtd\nand\s3c2410_nand.c中的函数 s3c2440_hwcontrol

    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();

        if (ctrl & NAND_CLE)
        {
            /* 发命令 */
            writeb(dat, &nand->nfcmd);
        }
        else if (ctrl & NAND_ALE)
        {
            /* 发地址 */
            writeb(dat, &nand->nfaddr);
        }
    }

g. 编译make,如果编译有问题,解决第一个出现的错误
h. 烧写到nor flash,在超级终端中输入如下命令

    1. loady 30000000
    2. protect off all
    3. erase 0 7ffff
    4. cp.b 30000000 0 80000

此时发现打印中已经正确识别出nand flash大小了,说明移植成功
在这里插入图片描述
i. 最后介绍一下linux下面对nand flash的初始化启动操作流程
(1)nand协议层, 知道发出什么命令
(2)单板相关层,知道怎么发,选中/取消片选,发命令,发地址,读写数据,判断状态
框架如下所示

nand_init
     nand_init_chip
         board_nand_init
             设置nand_chip结构体,提供底层的操作函数
         nand_scan
             nand_set_defaults
                 chip->select_chip = s3c2440_select_chip
             nand_get_flash_type
                 chip->cmdfunc(mtd, NAND_CMD_RESET, -1, -1)
                     nand_command
                         chip->cmd_ctrl
                             s3c2440_hwcontrol
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值