高通平台启动过程
发布日期:2021-06-29 14:50:58 浏览次数:3 分类:技术文章

本文共 6413 字,大约阅读时间需要 21 分钟。

高通平台启动过程

高通CPU 启动流程介绍

Date: 2019/10/13

一、前言

1.CPU位数

在开机过程中,会从PBL (AArch32) 切换到 AArch 64 位。这个64位和32位的意思是,CPU的指令集的长度,现在CPU一般都是64位架构的。

同一套代码也可以根据客户的需求,配置为32 位或者 64位,一般来说64位比32位好,但内存占用肯定会更小。比如,如果做低端机或者非手机项目,客户要省成本,非要用小的flash ,那这样,就尽量用32位好些,当然性能会相对差。
这也说明了,所以马儿吃草或马儿跑 这两者是要权衡的。

注意: x86并不意味着就是CPU就是32位的。

x86 是指 x86指令集的意思,它包括了(IA32 和 IA64),
而所谓的32位和64位指的是CPU指令集的长度。

IA(Intel Architecture)英特尔体系结构、

IA-32架构下有32位CPU,也有64位架构 (我们常用的CPU一般都是这种的)。
IA-64 架构下只有 Intel64 的CPU(一般只有服务器使用),这种架构是Intel放弃IA32开发出来的,它不好往下兼容,也就是没兼32位。

X86架构是对这个系列的简称:

x86、x86-32、x86-64(AMD 64位CPU采用的技术)、x64(EM64T Intel在64位处理器采用的技术)、 老的32位包括(i0386、i0486、I0586、i0686)等。

还有一些其他的架构就是:

大学玩的 ARM单片机,它是ARM构构(也有对应的ARM 32位 和ARM 64位的区别)
Solaris 平台的sparc 架构, 及 IBM apple 的 PowerPC架构,

2.ELF Loading

EFL指的是镜像,在高通中加载模块镜像,都是靠前一个模块来加载或启动后一个模块的镜象来实现切换的,通过ELF 头信息,就能知道整个img镜像的布局信息,就知道镜像应该如何加载到内存什么位置。 ---------- 这个很重要,加载不好会导致没法开机

3.Watchdog Reset Debug

主要是用于系统稳定性问题分析,比如系统 crash 死机 ramdump 的功能实现,就靠它的。

二、高通平台CPU类型介绍

在我们平常所说的高通平台(比如 MSM8917,MSM8937,SDM450,SDM660,SDM855 等),或者苹果A12, 华为麒麟980等等,这些我们虽然叫CPU,但并不是只有一个CPU,实际上在它们内部是由很多CPU 共同协同工作的。

我们今天就是要介绍就是在一个平台中,这么多CPU 是如何协同工作的。

在这里插入图片描述

CPU类型如下:

1.APSS (Applications Processor Subsystem)

它就是我们平常说的主CPU处理器,比如 ARM Cortex-A53 或者 Qualcomm Kryo CPU(Kryo 目前只用在 SDM632 中).

它的启动地址是 0x00100000 (1 M)

2.RPM (Resource Power Manager)

主要负责电源管理相关的事务

芯片为ARM Cortex-M3,启动地址是0x002000000 (2 M) 物理地址,
(逻辑地址是指相对它内部的地址,逻辑地址还是0x00000000)

3.MPSS (Modem peripheral subsystem)OCIMEM

是 onchip memory,运行时作为RAM 使用,SBL运行时内存不够用时,会借用

芯片为Modem Qualcomm Hexagon DSP,启动地址可自定义配置,
在booloader 过程中加载的。
主要是对通迅相关业务的处理,比如打电话,发短信等 。

4.WCNSS (Wireless connectivity subsystem )

芯片为ARM9, 启动地址为 0x0 或者 0xFFFF0000 ,或者 自定义配置

主要负责wifi,bt 等无线相关的事宜

5.Low-power audio subsystem (LPASS)

LPASS 也就是我们做高通项目时常说的 ADSP

芯片为 LPASS Hexagon, 启动地址可 自定义配置
主要是对低功耗相关的处理,最初是audio 处理算法等,后面慢慢地新增了很多功能。
比如:后面我们要学习的传感器(比如光感、距感、重力传感器等等) ,在老平台,或者 MTK 平台,这些代码是在 Kernel 目录下的,现在高通的sensor 代码是放在 ADSP 目录下的。
主要的好处在于,省功耗,因为,如果放在Kenrel 目录下,好果计步器等等还在运行的话,是没法放CPU和 Flash休眠的。
但如果放在 ADSP 中,这样,在adsp 处理Audio 数据的间隙稍带处理下Sensor 数据,
当Sensor 工作时,就可以让 CPU 和 Flash 都进入休眠,此时 adsp 和 cache 是工作的,对比起来,功耗大大的减少了。

