python h5网站开发/seo入门培训班
对于i.MX平台上的SPL来说,其不会直接跳转到Uboot,而是在SPL阶段借助BOOTROM跳转到ATF,然后再通过ATF跳转到Uboot。
board_init_f
会初始化设备相关的硬件,最后进入board_init_r
为镜像跳转做准备。下面是board_init_r
调用的核心函数流程,接下来我们会对其中的函数进行详细分析。
spl_board_init //board/freescale/imx93_evk/spl.c
board_boot_order(spl_boot_list)//spl_boot_device获取SPL启动设备 arch/arm/mach-imx/imx8/cpu.c
spl_boot_device//arch/arm/mach-imx/spl.c->spl_board_boot_device//board/freescale/imx93_evk/spl.c
spl_return_to_bootrom
board_return_to_bootrom//arch/arm/mach-imx/spl_imx_romapi.c
1、spl_board_init
对于i.MX93芯片来说,spl_board_init
启动ELE了引擎。这里不对ELE进行详细分析。
//board/freescale/imx93_evk/spl.c
void spl_board_init(void)
{int ret;puts("Normal Boot\n");ret = ahab_start_rng();if (ret)printf("Fail to start RNG: %d\n", ret);
}
2、board_boot_order
spl_boot_device
根据boot配置获取当前的启动设备。对于使用SCU的芯片需要特殊处理BOOT_DEVICE_SPI
类型的设备。
//arch/arm/mach-imx/imx8/cpu.c,适用于93
void board_boot_order(u32 *spl_boot_list)
{spl_boot_list[0] = spl_boot_device();if (spl_boot_list[0] == BOOT_DEVICE_SPI) {/* Check whether we own the flexspi0, if not, use NOR boot */if (!sc_rm_is_resource_owned(-1, SC_R_FSPI_0))spl_boot_list[0] = BOOT_DEVICE_NOR;}
}
从spl_board_boot_device
函数内容可以看出,i.MX8以及i.MX9系列芯片的SPL跳转皆是由BOOTROM辅助实现的,因为这里直接返回了BOOT_DEVICE_BOOTROM
。
//arch/arm/mach-imx/spl.c
u32 spl_boot_device(void)
{enum boot_device boot_device_spl = get_boot_device();return spl_board_boot_device(boot_device_spl);
}int spl_board_boot_device(enum boot_device boot_dev_spl)
{
#ifdef CONFIG_SPL_BOOTROM_SUPPORTreturn BOOT_DEVICE_BOOTROM;
#elseswitch (boot_dev_spl) {case SD1_BOOT:case MMC1_BOOT:return BOOT_DEVICE_MMC1;case SD2_BOOT:case MMC2_BOOT:return BOOT_DEVICE_MMC2;default:return BOOT_DEVICE_NONE;}
#endif
}
3、spl_return_to_bootrom
由于上面返回的boot设备是BOOT_DEVICE_BOOTROM
,因此这里各家定义的board_return_to_bootrom
用于辅助跳转。
通过ROM API查询当前的启动设备和启动阶段,启动阶段可以分为Primary boot
,Secondary boot
,Recovery boot
和USB boot
,打印对应的启动阶段信息,最后使用ROM API将Uboot搬运到DDR的对应位置。
int board_return_to_bootrom(struct spl_image_info *spl_image,struct spl_boot_device *bootdev)
{volatile gd_t *pgd = gd;int ret;u32 boot, bstage;ret = g_rom_api->query_boot_infor(QUERY_BT_DEV, &boot,((uintptr_t)&boot) ^ QUERY_BT_DEV);ret |= g_rom_api->query_boot_infor(QUERY_BT_STAGE, &bstage,((uintptr_t)&bstage) ^ QUERY_BT_STAGE);set_gd(pgd);if (ret != ROM_API_OKAY) {puts("ROMAPI: failure at query_boot_info\n");return -1;}printf("Boot Stage: ");switch (bstage) {case BT_STAGE_PRIMARY:printf("Primary boot\n");break;case BT_STAGE_SECONDARY:printf("Secondary boot\n");break;case BT_STAGE_RECOVERY:printf("Recovery boot\n");break;case BT_STAGE_USB:printf("USB boot\n");break;default:printf("Unknow (0x%x)\n", bstage);}//USB下载模式if (is_boot_from_stream_device(boot))return spl_romapi_load_image_stream(spl_image, bootdev);return spl_romapi_load_image_seekable(spl_image, bootdev, boot);
}
4、spl_romapi_load_image_seekable
下面我们将分析ROM API是如何将Uboot搬运到指定位置的。
-
通过
query_boot_infor
查询IVT的偏移量、pagesize和image_offset。 -
获取header的位置
header = (struct image_header *)(CONFIG_SPL_IMX_ROMAPI_LOADADDR);//0x48000000 内存地址
-
获取Uboot在MMC介质中的偏移量,将其存储在offset(0x41400)中。
offset = spl_romapi_get_uboot_base(image_offset, rom_bt_dev);ulong spl_romapi_get_uboot_base(u32 image_offset, u32 rom_bt_dev) {ulong end;image_offset = spl_arch_boot_image_offset(image_offset, rom_bt_dev);end = get_imageset_end((void *)(ulong)image_offset, ROM_API_DEV);end = ROUND(end, SZ_1K);printf("Load image from 0x%lx by ROM_API\n", end);return end; }
-
使用
download_image
函数从MMC中的0x41400
处下载header信息到DDR中的0x48000000
处,后续需要对header里的信息进行判断(image_get_magic(header) == FDT_MAGIC
)。这个header由mkimage_imx8.c
写入。g_rom_api->download_image((u8 *)header, offset, size,((uintptr_t)header) ^ offset ^ size);
-
设置其他固件的信息,对于93/8ulp来说调用的是
spl_load_imx_container
函数,其余芯片为spl_load_simple_fit
函数。spl_load_simple_fit
这个函数会解析itb文件,获取里面的配置信息,填充spl_image_info
和spl_load_info
中的信息,加载ATF做好跳转之前的准备。
5、spl_load_simple_fit
在进入之前,设置了load.read
为spl_romapi_read_seekable
,然后spl_simple_fit_read
会调用传入的read函数和上一节而最后读取到内存的header读取整个fit固件。这个是后续读取固件的核心函数。
if (IS_ENABLED(CONFIG_SPL_LOAD_FIT) && image_get_magic(header) == FDT_MAGIC) {struct spl_load_info load;memset(&load, 0, sizeof(load));load.bl_len = pagesize;load.read = spl_romapi_read_seekable;load.priv = &pagesize;return spl_load_simple_fit(spl_image, &load, offset / pagesize, header);
}
spl_load_simple_fit_fix_load
使用ROM API读取itb到内存中,然后解析/configurations
节点,其中的default
配置名称和images
的偏移量。
5.1、解析uboot
解析默认config(config-1)下面的firmware
所指向的名称,这里解析出"uboot-1"
,然后返回出这个uboot节点在itb文件中的偏移量。一个config只有一个firmware,可以是uboot也可以是kernel,其余均为external数据。
spl_load_fit_image
根据解析出的加载地址,将u-boot-nodtb.bin
放到加载地址处。然后填充spl_image_info
中的load_addr
等信息。
#define FIT_FIRMWARE_PROP "firmware"
node = spl_fit_get_image_node(&ctx, FIT_FIRMWARE_PROP, 0);ret = spl_load_fit_image(info, sector, &ctx, node, spl_image);
5.2、解析fdt
spl_fit_append_fdt
首先也是解析出its中关于设备树的相关信息,然后使用fdt_overlay_apply_verbose->fdt_overlay_apply
将its中需要overlay的部分覆盖进原始dtb中。
if (os_takes_devicetree(spl_image->os)) {ret = spl_fit_append_fdt(spl_image, info, sector, &ctx);
}
overlay dtb格式1:
/dts-v1/;
/plugin/;/ {fragment@0 {target-path = "/";__overlay__ {/*在此添加要插入的节点*/.......};};fragment@1 {target = <&XXXXX>;__overlay__ {/*在此添加要插入的节点*/.......};};.......};
overlay dtb格式2:
/dts-v1/;
/plugin/;&{/} {/*此处在根节点"/"下,添加要插入的节点或者属性*/
};&XXXXX {/*此处在节点"XXXXX"下,添加要插入的节点或者属性*/
};
5.3、解析loadables
和解析加载uboot类似,先找到its节点中的信息,然后根据这些信息将atf和tee放到指定位置。
for (; ; index++) {uint8_t os_type = IH_OS_INVALID;node = spl_fit_get_image_node(&ctx, "loadables", index);image_info.load_addr = 0;ret = spl_load_fit_image(info, sector, &ctx, node, &image_info);/* Record our loadables into the FDT */if (spl_image->fdt_addr)spl_fit_record_loadable(&ctx, index,spl_image->fdt_addr,&image_info);}
如果firmware属性中未定义entry值,那么将第一个loadables的entry作为跳转入口(spl_image->entry_point
)。从its中我们可以知道,第一个loadables就是atf。
6、跳转至ATF
直接跳转进spl_image->entry_point
所定义的地址,也就是进入ATF中。
arch/arm/mach-imx/spl.c
/** +------------+ 0x0 (DDR_UIMAGE_START) -* | Header | |* +------------+ 0x40 |* | | |* | | |* | | |* | | |* | Image Data | |* . | |* . | > Stuff to be authenticated ----+* . | | |* | | | |* | | | |* +------------+ | |* | | | |* | Fill Data | | |* | | | |* +------------+ Align to ALIGN_SIZE | |* | IVT | | |* +------------+ + IVT_SIZE - |* | | |* | CSF DATA | <---------------------------------------------------------+* | |* +------------+* | |* | Fill Data |* | |* +------------+ + CSF_PAD_SIZE*/__weak void __noreturn jump_to_image_no_args(struct spl_image_info *spl_image)
{typedef void __noreturn (*image_entry_noargs_t)(void);uint32_t offset;image_entry_noargs_t image_entry =(image_entry_noargs_t)(unsigned long)spl_image->entry_point;debug("image entry point: 0x%lX\n", spl_image->entry_point);if (spl_image->flags & SPL_FIT_FOUND) {image_entry();} else {/** HAB looks for the CSF at the end of the authenticated* data therefore, we need to subtract the size of the* CSF from the actual filesize*/offset = spl_image->size - CONFIG_CSF_SIZE;if (!imx_hab_authenticate_image(spl_image->load_addr,offset + IVT_SIZE +CSF_PAD_SIZE, offset)) {image_entry();} else {panic("spl: ERROR: image authentication fail\n");}}
}
附录1:its表
/dts-v1/;/ {description = "Configuration to load ATF before U-Boot";#address-cells = <1>;images {uboot-1 {description = "U-Boot (64-bit)";data = /incbin/("u-boot-nodtb.bin");type = "standalone";arch = "arm64";compression = "none";load = <0x40200000>;};fdt-1 {description = "evk";data = /incbin/("evk.dtb");type = "flat_dt";compression = "none";};atf-1 {description = "ARM Trusted Firmware";data = /incbin/("bl31.bin");type = "firmware";arch = "arm64";compression = "none";load = <0x00970000>;entry = <0x00970000>;};tee-1 {description = "TEE firmware";data = /incbin/("tee.bin");type = "firmware";arch = "arm64";compression = "none";load = <0x56000000>;entry = <0x56000000>;};};configurations {default = "config-1";config-1 {description = "evk";firmware = "uboot-1";loadables = "atf-1", "tee-1";fdt = "fdt-1";};};
};
附录2:启动log
i.MX93
U-Boot SPL 2022.04-lf_v2022.04+g1734965341 (Jun 30 2023 - 10:23:49 +0000)
SOC: 0xa0009300
LC: 0x40010
M33 prepare ok
>>SPL: board_init_r()
spl_init
Normal Boot
Trying to boot from BOOTROM
Boot Stage: Primary boot
image offset 0x0, pagesize 0x200, ivt offset 0x0
Load image from 0x41400 by ROM_API
Unsupported OS image.. Jumping nevertheless..
image entry point: 0x204e0000
i.MX8MP
U-Boot SPL 2023.04-lf_v2023.04+gaf7d004eaf (Aug 14 2023 - 03:48:45 +0000)
DDRINFO: start DRAM init
DDRINFO: DRAM rate 4000MTS
DDRINFO:ddrphy calibration done
DDRINFO: ddrmix config done
>>SPL: board_init_r()
spl_init
SEC0: RNG instantiated
Normal Boot
Trying to boot from BOOTROM
Boot Stage: Primary boot
image offset 0x0, pagesize 0x200, ivt offset 0x0
Jumping to U-Boot...
image entry point: 0x970000
相关文章:

