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

ARMV8 RK3399 u-boot TPL启动流程分析 --start.S

上电后运行的第一支文件:arch/arm/cpu/armv8/start.S

CONFIG_ENABLE_ARM_SOC_BOOT0_HOOK=1

#include <asm/arch/boot0.h>

跳转到 arch/arm/include/asm/arch-rockchip/boot0.h

CONFIG_SPL_BUILD=1

b 1f

ROCKCHIP_EARLYRETURN_TO_BROM=no

TINY_FRAMEWORK=no

b reset

reset 位于 arch/arm/cpu/armv8/start.S

b save_boot_params

save_boot_params 位于arch/arm/mach-rockchip/bootrom.c

Rockchip BROM 有设置stackpointer, 此处可以正常运行c code

1. ret = setjmp(brom_ctx);

setjmp 位于arch/arm/lib/setjmp_aarch64.S

该函数将regs 保存到brom_ctx, 注意

a.此处需将brom_ctx强制声明为data section, bss 还未初始化,初始化时会将其清掉

b. 保存的LR等于save_boot_params的返回地址,即save_boot_params_ret

c. mov x0, #0 => ret 等于0

2. check_back_to_brom_dnl_flag

CONFIG_ROCKCHIP_BOOT_MODE_REG 0xff320300

BROM_BOOTSOURCE_ID_ADDR = no

return false

goto save_boot_params_ret

3. 设置中断向量相关,根据当前EL级别跳转到3,2,1

CONFIG_POSITION_INDEPENDENT=n

CONFIG_SYS_RESET_SCTRL=n

	adr	x0, vectorsswitch_el x1, 3f, 2f, 1f
3:	msr	vbar_el3, x0mrs	x0, scr_el3orr	x0, x0, #0xf			/* SCR_EL3.NS|IRQ|FIQ|EA */msr	scr_el3, x0msr	cptr_el3, xzr			/* Enable FP/SIMD */
#ifdef COUNTER_FREQUENCYldr	x0, =COUNTER_FREQUENCYmsr	cntfrq_el0, x0			/* Initialize CNTFRQ */
#endifb	0f

4 cache 相关设置

CONFIG_SYS_ICACHE_OFF=n

    mov x1, #CR_Iswitch_el x2, 3f, 2f, 1f
3:	mrs	x0, sctlr_el3orr	x0, x0, x1msr	sctlr_el3, x0
#ifndef CONFIG_SUPPORT_USBPLUGmsr	daifclr, #4			/* Enable SError. SCR_EL3.EA=1 was already set in start.S */
#endifb	0f...0:isb

5 SMP 相关设置

CONFIG_ARMV8_SET_SMPEN=n, 跳过这段

6

/* Apply ARM core specific erratas */

bl apply_core_errata //arm 相关errata, 暂不具体分析

/* Processor specific initialization */

bl lowlevel_init  //RK3399 没有相关定义,使用start.S 中的weak function

CONFIG_IRQ=1

CONFIG_GICV3=1

7 如下都是n, 跳过分析

CONFIG_ARMV8_SPIN_TABLE=n

CONFIG_ARMV8_MULTIENTRY=n

CONFIG_ARM_SMP=n

master_cpu:

bl _main //至此跳转到arch/arm/lib/crt0.S,

http://www.xdnf.cn/news/5413.html

相关文章:

  • TypeScript 装饰器详解
  • 论文阅读与写作:《从探索到突破:解密科研和论文写作的思维密码》
  • 17.【.NET 8 实战--孢子记账--从单体到微服务--转向微服务】--微服务基础工具与技术--loki
  • Stream流
  • 一周内学完计算机网络课程之二:计算机网络物理层的理解
  • STM32智能窗帘系统:从零到一的开发实战
  • 如何租用服务器并通过ssh连接远程服务器终端
  • 【计算机网络01】 网络组成与三种交换方式
  • Web 实时通信技术:WebSocket 与 Server-Sent Events (SSE) 深入解析
  • 【RAG】11种Chunking Strategies分块策略介绍和选择
  • VirtualBox中安装并运行ubuntu-24.04.2-desktop虚拟机
  • Linux基础整理
  • Docker Compose 完全指南:从入门到生产实践
  • java的Stream流处理
  • 数据库事务以及JDBC实现事务
  • 模型欠拟合是什么?
  • 基于VSCode + PlatformIO平台的ESP8266的DS1302实时时钟
  • AI日报 · 2025年05月11日|传闻 OpenAI 考虑推出 ChatGPT “永久”订阅模式
  • Linux中常见开发工具简单介绍
  • 05.three官方示例+编辑器+AI快速学习three.js webgl - animation - skinning - ik
  • Three.js + React 实战系列 - 职业经历区实现解析 Experience 组件✨(互动动作 + 3D 角色 + 点击切换动画)
  • MySql(进阶)
  • 【大模型】AI智能体Coze 知识库从使用到实战详解
  • 基于Dify实现对Excel的数据分析
  • 嵌入式硬件篇---陀螺仪|PID
  • Linux之进程概念
  • 电源架构与太阳能充电器电路设计分析
  • OpenWrt开发第8篇:树莓派开发板做无线接入点
  • langchain 接入国内搜索api——百度AI搜索
  • Qt 样式表:全面解析与应用指南