Idea6410的uboot移植norflash启动小结

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_SAVEENV
#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

你可能感兴趣的:(uboot,idea6410)