Linux2.6.21之ARM2410電源管理分析

    由於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的狀態轉換。

發佈了19 篇原創文章 · 獲贊 1 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章