高通SDX12平台 启动流程梳理

1. 高通平台CPU类型介绍

通常我们所说的CPU如高通平台MSM8998、苹果A12, 华为海思平台(麒麟980、990)等,这些我们虽然叫CPU,但并不是只有一个CPU,实际上是一个芯片组,在芯片组内部有很多CPU 协同工作的。不同处理器的子系统有:
图1 X12芯片组

图2 其他芯片组

1.1 APSS (Applications Processor Subsystem)

APSS是我们常说的主CPU处理器,比如 ARM Cortex-A7,主频可达1.28GHz,它的启动地址是 0x00100000 (1 M)。

1.2 RPM (Resource Power Manager)

RPM主要负责电源管理相关的事务,比如ARM Cortex-M3,主频可达300MHz,它的启动地址是0x002000000 (2 M)。

1.3 MPSS /Modem(Modem peripheral subsystem)

主要负责通迅相关业务的处理,比如打电话、发短信、数据业务等 。如Modem Qualcomm Hexagon DSP6,主频可达1GHz,启动地址可自定义配置。

1.4 WCNSS (Wireless connectivity subsystem )

主要负责wifi,bt 等无线相关的事宜。如ARM9, 启动地址为 0x0 或者 0xFFFF0000 ,或自定义配置。

1.5 LPASS (Low-power audio subsystem)

主要负责低功耗相关的处理,最初是audio 处理算法等,后面慢慢地新增了很多功能。如LPASS Hexagon, 启动地址可自定义配置。

2. 高通启动过程介绍

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


2.1 APPS PBL ( Application Process Primary Boot Loader )

APPS PBL是芯片厂商固化的应用程序,高通芯片出厂自带刷入的,用户或者开发者无法操件它。当芯片复位的时候,芯片会执行内部ROM固化的PBL,PBL执行的目的就是加载SBL并运行。这段程序,我们无法看到其内部代码。

主要作用是:

(1)启动设备和接口检测,支持紧急模式下载;

上电时自启动,通过查询对应的BootOption GPIO状态 或者fuse,知道当前硬件的启动方式(比如,是通过 USB 来启动,还是通过Flash eMMC/NAND来启动)。USB 启动的话,如果拿电脑举例 ,就是我们的 USB 启动盘。在高通中,当检测到要从USB 启动,或者当前Flash eMMC/NAND中是没有镜像时,当前高通板子就会修改USB 口,枚举出 9008 口用于镜像下载。

(2) 加载和验证TCM(Tightly-Coupled Memory)和OCIMEM(On-Chip Internal Memory)的SBL可执行片段。

从Flash eMMC/NAND中加载并校验 SBL1 ELF镜像,通过ELF 头信息知道应该如何将 SBL 镜像拆分加载到不同的内存区域(主要是 L2 TCM 和 RPM Code RAM 两块内存区域)。加载完SBL镜像后,就把 PC 指针交给 SBL,SBL会输出PBL相关的调用关系和对应函数的执行时间,如下图可以查看当前PBL执行时间约为116.718ms:

2.2 XBL(eXtensible Boot Loader/Secondary bootloader)

XBL是扩展引导加载程序(加载会被细分为SBL1、SBL2、SBL3等),受PBL引导加载至内存中,主要工作是对硬件环境初始化,并从flash中加载RPM、QSEE等镜像至内存中并执行其初始化。在该阶段会进行项目、板级、器件等区分,并将区分的信息通过数据结构传递至ABL。

XBL阶段的初始化入口为sbl1_main_ctl,函数的调用位于汇编文件中(文件为:sdx12\boot_images\core\boot\secboot3\hw\mdm\sbl1\sbl1.S),函数调用如下所示:

sbl1_main_ctl实现位于sdx12\boot_images\core\boot\secboot3\hw\mdm\sbl1\sbl1_mc.c,其代码执行流程如下所示:

首先配置MMU的寄存器信息,并读取PBL部分的相关启动信息在后续加载完log机制后进行打印输出。之后对当前阶段的内存进行初始化,读取平台信息,对DAL进行初始化,对硬件初始化(配置pmic设备、温度传感器等;),最后调用SBL阶段总的入口处理函数boot_config_process_bl(),函数通过循环调用boot_config_process_entry来跳转sbl1_config_table数组中的有效成员(加载rpm、app等镜像)。sbl1_config_table中包含了SBL->DEVCFG\APDP\QSEE\RPM\EFS1\EFS2\EFS3\APPSBL\ACDB\MBA\Q6 Modem\AVS.MDSP\APPS等配置,部分内容如下所示:

上图中需要关注的字段主要有load(是否要加载该镜像)、exec(镜像是否要立即执行)、jump(是否执行跳转程序跳转到对应image的入口执行程序)、exec_func(镜像的入口函数)、jump_func(镜像的调整函数)、pre_procs(镜像的pre执行函数)、post_procs(镜像的post执行函数)、boot_load_cancel(取消加载)、target_img_str(打印字符串,在执行相关镜像操作时会打印打印当前在加载哪个镜像)。

在boot_config_process_entry函数中通过判断sbl1_config_table数组各成员的load参数是否为TRUE来打印“Image Load, Start”。

对于boot_config_process_bl()函数的执行逻辑如下图所示:

2.2.1 SBL1 ( Secondary boot loader Stage 1 )

运行在L2 TCM 和 RPM Code RAM 两块内存区域,和内存子系统初始化相关的模块均由Cortex-A7 来处理。

主要作用:

(1) 初始化memory子系统(总线,DDR,时钟,CDT);
PBL中没有DDR是可以运行的,但SBL中一定要对DDR 做初始化,因为后续所有的镜像load都是load到 DDR中)。一般来说,几乎所有的DDR 相关问题的修改都是在SBL1 中做的,除了DDR的频率的调整是在RPM 中做。

(2) 加载和认证TrustZone 、RPM、MBA、APPSBL、modem镜像;

(3) 内存dump,保存看门狗调试信息;

(4) 开机温升检测,PMIC驱动加载和初始化;

(5) DDR配置等。

2.2.2 QTEE Or TZ(trustzone)

运行在 eMMC/NAND LPDDR2 中,和安全相关的模块是由Cortex-A7 来处理,主要功能就是初始化TrustZone bsp 模块,初始化可信任环境。

(1)初始化secure run-time 相关的执行环境;

(2)配置 xPU;

(3)读取fuse 信息;

(4)对各种子系统的 image 镜像做鉴权。

2.2.3 RPM_FW

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

2.2.4 APPSBL

运行在 eMMC/NAND LPDDR2 中,注意此处LK是运行32位的,而此时CPU是64位指令集模式,也就是在64位指令集下运行32位指令。此处也就是我们后面要说的fastboot,lk ,UEFI 相关的实现部分。主要功能是加载和验证Kernel 镜像(boot.img),随后将 PC 指针给到 Kernel 当中。PBL 和 SBL 是只运行在 AArch32 模式下的。

2.2.5 Modem PBL

Modem Hexagon 运行在 Modem ROM and Hexagon TCM (data and stack)中。在这么多子系统中,只有Modem 是有独立 PBL(Primary Boot Loader)的。
其主要的功能如下:

(1)在Modem ROM中建立初始化Heaxagon TCM内存

(2)从LPDDR2中加载MBA 到Heaxagon TCM中;

(3) MBA 是Modem 的加密校验模块,负责校验后面的Modem模块是否安全

2.2.6 MBA(Modem boot authenticator)

Modem Hexagon 运行在 MSS Hexagon TCM中。
其主要功能如下:

(1)校验后面的Modem模块是否安全

(2)配置Modem 的secure 环境

2.3 Kernel加载

内核启动流程如下所示:

启动入口位于“sdx12\apps_proc\kernel\msm-5.4\arch\arm64\kernel\head.S”文件中,最终调用start_kernel()函数执行kernel的加载,函数位于“kernel\msm-5.4\init\main.c”文件中,函数逻辑如下所示:

内核启动的流程如下图所示:




高通SDX12平台:启动流程梳理相关推荐

  1. 高通SDX12平台:LINUX上MBIM功能异常

    高通SDX12平台 LINUX上MBIM功能异常 1. 问题描述 按照高通SDX12平台产品规格,其支持RMNET.ECM.RNDIS.PPP.MBIM等拨号:但经测试,发现Windos下MBIM功能 ...

  2. 基于高通sdx12平台,简单介绍编译(bitbake)

    高通sdx12平台:bitbake 编译介绍 Audio machine.platform.dai等单独编译介绍 新添加bb文件 编译介绍 1.编译环境配置脚本 Audio machine.platf ...

  3. 高通简单的启动流程说明

    高通的启动流程较MTK稍微复杂一点,大体阶段如下: 一.系统上电后加载rom里面的一段代码,其实这个过程就是PBL,此处也是启动的开始,假如此处枚举不出来启动,也就是我们常说的救机其实也就是从此处进行 ...

  4. 高通SDX12平台PCIe驱动dtsi解析

    &soc {pcie0: qcom,pcie@1c00000 {compatible = "qcom,pci-msm"; //设备节点的compatible属性,用来匹配驱 ...

  5. 高通SDX12:ProSLIC Si32185移植调试

    一.SLIC业务流程图 本次在高通SDX12平台上支持语音芯片Si32185大致流程如下: 驱动部分直接放在Kernel中,通过SPI注册设备创建字符节点,与硬件建立连接 注册设备成功并在audio_ ...

  6. 高通SDX12:USB3.0驱动初始化代码分析

    1. Code Overview 高通SDX12平台使用synopsys dwc3的USB3.0控制器IP.早期的初始化是分两部分进行的,一个在高通官方提供的驱动中初始化,位于kernel/msm-5 ...

  7. 高通SDX12:基于sgm4151x的充电IC代码架构

    基于高通SDX12平台的充电功能代码可分为LK阶段和Kernel阶段 一.LK阶段 通常,lk阶段的充电逻辑被用于实现关机充电功能 首先,在/bootable/bootloader/lk/kernel ...

  8. android_驱动_qcom_【高通SDM660平台】(4) --- Camera Init 初始化流程

    [高通SDM660平台]Camera Init 初始化流程 一.Camera 系统架构 二.Camera Init 初始化流程 2.1 CameraService 启动 2.2 CameraServi ...

  9. 高通SM4350平台指纹移植流程

    本文总结了高通sm4350平台指纹移植流程,厂家一般会提供移植文档,本文档可作为补充: 准备工作: 1.把指纹模组扣到主板上的SPI连接器上 2.高通sm4350平台,Android R版本全代码,全 ...

最新文章

  1. windows下git bash乱码问题
  2. vue.js 2.0实现的简单分页
  3. altium 去掉部分铺铜_干货|HFSS器件导入Altium进行PCB制作教程!!!
  4. dotnet Blazor 用 C# 控制界面行为
  5. 您不知道Bash:Bash阵列简介
  6. Linux meson + ninja编译安装源码(八)
  7. 如何用PS缩小图片而清晰度不变?
  8. OrCAD多页原理图器件按页编号的设置
  9. 超级万能计算机在线应用,超级万能计算器手机版
  10. 手把手教你做一个APP应用(含源码)
  11. 数学笔记——导数1(导数的基本概念)
  12. Https网址在线安全检测网站
  13. Win10设置添加来宾账户的方法
  14. 【POJ3281】Dining 网络流
  15. Sql Server 2008 R2 清理内存的三种方法
  16. python地形图渲染_地形渲染之彩色地形图(Painted Relief Map)
  17. iOS 应用创建APNS 和 VOIP的pem证书流程
  18. C/C++中的日期和时间 TIME_T与STRUCT TM转换
  19. python报时功能_wxPython实现整点报时
  20. 利用AD创建封装,并导入立创EDA

热门文章

  1. 在那之后,我决定做一个出色的打工仔!
  2. 守护游戏安全,保障开发权益丨客户案例
  3. 争做“拼购村” 中国“家电之都”有了新致富路
  4. 在程序中如何区分汉字和英语
  5. ios上safari的事件模型(一)
  6. “放心消费”宣言传递正品心智,网易考拉8.16大促首日获用户好评
  7. 3步破解windows7 登陆密码
  8. 教你如何快速识别好固态硬盘?
  9. 前端工程师必备:前端的模块化
  10. 90个外国英文网站强力推荐 (转)