这篇进行移植第二步,支持NAND FLASH的读写,我的板子的NAND FLASH是K9F1G08U0A,128M 8BIT。
1.去掉对NOR FLASH的支持
UBOOT默认支持NOR FLASH,因为我的FL2440只有NAND FLASH,决定把这部分去掉。
vi include/configs/fl2440.h
将183行左右,下面这段代码去掉(这里要说明一点,在配置文件中注释,不能使用//,只能使用/* */):
#define CONFIG_SYS_FLASH_CFI
#define CONFIG_FLASH_CFI_DRIVER
#define CONFIG_FLASH_CFI_LEGACY
#define CONFIG_SYS_FLASH_LEGACY_512Kx16
#define CONFIG_FLASH_SHOW_PROGRESS 45
#define CONFIG_SYS_MAX_FLASH_BANKS 1
#define CONFIG_SYS_FLASH_BANKS_LIST { CONFIG_SYS_FLASH_BASE }
#define CONFIG_SYS_MAX_FLASH_SECT (19)
#define CONFIG_ENV_ADDR (CONFIG_SYS_FLASH_BASE + 0x070000)
#define CONFIG_ENV_IS_IN_FLASH
增加下面这段:
#define CONFIG_SYS_NO_FLASH 1
#define CONFIG_ENV_IS_NOWHERE 1修改include/config_cmd_default.h,注释掉其中的CONFIG_CMD_IMI和CONFIG_CMD_IMLS
vi include/config_cmd_default.h
/*#define CONFIG_CMD_IMI*/
/*#define CONFIG_CMD_IMLS*/修改 board/samsung/fl2440/fl2440.c
vi board/samsung/fl2440/fl2440.c
#if !defined(CONFIG_SYS_NO_FLASH)
ulong board_flash_get_legacy(ulong base, int banknum, flash_info_t *info)
{
info->portwidth = FLASH_CFI_16BIT;
info->chipwidth = FLASH_CFI_BY16;
info->interface = FLASH_CFI_X16;
return 1;
}
#endif
2.增加NAND FLASH支持
在include/configs/fl2440.h中将原来注释掉的CONFIG_CMD_NAND添加回来
增加NAND驱动文件:
cp drivers/mtd/nand/s3c2410_nand.c drivers/mtd/nand/s3c2440_nand.c
在drivers/mtd/nand/Makefile 49行处增加一行:
COBJS-$(CONFIG_NAND_S3C2440) += s3c2440_nand.o
将include/configs/fl2440.h 201行左右:
- #define CONFIG_NAND_S3C2410
- #define CONFIG_SYS_S3C2410_NAND_HWECC
+ #define CONFIG_NAND_S3C2440修改drivers/mtd/nand/s3c2440_nand.c文件:
去掉:
#define S3C2410_NFCONF_EN (1<<15)
#define S3C2410_NFCONF_512BYTE (1<<14)
#define S3C2410_NFCONF_4STEP (1<<13)
#define S3C2410_NFCONF_INITECC (1<<12)
#define S3C2410_NFCONF_nFCE (1<<11)
#define S3C2410_NFCONF_TACLS(x) ((x)<<8)
#define S3C2410_NFCONF_TWRPH0(x) ((x)<<4)
#define S3C2410_NFCONF_TWRPH1(x) ((x)<<0)
#define S3C2410_ADDR_NALE 4
#define S3C2410_ADDR_NCLE 8
增加:#define S3C2440_ADDR_NALE 0xc
#define S3C2440_ADDR_NCLE 0x8将文件中所有的2410替换成2440:
:g/2410/s//2440/g (VI命令,全部替换)
修改boart_init函数,这个函数主要初始化一些数据,要修改的地方是配置NFCONT和NFCONF
去掉:
#else
tacls = 4;
twrph0 = 8;
twrph1 = 8;
#endif
cfg = S3C2440_NFCONF_EN;
cfg |= S3C2440_NFCONF_TACLS(tacls - 1);
cfg |= S3C2440_NFCONF_TWRPH0(twrph0 - 1);
cfg |= S3C2440_NFCONF_TWRPH1(twrph1 - 1);
writel(cfg, &nand_reg->nfconf);
增加:
#else
/*
HCLK is 100MHZ
FL2440'NAND FLASH IS K9F1G08U0A
time_acls=tacls*HCLK=10ns
time_we=HCLK*(twrph0+1)=15ns
time_wh=HCLK*(twrph1+1)=10ns
*/
tacls = 1;//10ns
twrph0 = 1;//20ns
twrph1 = 0;
#endif
u_int32_t cnt;
cfg =tacls<<12 | twrph0<<8 | twrph1<<4;//for nfconf
cfg &= ~(1<<0);//bus width:8bit
writel(cfg, &nand_reg->nfconf);
cnt = 1<<6|1<<5|1<<0;//for nfcont
writel(cnt,&nand_reg->nfcont);
修改s3c2440_hwcontrol函数为:
struct nand_chip *chip = mtd->priv; struct s3c2440_nand *nand = s3c2440_get_base_nand(); debugX(1, "hwcontrol(): 0x%02x 0x%02x\n", cmd, ctrl); ulong IO_ADDR_W = (ulong)nand; //if (ctrl & NAND_CTRL_CHANGE) { if (ctrl & NAND_CLE) IO_ADDR_W |= S3C2440_ADDR_NCLE; if (ctrl & NAND_ALE) IO_ADDR_W |= S3C2440_ADDR_NALE; //chip->IO_ADDR_W=(void*)IO_ADDR_W; if(ctrl & NAND_NCE){ writel(readl(&nand->nfcont) & ~(1<<1),&nand->nfcont); }else{ writel(readl(&nand->nfcont) | (1<<1),&nand->nfcont); } //} if (cmd != NAND_CMD_NONE) writeb(cmd,(void*)IO_ADDR_W);
这个时候已经可以支持NAND FLASH了,但是还会有Signal # 8 caught错误,据说这是新版uboot的问题,修改arch/arm/cpu/arm920t/s3c24x0/timer.c,修改方法我不清楚,参考别人的博客:u-boot-2011.06在基于s3c2440开发板的移植之解决raise: Signal # 8 caught
重新make,将生成的uboot.bin下载到开发板运行,就可以进入uboot了,运行命令nand info,可以查看nand flash信息,打印信息如下:
U-Boot 2011.09-rc1 (Oct 04 2011 - 12:56:05)
DRAM: 64 MiB
WARNING: Caches not enabled
NAND: 128 MiB
Using default environment
In: serial
Out: serial
Err: serial
Net: CS8900-0Warning: failed to set MAC address
SMDK2410 # nand info
Device 0: nand0, sector size 128 KiB
关于NAND ECC方面,暂时还不清楚,等有空再说,先把国庆过完:-)