您的位置:首页 > 其它

Idea6410的uboot移植norflash启动小结

2013-08-15 16:20 190 查看
Idea6410开发板上有nor芯片,但是u-boot没有做nor驱动,将u-boot保存在nor中比较安全,因为nand很有可能会被全部清空。

查看开发板硬件原理图,发现使用的nor flash芯片是am29lv160DB,2MByte,但是由于a20被ddr占用,只连接了a0-a18这19根数据线,也就是只能使用2^19 x 16bit = 8Mbit = 1Mbyte空间。

既然只有1Mbyte空间,应该和am29lv800这颗芯片的使用方法兼容,查看smdk6410.h,发现启动有AMD_LV800相关的定义,smdk6410文件夹中的flash.c文件也是针对AMD_LV800的,看来使用nor芯片的难度不大。

1 为u-boot添加nor驱动支持

1)修改smdk6410.h文件

#define CFG_FLASH_BASE0x10000000 //根据原理图,nor芯片使用CSn[0]片选,基址0x10000000

/*-----------------------------------------------------------------------

* FLASH and environment organization

*/

#define CFG_MAX_FLASH_BANKS 1/* max number of memory banks 几个norflash*/

#define CFG_MAX_FLASH_SECT 19 //配置norflash的扇区数,没搞懂

#define CONFIG_AMD_LV800

#define PHYS_FLASH_SIZE 0x100000 //norflash的大小

/* timeout values are in ticks */

#define CFG_FLASH_ERASE_TOUT (5*CFG_HZ) /* Timeout for Flash Erase */

#define CFG_FLASH_WRITE_TOUT (5*CFG_HZ) /* Timeout for Flash Write */

#define CFG_ENV_ADDR (CFG_FLASH_BASE + 0X0E0000) /*这个一定的配置,说明这参数存放在norflash的哪里,否则saveenv将出现

SMDK6410 # sav

Saving Environment to Flash...

Error: end address not on sector boundary */

#define CFG_ENV_SIZE 0x10000/* Total Size of Environment Sector */

3)查看flash.c源码,发现只要定义CONFIG_AMD_LV800,在flash_init中就会对nor参数进行赋值,并没有从芯片读取数据。

也就说目前并没有真正从nor flash芯片中读到数据。

4)开始怀疑bank宽度设置不正确,因为前面做dm9000ae时就需要将bank宽度设置为16。

查看s3c6410数据手册,发现CSn[0]的bank宽度又H/W控制,如果配置nor启动,能够正确设置,但我目前还是nand启动。。。

调用printf,在启动时打印出SROM_BW_REG的值,是0xd0,果然,只初始化了CSn[1],CSn[0]还是停留在8bit宽带

5)参考dm9000的初始化,修改smdk6410.c文件

//
SROM_BW_REG &= ~(0xf << 4);

// SROM_BW_REG |= (1<<7) | (1<<6) | (1<<4);

SROM_BW_REG &= ~(0xff << 0);

SROM_BW_REG |= (1<<7) | (1<<6) | (1<<4) | (1<<3) | (1<<2) | (1);
// set bit[3:1]=111 for nor

SROM_BC1_REG = ((CS8900_Tacs<<28)+(CS8900_Tcos<<24)+(CS8900_Tacc<<16)+(CS8900_Tcoh<<12)+(CS8900_Tah<<8)+(CS8900_Tacp<<4)+(CS8900_PMC));

//SROM_BW_REG &= ~(0xf); //nor

//SROM_BW_REG |= (1<<3) | (1<<2) | (1);

添加初始化带宽代码,当然也可以修改SROM_BC0_REG,优化时序,也可以使用默认值。

6)重新编译后,nor flash可以使用!

nor 开头会被默认设置为RO,每次要unprotect比较烦,可以注释掉flash.c中flash_init相关代码

/*

flash_protect (FLAG_PROTECT_SET,

CFG_FLASH_BASE,

CFG_FLASH_BASE + monitor_flash_len - 1,

&flash_info[0]);

flash_protect (FLAG_PROTECT_SET,

CFG_ENV_ADDR,

CFG_ENV_ADDR + CFG_ENV_SIZE - 1, &flash_info[0]);

*/

2 为u-boot添加nor启动

其实nor启动比nand启动简单多了,因为程序可以直接在nor中运行,通过简单的搬运代码将自身搬运到ram中即可。

1)修改smdk6410.h文件

#define CONFIG_BOOT_NOR

//#define CONFIG_BOOT_NAND

#if defined(CONFIG_BOOT_NAND)//|| defined(CONFIG_BOOT_NOR)

#define CFG_ENV_IS_IN_NAND

#define CFG_NAND_LARGEPAGE_S***EENV

#define CFG_NAND_HWECC

//#define CFG_NAND_FLASH_BBT

//#define CONFIG_BOOTCOMMAND "nand read 0xc0008000 0x00040000 0x00800000;bootm 0xc0008000"

#define CONFIG_BOOTCOMMAND "nand read 0xc0008000 0x100000 0x300000;bootm 0xc0008000"

//记得添加下面几句

#elif defined(CONFIG_BOOT_NOR)

#define CFG_ENV_IS_IN_FLASH

#define CFG_NAND_HWECC (为norfalsh能启动nandflash的kernel提供校验)

#define CONFIG_BOOTCOMMAND "nand read 0xc0008000 0x100000 0x300000;bootm 0xc0008000"

还有个宏不知道是否有用,也打开

#define CONFIG_USE_NOR_BOOT

2)重新编译,将内容烧到nor flash的开头(用cp.b比较方便)

a、输入dnw c0008000回车,用USB transmit下载u-boot-nor.bin

b、下载完成写到NOR Flash,输入cp.b c0008000 10000000 40000

若第二次烧写,可用命令将nor搽除,命令:erase 10000000 1003FFFF

SMDK6410 # flinfo



Bank # 1: AMD: 1x Amd29LV800BB (8Mbit)

Size: 1 MB in 19 Sectors

Sector Start Addresses:

10000000 (RO) 10004000 (RO) 10006000 (RO) 10008000 (RO) 10010000 (RO)

10020000 (RO) 10030000 10040000 10050000 10060000

10070000 10080000 10090000 100A0000 100B0000

100C0000 100D0000 100E0000 (RO) 100F0000

SMDK6410 #

SMDK6410 # protect off all

Un-Protect Flash Bank # 1
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: