1105204_zh-CN

取消
显示结果 
显示  仅  | 搜索替代 
您的意思是: 

1105204_zh-CN

1105204_zh-CN

i.MX Android 电源管理调试技巧<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

作者: b47504

Overview

本文档旨在介绍基于 i.MX Android 软件的 i.MX 电源管理的调试技巧。本文档涉及以下主题:

  • 如何调试暂停/恢复问题
  • 如何进行电源优化

如何调试暂停/恢复问题

  • 通用方法:捕获更多PM调试消息
    • 启用PM调试系统以获取有关内核和调试接口中的PM的更多信息

电源管理选项--->

[*] 电源管理调试支持

[*] sysfs 中的额外 PM 属性用于低级调试/测试

    • 启用 wakelock debug_mask 来捕获有关 wakelock 的更多消息

root@android:/ # echo 15 > /sys/module/wakelock/parameters/debug_mask

root@android:/ # echo 15 > /sys/module/userwakelock/parameters/debug_mask

    • 启用 earlysuspend debug_mask 来捕获有关早期挂起和晚期恢复的更多消息

root@sabresd_6dq:/#echo 15>/sys/module/earlysuspend/parameters/debug_mask

    • 将 no_console_suspend=1 添加到内核的启动选项

这使得系统在进入暂停状态之前打印更多有用的信息

Eg:

--- a/sabresd_6dq/BoardConfig.mk

+++ b/sabresd_6dq/BoardConfig.mk

-BOARD_KERNEL_CMDLINE := console=ttymxc0,115200 init=/init video=mxcfb0:dev=ldb,bpp=32 video=mxcfb1:off video=mxcfb2:off fbmem=10M fb0base=0x27b00000 vmalloc=400M androidboot.console=ttymxc0androidboot.hardware=飞思卡尔

+BOARD_KERNEL_CMDLINE:=控制台=ttymxc0,115200 init=/init视频=mxcfb0:dev=ldb,bpp=32视频=mxcfb1:关闭视频=mxcfb2:关闭fbmem=10M fb0base=0x27b00000 vmalloc=400M androidboot.console=ttymxc0androidboot.hardware=飞思卡尔no_console_suspend=1

  • 系统无法进入挂起模式
    • 检查以下设置项已被禁用:

§ USB 电缆是否已被移除(USB 小工具将保持唤醒锁)

§设置->显示->睡眠,检查不活动超时时间设置是否比您预期的时间长。

§设置->系统->开发者选项->保持唤醒(可不设置),检查该选项是否被禁用

    • 检查所有唤醒锁是否都已释放(可以查看哪些唤醒锁被持有,然后进入具体模块进行调试):

root@sabresd_6dq:/#cat/sys/power/wake_lock

  • 系统无法从挂起状态恢复/恢复或挂起时系统崩溃
    • 检查PMIC_STBY_REQ信号。

系统使用 PMIC_STBY_REQ 信号通知电源管理 IC 将电压从待机电压更改为功能电压,反之亦然。一般来说,pmic_stby_req 引脚连接到 pmic 待机引脚。因此测量引脚以检查是否触发了取消断言信号。

如果没有触发信号,我们就可以考虑唤醒源是否设置正确。如果信号被触发,我们可以再检查一下pmic供电是否正常。

并且不仅限于这两点,我们还应该根据系统日志和硬件测量波形仔细检查我们怀疑的一切。

    • 使用Trace32或者ICE来定位问题。

请查看 trace32 网站以获取更多详细信息。

    • 从 arch/arm/mach-mx6 中的 mx6_suspend_enter 进行跟踪。

跟踪“状态”值并尝试通过函数 mxc_cpu_lp_set 映射到不同的低功耗模式。

查看“mx6_suspend.S”,其中对suspend进行了详细的操作:

      • “MEM”映射到“休眠”模式。因此,转到“休眠”符号并尝试转储不同的操作以缩小挂起/恢复失败的范围
      • 如果此故障可能与 DDR 操作有关,请尝试虚拟 DDR IO 相对低功耗操作。
    • 重启后使用 ram 控制台转储内核日志。

Ram 控制台将把一个内核日志副本保存到某个特定的内存空间中。如果在重启过程中内存电源没有被切断,您可以使用以下命令检查上次内核日志。

例如(如果是第一次启动,则无法找到 /proc/last_kmsg 文件):

