加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

移植u-boot-2011.09-rc1到FL2440(2)

发布时间:2020-12-15 06:45:43 所属栏目:百科 来源:网络整理
导读:??? 这篇进行移植第二步,支持NAND FLASH的读写,我的板子的NAND FLASH是K9F1G08U0A,128M 8BIT。 ??? 1.去掉对NOR FLASH的支持 UBOOT默认支持NOR FLASH,因为我的FL2440只有NAND FLASH,决定把这部分去掉。 vi include/configs/fl2440.h 将183行左右,下面

??? 这篇进行移植第二步,支持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%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方面,暂时还不清楚,等有空再说,先把国庆过完:-)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读