一、start.S文件分析
1、设置中断异常向量表
2、save_boot_params //空函数,直接返回,占位的意思 (126)
3、设置CPU为SVC32 mode (131)
4、调用cpu_init_cp15 :关闭MMU、cache (159)
5、调用cpu_init_crit----->调用lowlevel_init:IO复位、关看门狗、初始化串口
二、uboot代码的修改
1、在代码的前边添加16字节的校验头信息
2、修改lowlevel_init的链接问题
- arch/arm/cpu/u-boot.lds中start.o后面添加board/samsung/goni/lowlevel_init.o (.text*)
- 修改board/samsung/goni/Makefile
3、添加DDR初始化,在cpu_init_crit中添加,之后进行代码的重定位
- 添加cpu_init.S文件到uboot2013.10中
- 作链接处理,同lowlevel_init.S文件一样
- 添加头文件s5pc110.h到include目录下
- DDR配置参数,从三星版本的smdkv210single.h中复制到s5p_goni.h中
- s5pc110.h中进行修整
4、添加uboot第二阶段重定位
- 重定位代码移植
- 清bss段移植
- movi_bl2_copy函数移植
movi.c和movi.h到uboot2013.10中,方法和cpu_init.S一样
- _mian函数中基本处理,去掉重定位功能
- 最后在s5p_goni.h中添加了 CONFIG_EVT1这个宏
- 屏蔽掉这个规则"R_ARM_RELATIVE
下面的修改都是在_main中
5、修改banner
_main----> board_init_f---->init_sequence中display_banner函数
6、CPU信息的更改
_main----> board_init_f---->init_sequence中的print_cpuinfo函数
更改时钟频率:在cpu_init_crit函数中添加时钟的初始化函数,从samsung版本的移植,然后再S5p_goni.h中添加相应的宏
7、board名称更改
_main----> board_init_f---->init_sequence中的checkboard函数
8、DDR配置值修改
_main----> board_init_f---->init_sequence中的dram_init函数,在S5p_goni.h中修改DRAM的配置宏信息
#define CONFIG_NR_DRAM_BANKS 2 #define PHYS_SDRAM_1 CONFIG_SYS_SDRAM_BASE /* OneDRAM Bank #0 */ #define PHYS_SDRAM_1_SIZE (256 << 20) /* 256 MB in Bank #0 */ #define PHYS_SDRAM_2 0x40000000 /* mDDR DMC1 Bank #1 */ #define PHYS_SDRAM_2_SIZE (256 << 20) /* 256 MB in Bank #1 */
9、屏蔽多余信息提示WARNING和PMIC
board_init_r中enable_caches();函数
board_init_r中power_init_board()函数
10、去掉oneNand支持
在S5p_goni.h中屏蔽CONFIG_CMD_ONENAND宏
在S5p_goni.h中屏蔽和ONENAND相关的宏
1 //#define CONFIG_ENV_IS_IN_ONENAND 1 2 //#define CONFIG_ENV_SIZE (256 << 10) /* 256 KiB, 0x40000 */ 3 //#define CONFIG_ENV_ADDR (1 << 20) /* 1 MB, 0x100000 */ 4 5 //#define CONFIG_USE_ONENAND_BOARD_INIT 6 //#define CONFIG_SAMSUNG_ONENAND 1 7 //#define CONFIG_SYS_ONENAND_BASE 0xB0000000
在根据提示信息作相应的修改,添加这些宏
1 #define CONFIG_ENV_SIZE CFG_ENV_SIZE /* 256 KiB, 0x40000 */ 2 #define CONFIG_ENV_IS_IN_MMC 1 3 #define CONFIG_SYS_MMC_ENV_DEV 0 //0表示SD卡
在board/samsung/goni的Makefile中,去掉onenand.o(15行)
在common中屏蔽掉COBJS-$(CONFIG_ENV_IS_IN_NAND) += env_nand.o 46行
11、添加SD/MMC支持
- 对比三星版本,复制文件到uboot/drivers/mmc,注释掉CONFIG_SDHCI、CONFIG_S5P_SDHCI,添加CONFIG_S3C_HSMMC宏,根据文件复制samsung中driver/mmc中makefile相关内容
- board_mmc_init()函数修改成三星版本的,根据三个函数所在的文件进行移植,(把setup_hsmmc.c添加到uboot的goni文件夹下)
- 在浏览三个函数,看缺少什么宏,进行移植
- 编译,根据报错进行相应修改
(1)出错1:cmd_mmc.c中出错。原因是cmd_mmc.c和mmc驱动密切相关,所以改了驱动后这个实现文件也要跟着改,解决方法是从三星版本的直接同名文件复制过来替换
(2)出错2:drivers/mmc/mmc_write.c编译出错。原因是这个文件和本来版本中的mmc.c文件相关,但是mmc.c被替换掉了所以这个文件编译报错。解决方案就是修改makefile去掉这个文件的依赖,让他不被编译。
(3)出错3:#include<regs.h>注释掉,然后添加#include <s5pc110.h>
12、环境变量的移植
- 环境变量相关代码浏览,通过搜索saveenv,找到Env_mmc.c--->saveenv()----->mmc_get_env_addr()[修改offset]------>使CONFIG_ENV_OFFSET=17*512
- 修改完环境变量后,先用命令mmc write 0 30000000 17# 32破坏掉inand自带的,然后重启即可看见自己修改的那一份
14、网卡驱动的移植
- 找到board.c,在S5p_goni.h添加CONFIG_CMD_NET宏
- 添加ping tftp命令支持,在S5p_goni.h添加CONFIG_CMD_PING CONFIG_CMD_NET宏
- 在eth.c添加注册函数,board_eth_init用来注册网卡
1 extern int dm9000_initialize(bd_t *bis); 2 3 static int board_eth_init(bd_t *bis) 4 { 5 6 return dm9000_initialize(bis); 7 8 }