ARM uboot 的移植4 -从 uboot 官方标准uboot开始移植
创始人
2024-06-01 16:14:01
0

一、添加DDR初始化1

1、分析下一步的移植路线

(1) cpu_init_crit 函数成功初始化串口、时钟后,转入 _main 函数,函数在 arch/arm/lib/crt0.S 文件中。

在这里插入图片描述

在这里插入图片描述


(2) 在 crt0.S 中首先设置栈,将 sp 指向 DDR 中的栈地址;

在这里插入图片描述

#if defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_STACK)ldr	sp, =(CONFIG_SPL_STACK)
#elseldr	sp, =(CONFIG_SYS_INIT_SP_ADDR)
#endif#define CONFIG_SYS_INIT_SP_ADDR	(CONFIG_SYS_LOAD_ADDR - 0x1000000)  //0x33000000#define CONFIG_SYS_LOAD_ADDR	(CONFIG_SYS_SDRAM_BASE + 0x4000000) //0x34000000/* DRAM Base */
#define CONFIG_SYS_SDRAM_BASE		0x30000000

然后调用 board_init_f 函数进行板级初始化。函数在 arch/arm/lib/board.c 中。

在这里插入图片描述


(3) 在这个版本的 uboot 中,把以前 uboot 的第二阶段 start_armboot 函数分成了 2 部分:board_init_fboard_init_r。所以在这里,就和以前版本的 uboot 接轨上了,推测 board_init_f 中肯定是做了板级初始化,board_init_r 中进入了uboot的命令行。

在这里插入图片描述


(4) 分析到这里,在 uboot2013.10 版本中思路已经很清晰了:uboot 的第二阶段就在 crt0.S 文件中,第二阶段的入口就是 _main 函数。第一阶段工作主要就是 cpu_init_crit 函数,所以我们要在 cpu_init_crit 函数中添加 DDR 初始化和 uboot 的重定位。


(5) 分析到这里,下一步工作方向就确定了。我们要先在 cpu_init_crit 函数中添加 DDR 初始化,然后在 start.S 中 bl _main 之前,添加 uboot 的重定位,然后将 bl _main 改成 ldr pc, __main(__main: .word _main) 长跳转。然后在 crt0.S 中 board_init_f 后,删除那些重定位代码,至此 uboot 的第二阶段就应该能启动起来了。后续的移植就是第二阶段了。


2、分析 DDR 初始化代码移植思路

(1) 如果本来 uboot 中有 DDR 初始化代码,那我们可以就着这些代码来修改。但是问题是这个 uboot2013.10 中根本没有DDR初始化,所以我们需要完全从头去另外添加 DDR 初始化代码。

(2) 我们的思路就是,从三星版本的 uboot 中直接移植 DDR 初始化代码过来即可。三星版本的 uboot 中,DDR 初始化函数在 cpu/s5pc11x/s5pc110/cpu_init.S 文件中,直接将这个文件移植过来即可。

在这里插入图片描述


3、动手移植

(1) 添加 cpu_init.S 文件到 uboot2013.10 中。注意,这里的代码必须保证在前 8kb 内,所以必须和 lowlevel_init.S 文件一样的链接处理。

在这里插入图片描述


主要是在 board/samsung/goni/Makefile 中和 arch/arm/cpu/u-boot.lds 文件中做修改添加。
在这里插入图片描述

在这里插入图片描述


(2) 添加头文件 s5pc110.hinclude 目录下。

在这里插入图片描述

在这里插入图片描述


(3) 对 cpu_init.S 文件代码进行修整,把一些无用的代码去掉,把一些相关的条件编译人工处理一下。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


二、添加DDR初始化2

1、移植必要的宏定义

(1) DDR 配置参数,从三星版本的 smdkv210single.h 中复制到 s5p_goni.h 中。

1、
在这里插入图片描述


(2) s5pc110.h 中进行修整。

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


2、代码同步、编译、再修整


3、添加调试信息,验证 DDR 初始化完成。

(1) 调试信息有 LED 点亮和串口输出两种。优先选用串口调试的方法。

(2) 在 DDR 初始化完成后,添加串口输出字符 “K”,这样启动时如果看到了"OK",就说明 DDR 已经被成功初始化了。

在这里插入图片描述

(3) 结果:看到了 “OK” 标志,说明 DDR 添加实验成功。
在这里插入图片描述


三、添加uboot第二阶段重定位1

1、在重定位代码前,加调试信息定位

(1) 逻辑上来说,重定位部分的代码,应该在 DDR 初始化之后和 uboot 第二阶段来临前之间。

(2) uboot 的第一阶段和第二阶段的划分并不是绝对的,唯一必须遵循的原则就是:第一阶段不能大于 8KB。所以 uboot 的第一阶段最少要完成 DDR 初始化和重定位,最多不能超过 8KB。在满足这些条件时,第一阶段和第二阶段的接点可以随便挑。

(3) 找到合适的地方来写重定位代码,重定位之后远跳转到第二阶段的入口。

(4)
在这里插入图片描述

在这里插入图片描述


2、重定位代码移植

  1. 设置栈指针
    在这里插入图片描述

在这里插入图片描述

最终修改:

在这里插入图片描述


  1. 判断运行地址。

在这里插入图片描述

最终修改:

在这里插入图片描述


  1. 判断启动介质。

在这里插入图片描述


  1. 跳转 BL2 copy 函数。

在这里插入图片描述

最终修改结果:

在这里插入图片描述


