rk3399【休眠唤醒】调试笔记(一)

本文记录了一位工程师在基于RK3399平台、4.4内核及麒麟v4系统上的平板电脑遇到的挂机功能无法正常唤醒的问题。通过分析内核休眠机制,发现休眠被gpio-charger唤醒,进一步调试发现是电源键以外的按键设置不当导致。修改设备树去除唤醒键后,虽然能成功休眠唤醒,但长时间休眠后系统功能出现异常。文章预告将对这一问题进行深入分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景 :基于rk3399 平台 4.4 内核,平板上系统为麒麟v4, 点击系统的挂机功能,平板不能唤醒。
各个平台基本上都实现了自己额休眠唤醒功能,接下来记录一下自己的调试过程

分析之前,肯定先要了解一下内核 的suspend 机制 发现绝大部分都是参考: Linux电源管理(6)_Generic PM之Suspend功能.
了解了一些背景知识之后,开始继续向下分析。

现象1 : 接适配器,不差电池,点击挂机功能后,过几秒自动唤醒。该如何分析呢?

1.查看内核支持的休眠方式

在这里插入图片描述
2.尝试休眠

echo mem > state
[ 46.060194] cpu cpu4: failed to read out thermal zone (-11)
[ 46.066413] cpu cpu4: failed to find power_model node
发现休眠不了,立刻被唤醒了。

此时发现 /sys/power/下 有pm_wakeup_irq节点(提示唤醒源对于的终端号)
cat 出来 121 中断号,然后 对照 cat /proc/interrupts
发现对于的唤醒中断是gpio-charger,接着分析 gpio-charger 为啥会唤醒。

3.gpio-charger
查看对应驱动源码: drivers/power/gpio-charger.c

发现驱动probe 函数中设置:device_init_wakeup(&pdev->dev, 1);

修改为 device_init_wakeup(&pdev->dev, 0);

编译后重新验证,按照2的方法继续调试发现
中断唤醒源变为58,对应GPIO KEY LEFT

4.调试按键为啥会唤醒
查看设备树发现除了电源按键设置了gpio-key,wakeup = <0x1>之外,其他的按键还
设置了,gpio-key,wakeup = <0x00>;
在分析一下源码:
在这里插入图片描述
在这里插入图片描述

也就是说只要设备树里有wakeup,就会被设置成唤醒源。
修改设备树去除了唤醒键power键其他按键的wakeup。

接下来再次烧录验证,发现能休眠唤醒了,然后笔者做了长时间休眠后,唤醒的测试

问题来了。长时间休眠后,唤醒之后系统功能异常,操作不响应:

在这里插入图片描述
那么接着适配器,长时间唤醒系统功能异常,操作不响应又该如何分析呢?
请继续关注,下篇文章接着分析

### RK3568 芯片的休眠唤醒机制及实现方法 #### 1. Autosleep 功能概述 Autosleep 是基于 wakeup source 实现的功能,旨在替代 Android Wakelock 中的自动休眠功能。该特性允许系统根据预设条件进入并退出低功耗模式。为了启用此功能,在编译 Linux 内核时需配置 `CONFIG_PM_AUTOSLEEP` 选项[^1]。 #### 2. Sysfs 接口支持 通过 `/sys/power/autosleep` 文件节点可以控制 autosleep 的行为。这使得开发者能够动态调整系统的休眠策略而无需重新编译内核。具体来说,可以通过读写这些文件来设置触发条件以及查询当前状态。 #### 3. Alarm 系统的作用 Alarm 是 Android 系统中的个重要组件,它不仅作为个硬件时钟存在,还提供了定时唤醒服务。即使当设备处于深度睡眠状态下,alarm 依然保持活跃,并能在指定时间点将系统唤醒执行预定任务[^2]。 #### 4. 设备恢复过程解析 在RK3568平台上,每当发生从休眠到正常工作的转换过程中都会调用特定的恢复函数。这类函数负责确保所有外设及其关联资源都能顺利恢复正常运作,从而保障整个系统的稳定性和可靠性[^3]。 #### 5. 关键代码位置与模块依赖关系 - **Autosleep 模块**: 主要实现在 `kernel/power/autosleep.c` 文件中; - **PM (Power Management)** 配置项: 如前所述需要开启 `CONFIG_PM_AUTOSLEEP` 支持; - **Wakeup Source 处理逻辑**: 定义于各个具体的驱动程序里; ```c // 示例:注册个新的唤醒源 wake_lock_init(&my_wake_source, WAKE_LOCK_SUSPEND, "example-wakelock"); ```
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值