本文仅为工作中对AAOS电源管理的学习笔记,不作为教程或其他用途,存在对官方文档的大量摘抄和个人理解,如有错误烦请指出。
前注:本文由notion创作,由于Markdown对某些效果的实现略繁琐,因此如有需要请移步至原文,系列地址:Notion Share
电源管理
CPM提供的编码接口
CPM为系统应用程序和服务提供了相关编码接口,我们可以通过这些API对以下方面进行操作:
- 在AP中监控电源状态机变化
- 应用电源策略
通过以下步骤进行API的调用:
- 通过Car API获取CPM实例
- 通过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
于大连
Comments | NOTHING