6.console_init_f 在环境变量里对串口进行注册。
7.display_options 至此将显示uboot的版本号,也是在console中显示的第一行,根据makefile自动获取的新版本号,所以无需修改
8.checkboard 修改硬件板卡版本号,做一些IO初始化。因为以太网EFC1管脚复位即为第一功能,所以注释掉iopin_initialize()的初始化。
因为MPC5125有两个GPIO模块,所以基地址发生变化,修改GPIO的结构体:
typedef struct gpio512x {
u32 gpdir;
u32 gpodr;
u32 gpdat;
u32 gpier;
u32 gpimr;
u32 gpicr1;
u32 gpicr2;
u8 res0[0x64];
} gpio512x_t;
注意gpio_initialize()关于对板子GPIO的初始化的修改。此处先不做修改。
9.uboot并没有用到I2C以及SPI所以不对其做修改。
10.init_func_ram
主要完成对SDRAM的初始化,由于此次改为DDR2的MT47H64M16LFCK-3,256M,工作时钟为200MHz,主要修改cpu/mpc512x/fixed_sdram.c初始化时序
对于mpc5125 ddr模块没有做出调整,因此不用对其进行重映射;对于DDR控制器优先级采用默认设置;
修改SDRAM容量的定义atdboard_v2.h
#define CONFIG_SYS_DDR_SIZE 256
根据芯片手册的初始化顺序在fixed_sdram.c中添加对SDRAM初始化结构体
u32 mt47H64M16_init_seq[] = {
CONFIG_SYS_DDRCMD_NOP,
CONFIG_SYS_DDRCMD_NOP,
CONFIG_SYS_DDRCMD_NOP,
CONFIG_SYS_DDRCMD_NOP,
CONFIG_SYS_DDRCMD_NOP,
CONFIG_SYS_DDRCMD_NOP,
CONFIG_SYS_DDRCMD_NOP,
CONFIG_SYS_DDRCMD_NOP,
CONFIG_SYS_DDRCMD_NOP,
CONFIG_SYS_DDRCMD_NOP,
CONFIG_SYS_DDRCMD_PCHG_ALL,
CONFIG_SYS_DDRCMD_EMR2,
CONFIG_SYS_DDRCMD_EMR3,
CONFIG_SYS_DDRCMD_EMR_EN_DLL,
CONFIG_SYS_DDRCMD_MR_RST_DLL,
CONFIG_SYS_DDRCMD_PCHG_ALL,
CONFIG_SYS_DDRCMD_RFSH,
CONFIG_SYS_DDRCMD_RFSH,
CONFIG_SYS_DDRCMD_MR_INIT_DEV_OP,
CONFIG_SYS_DDRCMD_EMR_OCD_DEF,
CONFIG_SYS_DDRCMD_EMR_OCD_EXIT
}
以及对DDR控制器配置寄存器的以下定义
#ifdef CONFIG_ATDBOARD_V2
#define CONFIG_SYS_MDDRC_SYS_CFG 0xea804a00
#define CONFIG_SYS_MDDRC_TIME_CFG0 0x00003c2d
#define CONFIG_SYS_MDDRC_TIME_CFG1 0x68ec1189
#define CONFIG_SYS_MDDRC_TIME_CFG2 0x35310864
/* MDDRC SYS CFG and Timing CFG0 Registers */
#define MDDRC_SYS_CFG_EN 0xF0000000
#define MDDRC_SYS_CFG_CMD_MASK 0x10000000
#define MDDRC_REFRESH_ZERO_MASK 0x0000FFFF
#endif
定义初始化自定义的命令
#ifdef CONFIG_ATDBOARD_V2
#define CONFIG_SYS_DDRCMD_EMR_EN_DLL 0x01010000
#define CONFIG_SYS_DDRCMD_MR_RST_DLL 0x01000100
#define CONFIG_SYS_DDRCMD_MR_INIT_DEV_OP 0x01000432
#define CONFIG_SYS_DDRCMD_EMR_OCD_DEF 0x01010400
#define CONFIG_SYS_DDRCMD_EMR_OCD_EXIT 0x01010000
#define CONFIG_SYS_DDRCMD_EMR2 0x01020000
#define CONFIG_SYS_DDRCMD_EMR3 0x01030000
#endif
至此初始化对SDRAM初始化完毕,接下来对环境变量进行分配空间,存储系统参数,无需更改,跳转到relocate_code处进行copymyself.
在start.S中可以看出这部分没有变化,所以跳转到内存中去执行
board_init_r:
1.flash_init: 使用LPC总线无需对相应寄存器进行设置,只需对地址直接进行读写。采用了CFI标准接口协议对flash初始化,获得容量大小,其读写操作分析不再赘述。
2.env_relocate ()重定位环境变量指针
3.getenv_IPaddr 在环境变量中获得IP地址,interrupt_init()初始化decrementer定时器中断
4.getenv(),获得下载地址以及引导命令
5.eth_initialize()以太网初始化,MPC5125有两个以太网控制器,FEC1与MPC5121e的相同,寄存器不变,PHY芯片不变
6.main_loop
移植总结:
本次移植主要对处理器的memory map、PSC串口、DDR2 SDRAM以及GPIO进行了移植,最麻烦的地方就是memory map,需要细心的与芯片手册寄存器对照,写错一个就会影响到之后所有的模块,移植的正确性,需要在调试中验证。