平台:mpc8313。
u-boot版本:uboot1.3.0。
DDR2:128MB:位于0x00000000。
启动nor-flash:型号,AM29LV040B-90JD,512Kx8BIT,位于0xfff00000处。
内核、文件系统放置在另一片1G的nor flash中,所以需要在u-boot中加载两片nor-flash的驱动,这一部分最后实现,先实现512kb的nor-flash启动u-boot。
?
首先用freescale的开发套件获取u-boot-1.3.0。方式是在开发套件的安装目录下运行./ltib -c。先不要选择Build a boot loader,即先让该选项为空,然后编译一遍.然后再次运行./ltib -c.选择Build a boot loader(这样做的目的是为了获取freescale配置好的u-boot),如图1:

图1
????????????然后确定,运行。注意,此处比较重要。因为套件默认在编译完成之后会删除u-boot文件夹,所以不能让他编译完成。在快要完成的时候用Ctrl+c中断运行(具体时机自己把握,太早的话可能没有完全配置,太晚则系统会删掉u-boot文件夹),?然后可以在:
安装目录/ltib-mpc8313erdb-20081222/rpm/BUILD下找到u-boot文件夹。将其拷贝到xp下编辑,或者在linux下用vi编辑也可以。
以下操作全部都在u-boot-1.3.0文件夹下完成。
首先,打开u-boot根目录下的Makefile文件,把交叉编译工具改为powerpc的。下面是我的。
ifeq ($(ARCH),ppc)
?????? CROSS_COMPILE = powerpc-e300c3-linux-gnu-? ---------->这里由我更改。
然后打开配置头文件,include/configs/mpc8313erdb.h。下面贴出需要更改的地方。原来的注释掉。
/*
?* FLASH on the Local Bus
?*/
#define CFG_FLASH_CFI????/* use the Common Flash Interface */
#define CFG_FLASH_CFI_DRIVER???/* use the CFI driver */
#define CFG_FLASH_BASE??0xFFF00000?/* start of FLASH?? */
/*此处要保持和TEXT_BASE(board/freescale/mpc8313erdb/config.mk)一致*/
/********************************* add by David ***********************************/
/*#define CFG_FLASH_SIZE??????????????? 8?*//* flash size in MB */
#define CFG_FLASH_SIZE??????????????? 1/*flash大小,最小为1MB,因为它是以MB为单位的*/
/*********************************? 2012.05.17? ***********************************/
#define CFG_FLASH_EMPTY_INFO???/* display empty sectors */
#define CFG_FLASH_USE_BUFFER_WRITE??/* buffer up multiple bytes */
/********************************* add by David ***********************************/
#if 0
#define CFG_FLASH_BR_PRELIM?(CFG_FLASH_BASE |?????? /* flash Base address */
????????????????????????????? (2 << BR_PS_SHIFT) |??? /* 16 bit port size */
????????????????????????????? BR_V)?????????????????? /* valid */
#endif
/*此处的CFG_FLASH_BR_PRELIM定义的是CPU的BR0寄存器,即上电后LCS0的访问空间,即从哪里开始加载u-boot。此处要配合*/
/*屏蔽字OR0和上电复位配置字RCWH[ROMLOC]位,一起实现对上电后访问地址的配置,具体看图2*/
#define CFG_FLASH_BR_PRELIM?(CFG_FLASH_BASE |?????? /* flash Base address */
????????????????????????????? (1 << BR_PS_SHIFT) |??? /*8 bit(8位的左移1位,16位的左移2位)port size */
????????????????????????????? BR_V)?????????????????? /* valid */
#if 0
#define CFG_FLASH_OR_PRELIM?(0xFF000000???????? /* 16 MByte */
??????????????????????????????? | OR_GPCM_XACS
??????????????????????????????? | OR_GPCM_SCY_9
??????????????????????????????? | OR_GPCM_EHTR
??????????????????????????????? | OR_GPCM_EAD)
??????????????????????????????? /* 0xFF006FF7?? TODO SLOW 16 MB flash size */
#endif
/*此处CFG_FLASH_OR_PRELIM配置的是OR0寄存器,具体看图3和图4。注意:因为CPU配置的是大端模式,所以底位数据在前。*/
#define CFG_FLASH_OR_PRELIM???? (0xFFF80000?/*这个也要根据flash大小配置,512Kb*/
??????????????????????????????? | OR_GPCM_XACS
??????????????????????????????? | OR_GPCM_SCY_9
??????????????????????????????? | OR_GPCM_EHTR
??????????????????????????????? | OR_GPCM_EAD)
??????????????????????????????? /* 0xFFF86FF7?? TODO SLOW 1 MB flash size */
#define CFG_LBLAWBAR0_PRELIM?CFG_FLASH_BASE?/* window base at flash base */
/*#define CFG_LBLAWAR0_PRELIM?? 0x80000017????? *//* 16 MB window size */
/*CFG_LBLAWAR0_PRELIM此处的配置见图5*/
#define CFG_LBLAWAR0_PRELIM???? 0x80000013????? /* 1MB window size,这里总线宽度最少需要1MB,否则会出错。 */
#define CFG_MAX_FLASH_BANKS?1??/* number of banks */
/*#define CFG_MAX_FLASH_SECT?135??*//* sectors per device */
#define CFG_MAX_FLASH_SECT?8 /*AM29LV040B-90JD有8个sector*/
/*********************************? 2012.06.26? ***********************************/
?图2的BA即是要配置的Flash的基地址,空间是2的17次方,即128Kb。其他的用默认的就行。