【精读Uboot】SPL阶段的board_init_r详细分析
对于i.MX平台上的SPL来说,其不会直接跳转到Uboot,而是在SPL阶段借助BOOTROM跳转到ATF,然后再通过ATF跳转到Uboot。 board_init_f会初始化设备相关的硬件,最后进入board_init_r为镜像跳转做准备。下面是board_init_r调用的核心函数…...

canvas绘制渐变色三角形金字塔
项目需求:需要绘制渐变色三角形金字塔,并用折线添加标识 (其实所有直接用图片放上去也行,但是ui没切图,我也懒得找她要,正好也没啥事,直接自己用代码绘制算了,总结一句就是闲的) 最终效果如下图: (以上没用任何图片,都是代码绘制的) 在网上找了,有用canvas绘…...

企业电子招标采购系统源码Spring Boot + Mybatis + Redis + Layui + 前后端分离 构建企业电子招采平台之立项流程图
功能模块: 待办消息,招标公告,中标公告,信息发布 描述: 全过程数字化采购管理,打造从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。通供应商门户具备内外协同的能力,为外部供…...

Debain JDK8 安装
Debain JDK8 安装 首先请安装依赖: sudo apt-get update && sudo apt-get install -y wget apt-transport-https然后信任 GPG 公钥: wget -O - https://packages.adoptium.net/artifactory/api/gpg/key/public | sudo tee /etc/apt/keyrings/…...

