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

2021-08-31 12:11:33 字數 3043 閱讀 5631

suspend

第三、四、五階段:platform

、processor

、core

static int suspend_enter(suspend_state_t state)

error = dpm_suspend_noirq(pmsg_suspend);

// 對於一些non-sysdev devices

,需要呼叫禁止中斷的dpm_suspend

函式來suspend

那些裝置

if (error)

if (suspend_ops->prepare_late)

if (suspend_test(test_platform)) // suspend

第3階段到此為止

goto platform_wake;

error = disable_nonboot_cpus(); // disable nonboot cpus

if (error || suspend_test(test_cpus)) // suspend

第4階段到此為止

goto enable_cpus;

arch_suspend_disable_irqs(); //

中斷禁止

bug_on(!irqs_disabled());

error = sysdev_suspend(pmsg_suspend); // kernel/driver/base/sys.c

// suspend system devices

if (!error)

arch_suspend_enable_irqs();

bug_on(irqs_disabled());

enable_cpus:

enable_nonboot_cpus();

platform_wake:

if (suspend_ops->wake) //

平台無定義

suspend_ops->wake();

power_up_devices:

dpm_resume_noirq(pmsg_resume);

platfrom_finish:

if (suspend_ops->finish) //

做和函式suspend_ops->prepare()

相反的工作

suspend_ops->finish();

return error; }

static int mtk_pm_enter(suspend_state_t state)

int _chip_pm_enter(suspend_state_t state)

return 0; }

void mt6516_pm_suspendenter(void)

#endif}

else

} slp_exit:

wifi_lowpower_opt(false);

/* restore interrupt mask ; */

*mt6516_irq_maskl = irqmask_l;

*mt6516_irq_maskh = irqmask_h; }

函式mt6516_cpususpend (u4suspendaddr, u32tcm)

是一段彙編**,在檔案:

kernel/arch/arm/amch-mt6516/mt6516_slpctrl.s

中。下面是這段彙編**片段,看一看也蠻有意思,因為處理進入low power

模式之後,是停留在該函式之中的。

entry(mt6516_cpususpend)

stmfd sp!,

// r0 = mt6516_cpususpend physical address,

// r1 = tcm address

mov r4, r0

mov r9, r1

// set svc mode

mrs r0, cpsr

bic r0, r0, #mode_mask1

orr r1, r0, #mode_svc

// set i/f bit, disable irq and fiq

orr r1, r1, #i_bit|f_bit

// update cpsr

msr cpsr_cxsf, r1

// calculate the physical address of instruction after disable mmu

ldr r0, =physicalpart

ldr r1, =mt6516_cpususpend

sub r0, r0, r1

mov r1, r4

// now r0 is the physical address of physicalpart

add r0, r0, r1

......

// power down cache and mmu, mcu_mem_pdn

ldr r0, =0xf0001308

ldr r1, [r0]

// ldr r1, =0xffffffff

orr r1, r1, #0x0f

str r1, [r0]

// step1: set ap sleep (irq code: 0x36) to level sensitive on cirq.

// already done when system start.

// step2: unmask ap sleep ctrl interrupt.

// already done at mt6516_pm_maskinterrupt.

// step3: eoi ap sleep interrupt.

// already done at mt6516_pm_maskinterrupt.

// step4: read clear ap_sm_sta (oxf003c21c).

// already done at mt6516_pm_maskinterrupt.

標準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 3.本文先研究標準 linux 的休眠與喚醒,android 對這部分的增改在另一篇文章中討論 4....

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

說明 1.based on linux2.6.32,only for mem sdr 2.有興趣請先參考閱讀 電源管理方案apm和acpi比較.doc linux系統的休眠與喚醒簡介.doc 4.基於手上的乙個專案來討論,這裡只討論共性的地方 雖然linux支援三種省電模式 standby susp...