大佬教程收集整理的这篇文章主要介绍了linux内核是如何支持深度睡眠(deep sleep)方式的?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
1. 硬件架构
arm64
2. 内核版本
4.19
3. 分析相关函数
get_set_conduit_method()
-> of_property_read_string(np,"method",&method))
-> set_conduit(PSCI_CONDUIT_HVC) 或set_conduit(PSCI_CONDUIT_SMC),根据设备树中的method属性来设定,
设定invoke_psci_fn回调函数(__invoke_psci_fn_smc或者__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,#ARM_SMCCC_RES_X2_OFFS]
ldr x4,[sp,#8]
cbz x4,1f /* no quirk structure */
ldr x9,#ARM_SMCCC_QUIRK_ID_OFFS]
cmp x9,#ARM_SMCCC_QUIRK_QCOM_A6
b.ne 1f
str x6,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)
以上是大佬教程为你收集整理的linux内核是如何支持深度睡眠(deep sleep)方式的?全部内容,希望文章能够帮你解决linux内核是如何支持深度睡眠(deep sleep)方式的?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。