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

news2024/12/25 1:28:46

一、添加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.coloradmin.cn/o/403940.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CNCF x Alibaba云原生技术公开课 【重要】第九章 应用存储和持久化数据卷:核心知识

1、Pod Volumes 场景 同一个pod中的某个容器异常退出,kubelet重新拉起来,保证容器之前产生数据没丢同一个pod的多个容器共享数据 常见类型 本地存储,常用的有 emptydir/hostpath;网络存储:网络存储当前的实现方式有两…

2021年我国半导体分立器件市场规模已达3037亿元,国内功率半导体需求持续快速增长

半导体分立器件是由单个半导体晶体管构成的具有独立、完整功能的器件。例如:二极管、三极管、双极型功率晶体管(GTR)、晶闸管(可控硅)、场效应晶体管(结型场效应晶体管、MOSFET)、IGBT、IGCT、发光二极管、敏感器件等。半导体分立器件制造,指单个的半导体…

proteus I2C Debugger 查看 AT24C02写入读取

I2C Debugger仪器,在仿真调试期中,该仪器可以显示I2C数据传送时间、S(START状态)、Sr(ReStart状态)、A(Ask响应)、N (No ask状态)、P(Stop状态)、…

中值滤波+Matlab仿真+频域响应分析

中值滤波 文章目录中值滤波理解中值滤波的过程Matlab 实现实际应用频域分析中值滤波是一种滤波算法,其目的是去除信号中的噪声,而不会对信号本身造成太大的影响。它的原理非常简单:对于一个给定的窗口大小,将窗口内的数值排序&…

【C++进阶】四、红黑树(三)

目录 一、红黑树的概念 二、红黑树的性质 三、红黑树节点的定义 四、红黑树的插入 五、红黑树的验证 六、红黑树与AVL树的比较 七、完整代码 一、红黑树的概念 红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可…

嵌入式安防监控项目——html框架分析和环境信息刷新到网页

目录 一、html控制LED 二、模拟数据上传到html 一、html控制LED 简单来说就是html给boa服务器发了一个控制指令信息,然后boa转发给cgi进程,cgi通过消息队列和主进程通信。主进程再去启动LED子线程。 这是老师给的工程。 以前学32都有这工具那工具来管…

导航技术调研(CSDN_0023_20221217)

文章编号:CSDN_0023_20221217 目录 1. 惯性导航 2. 组合导航技术 3. 卡尔曼滤波 1. 惯性导航 惯性导航系统(INS-Inertial Navigation System)是上个世纪初发展起来的。惯性导航是一种先进的导航方法,但实现导航定位的原理却非常简单,它是…

RHCSA-用户和组管理和文件系统权限(3.11)

目录 用户(UID) 用户类别(UID): 用户的增删改查: 修改用户密码: 查看用户是否存在: 组(GID) 组的增删改查: 设置组密码: 用户…

idea集成GitHub

设置 GitHub 账号绑定账号有两种方式:1. 通过授权登录2.如果上述登录不成功,用Token口令的方式登录,口令在github账号哪里生成,点击settings --->Developer settings --->pwrsonal access tokens ----> 复制口令到idea 口…

设置cpp-httplib 服务器模式模式下的线程池大小 以及如何增加默认处理函数 以便能够实现http请求转发

先说说默认的创建的线程池数量 原因是某天调试在gdb调试下 一启动程序发现 开启了好多线程 如下图 因为我们程序 没几个线程 数了下 居然有60多个线程 不需要那么多 所以看下 httplib的源码 构造函数的时候 设置了最大线程池数量 看下这个宏 然后打印了下 发现 居然那么大 …

FusionCompute安装和配置步骤

1. 先去华为官网下载FusionCompute的镜像 下载地址:https://support.huawei.com/enterprise/zh/distributed-storage/fusioncompute-pid-8576912/software/251713663?idAbsPathfixnode01%7C22658044%7C7919788%7C9856606%7C21462752%7C8576912 下载后放在D盘中&am…

【rabbitmq 实现延迟消息-插件版本安装(docker环境)】

一:插件简介 在rabbitmq 3.5.7及以上的版本提供了一个插件(rabbitmq-delayed-message-exchange)来实现延迟队列功能。同时插件依赖Erlang/OPT 18.0及以上。 二:插件安装 1:选择适合自己安装mq 版本的插件&#xff1…

设计模式---抽象工厂模式

目录 1 介绍 2 优缺点 3 实现 1 介绍 抽象工厂模式(Abstract Factory Pattern) 是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 在抽象工厂模式中,接口是负…

ROC和AUC

目录 ROC AUC ROC ROC曲线是Receiver Operating Characteristic Curve的简称,中文名为"受试者工作特征曲线"。ROC曲线的横坐标为假阳性率(False Postive Rate, FPR);纵坐标为真阳性率(True Positive Rate, TPR).FPR和TPR的计算方法分别为 F…

Spring——案例-业务层接口执行效率和AOP通知获取数据+AOP总结

执行时间获取:记录开始时间和结束时间,取差值。 这里使用环绕通知来实现。 环境准备: 项目文件结构: 业务层接口和实现类: 数据层: 采用mybatis注解开发,这里没有实现类,直接在接口方法里面实现映射。 domain层: 实现了数据库里面每一个…

Altium designer--软件简介及安装教程(Altium designer16)

一、软件介绍(完整安装包资源见文末链接,含破解license) Altium Designer 是一款简单易用、原生3D设计增强的一体化设计环境,结合了原理图、ECAD库、规则和限制条件、BoM、供应链管理、ECO流程和世界一流的PCB设计工具。通过原理…

Baumer工业相机中曝光与增益两种功能的优点和作用以及使用方法

项目场景 Baumer工业相机堡盟相机是一种高性能、高质量的工业相机,可用于各种应用场景,如物体检测、计数和识别、运动分析和图像处理。 Baumer的万兆网相机拥有出色的图像处理性能,可以实时传输高分辨率图像。此外,该相机还具有…

[NOIP2009 提高组] 最优贸易(C++,tarjan,topo,DP)

题目描述 $C 国有国有国有 n 个大城市和个大城市和个大城市和 m$ 条道路,每条道路连接这 nnn个城市中的某两个城市。任意两个城市之间最多只有一条道路直接相连。这 mmm 条道路中有一部分为单向通行的道路,一部分为双向通行的道路,双向通行的…

OpenHarmony通过MQTT连接 “改版后的华为IoT平台”

一、前言 本篇文章我们使用的是BearPi-HM_Nano开发板:小熊派的主板+E53_IA1扩展板 源码用的是D6_iot_cloud_oc,点击下载BearPi-HM_Nano全量源码 那么为什么要写这篇呢? 前段时间看到OpenHarmony群里,经常有小伙伴问接入华为IoT平台的问题,他们无法正常连接到华为IoT平台等…

【数据结构】二叉树相关OJ题

文章目录一、单值二叉树二、检查两颗树是否相同三、判断一棵树是否为另一颗树的子树四、对称二叉树五、二叉树的前序遍历六、二叉树中序遍历七、二叉树的后序遍历八、二叉树的构建及遍历一、单值二叉树 单值二叉树 题目描述 如果二叉树每个节点都具有相同的值,那…