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

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

电源管理

CPM提供的编码接口

CPM为系统应用程序和服务提供了相关编码接口,我们可以通过这些API对以下方面进行操作:

  • 在AP中监控电源状态机变化
  • 应用电源策略

通过以下步骤进行API的调用:

  1. 通过Car API获取CPM实例
  2. 通过CPM实例调用CPM API

创建CPM对象

//通过上下文创建Car API
Car car = Car.createCar(this);
//通过Car API获取CPM对象
CarPowerManager powerManager =
  (CarPowerManager) car.getCarManager(android.car.Car.POWER_SERVICE);

CarPowerStateListener与其注册

系统允许应用和服务通过CarPowerManager.CarPowerStateListener获取电源变化状态,该接口定义了方法onStateChanged(),该方法是CPMS电源状态改变时的回调函数java

//通过匿名类实现一个电源状态监听器
private final CarPowerManager.CarPowerStateListener powerListener =
  new CarPowerManager.CarPowerStateListener () {
        @Override
    public void onStateChanged(int state) {
                //TODO: 电源状态改变时执行的业务
                Log.i(TAG, "onStateChanged() state = " + state);
     }
};

如果要对上述状态监听器进行注册,需要创建一条新的线程并将该监听器与线程注册到CPM中:

executor = new ThreadPerTaskExecutor();
powerManager.setListener(powerListener, executor);

当注册完成后,监听器的onStateChanged()方法将在电源状态改变时被调用,同时,存在一个整型state来表示新的电源状态, CarPowerManager 中定义了实际值和电源状态之间的关联,如下表所示:

状态名 状态描述
STATE_ON 进入开启状态,系统已全面运行
STATE_SHUTDOWN_CANCELLED 关机动作被取消,同时电源状态回到正常状态
STATE_POST_SHUTDOWN_ENTER 关机准备工作已经完成,同时VMCU已经做好关机准备,进入关机状态
STATE_PRE_SHUTDOWN_PREPARE 已经提交了关机请求,但是CPMS还没有开始进行关机,此时屏幕和声音依旧开启。
STATE_SHUTDOWN_PREPARE 车库模式可以在此状态下运行
STATE_SUSPEND_ENTER 应用程序应该在此时被清理并准备好挂起到内存。
STATE_POST_SUSPEND_ENTER 挂起到内存的准备工作已经完成,VMCU已经准备好挂起到内存,进入挂起状态。
STATE_SUSPEND_EXIT 从挂起状态唤醒或取消挂起操作。
STATE_HIBERNATION_ENTER 应用程序应该在此时被清理并准备好休眠(挂起到硬盘)
STATE_POST_HIBERNATION_ENTER 休眠的住被已经完成,VMCU已经准备好进入休眠状态,然后进入休眠。
STATE_HIBERNATION_EXIT 从休眠状态唤醒或取消休眠操作。
STATE_WAIT_FOR_VHAL 系统正在启动,但是在进入ON状态之前需要等待VHAL回应通信。

CarPowerStateListener注销

通过CPM实例对监听器进行注销:

powerManager.clearListener();

在安卓实现上集成系统

系统集成需要对以下内容进行实现:

  • 实现内核接口以挂起系统
  • 实现VHAL功能,包括:
    • 从汽车硬件将挂起与关闭初始化指令传递至安卓系统
    • 从安卓系统传递关闭准备指令到汽车硬件
    • 通过Linux内核接口初始化安卓的挂起和关闭
  • 当设备挂起时,确保所有的唤醒源被禁用
  • 确保应用程序可以迅速关闭以避免无限期地延长关闭过程
  • 确保BSP根据电源策略打开或关闭组件,防止挂起和休眠被阻塞

内核接口:/sys/power/state

当应用程序或服务将用于挂起到RAM的内存或用于挂起到磁盘的磁盘写入位于/sys/power/state的文件时,AAOS会将设备置于挂起模式。开发者必须提供一个功能来监控这个文件并将Linux置于挂起电源状态。该功能可以向VMCU发送一个GPIO以通知VMCU设备已完全关闭。开发者还应负责消除VHAL将最终消息发送到VMCU与系统进入挂起或关闭模式之间的任何冲突条件。

VHAL的任务

VHAL应提供一个介于安卓系统层和车载网络层之间的交互接口层,其应满足上述VHAL功能。

