ARM uboot源码分析2-启动第一阶段

news2024/11/29 4:36:23

一、start.S 解析5

在这里插入图片描述

注释的中文含义:
当我们已经在 RAM 中运行时,我们不需要重新定位 U-Boot。实际上,在 U-Boot 在 RAM 中运行之前,必须配置内存控制器。


1、判断当前代码执行位置

(1) lowlevel_init.S 的 110-115 行。

(2) 这几行代码的作用,就是判定当前代码执行的位置在芯片内部 SRAM 中还是在 DDR 内存中。
为什么要做这个判定?

原因1:BL1(uboot 的前一部分)在 SRAM 中有一份,在 DDR 中也会有一份(从 SRAM 中copy 过去的)。因此如果是冷启动,那么当前代码应该是在 SRAM 中运行的 BL1;如果是低功耗状态的复位,这时候应该就是在 DDR 中运行的。

原因2:我们判定 “当前运行代码的地址” 是有用的,可以指导后面代码的运行。譬如在 lowlevel_init.S 中判定当前代码的运行地址,就是为了确定:要不要执行 “时钟初始化和初始化 DDR” 的代码。如果当前代码是在 SRAM 中,说明是冷启动,那么时钟和 DDR 都需要初始化;如果当前代码是在 DDR 内存中,那么说明是热启动,则时钟和 DDR 都不用再次初始化。


(3) bic r1, pc, r0 这句代码的意义是:将 pc 的值中的某些 bit 位清0,剩下一些特殊的 bit 位赋值给 r1( r0 中为 1 的那些位清零)相等于:r1 = pc & ~(ff000fff)
ldr r2, _TEXT_BASE 加载链接地址到 r2,然后将 r2 的相应位清 0 ,剩下特定的位。

在这里插入图片描述


(4) 最后比较 r1 和 r2.

总结:这一段代码是通过读取当前运行地址和链接地址,然后处理两个地址后对比是否相等,来判定当前运行是在 SRAM中(如果不相等)还是 DDR 中(如果相等)。从而决定是否跳过下面的时钟和 DDR 初始化。


2、system_clock_init

在这里插入图片描述

(1) 搜索 system_clock_init,确定这个函数就在当前文件的 205 行,一直到 第385 行。这个初始化时钟的过程和裸机中初始化的过程一样的,只是更加完整而且是用汇编代码写的。

在这里插入图片描述


(2) 在 x210_sd.h 中 300 行到 428 行,都是和时钟相关的配置值。这些宏定义就决定了 210 的时钟配置是多少。也就是说代码在 lowlevel_init.S 中都写好了,但是代码的设置值都被宏定义在 x210_sd.h 中了。因此,如果移植时需要更改 CPU 的时钟设置,根本不需要动代码,只需要在 x210_sd.h 中更改配置值即可。

在这里插入图片描述

时钟频率的参数宏,来自于《S5PV210_UM_REV1.1.pdf》文档。
在这里插入图片描述


二、start.S 解析6

在这里插入图片描述

1、mem_ctrl_asm_init

(1) 该函数用来初始化 DDR。

(2) 函数位置在 uboot/cpu/s5pc11x/s5pc110/cpu_init.S 文件中。

(3) 该函数和裸机中初始化 DDR 代码是一样的。实际上裸机中初始化 DDR 的代码就是从这里抄的。配置值也可以从这里抄,但是当时我自己根据理解+抄袭整出来的一份。


在这里插入图片描述

在这里插入图片描述

(4) 配置值中其他配置值参考裸机中的解释即可明白,有一个和裸机中讲的不一样。

DMC0_MEMCONFIG_0,在裸机中配置值为 0x20E01323;在 uboot 中配置为 0x30F01313 . 这个配置不同就导致结果不同。

在 裸机中,DMC0 的 256MB 内存地址范围是 0x20000000-0x2FFFFFFF;
在uboot中,DMC0 的 256MB 内存地址范围为 0x30000000-0x3FFFFFFF。

(DMC1 的配置都是一样的,0x4000,0000 ~ 0x4FFF,FFFF,一共 256M。)

在这里插入图片描述