3、清 bss 段移植

在这里插入图片描述

在这里插入图片描述

最终修改结果:

在这里插入图片描述


4、movi_bl2_copy 函数移植

(1) 从三星版本的 uboot 中复制 movi.cmovi.h 到 uboot2013.10 中。

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


movi.c 文件的修改:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


修改后:

在这里插入图片描述


在这里插入图片描述

在这里插入图片描述


(2) 改 makefile 和 u-boot.lds。

在这里插入图片描述

在这里插入图片描述


四、添加 uboot 第二阶段重定位 2

1、_mian 函数中基本处理

(1) 主要就是把里面的重定位代码部分给删除掉。剩下就是:设置栈、调用 board_init_f 函数和 board_init_r 函数。

在这里插入图片描述


2、代码同步及编译

(1) 主要是 crt0.S 和 movi.h。


3、编译中出现问题解决

(1) movi.h 中宏定义出错,最后在 s5p_goni.h 中添加了 CONFIG_EVT1 这个宏解决了。

在这里插入图片描述

在这里插入图片描述


(2) 连接错误:u-boot contains relocations other than R_ARM_RELATIVE
在 uboot 下用 grep “R_ARM_RELATIVE” -nR * 搜索,发现 Makefile 中有一个检查重定位的规则,屏蔽掉这个规则后编译连接成功。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


4、结果验证及下阶段展望

(1) 看到了 uboot 启动打印出来的一系列信息,但是 uboot 没有进入命令行。

(2) 这说明 uboot 中的 DDR 初始化和重定位功能都已经完美实现,后面就是第二阶段的继续移植了。

在这里插入图片描述


源自朱有鹏老师.

相关内容

热门资讯

开晨会需要说什么内容 开晨会需要说什么内容晨会说的内容可以很多呀,可以说接下来的工作安排,也可以说,前期工作中的一些总结,...
有谁知道在鬼吹灯有声小说中前面... 有谁知道在鬼吹灯有声小说中前面有一段小女孩的声音念:人点烛 鬼吹灯... 这个版本的故事是谁讲的?周...
小蒂皮出自哪本书 小蒂皮出自哪本书小蒂皮出自哪本书我的野生动物朋友(蒂皮·本杰明·奥康迪·德格雷著图书)《我的野生动物...
盘古开天辟地的故事 盘古开天辟地的故事很久很久以前,天和地还没有分开,宇宙混沌一片。有个叫盘古的巨人一直睡在这混沌之中。...
英雄联盟中 赏金猎人怎么样? ... 英雄联盟中 赏金猎人怎么样? 多少钱 金币3150的ADC。入手的话不会吃亏,基本不会压箱底,很热门...
寻找一部累死何以笙箫默之类的小... 寻找一部累死何以笙箫默之类的小说也是辛夷坞的,叫山月不知心底事那就它的作者顾漫的其他小说呗 微微一...
大家谈谈对洪荒小说之中圣人的看... 大家谈谈对洪荒小说之中圣人的看法圣人不死,大盗不止都是人 人有的情绪他们都有 就是拳头大些对...
单位体检,自己一个人去害怕撞到... 单位体检,自己一个人去害怕撞到同事怎么办,不想别人看到观察我,漏出我不成熟样子,显出我的丑态。这让单...
鱼在天上飞? 鱼在天上飞?“鱼在天上飞,鸟在水里游”这句话的意思是鸟儿在水中的倒影就像是在水里游,天空在水中的倒影...
我想复婚,前夫说以后再,我改变... 我想复婚,前夫说以后再,我改变好了,他有可能追我,现在不想复婚,他有喜欢的女人了,我们就不可能了吗感...
原神草神什么时候复刻 原神草神什么时候复刻原神草神复刻是在3.6版本以后。草神纳西妲首次登场是逗腊3.2版本,新角色想要等...
网络拽姐语录小学生? 网络拽姐语录小学生?无论谁离开了你,请你别忘了,他没来之前,你本就是一个人生活。
有一部小说,女主小时候被男主收... 有一部小说,女主小时候被男主收养了,女主叫男主哥哥,男主对女主的我也在找这个小说我之前也看了,好像叫...
高层建筑立面大面积粉刷需要设伸... 高层建筑立面大面积粉刷需要设伸缩缝吗?高层建筑立面大面积粉刷需要设伸缩缝需要的,无正举论地面或立念清...
低头思故乡,为什么把杯思在长,... 低头思故乡,为什么把杯思在长,情愿何处在方歌曲叫什么名字“李白的歌”离开了家乡 背着沉沉的行囊开始了...
李白的诗有多少 李白的诗有多少典故中大多说是三千至四千首,现存不足一千首很多,总之不少~李白一生留下了九百六十多首诗...
怎么才可以学会拿得起放得下……... 怎么才可以学会拿得起放得下…… 有一段感情,正整3年了,可是我还是觉得分手那天就好像昨天发生的一样替...
为什么官方直播间买手机送耳机 为什么官方直播间买手机送耳机吸引消费者,增加销售量。官方直播间作为官方的直播平台,买手机送耳机是为了...
自考通还是一考通好?该选哪个? 自考通还是一考通好?该选哪个?我现在自考行政管理专科。专业课程我应该选自考通好还是一考通好呢?这个很...
淘宝实际付款价格为什么与订单价... 淘宝实际付款价格为什么与订单价格不符是这样的,我买了一双鞋,当时限价160我拍了下来,当时没付款,后...