標準linu休眠和喚醒機制分析 一

2021-05-25 14:53:10 字數 3392 閱讀 3067

說明:

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...