背景 :基于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。
接下来再次烧录验证,发现能休眠唤醒了,然后笔者做了长时间休眠后,唤醒的测试
问题来了。长时间休眠后,唤醒之后系统功能异常,操作不响应:
那么接着适配器,长时间唤醒系统功能异常,操作不响应又该如何分析呢?
请继续关注,下篇文章接着分析