(5) 之前在裸机中时,配置为 2 开头的地址,当时并没有说可以配置为 3 开头的地址。从分析九鼎移植的 uboot 可以看出:DMC0 上允许的地址范围是 0x2000,0000 ~ 0x3FFF,FFFF(一共是512MB),而我们实际只接了 256MB 物理内存,SoC 允许我们给这 256MB 挑选地址范围。

在这里插入图片描述


(6) 总结一下:在 uboot 中,可用的物理地址范围为:0x30000000 ~ 0x4FFFFFFF。一共512MB,其中 0x3000,0000 ~ 0x3FFF,FFFF 为 DMC0,0x4000,0000 ~ 0x4FFF,FFFF为 DMC1。

(7) 我们需要的内存配置值在 x210_sd.h 的 438 行到 468 行之间。分析的时候要注意条件编译的条件,配置头文件中考虑了不同时钟配置下的内存配置值,这个的主要目的是让不同时钟需求的客户都能找到合适自己的内存配置值。
在这里插入图片描述


(8) 在 uboot 中 DMC0 和 DMC1 都工作了。所以在裸机中,只要把 uboot 中的配置值和配置代码全部移植过去,应该是能够让 DMC0 和 DMC1 都工作的。


2、uart_asm_init

在这里插入图片描述

(1) 这个函数用来初始化串口。

(2) 初始化完了后通过串口发送了一个’O’ 字符。

在这里插入图片描述


3、tzpc_init

在这里插入图片描述

(1) trust zone初始化,没搞过,不管。


4、pop {pc} 以返回

在这里插入图片描述

(1) 返回前通过串口打印 ‘K’ 字符。


分析:lowlevel_init.S 执行完如果没错误,那么就会串口打印出 “OK” 字样。这应该是我们 uboot 中看到的最早的输出信息。


源自朱有鹏老师.

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

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

相关文章

5年经验之谈:月薪3000到30000,测试工程师的变“行”记!

自我介绍下,我是一名转IT测试人,我的专业是化学,去化工厂实习才发现这专业的坑人之处,化学试剂害人不浅,有毒,易燃易爆,实验室经常用丙酮,甲醇,四氯化碳,接触…

ESP32 Arduino(十二)lvgl移植使用

一、简介LVGL全程LittleVGL,是一个轻量化的,开源的,用于嵌入式GUI设计的图形库。并且配合LVGL模拟器,可以在电脑对界面进行编辑显示,测试通过后再移植进嵌入式设备中,实现高效的项目开发。SquareLine Studi…

RMI攻击中的ServerClient相互攻击反制

前言 前文中,我们分析了攻击Registry的两种方式,这里我们接着前面的内容,分析Server和Client的相互攻击方式。 Attacked Server Attacked By Client 首先我们搭建个示例,这里直接注册端和服务端放置在一起。 package pers.rm…

JS 实现抛物线动画案例

相信大家都有浏览过,很多购物网站购物车的添加商品动画,今天,我们就手写一个简单的抛物线动画,先上案例: 一、绘制页面 我们这里简单实现,一个按钮,一个购物车图标,样式这里直接跳过…

GNN图神经网络原理解析

一、GNN基本概念 1. 图的基本组成 图神经网络的核心就是进行图模型搭建,图是由点和边组成的。在计算机处理时,通常将数据以向量的形式进行存储。因此,在存储图时,就会有点的向量,点与点之间边的向量,全局…

Acwing---1235. 付账问题

付账问题1.题目2.基本思想3.代码实现1.题目 几个人一起出去吃饭是常有的事。 但在结帐的时候,常常会出现一些争执。 现在有 nnn个人出去吃饭,他们总共消费了 SSS元。 其中第 iii 个人带了 aiaiai元。 幸运的是,所有人带的钱的总数是足够…

vue解决跨域问题-反向代理

浏览器有同源策略,限制同协议、同域名、同端口,只要有一项不一致,就是跨域。(不同源则跨域) 解决方案: 后端 、cors 、 jsonp、 反向代理 同源下:浏览器向服务器请求数据,服务器响应…

jenkins +docker+python接口自动化之docker下安装jenkins(一)

