ARM uboot 的移植4 -从 uboot 官方标准uboot开始移植

一、添加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)
#else
	ldr	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 初始化和重定位功能都已经完美实现,后面就是第二阶段的继续移植了。

在这里插入图片描述


源自朱有鹏老师.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/200.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

被骗进一个很隐蔽的外包公司,入职一个月才发现,已经有了社保记录,简历污了,以后面试有影响吗?...

职场的套路防不胜防,一不留神就会掉坑,一位网友就被“骗”进了外包公司,他说公司非常隐蔽,入职一个月才发现是外包,但已经有了社保记录,简历污了,不知道对以后面试有影响吗?楼主说&a…

【含源码】用python做游戏有多简单好玩

有很多同学问我还有其他什么小游戏吗,游戏是怎么做的,难不难。我就用两篇文章来介绍一下,如何使用Python做游戏。 兔子与灌 俄罗斯方块 休闲五子棋 走迷宫 推箱子 消消乐 超多小游戏玩转不停↓ 更多小游戏可以评论区讨论哦,喜欢…

保姆级使用PyTorch训练与评估自己的Replknet网络教程

文章目录前言0. 环境搭建&快速开始1. 数据集制作1.1 标签文件制作1.2 数据集划分1.3 数据集信息文件制作2. 修改参数文件3. 训练4. 评估5. 其他教程前言 项目地址:https://github.com/Fafa-DL/Awesome-Backbones 操作教程:https://www.bilibili.co…

【C++】模板进阶

模板进阶 文章目录模板进阶1、非类型模板参数2、模板的特化2.1.概念2.2.函数模板特化2.3.类模板特化2.3.1.全特化2.3.2.偏特化2.4.类模板特化示例3、模板总结1、非类型模板参数 模板参数分类类型形参与非类型形参。类型模板参数:出现在模板参数列表中,跟…

技术人的管理学-团队管理

主要内容前言团队管理,如何让猪上树?选人育人用人留人总结前言 本周报名参加了 风 变 科 技推出的管理学MTP培训课,花了点小钱,感觉还是有用的,可惜时间安排都在8点以后,刚好是看孩子的时间,只…

io流概述

public static void main(String[] args) throws IOException {//1.与文件建立联系 File->数据源File src new File("D://AAA/test.txt");//2.创建文件字节输入流->管道//InputStream is new FileInputStream(src);InputStream is new FileInputStream(&quo…

中科亿海微FPGA

国产FPGA中,紫光、安路、高云称得上是三小龙,其他的半斤八两,中科亿海微也算是其中之一。 其产品为亿海神针系列,如下: 可见其最小规模也有9.2KLUT,最大竟有136K之多了,对比其他国产&#xff0…

18、江科大stm32视频学习笔记——USART串口发送串口发送和接收

目录 一、USART串口发送 1、电路图 2、printf函数的移植方法 3、serial.c 4、main.c 5、解决直接写汉字,编译器报错 二 、USART串口发送和接收 1、查询实现 2、中断实现 (1)在Serial.c中添加的代码 (2)主函…

【Spring从入门到实战】第 4 讲:SpringAOP实现以及原理

本文已收录于专栏🌲《Spring从入门到实战》🌲专栏前言 大家好,我是执梗。本专栏将从Spring入门开始讲起,详细讲解各类配置的使用以及原因,到使用SpringBoot进行开发实战,旨在记录学习生活的同时也希望能帮到…

IDEA常用插件列表

一 背景 IDEA常用插件列表,用来提供工作效率。你都安装了吗 IntelliJ IDEA 默认安装并提供了非常多的工具,比如 Maven Integration、Markdown support、SSH Remote Run 等。其中有很多好用,但是不为人知的工具。 二 插件列表 阿里代码规约…

Linux基础命令大全(上)

♥️作者:小刘在C站 ♥️个人主页:小刘主页 ♥️每天分享云计算网络运维课堂笔记,努力不一定有收获,但一定会有收获加油!一起努力,共赴美好人生! ♥️夕阳下,是最美的绽放&#xff0…

pytorch-在竞赛中去摸索用法,用房价预测比赛了解数据处理流程

实战Kaggle比赛:房价预测 让我们动手实战一个Kaggle比赛:房价预测House Prices - Advanced Regression Techniques | Kaggle。本文将提供未经调优的数据的预处理、模型的设计和超参数的选择。通过动手操作、仔细观察实验现象、认真分析实验结果并不断调…

【算法入门】字符串基础

目录 一.字符串引言1.字符串基础二.洛谷P5734详解1.字符串相关库函数💫(1) strcpy函数 💫💫(2) strcat函数 💫💫(3)strstr函数 💫2.题…

JavaScript的事件传播机制

你在学习和编写JavaScript时可能听说过事件冒泡(event bubbling)。它会发生在多个元素存在嵌套关系,并且这些元素都注册了同一事件(例如click)的监听器时。 但是事件冒泡只是事件机制的一部分。它经常与事件捕获(event capturing)和事件传播…

ChatGPT的N种用法(持续更新中。。。)

目录前言一、语法更正二、文本翻译三、语言转换3-1、Python-->JAVA四、代码解释-1五、代码解释-2六、修复代码错误六、作为百科全书七、信息提取七、好友聊天八、创意生成器8-1、VR和密室结合8-2、再结合AR九、采访问题9-1、采访问题清单9-2、采访问题清单并给出相应答案十、…

2分钟彻底搞懂“高内聚,低耦合”

💗推荐阅读文章💗 🌸JavaSE系列🌸👉1️⃣《JavaSE系列教程》🌺MySQL系列🌺👉2️⃣《MySQL系列教程》🍀JavaWeb系列🍀👉3️⃣《JavaWeb系列教程》…

一个nginx的小项目,不写代码,实现在局域网内访问其他电脑的网页

准备工作 下载nginx //官网 https://nginx.org/en/download.html //直接下载 https://nginx.org/download/nginx-1.23.3.zip解压 下载一个html项目,或者自己随便写一个 我是直接下载的,然后使用的是第一个01 https://gitee.com/StarPort/HTML_CSSTe…

从SpringBoot生命周期来看服务注册到Eureka/Nacos的时机

文章目录服务注册入口1、Eureka2、Nacos总结服务注册入口 无论是将服务注册到哪种服务注册中心,服务注册的时机都是在AbstractApplicationContext#finishRefresh()方法中;即Spring容器加载完成、Web服务启动之后; 从SpringCloud规范来看&am…

C语言实现学生成绩管理系统思考

学生成绩管理系统思考 作业要求: 目录 思路 基本函数 学习理解大佬的代码: 完成作业: 思路 学生成绩管理系统,首先要初始化系统, 用C语言做学生实验管理系统要求实现对某班学生3门课程(包括语文、数…

Python 基础教程【2】:条件语句和循环语句

本文已收录于专栏🌻《Python 基础》文章目录1、流程控制语句1.1 顺序语句1.2 条件语句1.2.1 if语句注意事项1.2.2 三元运算符1.2.3 自动类型转换1.3 循环语句1.3.1 while 循环1.3.2 for-in 循环1.3.3 for...else 循环1.3.4 break 和 continue 的区别2、实践——猜数…
最新文章