?图2
图3的AM的值可以按照图4提供的标准来填写。0xFFF80000。高位合并后是0xFFF8667

?图3

??图4

图5
?
#ifdef CONFIG_NAND_SPL
#define CFG_HRCW_HIGH_PRE2 (CFG_HRCW_HIGH_PRE1 |
?HRCWH_FROM_0XFFF00100 |
?HRCWH_ROM_LOC_NAND_SP_8BIT |
?HRCWH_RL_EXT_NAND)
#else
/**************************************** add by David ***********************************/
#if 0
#define CFG_HRCW_HIGH_PRE2 (CFG_HRCW_HIGH_PRE1 |
?HRCWH_FROM_0X00000100 |
?HRCWH_ROM_LOC_LOCAL_16BIT |
?HRCWH_RL_EXT_LEGACY)
#endif
#define CFG_HRCW_HIGH_PRE2 (CFG_HRCW_HIGH_PRE1 |
?HRCWH_FROM_0X00000100 |
/*HRCWH_ROM_LOC_LOCAL_8BIT 注意,此处非常重要,如果配置不对,nor flash是不能正常访问的,这里配置的是复位配置字的*/
/*高字节,就是配置u-boot开始的64Bytes的数据,等u-boot编译完成后,你可以用UEDIT32打开u-boot.bin文件,在前64Bytes*/
/*看到自己的配置字。并且核对是否正确。请看图6、图7、图8和图9,图9最重要。*/
?HRCWH_ROM_LOC_LOCAL_8BIT |
?HRCWH_RL_EXT_LEGACY)
#endif
/****************************************? 2012.06.30? ***********************************/
?
图6是复位配置字的低位字节。

?图6
?
图7是复位配置字的高位字节。注意其中的ROMLOC段,非常重要,它制定系统的起始位置和位宽。如果这里错误,串口是不会打印任何信息的。因为系统根本没起来,串口肯定没有工作。

?图7

?图8
?
图9的ROMLOC位就是图8圈出来的重点部分,为系统启动位置,即由复位配置字高位字节制定。

?图9
?
下面是u-boot环境变量的保存位置:
?/*
?* Environment
?*/
#if defined(CONFIG_NAND_U_BOOT)
?#define CFG_ENV_IS_IN_NAND?1
?#define CFG_ENV_SIZE??CFG_NAND_BLOCK_SIZE
?#define CFG_ENV_OFFSET??((1024<<10) - (CFG_NAND_BLOCK_SIZE<<1))
/***************************** add by David *************************************/
#elif !defined(CFG_RAMBOOT)
#if 0
?#define CFG_ENV_IS_IN_FLASH?1
?#define CFG_ENV_ADDR??(CFG_MONITOR_BASE + 0x40000)
?#define CFG_ENV_SECT_SIZE?0x10000 /* 64K(one sector) for env */
?#define CFG_ENV_SIZE??0x2000
#endif
#define CFG_ENV_IS_IN_FLASH???? 1
/*一般情况下,环境变量存储在flash的最后一个sector中。若按照上面的定义存在0x40000开始的地址,则前面总共有256Kb。*/
/*空间来保存u-boot的正文。但是若u-boot大于256的时候保存环境变量,则会破坏u-boot的完整性,所以还是存在0x70000处。*/
#define CFG_ENV_ADDR??????????? (CFG_MONITOR_BASE + 0x70000)
#define CFG_ENV_SECT_SIZE?????? 0x10000 /* 64K(one sector) for env */
#define CFG_ENV_SIZE??????????? 0x2000
/*****************************? 2012.07.03? *************************************/
按照上面更改后,编译u-boot已经可以启动,串口也可以正常打印。但是还有问题,因为freescale的MPC8313E-RDB-REVC版的开发板用的flash是S29GL064A,64MB、16位宽的flash,这个flash。虽然是JEDEC接口的,但是它兼容CFI接口,就是说你可以用CFI接口探测函数探测到它,并且可以实现读写。
虽然在MPC8313ERDB.h中已经更改为8位宽,但是u-boot用来探测及初始化flash的函数原来用的是common下的cfi_flash.c文件,默认用cfi接口探测函数,但是我用的AM29LV040B-90JD,不支持CFI接口。所以要用JEDEC接口标准。下一篇讲flash.c文件的更改。