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
在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%02xn",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方面,暂时还不清楚,等有空再说,先把国庆过完:-)