Python序列操作指南:列表、字符串和元组的基本用法和操作
文章目录 序列列表创建列表访问元素修改元素添加和删除元素 range()字符串创建字符串访问字符字符串切片修改字符串 元组创建元组访问元素获取元素数量元组的特点: 可变对象改变对象的值改变变量的指向比较运算符总结 python精品专栏推荐python基础知识(…...

【已更新代码图表】2023数学建模国赛E题python代码--黄河水沙监测数据分析
E 题 黄河水沙监测数据分析 黄河是中华民族的母亲河。研究黄河水沙通量的变化规律对沿黄流域的环境治理、气候变 化和人民生活的影响,以及对优化黄河流域水资源分配、协调人地关系、调水调沙、防洪减灾 等方面都具有重要的理论指导意义。 附件 1 给出了位于小浪底水…...

【前端】CSS-Grid网格布局
目录 一、grid布局是什么二、grid布局的属性三、容器属性1、display①、语句②、属性值 2、grid-template-columns属性、grid-template-rows属性①、定义②、属性值1)、固定的列宽和行高2)、repeat()函数3)、auto-fill关键字4)、f…...

计算机竞赛 基于深度学习的动物识别 - 卷积神经网络 机器视觉 图像识别
文章目录 0 前言1 背景2 算法原理2.1 动物识别方法概况2.2 常用的网络模型2.2.1 B-CNN2.2.2 SSD 3 SSD动物目标检测流程4 实现效果5 部分相关代码5.1 数据预处理5.2 构建卷积神经网络5.3 tensorflow计算图可视化5.4 网络模型训练5.5 对猫狗图像进行2分类 6 最后 0 前言 &#…...

