【Android】电源管理,进入和退出 Suspend To RAM

汽车电源管理

CarPowerManagementService 实现 Suspend To RAM 以及 Shutdown;

CarPowerManager 电源状态改变时的回调;

深度睡眠功能(将 Android 挂起到 RAM)在内核中实现。此功能以位于 /sys/power/state 的特殊文件形式提供给用户空间。AAOS 通过将 mem 写入此文件而挂起。

代码路径

内容 目录
与 CarPowerManager 相关的代码 packages/services/Car/car-lib/src/android/car/hardware/power
CarPowerManagementService 等等 packages/services/Car/service/src/com/android/car
处理 VHAL 的服务,如 VehicleHal 和 HAlClient packages/services/Car/service/src/com/android/car/hal
VHAL 接口和属性定义 hardware/interfaces/automotive/vehicle/2.0
介绍 CarPowerManager 的示例应用 packages/services/Car/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink
CarServiceHelperService 相关的代码 frameworks/opt/car/services
libsuspend system/core/libsuspend

进入到 Suspend To RAM

当 VHAL 层调用 doHalEvent(createApPowerStateReq(VehicleApPowerStateReq::SHUTDOWN_PREPARE, (int)VehicleApPowerStateShutdownParam::CAN_SLEEP)); 表明收到请求进入 Suspend To RAM。

时序图

在这里插入图片描述

VHAL 层的调用

doHalEvent 这个函数实现的功能需要从 VehicleHalManager.cpp 这个文件的 init 函数看起。

void VehicleHalManager::init() {
    ALOGI("VehicleHalManager::init");

    mHidlVecOfVehiclePropValuePool.resize(kMaxHidlVecOfVehiclPropValuePoolSize);


	//起一个线程处理EventQueue
    mBatchingConsumer.run(&mEventQueue,
                          kHalEventBatchingTimeWindow,
                          std::bind(&VehicleHalManager::onBatchHalEvent,
                                    this, _1));
	//doHalEvent 实际上就是 &VehicleHalManager::onHalEvent
    mHal->init(&mValueObjectPool,
               std::bind(&VehicleHalManager::onHalEvent, this, _1),
               std::bind(&VehicleHalManager::onHalPropertySetError, this,
                         _1, _2
  • 8
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在灵动微mm32f系列的 tinyusb 例程中,进入退出suspend模式的代码如下: 进入suspend模式: ```c void tud_suspend_cb(void) { // Wake up by uart or button press // so no need to do anything here // but must call tud_rh_suspend_complete() to acknowledge the suspend request tud_rh_suspend_complete(); } // Invoked when usb bus is resumed void tud_resume_cb(void) { (void) tud_control_xfer(0, 0, 0, NULL, 0); // dummy control request to wake up host if it is sleeping } ``` 在进入suspend模式时,需要调用tud_rh_suspend_complete()函数,以确认收到suspend请求。当usb bus被唤醒时,调用tud_resume_cb()函数。 退出suspend模式: ```c // Invoked when received control request to enter DFU mode bool tud_control_request_cb(uint8_t rhport, tusb_control_request_t const * p_request) { switch (p_request->bmRequestType_bit.typeRecipient) { case TUSB_REQ_TYPE_STANDARD: switch (p_request->bRequest) { case TUSB_REQ_SET_FEATURE: if ( p_request->wValue == 0 ) tud_suspend(); break; case TUSB_REQ_CLEAR_FEATURE: if ( p_request->wValue == 0 ) tud_resume(); break; } break; } return false; } void tud_suspend(void) { // Stop usb usb_device_disconnect(); // Enter into deep sleep mode // ... } void tud_resume(void) { // Leave deep sleep mode // ... // Start usb usb_device_connect(); } ``` 在退出suspend模式时,需要在tud_control_request_cb()函数中,根据收到的控制请求来判断是否需要退出suspend模式。在tud_suspend()函数中,停止usb设备,并进入深度睡眠模式。在tud_resume()函数中,退出深度睡眠模式,并重新启动usb设备。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值