从uboot官方开始移植

一、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.ldsstart.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 }

 

 

 

 

 

 

 

 

   

 

posted @ 2020-03-01 22:46  Z9Y1J5  阅读(295)  评论(0编辑  收藏  举报