全志D1-H芯片 如何在休眠唤醒过程中通过 sunxi_dump 读写外设寄存器?

2024-02-02 15:48:53 浏览数 (3)

问题背景

设备休眠唤醒出错 是在休眠唤醒问题中最常见的一种,因此需要在休眠过程中,读取设备寄存器信息,分析设备状态,成为一种常见的需求。

sunxi_dump 是 AW 提供的一种通过控制台 dump 设备寄存器的模块,但由于在休眠唤醒过程中控制台不可用,因此需要一种在休眠唤醒过程中,可以直接dump设备寄存器的机制。

因此,拓展了 sunxi_dump 的功能,使其支持通过休眠唤醒前的配置,在休眠过程中执行 dump。

使用方法

1, 使能休眠唤醒日志

  • 使控制台不休眠,必须
代码语言:javascript复制
echo N > /sys/module/printk/parameters/console_suspend
  • 使能 kernel 休眠打印 可选
代码语言:javascript复制
echo 1 > /sys/module/kernel/parameters/initcall_debug
  • 使能 设备休眠唤醒调用顺序 可选
代码语言:javascript复制
echo 1 > /sys/power/pm_print_times
  • 调整控制台打印级别 可选
代码语言:javascript复制
echo 8 > /proc/sys/kernel/printk
  • 也可以执行
代码语言:javascript复制
echo Y > /sys/module/printk/parameters/ignore_loglevel

2, 根据需要,关闭异步休眠唤醒 默认是并行休眠,可能出现多个核同时休眠设备,打印日志比较乱的情况

代码语言:javascript复制
echo 0 > /sys/power/pm_async # 关闭异步

3, 设置休眠过程需要执行的动作 /sys/class/sunxi_dump/standby_dump_ctrl 是为了方便在 standby 等流程中读写寄存器的值,增加的接口。

其每个bit对应一个动作开关,目前支持一下控制位。 可以通过位操作同时使能多个动作。

代码语言:javascript复制
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
};

例如

代码语言:javascript复制
# echo 0x11111 > /sys/class/sunxi_dump/standby_dump_ctrl
[ 2750.841496] standby_dump_ctrl change to 0x00011111

4, 按需要设置,需要读写的寄存器域

  • 读取一个区域
代码语言:javascript复制
echo 0x07090100,0x0709010c > /sys/class/sunxi_dump/dump
  • 写一个寄存器
代码语言:javascript复制
# echo 0x0709010c 0x12345678 > /sys/class/sunxi_dump/write
[ 2783.442051] Will write it actually when suspend.

5, 休眠即可

注意实现

1, 由于该模块在standby中被抽象为设备,因此需要注意该模块与目标设备执行先后顺序是不是满足要求。

2, 由于有些设备会关闭自己的时钟,之后访问该设备寄存器可能存在 全 0 值。

以上,可以调整执行的动作 来确认和规避。

原贴链接:https://bbs.aw-ol.com/topic/1054

0 人点赞