2023-9-8 求组合数(二)
题目链接:求组合数 II #include <iostream> #include <algorithm>using namespace std;typedef long long LL; const int mod 1e9 7; const int N 100010;// 阶乘,阶乘的逆 int fact[N], infact[N];LL qmi(int a, int k, int p) {int res…...

k8s service的一些特性
文章目录 Service分发负载的策略同一端口通过不同协议暴露Headless Service的负载分发策略 Service分发负载的策略 大家都知道,一个service可以对应多个pod,那么一定要有一些方法来把service接收到的请求(负载)转发到pod上。 一般…...

C++中std::enable_if和SFINAE介绍
作为一个标准的C++模板类,我们先看下enable_if的定义: // STRUCT TEMPLATE enable_if template <bool _Test, class _Ty = void> struct enable_if {}; // no member "type" when !_Testtemplate <class _Ty> struct enable_if<true, _Ty> { //…...
华为OD机考算法题:数字加减游戏
目录 题目部分 解读与分析 代码实现 题目部分 题目数字加减游戏难度难题目说明小明在玩一个数字加减游戏,只使用加法或者减法,将一个数字 s 变成数字 t 。 每个回合,小明可以用当前的数字加上或减去一个数字。 现在有两种数字可以用来加减…...

WPF命令
在设计良好的Windows应用程序中,应用程序逻辑不应位于事件处理程序中,而应在更高层的方法中编写代码。其中的每个方法都代表单独的应用程序任务。每个任务可能依赖其他库。 使用这种设计最明显的方式是在需要的地方添加事件处理程序,并使用各…...