jenkins dockerpython接口自动化之docker下安装jenkins(一) 目录:导读 1、下载jenkins 2、启动jenkins 3、访问jenkins 4.浏览器直接访问http://ip/:8080 5.然后粘贴到输入框中,之后新手入门中先安装默认的插件即可,完成后出…

俄罗斯方块游戏代码

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

图表控件LightningChart .NET再破世界纪录,支持实时可视化 1 万亿个数据点

LightningChart.NET SDK 是一款高性能数据可视化插件工具,由数据可视化软件组件和工具类组成,可支持基于 Windows 的用户界面框架(Windows Presentation Foundation)、Windows 通用应用平台(Universal Windows Platfor…

数据可视化大屏百度地图绘制行政区域标注实战案例解析(个性化地图、标注、视频、控件、定位、检索)

百度地图开发系列目录 数据可视化大屏应急管理综合指挥调度系统完整案例详解(PHP-API、Echarts、百度地图)数据可视化大屏百度地图API开发:停车场分布标注和检索静态版百度地图高级开发:map.getDistance计算多点之间的距离并输入…

元宵晚会节目预告没有岳云鹏,是不敢透露还是另有隐情

在刚刚结束的元宵节晚会上,德云社的岳云鹏,再一次参加并引起轰动,并获得了观众朋友们的一致好评。 不过有细心的网友发现,早前央视元宵晚会节目预告,并没有看到小岳岳,难道是不敢提前透露,怕公布…

TCP 三次握手和四次挥手

✏️作者:银河罐头 📋系列专栏:JavaEE 🌲“种一棵树最好的时间是十年前,其次是现在” 目录TCP 建立连接(三次握手)为啥不能是 4 次?为啥不能是 2 次?三次握手的意义:TCP 断开连接(四…

前端报表如何实现无预览打印解决方案或静默打印

在前端开发中,除了将数据呈现后,我们往往需要为用户提供,打印,导出等能力,导出是为了存档或是二次分析,而打印则因为很多单据需要打印出来作为主要的单据来进行下一环节的票据支撑, 而前端打印可…

Android Binder机制之一(简介)

目录 前言 一、Android 进程间通信方式 二、Binder架构图 三、Binder涉及角色 3.1 Binder驱动 3.2 Binder实体 3.3 Binder引用 3.4 远程服务 3.5 ServiceManager守护进程 四、涉及源码 前言 这是本人第N次看Binder 相关知识了,其实每次看都有新的收获&…

Docker搭建本地私有仓库

目录 一、本地私有仓库的优点 二、Docker搭建本地私有仓库 2.1、首先下载 registry 镜像 2.2、在 daemon.json 文件中添加私有镜像仓库地址 2.3、运行 registry 容器 2.4、Docker容器的重启策略 2.5、为镜像打标签 2.6、上传到私有仓库 2.7、私有仓库的 centos 镜像有…

Cubox是什么应用?如何将Cubox同步至Notion、语雀、在线文档中

Cubox是什么应用? Cubox 是一款跨平台的网络收藏工具,通过浏览器扩展、客户端、手机应用、微信转发等方式,将网页、文字、图片、语音、视频、文件等内容保存起来,再经过自动整理、标签、分类之后,就可以随时阅读、搜索…

02- pandas 数据库 (数据库)

pandas 数据库重点: pandas 的主要数据结构: Series (一维数据)与 DataFrame (二维数据)。 pd.DataFrame(data np.random.randint(0,151,size (5,3)), # 生成pandas数据 index [Danial,Brandon,softpo,Ella,Cindy], # 行索引 …

windeployqt实现一键打包

每次发布QT程序前,都必须要在命令行环境下运行windeployqt 工具进行打包,加载相关的lib文件,才能正常运行。但是在命令行模式下,每次都要手动输入windeployqt的目录,和应用程序的位置目录,效率非常低,见下图: 那QT有没有什么好用的工具可以避免这个问题呢,认真找了一下…

前端如何实现将多页数据合并导出到Excel单Sheet页解决方案|内附代码

前端与数据展示 前后端分离是当前比较盛行的开发模式,它使项目的分工更加明确,后端负责处理、存储数据;前端负责显示数据.前端和后端开发人员通过接口进行数据的交换。因此前端最重要的能力是需要将数据呈现给用户后,与终端用户进行交互。 在前端拿到数…