先给自己打个广告,本人的微信公众号正式上线了,搜索:张笑生的地盘,主要关注嵌入式软件开发,股票基金定投,足球等等,希望大家多多关注,有问题可以直接留言给我,一定尽心尽力回答大家的问题
本文主要实现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