root@sabresd_6dq:/ # cat /proc/last_kmsg

  • 内核从暂停状态恢复,但 Android 没有
    • 这通常是由错误的按键布局文件引起的

使用 getevent/sendevent 工具获取电源键扫描代码

#获取事件

更正 Keylayout 文件

系统/usr/keylayout/****.kl

使用电源键报告值更正扫描代码以匹配电源键

  • 暂停/恢复耗费太多时间:

通过读/写/sys/power/device_suspend_time_threshold文件,可以打印出具体的模块名称和时间消耗详情,如果模块的挂起/恢复时间消耗超过阈值参数的话。默认情况下,该参数设置为0,即禁用该功能。我们可以通过以下命令启用它:

Eg:

root@android:/ # echo 10 > /sys/power/device_suspend_time_threshold

该命令的意思是,如果模块的挂起/恢复时间超过10us,系统就会打印出模块的详细信息。如果您想了解如何在内核中实现它的更多细节,请检查 kernel/power/main.c

说明:

可以使用shell命令进入不同的系统级低功耗模式进行调试(更多详情:可以查看Linux_6DQ_RM.pdf):

#echo mem > /sys/power/state

#echo 待机> /sys/power/state

如何进行电源优化

  • 运行时模式
    • 检查CPUFreq和Bus_freq scale是否启用

root@android:/ # cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

root@android:/#cat/sys/devices/platform/imx_busfreq.0/enable

关于更多详细信息,请参阅“Documentation/cpu-freq/governors.txt”

    • 检查系统总线是否以您期望的频率工作。

对于 MX6Q:

root@android:/#cat/sys/kernel/debug/clock/osc_clk/pll2_528_bus_main_clk/periph_clk/mmdc_ch0_axi_clk/rate

    • 检查CPU负载和中断(cat /proc/interrupts)

     root@android:/ # cat /proc/interrupts

     通过该命令可以查看某个模块是否会频繁触发中断。并考虑我们是否有机会减少中断次数。

    • 仔细检查时钟树,查看哪些时钟没有被关闭但没有任何模块需要它们。

root@android:/ # powerdebug -d -c

    • 降低GPU频率。GPU也提供了接口来修改频率。根据自己的产品,可以降低gpu频率。

默认的gpu3DMaxClock在init.rc文件中设置为64,我们可以自己调整一个合适的值。

差异 --git a/imx6/etc/init.rc b/imx6/etc/init.rc

索引 8c420b5..eb11ffe 100755

--- a/imx6/etc/init.rc

+++b/imx6/etc/init.rc

@@ -397,6 +397,9 @@ 启动时

# 将 GPU 3D 最小时钟设置为 3/64

写入/sys/module/galcore/parameters/gpu3DMinClock 3

+# 将 GPU 3D 最大时钟设置为 64/64

+写入/sys/module/galcore/parameters/gpu3DMaxClock 64

+

  • 挂起模式
    • 检查所有设备是否进入挂起模式或低功耗模式:
      • 在设备驱动程序中添加调试消息,以检查所有设备驱动程序挂起接口是否被调用
      • 使用示波器测量相关信号(取决于具体设备数据表和自定义硬件设计)检查每个设备是否进入低功耗模式
    • 从板上移除设备(或 rmmod 设备驱动程序),并进行硬件返工以排除某些硬件模块(如果需要)。然后我们就可以找出哪个模块导致了高功耗,并针对特定的模块进行调试。

在可能导致高功耗的设备驱动程序中添加调试消息,捕捉这些可能影响高功耗的模块的波形

    • 检查DDR是否进入自刷新模式(请查阅DDR数据表,找出哪个引脚指示自刷新状态,并用示波器检查)
    • 将 GPIO PAD 配置为输出零或输入模式(取决于硬件设计)
    • 切断不需要模块的 LDO/DCDC(取决于硬件设计)
    • 检查所有PLL都会切断,只有32KHZ的睡眠时钟活着
Androidi.MX6_全部回复:i.MX Android 电源管理调试技巧<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

是的~我也想知道

谢谢。

回复:i.MX Android 电源管理调试技巧<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

嗨, 赵渊

您能更新这些针对 Android 5.0+ 的提示吗?

因为有些技巧并不适合它。例如,我找不到 /proc/wakelocks、wakelock.c 的内容已更改。

非常感谢!

标记 (1)
无评分
版本历史
最后更新:
‎01-06-2026 01:19 AM
更新人: