Android 内核驱动——电源管理

本文探讨了Android内核驱动中的电源管理,重点讲解了如何通过sys文件控制低功耗状态,wakelock的使用及其两种形式:永久锁和超期锁。还介绍了wakelock的sysfs接口及在内核层与应用层之间的交互,特别是如何通过sysfs接口与Android Java应用程序交互。
摘要由CSDN通过智能技术生成
1.1基本原理
Android 中定义了几种低功耗状态:earlysuspend,suspend,hibernation。
 earlysuspend 是一种低功耗的状态,某些设备可以选择进入某种功耗较低的状态,比如
LCD 可以降低亮度或灭掉;
 suspend 是指除电源管理以外的其他外围模块以及 cpu 均不工作,只有内存保持自刷新的
状态;
 hibernation 是指所有内存镜像都被写入磁盘中,然后系统关机,恢复后系统将能恢复到
“关机”之前的状态。
1.2 电源管理机制的实现

    电源管理机制的源代码主要在 kernel/power/文件夹下面。main.c 文件是整个框架的入口。

用户可以通过读写 sys 文件/sys/power/state 实现控制系统进入低功耗状态。用户对于

/sys/power/state 的读写会调用到 main.c 中的 state_store(),用户可以写入

const char * const pm_states[] 中定义的字符串, 比如“on”“mem”“standby”“disk”

    state_store()首先判断用户写入的是否是“disk”字符串,如果是则调用 hibernate()函数命令
系统进入 hibernation 状态。如果是其他字符串则调用 request_suspend_state()(如果未定义
CONFIG_EARLYSUSPEND)或者调用 enter_state()(如果未定义 CONFIG_EARLYSUSPEND)。
    request_suspend_state()函数是 android 相对标准 linux 改动的地方,它实现在 earlysuspend.c
中。
    在标准 linux 内核中,用户通过 sysfs 写入“mem”“standby” 会直接调用 enter_state(),
进入 suspend 模式,但在 android 中则会调用 request_suspend_state()函数进入 early suspend
状态。request_suspend_state()函数代码如下:
void request_suspend_state(suspend_state_t new_state)
{
unsigned long irqflags;
int old_sleep;
spin_lock_irqsave(&state_lock, irqflags);
old_sleep = state & SUSPEND_REQUESTED;
......
if (!old_sleep && new_state != PM_SUSPEND_ON) {
state |= SUSPEND_REQUESTED;
//判断是否为省电请求,如果是排队一个 early_suspend_work
queue_work(suspend_work_queue, &early_suspend_work);
} else if (old_sleep && new_state == PM_SUSPEND_ON) {
state &= ~SUSPEND_REQUESTED;
wake_lock(&main_wake_lock);
//否则,是唤醒请求,排队 late_resume_work
queue_work(suspend_work_queue, &late_resume_work);
}
requested_suspend_state = new_state;
spin_unlock_irqrestore(&state_lock, irqflags);
}
early_suspend_work 和 late_resume_work 定义为
static DECLARE_WORK(early_suspend_work, early_suspend);
static DECLARE_WORK(late_resume_work, late_resume);

    可 见 实 际 工 作 的 是 early_suspend 和 late_resume 这 两 个 函 数 。 Android 提 供 了
register_early_suspend 和 unregister_early_suspend 两个函数供驱动调用,分别完成设备
earlysuspend 的注册和注销。系统将所有注册支持 early_suspend 的设备驱动对应的 handler
挂在一个称为 early_suspend_handler 的链表上。函数 early_suspend 和 late_resume 完成的事
情很简单,就是遍历这个链表,依次调用每个设备注册的 handler,late_resume 是唤醒处于
early_suspend 的那些设备。代码如下:
static void early_suspend(struct work_struct *work)
{
struct early_suspend 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值