本文仅为工作中对AAOS电源管理的学习笔记,不作为教程或其他用途,存在对官方文档的大量摘抄和个人理解,如有错误烦请指出。

前注:本文由notion创作,由于Markdown对某些效果的实现略繁琐,因此如有需要请移步至原文,系列地址:Notion Share

概览

电源要求

  1. 耗电要求:车辆停放时耗电几乎为0,保证即使在数月后车辆电池依旧有足够电量启动发动机。
  2. 硬件启动:后视摄像头,音频与启动画面等需要在安卓系统启动前迅速响应并启动。
  3. 系统启动:在短时间内快速启动安卓主屏幕以便用户交互使用。
  4. 系统状态:类似于挂起,重启后需要维持原本系统状态。

电源解决方案

  • 电源政策:确保根据需要选择性地开启和关闭硬件和软件组件。
  • 电源管理:AAOS的电源状态机,给予相关HAL属性。
  • 车库模式:车辆于停放时的低功耗状态,同时保证系统执行必要维护操作。
  • 管理启动时间:启动时间优化提示以及启动序列说明。

术语表

名称 简称 作用
系统芯片(片上系统) SoC System On a Chip,和手机芯片类似,在单颗芯片上集成了完整的嵌入式系统。
应用处理器 AP 物联网领域中使用的低功耗多功能处理器,一般是在低功耗CPU的基础上拓展音视频能力和专用接口的超大规模集成电路。是片上系统SoC的一部分。
介质(媒体)处理器 MP Media Processor,SoC的一部分
控制器区域网络 CAN 一种功能丰富的车用总线标准。被设计为无需主机的情况下允许总线网络上的单片机与仪器进行通信。(ISO 11898)
通用 I/O GPIO General-purpose input/output,一种具有引脚的微型处理芯片,可以实现高低电平的写入与读出。
串行外设接口 SPI Serial Peripheral Interface Bus,一种用于芯片通信的同步串口规范。
车载主控微控制器单元 VMCU MCU,即Microcontroller Unit,微控制器单元,VMCU即Vehicle MCU,车载控制器单元,具体作用如下列表所示。
汽车电源管理 CPM 车载电源管理API,用于向应用暴露操作接口来操作电源状态。
汽车电源管理服务 CPMS 车载电源管理服务,实现车载电源状态机,提供VHAL接口,同时执行对挂起和关机的最终调用。
汽车电源政策守护进程 CPPD 暴露原生AIDL接口以注册电源管理策略监听器
挂起 Suspend 也称为挂起到内存(S2R/STR)。SoC将进入S3电源模式,CPU断电但内存RAM依旧通电。指Storage to RAM。
休眠 Hibernate 也称为挂起到磁盘(S2D/S4)。SoC将进入S4电源模式即休眠,同时将RAM内存写入硬盘等非易失介质,同时系统断电。S2D指Storage to Disk,S4为电源模式。
硬件抽象层 HAL Hardware Abstraction Layer,位于操作系统与硬件之间,用于对其二者提供交互接口。
板级支持处理器 BSP BSP是介于硬件与操作系统之间的支撑层,用于初始化硬件并加载系统引导。
电源管理集成电路 PMIC 用于管理主机系统的电源需求的芯片。
车载 HAL VHAL HAL层即硬件抽象层,介于硬件(驱动)层与应用层之间,为应用提供硬件操作接口。V指Vehicle,即车。
车载接口处理器 VIP Vehicle Interface Processor

硬件架构

VMCU

  1. 与车辆原生接口连接,如CAN总线等。
  2. 控制AP电源。
  3. 通过GPIO与AP通信以通知状态转换活动。

Untitled.png

AP

车辆关闭与AP状态

车辆熄火后,AP需要进入如下状态之一:

  • 睡眠(Sleep):当VMCU决定保留AP主电源的时候AP进入此状态,一般,唤醒信号会通过GPIO通知AP。
  • 休眠(Hibernation):当VMCU决定切断AP主电源的同时保留内存内容的时候进入此状态,当下次开机时AP会载入内存内容。
  • 关闭(Shutdown):当VMCU决定保留电池电量的时候进入此状态,AP将在下次开机时进入冷启动。

VMCU-AP总线结构

必须为SPI等双向接口,且必须在车载HAL中公开。用于发送事件:

  • AP屏幕显示关闭或开启
  • AP唤醒(通过GPIO)
  • AP后视摄像头显示画面的关闭或开启
  • AP完整关闭(返回状态给VMCU)
  • 其他

电源管理

电源系统

电源状态转换

Untitled 1.png

  1. 挂起到RAM(Suspend-to-RAM):车辆和SoC断电。停止代码执行。内存仍然通电保证挂起状态。
  2. 等待VHAL(Wait for VHAL):当司机与车辆交互时(比如打开车门),VMCU向SoC通电,AAOS从挂起状态恢复并进入等待HAVL状态。
  3. 开启(On):VHAL启动完毕并向AAOS通知后,AAOS启动并进入开启状态,此时,司机与AAOS完全可交互。
  4. 关闭准备(Shutdown Prepare):当司机结束驾驶后(熄火),VHAL通知AAOS进入准备关闭状态,此时,显示屏和音频关闭,系统不与司机互动,但仍可更新应用与系统。当一切操作完成准备就绪时,进入等待VHAL结束状态。
  5. 等待 VHAL 完成/结束(Wait for VHAL Finish):当一切操作完成后,AAOS通知VHAL已经做好关闭准备,VMCU进入深度睡眠状态,并切断AP电源,同时,AAOS进入挂起状态。