Unity中Shader的屏幕抓取 GrabPass
文章目录 前言一、抓取1、抓取指令2、在使用抓取的屏幕前,需要像使用属性一样定义一下,_GrabTexture这个名字是Unity定义好的 前言 Unity中Shader的屏幕抓取 GrabPass 一、抓取 1、抓取指令 屏幕的抓取需要使用一个Pass GrabPass{} GrabPass{“NAME”} 2、在使用…...

手撕 队列
队列的基本概念 只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出 入队列:进行插入操作的一端称为队尾 出队列:进行删除操作的一端称为队头 队列用链表实现 队列的实现 队列的定义 队列…...

【autodl/linux配环境心得:conda/本地配cuda,cudnn及pytorch心得】-未完成
linux配环境心得:conda/本地配cuda,cudnn及pytorch心得 我们服务器遇到的大多数找不到包的问题一,服务器安装cuda和cudnn使用conda在线安装cuda和cudnn使用conda进行本地安装检查conda安装的cuda和cudnn本地直接安装cuda和cudnn方法一&#x…...

macOS Ventura 13.5.2(22G91)发布,附黑/白苹果镜像下载地址
系统介绍(下载请百度搜索:黑果魏叔) 黑果魏叔 9 月 8 日消息,苹果今日向 Mac 电脑用户推送了 macOS 13.5.2 更新(内部版本号:22G91),本次更新距离上次发布隔了 21 天。 本次更新查…...