三、 高通启动过程介绍

在高通平台中,是有很多镜像,启动的顺序,保存的位置,及各个的功能均是不一样的。

如下:

1.APPS PBL ( Application Process Primary Boot Loader )

Cortex-A53( AArch32 ) core 1 / Qualcomm Kryo Silver core 1

启动地址为: APPS ROM( 0x00100000)高通ROM固件(固化代码),不是安卓镜像,高通芯片出产自带刷入的,用户或者开发者开法操件它。
主要作用为:
(1)枚举选择启动方式,识别Emmc
上电时自启动,通过查询对应的BootOption GPIO状态 或者fuse 知道当前硬件的启动方式(比如,是通过 USB 来启动,还是通过Flash Emmc 来启动)。
USB 启动的话,如果拿电脑举例 ,就是我们的 USB 启动盘了。
在高通中,当检测到要从USB 启动,或者 当前flash emmc 中是没有镜像时,当前高通板子就会修改USB 口,枚举出 9008 口用于镜像下载。

(2)Load加载SBL 镜像

从Flash emmc中加载并校验 SBL1 ELF镜像,通过ELF 头信息知道 应该如何将 SBL 镜像拆分加载到不同的内存区域(主要是 L2 TCM 和 RPM Code RAM 两块内存区域)。
加载完SBL镜像后,就把 PC 指针交给 SBL。

2.SBL1 ( Secondary boot loader Stage 1 )

Cortex-A53( AArch32 ) core / Qualcomm Kryo Silver core

是从emmc load 出来的image,load后分布在 L2 TCM 、OCIMEM、RPM Code RAM 两块内存区域。
L2 TCM 是系统运行起来后的二级缓存(Cache)
OCIMEM 是 onchip memory,运行时作为RAM 使用,SBL运行时内存不够用时,会借用该地址区。

主要作用:

(1) Memoey subsystem环境初始化,Buses,Clock,DDR(LPDDR3), CDT初始化
(PBL中没有DDR是可以运行的,但sbl 中一定要对DDR 做初始化,因为后续所有的镜像load都是load到 DDR中)
一般来说,几乎所有的DDR 相关问题的修Debug修改都是在SBL1 中做的,
除了DDR的频率的调整是在RPM 中做的。
(2)USB 初始三、 高通启动过程化,主要是实现RAM Dump功能,也就是我们的 900E 端口,其实就是在SBL1中实现坆举的。
(3)还包括USB 充电,开机温升检测,PMIC 等功能初始化

SBL1 执行完毕后,会把 PC 指针交给QTEE

3.QTEE Or TZ(trustzone)

Cortex-A53( AArch64 ) core / Qualcomm Kryo Silver core,运行在 eMMC LPDDR3 中

和安全相关的模块也是运行在A53 的环境中,主要功能就是初始化TrustZone bsp 模块,初始化可信任环境
(1)初始化secure run-time 全相关的环境。
(2)配置 xPU
(3)读取fuse 信息
(4)对各种子系统的 image 镜像做鉴权
扩展:
xPU是APU(Audio),BPU(人工智能相关),CPU,DPU(AI芯片DeepLearning),EPU(情绪合成引擎,其于MCU),FPU(浮点运算),GPU(图形处理),HPU(全息处理器),IPU(图像认知,视觉处理),MPU(微处理器),NPU(神经网络处理器),VPU(视觉处理器)

详细参考: https://baijiahao.baidu.com/s?id=1577211892337884082&wfr=spider&for=pc

4.DEVCFG

Cortex-A53( AArch64 ) core / Qualcomm Kryo Silver core,运行在 eMMC LPDDR3 中.

这部分代码是 TZ 4.0对外的接口,可以通过这个模块实现对 TrustZone 的配置。

而TZ4.0的代码大部分是不对外开放的,如果有相关的问题,只能提交case 给到高通,请他们协助分析。

5.Debug Policy

Cortex-A53( AArch32 ) core / Qualcomm Kryo Silver core,运行在 eMMC LPDDR3 中

这部分主要是调试使用的,Secure boot使能后,JTAG就会禁止使用,这个是fuse 决定的。

Debug Policy 就相当于提供了一个方法,这样在Secure boot 使能后,还能通过烧写image 的方式来使能 JTAG 调试功能。
这个模块必须在 TrustZone 启动并运行起来后才会生效的。
所以如果是 secure boot 使能的板子,如果SBL出问题了,由于TrustZone未启动,此时是没法通过JTAG 进行调试的。

6.RPM_FW

Contex-M3 运行在 eMMC RPM Code RAM中

