1、前言
1.1编写背景
最近在解决MIFI关机状态下充电去logo的问题时跟踪了一下开机流程也查阅了一些资料,决定做下记录,巩固MDM9x35平台知识的学习,加深对高通9635平台的了解,也为同样在学习高通该平台启动流程的人做参考。起初硬着头皮分析代码,看了些天发现还是一头雾水,被9x35的架构给套住了,总是以之前高通其它平台的原理去想9x35平台的问题,最后一点点分析高通文档,再结合代码才勉强搞清楚了9635平台软件的大致架构。
1.2概述
本文档简要的介绍了高通MDM9x35的启动流程,通过阅读读者可以大致的了解9x35平台是如何正常启动起来的。由于能力有限,加上写作功底欠佳,其中难免会有错误之处,恳请指正,如有误导大家之处,恳请谅解。
1.3定义与缩写
本文档中使用的术语如表1-1术语表所示,大多为高通的缩略词
|
解释、含义 |
|
|
RPM |
Resource Power Manager(资源电源管理子系统) |
|
APPS |
Applications(应用子系统) |
|
Modem |
调制解调(基带)处理子系统 |
|
ADSP |
Advanced Digital Signal Processor(数字信号处理器) |
|
PBL |
Primary Bootloader(主引导加载程序) |
|
SBL |
Second Bootloader(二级引导加载程序) |
|
SDI |
System Debug Image(系统debug镜像) |
|
TZ |
TrustZone(信任区) |
|
MBA |
Modem Boot Authenticator(调制解调器引导认证) |
|
AMSS |
Advanced Mobile Subscriber Software(高通自己的操作系统) |
|
LPASS |
Low Power Audio SubSystem(低功耗音频子系统) |
|
SMEM |
shared memory(共享内存) |
|
L2 TCM |
Tightly-Coupled Memory(紧耦合内存) |
|
HLOS |
High-level Operation System(高级操作系统) |
|
QRD |
Qualcomm Reference Design(高通参考设计) |
|
LK |
Little Kernel |
|
FW |
Firmware(固件) |
|
PIL |
Peripheral image loader(外围镜像加载) |
1.4参考资料
查阅、参考资料如表1-2所示。
|
序号 |
文档名称 |
作者或资料来源 |
|
1 |
80-NH740-7_D_MDM9x35_Boot_Architecture_BSP_Overview |
QRD |
|
2 |
80-NH740-43_A_Enable_Secure_Boot_MDM9x35_ASICs |
QRD |
|
3 |
《高通msm8994启动流程简介》 |
Web |
|
4 |
《8926平台boot过程分析》 |
Web |
|
5 |
|
|
2、启动流程
2.1子系统、处理器及启动地址
MDM9X35正常运行一共包含四个子系统:资源功耗管理子系统(RPMR)、应用子系统(APSS)、低功耗音频子系统(LPASS)和调制解调器(基带)处理子系统(MPSS);不同的系统运行在不同的处理器上,Hexagon为高通骁龙的高级DSP,他们的处理器及启动地址如表2-1所示。
|
子系统 |
处理器 |
启动地址 |
|
RPM |
Cortex-M3 |
0x0 |
|
APSS |
Cortex-A7 |
Configurable |
|
LPASS |
Configurable |
|
|
MPSS |
Configurable |
2.2启动流程框图
如图2-2为MDM9x35的启动流程框图摘自高通文档,注意图中带颜色的箭头有助于我们理解。
2.3启动流程详情
通过图2-2能明朗的看出启动流程:
1、系统Power On MDM9x35芯片复位,第一个执行的CPU为Cortex-M3,其运行的是RPM镜像的PBL软件。这个PPM的PBL程序和后面的APPS PBL、Modem PBL(图2-2的灰色部分)应该是固化在ROM中的,高通不对我们开源,至少我没有在软件代码中找到这三个PBL对应的代码
2、在Cortex-M3中运行RPM PBL执行基本的电量和功率检测,然后复位APP处理器Cortex-A7(不开源)
3、APPS处理器 Cortex-A7执行APPS PBL,他从启动设备中加载并鉴定SBL1镜像到L2(as TCM),然后跳转到SBL1执行
4、SBL1开始执行,他首先初始化DDR,然后从启动设备中加载并鉴定TZBSP镜像到DDR, TZBSP执行完冷启动的初始化(cold_boot_init)执行权交回SBL1
5、SBL1从启动设备中加载并鉴定SDI镜像到DDR,,SDI建立安全环境执行权交回SBL1
6、SBL1从启动设备中加载并鉴定RPM固件到PPMcode RAM
7、RPM(Cortex-M3)开始执行RPM固件,此处RPM的执行可能由APPS的SBL1通知执行
8、SBL1从启动设备中加载并鉴定HLOS APPSBL(此处就是我们熟悉lk,它是用来启动linux的bootload)到DDR
9、、SBL1通过系统调用(TZ trap syscall)通知TZ boot loader启动完成,然后TZ跳转到APPSBL执行
10、APPSBL(lk)初始化系统,然后加载HLOS kernel(linux)
11、HLOS kernel起来之后根据需要通过PIL加载MBA和modem镜像到DDR
12、HLOS kernel复位Modem处理器,ModemPBL开始运行
13、Modem PBL从DDR中将MBA拷贝到modem TCM中,然后在modemTCM中鉴定MBA
14、MBA鉴定DDR中的AMSS镜像,然后运行amss系统
15、HLOS kernel根据需要通过PIL加载LPASS镜像到DDR,TZ鉴定它,然后HLOS复位LPASS
Note:
A、执行SBL1镜像文件,代码位于“MDM9x35-LE3.0/boot_images/core/boot/secboot3/hw/mdm9x35/sbl1/sbl1.s”,这里是一个启动过程非常重要的地方,分析代码你会发现它的主要功能便是启动TZBSP、SDI、RPM、APPSBL四个模块
B、4.5.6.这三步是通过SBL1来启动TZBSP,SDI,RPM三个模块,他们的代码分别位于“/trustzone_images,/debug_image,/rpm_proc”中
C、RPM PBL也可以调用RPM功能,RPM模块相关的代码位于"/rpm_proc"目录中
结合图2-2附一张串口启动流程实时打印图2-3:
2.4流程功能表
表2-4为启动流程的组成和相应的功能图
|
组成 |
处理器 |
加载 |
执行 |
功能 |
|
RPM PBL |
M3 |
NA |
PRM ROM and CodeRAM |
复位APPS处理器 |
|
APPS PBL |
Cotex-A7 |
NA |
APPS ROM and L2 as TCM(stack) |
启动设备,接口检测,紧急下载模式支持,加载并鉴定SBL1 |
|
SBL1 |
Cotex-A7 |
NAND |
L2 as TCM |
配置DDR,加载鉴定TZ,RPM_FW,加载鉴定SDI,APPSBL,提供memory dump支持 |
|
TZ |
Cotex-A7 |
NAND |
LPDDR2 |
更具安全需求和启动模式配置XPU,NAND MPU |
|
RPM_FW |
M3 |
NAND |
RPM CodeRAM |
资源功耗管理 |
|
SDI |
Cotex-A7 |
NAND |
OCIMEM |
配置DDR,dump cache,flush cache和其他软件支持debug配置 |
|
APPSBL |
Cotex-A7 |
NAND |
LPDDR2 |
开机第一幅图,加载鉴定kernel,提供bl特别功能 |
|
HLOS |
Cotex-A7 |
NAND |
LPDDR2 |
启动高级操作系统,复位外围设备并加载相应的镜像 |
|
Modem PBL |
Q6 |
NA |
Modem ROM and Q6 TCM (stack) |
初始化Q6 TCM,从LPDDR2拷贝MBA到TCM,鉴定MBA |
|
MBA |
Q6 |
NAND |
Q6 TCM(loaded from LPDDR2) |
鉴定modem镜像, xPU protects the DDR regions for modem, memory dump |
3、软件代码结构
3.1代码结构图
如图3-1为代码结构图:3.2文件目录说明
图3-1中除了(askey_proc、binaries)差不多每个目录都会编译成一个镜像文件,所以每个目录基本都是独立的一套程序,互相之间没有函数调用。
下面逐个对上面的文档进行简要介绍.(PS : 这些软件代码基本不需要进行深入分析,因为这些代码基本都是成熟的功能块,不需要修改,有时间有兴趣可以深入研究下)
adsp_proc : 这个目录保存的是adsp处理器的软件,adsp是与audio相关的dsp,audio的音频数据就是通过这个处理器处理的. 里面基本是高通定制的efs无源代码。
apps_proc:这个目录主要是APPS部分代码,包括lk,kernel和应用层代码等,应用层的修改主要在这个地方。
askey_proc:这个目录主要存放编译生成的版本、镜像、配置及编译信息等相关,客户自己定制不做详细介绍。
Binaries:这个目录主要存编译生成的镜像、bin文件相关与askey_proc差不多,自己定制不做详细介绍。
boot_image : 顾名思义,这里存放的是与启动相关的代码,前文中提到的SBL1的代码就位于这个目录下,具体位置为:/boot_images/core/boot/secboot3/hw/mdm9x35/sbl1/sbl1.s,分析启动过程时,这是一个很重要的文件,很多功能是通过它来开启的,比如trustzone,rpm,sdi,最后也是通过它来加载lk,由lk加载linux.需要注意的是,这个代码已经不属于modem端代码了,它是运行在ap处理器上的.所以说9x35平台是先启动ap端后由ap端启动modem端。
cnss_proc : CNSS是高通的wifi模块,这个目录里主要存放了与wifi相关的固件.
common : 这个目录里面存放了主要的编译工具和一些trace32调试工具的脚本文件.
debug_image : 这个文件夹下的文件最终会编译成一个简称为SDI的镜像文件,该镜像文件的主要功能是在系统崩溃后会通过安全看门狗主动把当时的程序执行环境dump到存储器中,这样有利于解决死机问题,这项功能可以不打开.详细介绍可参考高通文档 : 80-NH740-27_A_MDM9x30_MDM9x35_LE_Software_System_Debug_Manual.pdf
modem _proc : 这个目录下的文件都是与通信相关的代码,即真正的modem端代码.与8x25平台的modem端代码概念已经不一样了,9x35平台的modem端是包括了很多功能,比如audio,但是9x35平台的modem端只与通信模块相关,有关射频的代码我也没有分析过.
rpm_proc : RPM是一个单独的处理器,其目标是降低MDM的平均功耗.其有三种工作模式 :power-efficient flexible extensible.其主要功能是动态的进行电源管理.具体的管理电源的几种方式可参考高通文档或直接分析源码.解决电源管理方面的问题或许要看这里的代码.
trustzone_images : TZ是一个基于硬件的安全环境, 是Krait处理器(ARM7系列)的安全模式,类似于Supervisor模式. TZ软件层由两个主要部分组成 : TZBSP 和 TZOS/QSEE
TZOS/QSEE提供两个主要功能:
1. 系统软件和硬件在从下电状态到启动和唤醒期间初始化系统安全环境.
2. 在系统运行期间为存储空间和其它子系统提供保护和服务.(这里可能翻译不太准确,英文原文见高通文档)
TZ是在SBL启动阶段被加载,用户可以自定义和编译TZ镜像文件,包括TZBSP和TZ/QSEE(tz.mbn\tzbsp_no_xpu)
3.3编译方法
整个工程是由OpenEmbedded(oe bitbake)自动构建系统进行自动化编译的,这部分原理本人未研究过,仅限于会编译,具体编译原理及方法可参见高通文档:80-N5576-44_E_9x15_9x25_9x35_LE_SW_Build_Process
4、总结
本文仅限于框架流程式的概要介绍MDM9x35的正常启动流程,其过程相对比较复杂,PBL、SBL、LK、Kernel、Modem等任一流程展开都可以大篇幅介绍,以后有机会学习再详述。希望读者通过阅读本文档能对MDM9x35平台的启动过程有个大致的了解。