当CPMS通知VHAL准备好关机时,VHAL将关机准备完成的消息发送给VMCU,一般情况下,通过例如UART,SPI或USB等片上外围设备发送消息。一旦发送了消息,CPMS就会调用内核命令来挂起或关闭设备。在此之前,VHAL 或BSP可能会切换GPIO以指示VMCU可以安全地从设备中移除电源。

VHAL需要实现以下属性,以用来控制CPM:

属性名 描述
AP_POWER_STATE_REPORT 安卓通过VehicleApPowerStateReport枚举值来向VMCU报告电源状态的转换。
AP_POWER_STATE_REQ VMCU使用此属性来指示安卓通过VehicleApPowerStateReport枚举值转换到不同的状态。

AP_POWER_STATE_REPORT

本属性具有两个整型参数:

  • int32Values[0]:通过VehicleApPowerStateReport枚举表示的当前电源状态。
  • int32Values[1]:延迟或关机或休眠的时间(单位毫秒),具体含义由参数1决定。

参数1可以选择的值如下:

描述 参数2是否必须
WAIT_FOR_VHAL AP正在启动并需要与VHAL建立通信。
DEEP_SLEEP_ENTRY AP正在进入深度睡眠模式,通过第二个参数设置VMCU唤醒AP的时间。
DEEP_SLEEP_EXIT AP正在结束深度睡眠。
HIBERNATION_ENTRY AP正在进入休眠模式,通过第二个参数设置VMCU唤醒AP的时间。
HIBERNATION_EXIT AP正在结束休眠。
SHUTDOWN_POSTPONE 安卓尚未准备好关闭,通过第二个参数设置VMCU等待的时间,同时,安卓可能会再次发出SHUTDOWN_POSTPONE来增加延迟关闭的时间。
SHUTDOWN_PREPARE 安卓已经准备好进入关闭状态。
SHUTDOWN_START AP已经准备好关闭,通过第二个参数设置VMCU唤醒AP的时间(VMCU不需要支持定时启动的功能)。
SHUTDOWN_CANCELLED 安卓将停止准备关闭并进入WAIT_FOR_VHAL状态
ON 安卓处于正常运行状态

注:更加具体的描述包含在VehicleApPowerStateReport.aidl,存储在hardware/interfaces/automotive/vehicle/aidl/android/hardware/automotive/vehicle

该状态可以自行设置或通过以响应VMCU请求的方式设置。

AP_POWER_STATE_REQ

本属性具有两个整型参数:

  • int32Values[0]:通过VehicleApPowerStateReport枚举表示将要转换到的新状态。
  • int32Values[1]VehicleApPowerStateShutdownParam**枚举值,仅在参数1为SHUTDOWN_PREPARE的情况下将其选项传递给安卓。

参数1可以选择的值如下:

描述
ON AP应处于全功能状态。
SHUTDOWN_PREPARE AP应该已经准备好进行关闭,第二个值表示是否允许AP推迟关闭,以及AP是否应该关闭电源或进入深度睡眠。
CANCEL_SHUTDOWN AP应该取消准备关闭并进入准备进入全功能。
FINISHED AP已进入挂起或关闭。

参数2即VehicleApPowerStateShutdownParam可选值如下:

描述
CAN_SLEEP AP可以进入深度睡眠模式而非彻底关闭,可以被延迟。
CAN_HIBERNATE AP可以进入休眠而非彻底关闭,可以被延迟。
SHUTDOWN_ONLY AP只可以彻底关闭,可以被延迟。
SLEEP_IMMEDIATELY AP必须立刻进入深度睡眠模式。
HIBERNATE_IMMEDIATELY AP必须立刻进入休眠模式。
SHUTDOWN_IMMEDIATELY AP必须立刻彻底关闭。

唤醒源

当设备处于挂起状态时,开发者应适当禁用唤醒源。一般来说,心跳包,调制解调器,Wi-Fi与蓝牙等均属于唤醒源。挂起时,唯一有效的唤醒源应为由VMCU发往SoC的打断。当然,VMCU需要可以监听远程唤醒事件,如果此功能由AP实现,则需要添加另一个专为此服务的唤醒源作为调制解调器。

应用程序

OEM开发者应小心地开发对应的应用程序以保证当电源状态发生改变时迅速关闭或启动而非无限期地延迟指令顺序。

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


尽管如此,世界依旧美丽