linux 内核 sleep,linux内核是如何支持深度睡眠(deep sleep)方式的?
1. 硬件架構(gòu)
arm64
2. 內(nèi)核版本
4.19
3. 分析相關(guān)函數(shù)
get_set_conduit_method()
->?of_property_read_string(np, "method", &method))
->?set_conduit(PSCI_CONDUIT_HVC) 或set_conduit(PSCI_CONDUIT_SMC),根據(jù)設(shè)備樹中的method屬性來設(shè)定,
設(shè)定invoke_psci_fn回調(diào)函數(shù)(__invoke_psci_fn_smc或者_(dá)_invoke_psci_fn_hvc)
__invoke_psci_fn_smc()
->?arm_smccc_smc(),這是個宏定義,如下;
#define arm_smccc_smc(...) __arm_smccc_smc(__VA_ARGS__, NULL)
->__arm_smccc_smc(),定義在arch/arm64/kernel/smccc-call.S中:
.macro SMCCC instr
.cfi_startproc
\instr #0
ldr x4, [sp]
stp x0, x1, [x4, #ARM_SMCCC_RES_X0_OFFS]
stp x2, x3, [x4, #ARM_SMCCC_RES_X2_OFFS]
ldr x4, [sp, #8]
cbz x4, 1f /* no quirk structure */
ldr x9, [x4, #ARM_SMCCC_QUIRK_ID_OFFS]
cmp x9, #ARM_SMCCC_QUIRK_QCOM_A6
b.ne 1f
str x6, [x4, ARM_SMCCC_QUIRK_STATE_OFFS]
1: ret
.cfi_endproc
.endm
/*
* void arm_smccc_smc(unsigned long a0, unsigned long a1, unsigned long a2,
* unsigned long a3, unsigned long a4, unsigned long a5,
* unsigned long a6, unsigned long a7, struct arm_smccc_res *res,
* struct arm_smccc_quirk *quirk)
*/
ENTRY(__arm_smccc_smc)
SMCCC smc
ENDPROC(__arm_smccc_smc)
總結(jié)
以上是生活随笔為你收集整理的linux 内核 sleep,linux内核是如何支持深度睡眠(deep sleep)方式的?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 嵌入式linux 配置usb otg,嵌
- 下一篇: linux系统程序PPT,Linux 系