RK3568 Android12 红外遥控器待机唤醒问题

news/2024/11/30 14:25:40/

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指令详解 ↩︎


http://www.ppmy.cn/news/481342.html

相关文章

STM32F103+NRF2401+游戏摇杆ADC双单片机通信遥控小车

STM32F103NRF2401游戏摇杆ADC双单片机通信遥控小车 文章目录 STM32F103NRF2401游戏摇杆ADC双单片机通信遥控小车前言 一、实现的功能&#xff1f;二、主要代码及模块讲解1.主要代码2.RX&#xff08;接收端&#xff09; demo总体分析和代码部分解读PWM驱动部分游戏摇杆ADC部分NR…

正点原子MiniFly遥控器V1.1—电路图原理分析

MiniFly 遥控器系统框架&#xff1a; STM32F103C8T6 作为控制 MCU&#xff0c; 外围硬件主要有蓝色 0.96 寸 OLED、 NRF24L01、 RF 功率放大、 2.4G 天线、 摇杆、按键、 蜂鸣器、 LED 等。 1&#xff0c;MCU STM32F103C8T6&#xff1a; 32-bit Cortex-M3 内核芯片&#xff0c…

【GESP】2023年03月图形化一级 -- 问路

文章目录 问路1. 准备工作2. 功能实现3. 设计思路与实现&#xff08;1&#xff09;角色、舞台背景设置a. 角色设置b. 舞台背景设置 &#xff08;2&#xff09;脚本编写a. 角色&#xff1a;Averyb. 角色&#xff1a;Dee 4. 评分标准 问路 1. 准备工作 &#xff08;1&#xff09…

大疆开发板A型基于HAL库使用RoboMaster 遥控器(DT7DR16)及Debug在线调试

资料官网&#xff1a;RoboMaster 机甲大师赛 1.查看开发板A型芯片资料 2.查看遥控器用户手册 3.查看开发板A型DBUS接口说明 4.查看DBUS参数&#xff08;配置STM32CubeMX需要&#xff09; 5.配置STM32CubeMX 1&#xff09;新建new project&#xff0c;选择开发板A型芯片型号 …

【Android】蓝牙设备--游戏手柄作为遥控门铃工具试验

在之前的讨论中&#xff0c;考虑了app间通过发起连接提示&#xff0c;来实现类似的门铃提醒功能&#xff0c; 【Android】蓝牙门铃的实现--蓝牙设备的扫描_aaajj的博客-CSDN博客 但是app的操作不如按钮操作方便&#xff0c; 利用蓝牙手柄的connect广播&#xff0c;我们可以把…

基于STM32的最简易蓝牙遥控小车

基于STM32的最简易蓝牙遥控小车 硬件准备硬件连接STM32cubeMX配置代码部分视频演示 本篇博客主要针对的读者为有一定单片机基础&#xff0c;但是第一次自制蓝牙遥控小车的小白同学&#xff0c;所用物件型号选择的是作者最熟悉、最常用的&#xff0c;老手请自行发挥。 硬件准备 …

基于stm32f103的简易自制手柄

文章目录 前言一、模块准备二、电路走线三、通信协议总结 前言 这是wtr第一版自制手柄。 软件部分在github上&#xff1a; https://github.com/zhuzhengming/wtr_diy_joystick#wtr_diy_joystick 一、模块准备 模块包括stm32f103最小系统板&#xff0c;无线as32-ttl串口模块…

电子模块 001 --- 遥杆 JoyStick

电子模块 001 — 遥杆 JoyStick — Ongoing — 2016年8月31日 星期三 遥杆 JoyStick 模块 今天介绍&#xff1a;JoyStick 电子模块。 模块名称&#xff1a; 双轴按键摇杆 PS2游戏摇杆 控制杆 JoyStick 电子积木 电路板尺寸&#xff1a; 3.2*3.5CM 模块介绍&#xff1a; …