前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >全志D1-H芯片 如何在休眠唤醒过程中通过 sunxi_dump 读写外设寄存器?

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

作者头像
阿志小管家
发布2024-02-02 15:48:53
1200
发布2024-02-02 15:48:53
举报

问题背景

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-02-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题背景
  • 使用方法
  • 注意实现
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档