Platform: RK3568
OS: Android 12
Kernel: v4.19.206
SDK Version:android-12.0-mid-rkr1
Module: suspend


问题

红外遥控器待机后无法唤醒,只能用板载电源键唤醒,但是唤醒后红外遥控不能操作

解决方案

dts中如下配置:

&vdd_logic {regulator-state-mem {regulator-on-in-suspend;};
};&rockchip_suspend {status = "okay";rockchip,sleep-mode-config = < (0| RKPM_SLP_CENTER_OFF| RKPM_SLP_HW_PLLS_OFF| RKPM_SLP_PMUALIVE_32K| RKPM_SLP_PMIC_LP| RKPM_SLP_32K_PVTM)>;rockchip,wakeup-config = < (0| RKPM_PWM0_WKUP_EN| RKPM_CPU0_WKUP_EN)>;
};

简单分析

  1. 用板载电源按键唤醒后,红外遥控操作无效。此时用getevent命令看没有input事件上报,用echo 1 > sys/module/rockchip_pwm_remotectl/parameters/code_print命令看也没有键值打印。怀疑是待机后对应的pwm没有重新上电导致无法工作。

  2. 红外遥控待机唤醒功能在box产品中应该是标准功能,但目前我们使用的是非box版本的SDK。参考了box的dtsi,设置&rockchip_suspend 节点属性,但测试发现非但遥控不能唤醒,连板载电源键也不能唤醒了,只能重新上电。

  3. 根据rk曾工的指导,要保持休眠时logic不掉电,并修改以下配置,测试待机唤醒功能可用,并且唤醒后红外遥控可以正常工作。

rockchip,sleep-mode-config = <
(0
| RKPM_SLP_CENTER_OFF
| RKPM_SLP_HW_PLLS_OFF
)>;rockchip,wakeup-config = <
(0 | RKPM_PWM0_WKUP_EN | RKPM_CPU0_WKUP_EN
)
  1. 又经过一些对比验证,发现问题关键是需要设置好&rockchip_suspend节点属性和&vdd_logic节点中的regulator-on-in-suspend使其待机不断电。
  2. 相关驱动可见drivers/soc/rockchip/rockchip_pm_config.c
node = of_find_node_by_name(NULL, "rockchip-suspend");if (IS_ERR_OR_NULL(node)) {dev_err(&pdev->dev, "%s dev node err\n",  __func__);return -ENODEV;}   if (of_property_read_u32_array(node,"rockchip,sleep-mode-config",&mode_config, 1)) dev_warn(&pdev->dev, "not set sleep mode config\n");elsesip_smc_set_suspend_mode(SUSPEND_MODE_CONFIG, mode_config, 0); if (of_property_read_u32_array(node,"rockchip,wakeup-config",&wakeup_config, 1)) dev_warn(&pdev->dev, "not set wakeup-config\n");elsesip_smc_set_suspend_mode(WKUP_SOURCE_CONFIG, wakeup_config, 0); if (of_property_read_u32_array(node,"rockchip,pwm-regulator-config",&pwm_regulator_config, 1)) dev_warn(&pdev->dev, "not set pwm-regulator-config\n");
elsesip_smc_set_suspend_mode(PWM_REGULATOR_CONFIG,pwm_regulator_config,0);

其中可以看到从dts中解析到属性值后是通过sip_smc_set_suspend_mode()函数进行设置的。
继续跟下去来到drivers/firmware/rockchip_sip.c

static struct arm_smccc_res __invoke_sip_fn_smc(unsigned long function_id,unsigned long arg0,unsigned long arg1,unsigned long arg2)
{struct arm_smccc_res res;arm_smccc_smc(function_id, arg0, arg1, arg2, 0, 0, 0, 0, &res);return res;
}……int sip_smc_set_suspend_mode(u32 ctrl, u32 config1, u32 config2)
{struct arm_smccc_res res;res = __invoke_sip_fn_smc(SIP_SUSPEND_MODE, ctrl, config1, config2);return res.a0;
}
EXPORT_SYMBOL_GPL(sip_smc_set_suspend_mode);

这里的arm_smccc_smc定义在 arch/arm64/kernel/smccc-call.S,这是汇编的代码,超出我目前的水平了,还涉及到了ATF(ARM Trusted firmware)的领域。需要再看看参考资料12加深理解。

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

如有谬误欢迎指正,感谢阅读~

参考资料


  1. linux内核是如何支持深度睡眠(deep sleep)方式的? ↩︎

  2. [ATF]-smc指令详解 ↩︎

