PXA310的电源管理(3)

来源:互联网 发布:华为数据网络怎么设置 编辑:程序博客网 时间:2024/04/30 01:52

 

PXA310的电源管理(3)


ioctl 中还有设置CPU的工作模式

/kernel/power


传统的APM(Advanced Power Management)是一种基于bios的电源管理标准,目前的最新版本是1.2,

它提供了CPU和设备电源管理的功能,但是由于这种电源管理方式主要是由bios实现,所以有些缺陷,

比如对bios的过度依赖,新老bios之间的不兼容性,以及无法判断电源管理命令是由用户发起的还是由bios发起的,


为了弥补APM的缺陷,新的电源管理ACPI应运而生,这就是ACPI(Advanced Configuration and Power Interface),

它主要是将电源管理的主要执行者由bios转换成为操作系统,这样可以提供更大的灵活性以及可扩展性。


设备电源管理接口主要需要实现以下5点:
使用pm_register对设备的每个实例(instance)进行注册;
在对硬件进行操作之前调用pm_access(这样会保证设备已被唤醒并且处于ready状态);
用户自己的pm_callback函数在系统进入suspend状态(ACPI D1-D3),或者从suspend状态恢复(ACPI D0)的时候会被调用;
当设备不在被使用的时候调用pm_dev_idle函数,这个操作是可选的,可以增强设备idle状态的监测能力;
当被unload的时候,使用pm_unregister来取消设备的注册。

当收到IPMC_IOCTL_SET_CPU_MODE 时

直接调用pm_suspend进入指定的工作模式


linux 定义了如下几种电源管理状态

static const char * const pm_states[PM_SUSPEND_MAX] = {
 [PM_SUSPEND_STANDBY] = "standby",
 [PM_SUSPEND_MEM] = "mem",
#ifdef CONFIG_SOFTWARE_SUSPEND
 [PM_SUSPEND_DISK] = "disk",
#endif
 [PM_SUSPEND_LCDREFRESH] = "lcdrefresh",
 [PM_SUSPEND_DEEPSLEEP] = "deepsleep",
 NULL,
};

可以用如下命令来查找当前的所有状态

/sys/power # cat state
standby mem lcdrefresh deepsleep


如果传入的状态为

#define PM_SUSPEND_DISK  ((__force suspend_state_t) 4)

则pm_suspend_disk


如果是其他状态

则走suspend_prepare suspend_enter suspend_finish 的流程

这是一个框架

实际调用的是pxaxx_pm.c中的具体方法

在初试化的时候将对应的操作方法注册到linux的电源管理框架中

为了方便应用,还提供了一个动态定时器。

IPMC_IOCTL_SET_SLEEPTIME
IPMC_IOCTL_GET_SLEEPTIME
设置获取刚才那个动态定时器的时间间隔

也就是pxa310提供的电源管理的支持还是比较丰富的。