Android内核驱动——电源管理
### Android内核驱动——电源管理 #### 基本原理 Android系统为了有效管理设备的电力资源,确保在不使用时能够尽可能地节省电量,设计了一套完整的电源管理系统。该系统主要包括三种不同的低功耗状态:`earlysuspend`、`suspend`与`hibernation`。 1. **Earlysuspend**:这是一种轻度的低功耗状态,允许某些设备选择性地进入一种功耗更低的状态。例如,屏幕亮度可以被降低甚至完全关闭。 2. **Suspend**:在此状态下,除了电源管理模块之外,所有的其他外围模块及CPU都停止工作,但内存保持自刷新状态,以维持当前运行的数据和程序状态。 3. **Hibernation**:这是一种更深层次的节能状态,系统将内存中的所有数据镜像到磁盘上,然后完全关机。当系统重启时,它可以恢复到关机前的状态。 #### 电源管理机制的实现 电源管理机制的实现主要位于`kernel/power/`目录下。其中,`main.c`文件作为整个框架的入口点,负责处理用户对低功耗状态的控制。 - **用户接口**:用户可以通过读写`/sys/power/state`文件来控制系统的低功耗状态。用户对该文件的写操作会触发`main.c`中的`state_store()`函数。 - **状态设置**:用户可以向`/sys/power/state`写入特定字符串,如`"on"`、`"mem"`、`"standby"`、`"disk"`等,这些字符串在`const char* const pm_states[]`数组中有定义。如果写入的是`"disk"`,则会调用`hibernate()`函数使系统进入`hibernation`状态;否则会调用`request_suspend_state()`或`enter_state()`函数。 - `state_store()`函数会根据用户输入的字符串执行相应的动作。若输入为`"disk"`,则会调用`hibernate()`函数;否则,如果未定义`CONFIG_EARLYSUSPEND`,则调用`request_suspend_state()`,否则直接调用`enter_state()`。 - `request_suspend_state()`函数实现了Android相对于标准Linux内核的定制化功能。在标准Linux内核中,用户写入`"mem"`或`"standby"`时,会直接调用`enter_state()`函数进入`suspend`模式。而在Android中,则会先调用`request_suspend_state()`进入`earlysuspend`状态。具体实现如下: ```c 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; // 设置为省电请求 queue_work(suspend_work_queue, &early_suspend_work); // 排队early_suspend_work } else if (old_sleep && new_state == PM_SUSPEND_ON) { state &= ~SUSPEND_REQUESTED; // 清除省电请求 wake_lock(&main_wake_lock); // 唤醒请求 queue_work(suspend_work_queue, &late_resume_work); // 排队late_resume_work } requested_suspend_state = new_state; spin_unlock_irqrestore(&state_lock, irqflags); } ``` - `early_suspend_work`和`late_resume_work`分别定义为`DECLARE_WORK`宏,其实际执行函数分别为`early_suspend`和`late_resume`。 - Android还提供了`register_early_suspend`和`unregister_early_suspend`两个函数,用于设备驱动注册和注销`early_suspend`功能。这些驱动会被添加到`early_suspend_handler`链表中。 - `early_suspend`和`late_resume`函数分别遍历`early_suspend_handler`链表,依次调用每个设备驱动注册的`handler`函数。 通过上述机制,Android有效地实现了电源管理的各种状态切换,并且可以根据不同设备的具体需求进行灵活配置,从而达到最大化节省电量的目的。
剩余6页未读,继续阅读
- ZJUN_MM2013-01-17嗯,不错,这好学习电源管理的知识
- 小蛋来袭2013-02-16用来学习电源管理的还是可以的。。。
- peterpansjtu2013-11-26这本书还不错。可以学习一下内核电源管理方面的东西
- 粉丝: 7
- 资源: 357
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助