由于arm系统中没有bios设备, 所以要使用APM(Advanced Power Management),只能为arm系统创建一个虚拟的字符设备来模拟APM与用户空间进行通讯. 这就是drivers/char/apm-emulation.c文件。
drivers/char/apm-emulation.c:
此文件实现了一个misc设备apm_bios,实质上也是一个字符设备, 主设备号是10,
次设备号是134。这个apm_bios设备通过ioctl系统调用和用户空间进行通讯。当用户进程通过ioctl发来APM_IOC_SUSPEND命
令时,它就会调用apm_suspend函数,从而将系统转入suspend状态。
apm_suspend函数最终会调用"pm_suspend(PM_SUSPEND_MEM);"语句。
kernel/power/main.c:
pm_suspend函数在kernel/power/main.c文件中定义,它会调用enter_state函数。
enter_state函数分为3个阶段:
1. prepare阶段:
调用suspend_prepare函数,suspend_prepare将调用体系结构相关的函数pm_ops->prepare。
2. 进入suspend阶段:
调用suspend_enter函数,suspend_enter将调用体系结构相关的函数pm_ops->enter。
3. finish阶段:
调用suspend_finish函数,suspend_enter将调用体系结构相关的函数pm_ops->finish。
pm_ops->prepare,pm_ops->enter,pm_ops->finish三个函数都是pm_ops的成员,pm_ops在arch/arm/plat-s3c2410/pm.c中定义,并在体系结构初始化的时候被注册。
arch/arm/plat-s3c2410/pm.c:
s3c2410_pm_ops定义如下:
static struct pm_ops s3c2410_pm_ops = {
.pm_disk_mode = PM_DISK_FIRMWARE,
.prepare = s3c2410_pm_prepare,
.enter = s3c2410_pm_enter,
.finish = s3c2410_pm_finish,
};
模块初始化函数s3c2410_pm_init调用"suspend_set_ops(&s3c2410_pm_ops);"语句注册s3c2410_pm_ops。
核心就是s3c2410_pm_enter, 它真正实现suspend/resume的状态转换。
阅读(1828) | 评论(1) | 转发(0) |