由於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的狀態轉換。
Linux2.6.21之ARM2410電源管理分析
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.