vue 子组件向父组件传递参数 子传父
子组件中写: this.$emit(RowCount,res.data.RowCount); 父组件中写: getMFGLRowCount(val){ //父组件中的方法: 接收子组件传过来的参数值赋值给父组件的变量 //this.totalCount val; alert("这…...

自然语言处理学习笔记(八)———— 准确率
目录 1.准确率定义 2.混淆矩阵与TP/FN/FP/TN 3. 精确率 4.召回率 5.F1值 6.中文分词的P、R、F1计算 7.实现 1.准确率定义 准确率是用来衡量一个系统的准确程度的值,可以理解为一系列评测指标。当预测与答案的数量相等时,准确率指的是系统做出正确判…...

Matlab 如何选择窗函数和 FFT 的长度
Matlab 如何选择窗函数和 FFT 的长度 1、常用的四种窗函数 对于实际信号序列,如何选取窗函数呢?一般来说,选择第一旁瓣衰减大,旁瓣峰值衰减快的窗函数有利于緩解截断过程中产生的頻泄漏问题。但具有这两个特性的窗函数࿰…...

node.js下载安装环境配置以及快速使用
目录 一、下载 二、安装 三、测试安装是否成功 四、配置环境 五、测试配置环境是否成功 六、安装淘宝镜像 七、快速上手 1、建立一个自己的工作目录 2、下载工作代码 八、各种配置文件匹配问题入坑 九、总结 一、下载 Node.js 中文网 想选择其他版本或者其他系统使用…...

使用栈检查括号的合法性 C 实现
使用栈检查括号的合法性 思路讲解:首先从数组数组0下标开始,如果是左括号直接无脑压入栈,直到出现右括号开始判断合法与否。遇到右括号分两种情况,第一种是空栈的情况,也就是说我们第一个字符就是右括号,那…...

小白备战大厂算法笔试(四)——哈希表
文章目录 哈希表常用操作简单实现冲突与扩容链式地址开放寻址线性探测多次哈希 哈希表 哈希表,又称散列表,其通过建立键 key 与值 value 之间的映射,实现高效的元素查询。具体而言,我们向哈希表输入一个键 key ,则可以…...

云原生Kubernetes:pod基础
目录 一、理论 1.pod 2.pod容器分类 3.镜像拉取策略(image PullPolicy) 二、实验 1.Pod容器的分类 2.镜像拉取策略 三、问题 1.apiVersion 报错 2.pod v1版本资源未注册 3.取行显示指定pod信息 四、总结 一、理论 1.pod (1) 概念 Pod是ku…...

Ansys Zemax | 手机镜头设计 - 第 3 部分:使用 STAR 模块和 ZOS-API 进行 STOP 分析
本文是 3 篇系列文章的一部分,该系列文章将讨论智能手机镜头模组设计的挑战,从概念、设计到制造和结构变形的分析。本文是三部分系列的第三部分。它涵盖了使用 Ansys Zemax OpticStudio Enterprise 版本提供的 STAR 技术对智能手机镜头进行自动的结构、热…...

CSP-J初赛复习大题整理笔记
本篇全是整理,为比赛准备. 在这里插入代码片 #include<cstdio> using namespace std; int n, m; int a[100], b[100];int main() {scanf_s("%d%d", &n, &m);for (int i 1; i < n; i)a[i] b[i] 0;//将两个数组清0,这…...

面试题 ⑤
1、TCP与UDP的区别 UDPTCP是否连接无连接,即刻传输面向连接,三次握手是否可靠不可靠传输,网络波动拥堵也不会减缓传输可靠传输,使用流量控制和拥塞控制连接对象个数支持一对一,一对多,多对一和多对多交互通…...

硅谷课堂1
文章目录 P1 项目概述P2—P12 MybatisPlus知识回顾P8 MybatisPlus实现逻辑删除P9 QueryWrapper使用P14 项目后端模块介绍P15 项目后端环境搭建P50—P53 整合腾讯云对象存储1、整合腾讯2、腾讯云示例3、讲师头像上传-后端代码P54—P60 课堂分类管理1、课堂分类查询2、课程分类导…...

第6节-PhotoShop基础课程-认识选区
文章目录 前言1.认识选区1.选区原理1.普通选区2.高级选区 2.功能用途1.抠图2.修图3.调色 3.关键操作(手术与屠宰的区别)2.加选(shift 是快捷键)3.减选(Alt是快捷键)4.交集(2,3合起来…...

SQLServer如何获取客户端IP
SQLServer如何获取客户端IP 很多用户询问如何通过SQLServer获取客户端IP从而定位一些问题,比如链接泄露,其实主要是利用几个相关视图,如下给出一些SQL方便用户排查 当前链接 SELECT CONNECTIONPROPERTY(PROTOCOL_TYPE) AS PROTOCOL_TYPE,CO…...