ARM SCP入门-简介和代码下载编译

张开发
2026/4/10 8:28:47 15 分钟阅读

分享文章

ARM SCP入门-简介和代码下载编译
这个配图有点唬人要说**权利巅峰**还得是**太上皇**夺舍太上皇就有点不讲武德了。在现代SoC芯片中**CPU**只能说是皇帝掌握资源命脉的还得是太上皇**SCP**。 讲SoC前我们先看下传统的PC构架当你去买电脑的时候首先决定价位的就是**CPU**然后就是**显卡、声卡、无线网卡**等各种配件最后电脑攒出来了一个机箱个头不小啊耗电也是响当当的。家里插电还可以用但是对于手机、汽车等移动设备来说电池供电再这么搞是不行了系统对**省电、体积、功能**有更高的要求需要越来越多的模块解决方案就是**SoC**。随着芯片的集成化程度提升很多模块都做到芯片的内部比如isp、dsp、gpu这样做成**片上系统**System on Chip简称**SoC**好处是整个系统功能更内聚板级面积会减少但是芯片的体积却越来越大。大的芯片面积造成芯片成本和功耗增加但是整体功耗相对减小随着芯片制造工艺的提高可以提高能耗比和降低成本。 SoC诞生后一个问题愈发的严重就像“**一个和尚挑水吃两个和尚抬水吃三个和尚没水吃**”模块多了就会有资源的争夺。CPU上的OS软件之前一直是皇帝般的存在硬件之上都自己掌控现在不同了出现了藩王像GPU各种人工智能专属的NPU地平线自己还命名了一个BPU总之各种**PU**一堆CPU还是皇帝但是其他PU拥有自己独立的硬件和OS就像藩王有点不受控啊。争夺最厉害的就是电源这可是大奶妈然后就是存储、时钟、传感器等。这时候CPU皇帝很头大了需要搬出来**太上皇**了就是我们本篇介绍的**SCP****system control** processor。那么CPU可以代理太上皇吗答案是不能有的情况下比如休眠关机CPU都得关了但是还有的NPU还在运行CPU还没那个资格统领全局。上面图里面根据网络小说的名字看来作者知道**太上皇**才是权利巅峰从而意淫夺舍夺舍在计算机里面算是黑客入侵控制了但是SoC里面这个太上皇可不好夺舍是极度安全的幕后人物拥有自己的全套基础设施而又让你甚至感觉不到他的存在。但是当你一直沿着软件**OS-》ATF**往下分析发现还有这个**幕后黑手**SCP。1. ARM PCSA规范上图所示是一个典型的SoC里面除了CPU还有各种其他处理器。之前介绍的[ARM ATF入门-安全固件软件介绍和代码运行](http://mp.weixin.qq.com/s?__bizMzUzMDMwNTg2Nwmid2247484384idx1snc6a2c66b967a28f8f46430263bad7df6chksmfa5285c4cd250cd27a333f15bfcef80e8a8f92ac9afe8ac766f93e75a0dbc7500de2d4df0effscene21#wechat_redirect)中的固件都是在CPU上运行的也就是ARM的A核这里说的SCP是在M核上运行的。 俗话说 “**君权神授**”这个SCP肯定得是造物主ARM提出来的了。 随着SoC的复杂性增加为了更好的功耗管理需要从系统中其他的控制器和应用处理器中抽象出来各种电源或其他系统管理任务进行集中管理利用一个独立的控制器核心实现。因此ARM提出了功耗控制系统架构power control system architecture简称**PCSA**用来规范芯片功耗控制的逻辑实现。**为什么SoC需要集中功耗控制**首先SoC的复杂性现代SOC集成了大量的硬件模块在电源管理方面这些模块间需要进行集成和协调实现难度大其次功耗管理的复杂性涉及时钟、电源域、传感器、事件等方面。可以在ARM官网下载PCSA规范文档https://developer.arm.com/documentation/den0050/d/?langenPCSA描述了一种使用标准基础设施组件、低功耗接口和相关方法进行功率控制集成的方法。PCSA基于ARM的组件实现规范包括电压、电源和时钟的划分电源的状态和模式ARM电源控制框架和集成规范ARM特定组件的电源和时钟集成带有低功耗Q-channel和P-channel接口的IP。2. SCP简介PCSA 定义了**系统控制处理器** (SCP) 的概念一般是一个硬件模块例如cortex-M4微处理器再加上一些外围逻辑电路做成的功耗控制单元。SCP用于从应用程序处理器中抽象出电源和系统管理任务配合操作系统的功耗管理软件或驱动来完成顶层的功耗控制。上面这个图中间是**SCP**AP只是其中的一个**Agent**还有其他的Agent真正控制硬件的还是SCP这就很安全。SCP相关的软件交互定义如下AP软件是SCP服务的请求者。系统中的其他Agent也可以请求SCP的服务。代理例如一个modem子系统或者其他的硬件模块。SCP基于处理器有自己的固件控制自己的一组硬件资源例如本地私有内存、计时器、中断控制以及系统配置、控制和状态的寄存器。最底层是SCP控制的硬件资源例如时钟源、电源域门控、电压电压和传感器等SCP提供的服务系统初始化SCP负责通电复位系统初始化任务从主系统和AP核心电源域的通电顺序到AP启动。OSPM定向操作SCP在OSPM指导下执行电压供应变化、电源控制操作和时钟源管理。这些服务也可以被其他请求的Agent使用。对系统事件的响应计时器事件SCP有本地计时器资源可用于触发系统唤醒和任何周期性动作如监控。唤醒事件响应唤醒请求包括由路由到断电核心的中断引起的GIC唤醒请求以及来自其他代理的系统访问请求。调试访问电源控制响应来自调试访问端口的请求和相关控件的请求包括调试基础设施的电源管理。看门狗事件和系统恢复操作在本地看门狗超时时SCP可以执行一个重置和重新初始化序列。4. 系统感知功能SCP可以协调来自OSPM和其他代理对共享资源的请求。例如它可以控制到主存的路径或进入SoC睡眠模式和退出而不需要AP核心活动。SCP可负责监测传感器和测量功能。监控任务可能包括过程和温度传感器的数据收集和相关的操作如操作点优化和报警条件。SCP在操作点选择中的作用可以扩展到必要时覆盖OSPM方向以确保系统的电气和热保护。SCP在安全方面的优势由于其是一个独立的硬件模块和固件其内部资源例如内存、外设不能够被外界控制另外其还能控制外界的一些公共资源SCP具有较高的权限。配合安全引导过程SCP可以成为一个可信软件模块。SCP固件为其他MCP的固件实现提供了参考SOC中除了SCP处理器外还有一些其他的可管理性控制处理器 (MCP)其他MCP的实现固件框架跟SCP类似目的是为需要可管理性的片上系统 (SoC) 提供管理入口点。3. 电源管理软件协议栈用户层首先用户发起的一些操作通过用户空间的各service处理会经过内核提供的sysfs操作cpu hotplug、device pm、EAS、IPA等。内核层在linux内核中EASenergy aware scheduling通过感知到当前的负载及相应的功耗经过cpu idle、cpu dvfs及调度选择idle等级、cpu频率及大核或者小核上运行。IPAintrlligent power allocation经过与EAS的交互做热相关的管理。ATF层Linux kernel中发起的操作会经过电源状态协调接口Power State Coordination Interface简称PSCI由操作系统无关的frameworkARM Trusted Firmware简称ATF做相关的处理后通过系统控制与管理接口System Control and Management Interface简称SCMI向系统控制处理器system control processor简称SCP发起低功耗操作。SCP层SCP最终会控制芯片上的sensor、clock、power domain、及板级的pmic做低功耗相关的处理。**总结**用户进程 --sysfs– 内核EAS、IPA–PSCI– ATF --SCMI–SCP --LPI– 功耗输出器件4. 电压域和电源域划分为了更好地对电进行控制ARM划分了两个电相关的概念**电源域**power domain和**电压域**voltage domain。 **电压域**指使用同一个电压源的模块合集如果几个模块使用相同的电压源就认为这几个模块属于同一个电压域。**电源域**指的是在同一个电压域内共享相同电源开关逻辑的模块合集。即在同一个电源域的模块被相同的电源开关逻辑控制同时上、下电。一个电压域内的模块可以根据设计需求拆分到不同电源域。因此电压域对应的是功能是dvfs而电源域的概念对应的是power gating。如上图不同颜色表示不同的电压域VBIG是大核处理器的电源供电VLITTLE是小核处理器的电源供电VGPU是图形处理器的电源供电VSYS是系统电源。虚线框包围的模块表示可以做电源开关处理比如处理器核。实线框包围的模块表示不能做电源开关比如SCP。5. SCP代码下载编译和功能介绍官方开源代码路径https://github.com/ARM-software/SCP-firmware代码下载git clone https://github.com/ARM-software/SCP-firmware.git git submodule update --init目录名字主要功能framework存放scp架构的定义和实现是scp 的代码的主干module存放scp的各个通用功能模块的代码runtime services都是以module实现。例如power_domain smtscmiscmi_power_domainscmi_reset_domainscmi_sensordengscmi_system_powerscmi_voltage_domain等product存放具体的产品代码例如junotools存放编译脚本等工具doc项目文档arch处理器架构目前支持armv8-a和mARM的PCSA规范电源控制系统框架定义了SCP系统控制处理器相关内容SCP固件为系统控制提供了一个软件参考实现一个典型就是SCP源码中有一个**optee**实现product/optee-stm32mp1/fw/Firmware.cmake。SCP固件实现的功能可以分为两大类system和runtime实时功能runtime servicesPower domain management电源域管理System power management系统电源管理涉及开关机Performance domain management (Dynamic voltage and frequency scaling)性能管理这个主要就是ddr的调频了调频对应电压。Clock management时钟管理Linux中也有这里只提供重要的时钟管理Sensor management传感器管理Reset domain management域重置管理Voltage domain management电压域管理系统相关功能system services系统初始化启用应用核心引导系统控制和管理接口(SCMI平台端)支持GNU Arm嵌入式和Arm Compiler 6工具链支持具有多个控制处理器的平台我们以juno开发板为例介绍下编译执行如下全编译命令make-fMakefile.cmakePRODUCTjunoMODEdebug我们编译了三个镜像juno-bl1.bin: SCP ROM 固件映像 - 处理 RAM 固件到专用 SRAM 的传输并跳转到它juno-bl1-bypass.bin: 正常情况下scp_bl1SCP ROM固件需要对scp_bl2SCP RAM固件进行校验进行安全链式加载。此bin文件把bl1中对bl2固件的校验去掉了方便调试验证的时候使用。juno-bl2.bin: SCP RAM 固件映像 - 管理系统运行时服务要使用 TF-A 在 Juno 上启动 SCP 固件您至少需要三个额外的映像bl1: BL1 - 存储在系统 ROM 中的第一阶段引导加载程序bl2: BL2 - 加载的第二阶段bootloader bl1负责交给scp_bl2SCPfip: FIP - 包含bl2和的固件映像包scp_bl2疑问这里为什么有juno-bl1和juno-bl2跟ATF里面的BL2又有什么关系–将在下面SCP boot章节解释。6. SCP boot流程分析固件romfw和ramfw介绍对于一个product的scp firmware分为两部分romfwscp_bl1和ramfwscp_bl2。上电时在开机上电时首先运行scp_bl1然后启动SOC其他核心例如APAP启动后会运行BL1等待AP发送指令从系统ram把ramfw加载到SCP内部ram并跳转执行。scp_bl1用于加载和执行scp_bl2。运行时scp_bl2为scp主要runtime应用代码提供scp各种服务例如scmi。复位时当硬件发生复位时SCP上复位运行scp_bl1时间上和ATF的AP_BL1 and AP_BL2同时运行。juno固件相关目录如下~/arm/SCP-firmware/product/juno$ ls includemodule product.mk scp_ramfw scp_romfw scp_romfw_bypass scp_ut srcSCP_BL1 boot 流程系统启动首先运行scp_romfw firmware代码。执行scp应用初始化流程的初始流程fwk_arch_init按照Firmware.cmake中定义的module顺序进行初始化中断初始化module启动这些完成后会循环调用处理运行时event消息。ATF中BL2加载SCP_BL2TF(Trusted Firmware)是ARM在Armv8引入的安全解决方案为安全提供了整体解决方案。它包括启动和运行过程中的特权级划分。ATF BL2的主要职责就是将后续固件如u-boot。kernelSCP或者其他异构核的固件加载到ram中。SCP firmware的加载及boot 由arm Arm Trusted Firmware-A (TF-A)来完成。SCP用于电源时钟复位和系统控制。BL2将可选的SCP_BL2镜像从平台存储设备加载到特定的安全内存区域。SCP_BL2的后续处理是特定于具体平台的需要自行实现。例如Arm Juno BL2先把SCP_BL2加载到trust sram再使用Boot Over MHU (BOM) 协议把SCP_BL2加载到 SCP的内部RAM之后SCP运行SCP_BL2SCP给AP发出signals通知BL2继续执行。ATF中BL2的编译选项在如下位置定义plat/arm/board/juno/platform.mk中的BL2_SOURCESmorello ATF plat/arm/board/morello/platform.mk中未定义BL2_SOURCES不包含BL2.是否包含BL2相关通用代码及配置由CSS_LOAD_SCP_IMAGES决定scp romfw 跳转执行ramfw在juno中ATF的BL2中通过SDS(Shared-Data-Structure,在Juno平台中替代之前Boot-Over_MHU (BOM)协议)和SCP的romfw通信(mod_bootloader调用sds API)发送ramfw到安全内存然后再由romfw从安全内存加载到其他位置并执行。备注SCP_BL2的运行跟SCP_BL1一样两者都是使用SCP的框架代码属于两个系统。执行scp应用初始化流程的初始流程fwk_arch_init按照Firmware.cmake中定义的module顺序进行初始化中断初始化module启动这些完成后会循环调用处理运行时event消息。后记本篇对SCP进行了介绍下次文章介绍下SCP的**代码分析**作为一个M核运行的系统代码其代码框架还是有很多**通用性和优点**号称OPTEE固件可以直接在其框架下实现应用对电源管理和SoC有兴趣的朋友可以关注。“啥都懂一点啥都不精通干啥都能干干啥啥不是专业入门劝退堪称程序员杂家”。后续会继续更新纯干货分析无广告不打赏欢迎转载欢迎评论交流公众号“那路谈OS与SoC嵌入式软件”欢迎关注个人文章汇总https://thatway1989.github.io

更多文章