RK3568 Android12 红外遥控器待机唤醒问题相关推荐

  1. rk3568 Android 适配红外遥控器

    rk3568 适配红外遥控器 生活中充满了各种波长的电磁波,所谓的可见(色)光就是人眼可见的电磁波谱,其波长为 380~770nm,为了避免遥控器发射的光造成人眼不适及减少一般人造光源干扰,故选用人眼 ...

  2. 单片机练习-RC-5红外遥控器程序及简单制造DIY PC遥控器

    本程序采用的芯片为SAA3010, 参考资料有: 1. 常用红外遥控接收头引脚图解 2. 红外遥控编码资料 3. RC-5红外遥控程序 4. GIRDER中文教程与电脑遥控器制作资料 5. Girde ...

  3. stm32l0的停止模式怎么唤醒_探索者 STM32F407 开发板资料连载第二十二章 待机唤醒实验

    1)实验平台:alientek 阿波罗 STM32F767 开发板 2)摘自<STM32F7 开发指南(HAL 库版)>关注官方微信号公众号,获取更多资料:正点原子 第二十二章 待机唤醒实 ...

  4. 【STM32 .Net MF开发板学习-14】红外遥控器编码识别

    一年前我写过一篇博文<自制电脑红外遥控接收器(PC软解码)>,文中介绍借助几个简单的器件通过PC串口,来获取红外遥控器的按键信息.现在我们已经学会了如何用PWM技术驱动智能小车(参见< ...

  5. 【测试】更新红外遥控信号读取,用示波器抓取红外遥控器NEC信号

    最近群里有问红外信号采集相关问题,我以为他问arduino,原来他问米思齐,然后我居然忘了之前我用米思齐也试过.今天再把资料整理一下,备战新项目. 红外遥控器应用非常广泛,大部分家电都使用它来控制 , ...

  6. 【测试】用示波器抓取红外遥控器NEC信号

    红外遥控器应用非常广泛,大部分家电都使用它来控制 ,具有价格低,省点等特点.一般红外遥控器发送数据采用NEC格式,今天我们用示波器抓取一下NEC格式的红外信号,看看他长什么样子. 工具  arduin ...

  7. stm32l0的停止模式怎么唤醒_「正点原子STM32Mini板资料连载」第十九章 待机唤醒实验...

    1)实验平台:正点原子STM32mini开发板 2)摘自<正点原子STM32 不完全手册(HAL 库版)>关注官方微信号公众号,获取更多资料:正点原子 第十九章 待机唤醒实验 本章我们将向 ...

  8. Android 功耗(12)---如何查找待机唤醒源

    如何查找待机唤醒源 系统场景的唤醒源:EINT/CONN/CLDMA EINT: PMIC的唤醒. a.Powerkey 唤醒后面的log会有pwrkey_int_handler b. rtc ala ...

  9. 红外遥控c语言,NEC协议红外遥控器

    家电遥控器通信距离往往要求不高,而红外的成本比其它无线设备要低的多,所以家电遥控器应用中红外始终占据着一席之地.遥控器的基带通信协议很多,大概有几十种,常用的就有 ITT 协议.NEC 协议.Shar ...

最新文章

  1. oracle中创建触发器
  2. oracle正在没落,Oracle停掉一个正在运行的job
  3. leetcode算法题--目标和
  4. 计算机mooc操作测试视频,计算机基础课MOOC视频的制作方法.doc
  5. linux系统命令行基础知识点
  6. scala能进入交互模式但是无法执行本地文件、长时间卡住的问题
  7. python venv jenkins_Jenkins+Pytest+Allure集成测试环境
  8. Java编程题——打印“ X ”图形
  9. 电子设计竞赛控制组——完整旋转倒立摆程序
  10. 人工智能课程设计——植物识别专家系统
  11. 自定义VB程序加密方案
  12. Java八股系列——Java数据结构
  13. 数据仓库——概念数据模型
  14. oracle 富文本类型,将BLOB类型值在富文本显示和将富文本内容以BLOB类型存储到数据库...
  15. 对于ros中launch文件的解读
  16. 2018-2019-2 20189215 《网络攻防技术》第八周作业
  17. Gauss数据库初识
  18. 来势汹汹,奥米克戎;是否补种,特定疫苗? | 经济学人全球早报精选
  19. Json简介与基本使用
  20. 2013年10月22日、|充实自己|看书看到恶心看教学视频看到吐|也许旷几次课也是值得的

热门文章

  1. R语言使用:符号生成向量数据、使用pie函数可视化饼图、自定义设置饼图色彩为彩虹色、使用box函数在当前图上加个方框
  2. 编写程序:构造如下文档内容 姓名:邀请您来参加本次会议 李雷 其中,姓名从文件 names.txt 中读取,共 3 个,产生的输出文件为 3 个,输出文件名为对应的 姓名,txt如 张三.txt
  3. Jenkins定时构建:一分钟构建一次
  4. Sharding Proxy 实战
  5. ELMo: Deep contextualized word representations
  6. -考研第三十六周总结-
  7. splash : runjs()
  8. JavaFX:系统托盘
  9. Android 手机卫士(1)
  10. 将16进制数转换为8进制数输出——算法