【FAQ】全志D1芯片 如何在休眠唤醒过程中通过 sunxi_dump 读写外设寄存器?
-
问题背景
设备休眠唤醒出错 是在休眠唤醒问题中最常见的一种,因此需要在休眠过程中,读取设备寄存器信息,分析设备状态,成为一种常见的需求。
sunxi_dump 是 AW 提供的一种通过控制台 dump 设备寄存器的模块,但由于在休眠唤醒过程中控制台不可用,因此需要一种在休眠唤醒过程中,可以直接dump设备寄存器的机制。
因此,拓展了 sunxi_dump 的功能,使其支持通过休眠唤醒前的配置,在休眠过程中执行 dump。
使用方法
1, 使能休眠唤醒日志
- 使控制台不休眠,必须
echo N > /sys/module/printk/parameters/console_suspend
- 使能 kernel 休眠打印 可选
echo 1 > /sys/module/kernel/parameters/initcall_debug
- 使能 设备休眠唤醒调用顺序 可选
echo 1 > /sys/power/pm_print_times
- 调整控制台打印级别 可选
echo 8 > /proc/sys/kernel/printk
- 也可以执行
echo Y > /sys/module/printk/parameters/ignore_loglevel
2, 根据需要,关闭异步休眠唤醒
默认是并行休眠,可能出现多个核同时休眠设备,打印日志比较乱的情况echo 0 > /sys/power/pm_async # 关闭异步
3, 设置休眠过程需要执行的动作
/sys/class/sunxi_dump/standby_dump_ctrl 是为了方便在 standby 等流程中读写寄存器的值,增加的接口。其每个bit对应一个动作开关,目前支持一下控制位。 可以通过位操作同时使能多个动作。
enum { DUMP_CTRL_DEV_PREPARE = 0, // 在 device prepare 阶段执行dump DUMP_CTRL_DEV_SUSPEND, // 在 device suspend 阶段执行dump DUMP_CTRL_DEV_SUSPEND_LATE, // 在 device suspend_late 阶段执行dump DUMP_CTRL_DEV_SUSPEND_NOIRQ, // 在休眠唤醒的 device suspend_noirq 阶段执行dump DUMP_CTRL_SYSCORE_SUSPEND, // 在 syscore suspend 阶段执行dump DUMP_CTRL_DEV_COMPLETE = 8, // 在 device complete 阶段执行dump DUMP_CTRL_DEV_RESUME, // 在 device resume 阶段执行dump DUMP_CTRL_DEV_RESUME_EARLY, // 在 device resume_early 阶段执行dump DUMP_CTRL_DEV_RESUME_NOIRQ, // 在 device resume_noirq 阶段执行dump DUMP_CTRL_SYSCORE_RESUME, // 在 syscore resume 阶段执行dump DUMP_CTRL_SUSPEND_WRITE = 16, // 在 syscore suspend 阶段执行 write DUMP_CTRL_RESUME_WRITE = 17, // 在 syscore resume 阶段执行 write };
例如
# echo 0x11111 > /sys/class/sunxi_dump/standby_dump_ctrl [ 2750.841496] standby_dump_ctrl change to 0x00011111
4, 按需要设置,需要读写的寄存器域
- 读取一个区域
echo 0x07090100,0x0709010c > /sys/class/sunxi_dump/dump
- 写一个寄存器
# echo 0x0709010c 0x12345678 > /sys/class/sunxi_dump/write [ 2783.442051] Will write it actually when suspend.
5, 休眠即可
注意实现
1, 由于该模块在standby中被抽象为设备,因此需要注意该模块与目标设备执行先后顺序是不是满足要求。
2, 由于有些设备会关闭自己的时钟,之后访问该设备寄存器可能存在 全 0 值。
以上,可以调整执行的动作 来确认和规避。
-
-
-
-
-
-
-
Copyright © 2024 深圳全志在线有限公司 粤ICP备2021084185号 粤公网安备44030502007680号