当前位置: 首页 > news >正文

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

在这里插入图片描述


源自朱有鹏老师.

相关文章:

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月的第一天生成一条时间序列,绘制成图。 解决思路 对于时间序列的生成&#xff0…...

【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容器 &#xff08;1&#xff09; stack容器简介 stack是堆栈容器&#xff0c;是一种“先进后出”的容器。stack是简单地装饰deque容器而成为另外的一种容器。添加头文件&#xff1a;#include <stack> &#xff08;2&#xff09;stack对象的默认构造 stack…...

逻辑优化基础-disjoint support decomposition

先遣兵 在了解 disjoint support decomposition 之前&#xff0c;先学习两个基本的概念。 disjoint 数学含义上的两个集合交集&#xff0c;所谓非相交&#xff0c;即交集为空集。 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. 其他教程前言 项目地址&#xff1a;https://github.com/Fafa-DL/Awesome-Backbones 操作教程&#xff1a;https://www.bilibili.co…...

Java8新特性:Stream流处理使用总结

一. 概述 Stream流是Java8推出的、批量处理数据集合的新特性&#xff0c;在java.util.stream包下。结合着Java8同期推出的另一项新技术&#xff1a;行为参数化&#xff08;包括函数式接口、Lambda表达式、方法引用等&#xff09;&#xff0c;Java语言吸收了函数式编程的语法特…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件

在选煤厂、化工厂、钢铁厂等过程生产型企业&#xff0c;其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进&#xff0c;需提前预防假检、错检、漏检&#xff0c;推动智慧生产运维系统数据的流动和现场赋能应用。同时&#xff0c;…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版​分享

平时用 iPhone 的时候&#xff0c;难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵&#xff0c;或者买了二手 iPhone 却被原来的 iCloud 账号锁住&#xff0c;这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日&#xff0c;中天合创屋面分布式光伏发电项目顺利并网发电&#xff0c;该项目位于内蒙古自治区鄂尔多斯市乌审旗&#xff0c;项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站&#xff0c;总装机容量为9.96MWp。 项目投运后&#xff0c;每年可节约标煤3670…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

基于SpringBoot在线拍卖系统的设计和实现

摘 要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统&#xff0c;主要的模块包括管理员&#xff1b;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)

考察一般的三次多项式&#xff0c;以r为参数&#xff1a; p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]&#xff1b; 此多项式的根为&#xff1a; 尽管看起来这个多项式是特殊的&#xff0c;其实一般的三次多项式都是可以通过线性变换化为这个形式…...

JavaScript 数据类型详解

JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型&#xff08;Primitive&#xff09; 和 对象类型&#xff08;Object&#xff09; 两大类&#xff0c;共 8 种&#xff08;ES11&#xff09;&#xff1a; 一、原始类型&#xff08;7种&#xff09; 1. undefined 定…...

MySQL:分区的基本使用

目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区&#xff08;Partitioning&#xff09;是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分&#xff08;分区&#xff09;可以独立存储、管理和优化&#xff0c;…...

python爬虫——气象数据爬取

一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用&#xff1a; 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests&#xff1a;发送 …...