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)
#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_f 和 board_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.h 到 include 目录下。
(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、重定位代码移植
- 设置栈指针
最终修改:
- 判断运行地址。
最终修改:
- 判断启动介质。
- 跳转 BL2 copy 函数。
最终修改结果:
3、清 bss 段移植
最终修改结果:
4、movi_bl2_copy 函数移植
(1) 从三星版本的 uboot 中复制 movi.c 和 movi.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 初始化和重定位功能都已经完美实现,后面就是第二阶段的继续移植了。
源自朱有鹏老师.
相关文章:

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(CONF…...

不用索引怎么优化百亿数据? | MySQL性能优化篇
文章目录数据库调优一、数据库调优原理1.1 为什么要进行MySQL数据库调优?1.2 什么影响数据库性能?1.3 数据库调优到底调什么?二、数据库压力测试2.1 什么是压测?2.2 JMeter简介2.3 驱动下载2.4 测试过程三、连接池3.1 压力测试连接…...

JavaScript(WebAPI)
目录 1.什么是Web API? 2.DOM和DOM树 3.获取元素 4.事件 5.操作元素 获取/修改元素内容 1.innerText 2. innerHTML 获取/修改元素属性 获取/修改表单元素属性 获取/修改样式属性 1.修改内联样式 2.修改元素应用的CSS类名 6.操作节点 新增节点 删除节点 7.案例…...

idea集成GitHub
设置 GitHub 账号绑定账号有两种方式:1. 通过授权登录2.如果上述登录不成功,用Token口令的方式登录,口令在github账号哪里生成,点击settings --->Developer settings --->pwrsonal access tokens ----> 复制口令到idea 口…...
软考高级信息系统项目管理师系列之四十一:项目组合管理
软考高级信息系统项目管理师系列之四十一:项目组合管理 一、项目组合管理内容二、项目组合管理基础概述1.项目组合定义及相关知识图2.项目组合、项目集和项目之间的关系3.项目组合模块具备的特征三、项目组合管理1.项目组合管理定义及要求2.不同级别管理之间的特性及关联3.项目…...

Spring——Spring整合Mybatis(XML和注解两种方式)
框架整合spring的目的:把该框架常用的工具对象交给spring管理,要用时从IOC容器中取mybatis对象。 在spring中应该管理的对象是sqlsessionfactory对象,工厂只允许被创建一次,所以需要创建一个工具类,把创建工厂的代码放在里面&…...

【专项训练】布隆过滤器和LRU缓存
布隆过滤器:与哈希表类似 哈希表是一个没有误差的数据结构! 有哈希函数得到index,会把要存的整个元素放在哈希表里面 有多少元素,每个元素有多大,所有的这些元素需要占的内存空间,在哈希表中都要找相应的内存大小给存起来 事实上,我们并不需要存所有的元素本身,而是只…...

从一道面试题看 TCP 的吞吐极限
分享一个 TCP 面试题:单条 TCP 流如何打满香港到旧金山的 320Gbps 专线?(补充,写成 400Gbps 更具迷惑性,但预测大多数人都会跑偏,320Gbps 也就白给了) 这个题目是上周帮一个朋友想的,建议他别问三次握手&a…...
rsync 的用法
rsync 介绍下 用法 rsync是一个常用的数据同步工具,它能够在本地和远程系统之间同步文件和目录。以下是rsync的基本用法: 同步本地文件夹: bash Copy code rsync -av /path/to/source /path/to/destination其中,-a表示归档模式&…...

【LeetCode每日一题:[面试题 17.05] 字母与数字-前缀和+Hash表】
题目描述 给定一个放有字母和数字的数组,找到最长的子数组,且包含的字母和数字的个数相同。 返回该子数组,若存在多个最长子数组,返回左端点下标值最小的子数组。若不存在这样的数组,返回一个空数组。 示例 1: 输入…...
华为OD机试题 - 简易压缩算法(JavaScript)| 机考必刷
更多题库,搜索引擎搜 梦想橡皮擦华为OD 👑👑👑 更多华为OD题库,搜 梦想橡皮擦 华为OD 👑👑👑 更多华为机考题库,搜 梦想橡皮擦华为OD 👑👑👑 华为OD机试题 最近更新的博客使用说明本篇题解:简易压缩算法题目输入输出示例一输入输出说明示例二输入输出说明…...

Kubenates中的日志收集方案ELK(下)
1、rpm安装Logstash wget https://artifacts.elastic.co/downloads/logstash/logstash-6.8.7.rpm yum install -y logstash-6.8.7.rpm2、创建syslog配置 input {beats{port> 5044 } }output {elasticsearch {hosts > ["http://localhost:9200"]index …...

LeetCode - 42 接雨水
目录 题目来源 题目描述 示例 提示 题目解析 算法源码 题目来源 42. 接雨水 - 力扣(LeetCode) 题目描述 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 示例1 输入&…...

python --生成时间序列,作为横轴的标签。时间跨越2008-2022年,生成每年的6-10月的第一天作为时间序列
python 生成制定的时间序列作为绘图时x轴的标签 问题需求 在绘图时,需要对于x轴的标签进行专门的设置,整体时间跨越2008年-2022年,将每年的6-10月的第一天生成一条时间序列,绘制成图。 解决思路 对于时间序列的生成࿰…...

【Unity VR开发】结合VRTK4.0:创建一个按钮(Togglr Button)
语录: 有人感激过你的善良吗,貌似他们只会得寸进尺。 前言: Toggle按钮是提供简单空间 UI 选项的另一种方式,在该选项中,按钮将保持其状态,直到再次单击它。这允许按钮处于激活状态或停用状态的情况&#…...

lottie-miniprogram在taro+vue的小程序中怎么使用
把一个json的动图展示在页面上。使用的是插件lottie-miniprogramhttps://blog.csdn.net/qq_33769914/article/details/128705922之前介绍过。但是发现使用在taro使用的时候他会报错。那可能是因为我们 wx.createSelectorQuery().select(#canvas).node(res > {console.log(re…...

C++回顾(二十二)—— stack容器 与 queue容器
22.1 stack容器 (1) stack容器简介 stack是堆栈容器,是一种“先进后出”的容器。stack是简单地装饰deque容器而成为另外的一种容器。添加头文件:#include <stack> (2)stack对象的默认构造 stack…...

逻辑优化基础-disjoint support decomposition
先遣兵 在了解 disjoint support decomposition 之前,先学习两个基本的概念。 disjoint 数学含义上的两个集合交集,所谓非相交,即交集为空集。 A∩BC⊘A \cap B C \oslash A∩BC⊘ support 逻辑综合中的 supportsupportsupport 概念是…...

保姆级使用PyTorch训练与评估自己的DaViT网络教程
文章目录前言0. 环境搭建&快速开始1. 数据集制作1.1 标签文件制作1.2 数据集划分1.3 数据集信息文件制作2. 修改参数文件3. 训练4. 评估5. 其他教程前言 项目地址:https://github.com/Fafa-DL/Awesome-Backbones 操作教程:https://www.bilibili.co…...
Java8新特性:Stream流处理使用总结
一. 概述 Stream流是Java8推出的、批量处理数据集合的新特性,在java.util.stream包下。结合着Java8同期推出的另一项新技术:行为参数化(包括函数式接口、Lambda表达式、方法引用等),Java语言吸收了函数式编程的语法特…...

wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...

Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...

如何应对敏捷转型中的团队阻力
应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中,明确沟通敏捷转型目的尤为关键,团队成员只有清晰理解转型背后的原因和利益,才能降低对变化的…...
多元隐函数 偏导公式
我们来推导隐函数 z z ( x , y ) z z(x, y) zz(x,y) 的偏导公式,给定一个隐函数关系: F ( x , y , z ( x , y ) ) 0 F(x, y, z(x, y)) 0 F(x,y,z(x,y))0 🧠 目标: 求 ∂ z ∂ x \frac{\partial z}{\partial x} ∂x∂z、 …...
【Java】Ajax 技术详解
文章目录 1. Filter 过滤器1.1 Filter 概述1.2 Filter 快速入门开发步骤:1.3 Filter 执行流程1.4 Filter 拦截路径配置1.5 过滤器链2. Listener 监听器2.1 Listener 概述2.2 ServletContextListener3. Ajax 技术3.1 Ajax 概述3.2 Ajax 快速入门服务端实现:客户端实现:4. Axi…...

使用ch340继电器完成随机断电测试
前言 如图所示是市面上常见的OTA压测继电器,通过ch340串口模块完成对继电器的分路控制,这里我编写了一个脚本方便对4路继电器的控制,可以设置开启时间,关闭时间,复位等功能 软件界面 在设备管理器查看串口号后&…...