电源管理模块

电源管理模块由以下部分构成:

  • CarPowerManager:车载电源管理,用于提供Java/C++的API。
  • CarPowerManagementService:车载电源管理服务,用于协调电源状态转换。
  • CarPowerPolicyDaemon:车载电源政策守护进程,用于和原生电源政策客户端进行通信。
  • VHAL:车载硬件抽象层,用于连接到VMCU。
  • libsuspend:用于进入挂起模式的本地库文件。
  • Kernel:内核,用于实现对挂起与休眠的实现。

其中,内核对睡眠sleep与休眠(挂起到RAM)进行了实现,位于/sys/power/state,AAOS通过内存或硬盘写入此文件进行挂起。

CPMS与其他Service和HAL协调电源状态,CPMS实现状态机,并在电源状态发生变化的时候向每个观察者发送消息

某些属性定义在VHAL中,为了和VMCU进行通信,CPMS会读取并写入这些数据,应用程序可以在CPM中定义的接口来获取并监控电源状态的改变。同时,应用还能通过此接口注册电源政策监听器。在CPM中的 API 可通过 Java 进行调用,并且带有 @hide/@System API 注解,这意味着它仅供特权应用使用。

CPPD用于管理电源政策,直到CPMS接管控制权为止。此外,还会向原生监听器发送电源政策更改通知。

automotive_power_reference_diagram.png

Untitled 2.png

电源状态机

AAOS使用电源状态机(Car power state machine)对AP电源状态进行表示,状态机转移如下图所示:

Untitled 3.png

CpmsState类实现,同时在CPMS中以类属性形式保存,即public final int mState;其中,定义了六个状态参数:

参数名 参数值 参数用途
WAIT_FOR_VHAL 0 等待VAHL。当车俩从关闭或挂起状态下激活时,状态机由OFF或STR状态进入等待VHAL状态,同时状态机置于WAIT_FOR_VHAL并等待VHAL返回信号。除此之外,当状态机处于SHUTDOWN_PREPARE时,如果VHAL通知取消关机,也会重新进入WAIT_FOR_VHAL此状态。
ON 1 当VHAL返回On信号时,即硬件启动成功,状态机进入ON 状态完成电源启动。
SHUTDOWN_PREPARE 2 1、当等待VHAL失败,即硬件启动失败时,直接进入关机准备状态。
2、当VHAL返回关机准备时,状态机进入SHUTDOWN_PREPARE。
3、当AAOS还有应用正在运行时,CMPS通知应用进行关闭,同时状态机一直处于SHUTDOWN_PREPARE状态直至不再有应用等待关闭。
注1:当处于车库模式下,关闭准备状态允许执行闲置任务(idle jobs)。
注2:当VHAL取消关闭时,状态迁移至WAIT_FOR_VHAL状态
注3:此状态下,VHAL会返回SLEEP_IMMEDIATELY与SHUTDOWN_IMMEDIATELY信号,状态机应立即发生状态改变。
WAIT_FOR_FINISH 3 当所有应用关闭完成后,状态由SHUTDOWN_PREPARE迁移至WAIT_FOR_FINISH,同时通知VHAL已经做好关闭准备,等待VHAL返回完成信号。
SUSPEND 4 挂起到内存(STR)状态:
1、当状态机为WAIT_FOR_FINISH状态时,VHAL返回关闭完成(Finished)信号,状态机迁移至SUSPEND
2、当状态机处于SHUTDOWN_PREPARE状态时,VHAL返回立即睡眠信号(SLEEP_IMMEDIATELY),状态应立即迁移至SUSPEND
SIMULATE_SLEEP 5 模拟睡眠模式,用于对睡眠模式进行测试的状态,实际不会进行使用。

在CPMS中,存在*endPowerManagerEvent函数用于发送CPM状态迁移事件,在其中,通过notifyListeners方法中的listener.onStateChanged(newState);向所有监听这发送状态迁移广播,通过传递CpmsState的status code进行状态迁移目标通知。

深度睡眠模式与电源消息序列

只有 VMCU 可以启动深度睡眠。启动深度睡眠后,VMCU 会通过 VHAL 向 CPMS 发送通知。同时CPM会提供一个新的状态ID,然后CPMS通过上述方式向所有监听者发送该状态来实现状态迁移。状态迁移消息序列如下图所示:

Untitled 4.png

注:Garage Modes ends为等待车库模式结束,正常下电流程中,会进行车库模式的流程,但是如果VHAL返回SLEEP_IMMEDIATELYSHUTDOWN_IMMEDIATELY信号时,即要求立刻下电,则跳过车库模式。

本篇内容为原创内容,采用CC BY-NC-SA 4.0协议许可
2022-07-21 11:40
UtopiaXC
于大连


尽管如此,世界依旧美丽