說明:
1. based on linux2.6.32,only for mem(sdr)
2. 有興趣請先參考閱讀:
電源管理方案
apm和
acpi
比較.doc
linux
系統的休眠與喚醒簡介
.doc
3. 本文先研究標準
linux
的休眠與喚醒,
android
對這部分的增改在另一篇文章中討論
4. 基於手上的乙個專案來討論,這裡只討論共性的地方
雖然linux
支援三種省電模式:
standby
、suspend to ram
、suspend to disk
,但是在使用電池供電的手持裝置上,幾乎所有的方案都只支援
str模式
(也有同時支援
standby
模式的)
,因為std
模式需要有交換分割槽的支援,但是像手機類的嵌入式裝置,他們普遍使用
nand
來儲存資料和**,而且其上使用的檔案系統
yaffs
一般都沒有劃分交換分割槽,所以手機類裝置上的
linux
都沒有支援
std省電模式。
一、
專案
power
相關的配置
目前我手上的專案的
linux
電源管理方案配置如下,
.config
檔案的截圖,當然也可以通過
make menuconfig
使用圖形化來配置:
## cpu power management
## config_cpu_idle is not set
## power management options
#config_pm=y
# config_pm_debug is not set
config_pm_sleep=y
config_suspend=y
config_suspend_freezer=y
config_has_wakelock=y
config_has_earlysuspend=y
config_wakelock=y
config_wakelock_stat=y
config_user_wakelock=y
config_earlysuspend=y
# config_no_user_space_screen_access_control is not set
# config_console_earlysuspend is not set
config_fb_earlysuspend=y
# config_apm_emulation is not set
# config_pm_runtime is not set
config_arch_suspend_possible=y
config_net=y
上面的配置對應下圖中的下半部分圖形化配置。。。,看來是直接在
kconfig
檔案中刪除了配置
std模式的選項。
使用上面的配置編譯出來的系統,跑起來之後,進入
sys目錄可以看到相關的介面:
# pwd
/sys/power
# ls
statewake_lockwake_unlockwait_for_fb_sleepwait_for_fb_wake
# cat state
mem如果配置了巨集
config_pm_debug
,那麼在
power
目錄下會多出乙個
pm_test
檔案,cat pm_test
後,列出的測試選項有:
[none] core processors platform devices freezer
。關於這個
test
模式的使用,可以參考
kernel
文件:/kernel/documentation/power/basic-pm-debugging.txt
這個文件我也有詳細的閱讀和分析。
二、
sys/power和相關屬性檔案建立
系統bootup
時候在sys
下新建power
和相關屬性檔案,相關原始碼位置:
kernel/kernel/power/main.c
static int __init pm_init(void)
core_initcall(pm_init);
// 看的出來,該函式是很早就被呼叫,
initcall
等級為1
static struct attribute_group attr_group = ;
struct attribute_group ;
// 屬性檔案都是以最基本得屬性結構
struct attribute
來建立的
static struct attribute * g = ;
#ifdef config_pm_sleep
#ifdef config_pm_debug
power_attr(pm_test);
#endif
#endif
power_attr(state);
#ifdef config_pm_trace
power_attr(pm_trace);
#endif
#ifdef config_user_wakelock
power_attr(wake_lock);
power_attr(wake_unlock);
#endif
#define power_attr(_name) /
static struct kobj_attribute_name##_attr = ,/
.show= _name##_show,/
.store= _name##_store,/ }
// 而這些被封裝過的屬性結構體,將來會使用
kobject
的ktype.sysfs_ops->show(store)
這兩個通用函式通過
container_of()
巨集找到實際的屬性結構體中的
show
和store
函式來呼叫。
關於更多
sysfs
的內容,請檢視其他關於這部分內容的詳細解析文件。
標準linu休眠和喚醒機制分析 一
說明 1.based on linux2.6.32,only for mem sdr 2.有興趣請先參考閱讀 電源管理方案apm和acpi比較.doc linux系統的休眠與喚醒簡介.doc 4.基於手上的乙個專案來討論,這裡只討論共性的地方 雖然linux支援三種省電模式 standby susp...
標準linu休眠和喚醒機制分析 一
說明 1.based on linux2.6.32,only for mem sdr 2.有興趣請先參考閱讀 電源管理方案apm和acpi比較.doc linux系統的休眠與喚醒簡介.doc 4.基於手上的乙個專案來討論,這裡只討論共性的地方 雖然linux支援三種省電模式 standby susp...
標準linu休眠和喚醒機制分析 一
說明 1.based on linux2.6.32,only for mem sdr 2.有興趣請先參考閱讀 電源管理方案apm和acpi比較.doc linux系統的休眠與喚醒簡介.doc 4.基於手上的乙個專案來討論,這裡只討論共性的地方 雖然linux支援三種省電模式 standby susp...