RPM的代码实现,主要是Power、休眠唤醒和时钟相关的管理,
比如当系统申请休眠后,会投票给 RPM,由RPM 来检查是否是所有系统都申请休眠了,最终由 RPM 来对系统进行监管,此时系统所有的核都进入休眠了。
还有RPM 可以设置 DDR 的频率(最高频率,定频等)
还包括,可以配置各路 Power LDO 的电压值 等等
RPM_FW 是由 QTEE 来启动执行的,
RPM 启动起来后,我们的UART log 就可以正常打开调试了。

7.APPSBL or boot manager and OS loader

Cortex-A53( AArch32 ) core / Qualcomm Kryo Silver core,运行在 eMMC LPDDR3 中,注意此处LK是运行32位的,而此时CPU是64位指令集模式,也就是在64位指令集下运行32位指令。

此处也就是我们后面要说的fastboot,lk ,UEFI 相关的实现部分

主要功能如下:
(1)支持屏幕驱动,能够点亮屏幕
(2)加载 和 验证 Kernel 镜像(boot.img),随后将 PC 指针给到 Kerner 当中。
PBL 和 SBL 是只运行在 AArch32 模式下的。

8.HLOS(High-level Operating System)

Cortex-A53( AArch64/32 ) core / Qualcomm Kryo Silver core,运行在 eMMC LPDDR3 中,可以根据需求配置系统是 32位 或 64位的。

HLOS就是我们所说的Android 系统、或 Windows Mobile 系统等等

此时,我们Cortex-A53的多核就打开了,之前启动过程中,A53用的几乎只有 core 1 核心,现在 A53的8核,这样系统的吞吐量,性能相关的都打开了。
此时系统Android界面就出来了。

9.Modem PBL

Modem Hexagon 运行在 Modem ROM and Hexagon TCM (data and stack)中。

在这么多子系统中,只有Modem 是有独立 PBL(Primary Boot Loader)的。
其主要的功能如下:
(1)在Modem ROM中建立初始化Heaxagon TCM内存
(2)从LPDDR3中拷贝 MBA 到Heaxagon TCM中, MBA 是Modem 的加密校验模块,负责校验后面的Modem模块是否安全。

10.Modem boot authenticator MBA

Modem Hexagon 运行在 eMMC Hexagon TCM中

(1)校验后面的Modem模块是否安全
(2)配置Modem 的secure 环境

11.Modem、Wifi、LPASS 的启动

在HLOS 启动完成到一定阶段后,会对它的子系统模块先load image 操作 ,然后告诉对应的子系统image的地址,接着各子系统就知道从哪里去执行image,随后HLOS发出一个解复位操作,让子系统正式跑起来,

AMSS modem、WCNSS image 和 LPASS image 这三个模块的子系统。

系统启动框图

在这里插入图片描述

EL0, EL1, EL2, EL3 是在Cortex ARM中Execution Level执行等级区分,EL0 是最低等级,EL3 是最高等级。

我们后面的 Warm Reset 就必须在EL3 最高等级中做,不同的Level 中执行不同的image 或操作。

在这里插入图片描述

从上图可以看出

APP PBL/ SBL/ APPSBL 这三个模块是运行在 AArch32 位模式下的
TZ 和 HLOS 是可根据用户需求选择运行在 32 或 64 模式下的。
这样势必涉及到 32 位转64位的过程,这个就是QTEE工作的。

QTEE : SBL ==> TZ启动工作流程

QTEE 是指从 PBL 跳转到 TZ 的中间过程,它有单独的入口代码。

详细过程如下:
(1)PBL 和 SBL 是只运行在 AArch32 模式下的。

(2)通过解析SBL1 的头信息,可以知道接下来要运行的是32位TZ还是64位TZ:

(3)如果系统是32位指令集的话,整个初始化流程为:

SBL 会先将指针交给 QTEE镜像入口,然后由QTEE加载并启运TZ。
APPS PBL ==> SBL ==> QTEE ==>TZ ==> APPSBL ==> HLOS

(4)如果系统是64位指令集的话,在进入TZ 前要做一个WarmReset,流程如下:

SBL 会更新reset address, remaps secure path(TZ PC指针入口) 给 QTEE,然后启动一个WarmReset(CPU Core 1),然后切换CPU到64位模式。
然后CPU Reset 完毕后,PC 指针会指向QTEE 入口,运行QTEE镜像,最终通过QTEE将指针交给 TZ ,正式启运TZ
APPS PBL ==> SBL ==> [ Warm Reset ] ==> QTEE ==> TZ ==> APPSBL ==> HLOS

转载地址:https://ciellee.blog.csdn.net/article/details/102720283 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:2019年11月 生活记录&总结
下一篇:理解 Audio 音频系统三 之 [2] AudioFlinger --- AudioThread

发表评论

最新留言

表示我来过!
[***.240.166.169]2024年04月21日 17时02分29秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章