<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[【FAQ】全志D1芯片 如何在休眠唤醒过程中通过 sunxi_dump 读写外设寄存器？]]></title><description><![CDATA[<h1>问题背景</h1>
<p dir="auto">设备休眠唤醒出错 是在休眠唤醒问题中最常见的一种，因此需要在休眠过程中，读取设备寄存器信息，分析设备状态，成为一种常见的需求。</p>
<p dir="auto">sunxi_dump 是 AW 提供的一种通过控制台 dump 设备寄存器的模块，但由于在休眠唤醒过程中控制台不可用，因此需要一种在休眠唤醒过程中，可以直接dump设备寄存器的机制。</p>
<p dir="auto">因此，拓展了 sunxi_dump 的功能，使其支持通过休眠唤醒前的配置，在休眠过程中执行 dump。</p>
<h1>使用方法</h1>
<p dir="auto"><strong>1, 使能休眠唤醒日志</strong></p>
<ul>
<li>使控制台不休眠，<strong>必须</strong></li>
</ul>
<pre><code>echo N &gt; /sys/module/printk/parameters/console_suspend
</code></pre>
<ul>
<li>使能 kernel 休眠打印 <strong>可选</strong></li>
</ul>
<pre><code>echo 1 &gt; /sys/module/kernel/parameters/initcall_debug
</code></pre>
<ul>
<li>使能 设备休眠唤醒调用顺序 <strong>可选</strong></li>
</ul>
<pre><code>echo 1 &gt; /sys/power/pm_print_times
</code></pre>
<ul>
<li>调整控制台打印级别 <strong>可选</strong></li>
</ul>
<pre><code>echo 8 &gt; /proc/sys/kernel/printk
</code></pre>
<ul>
<li>也可以执行</li>
</ul>
<pre><code>echo Y &gt; /sys/module/printk/parameters/ignore_loglevel
</code></pre>
<p dir="auto"><strong>2, 根据需要，关闭异步休眠唤醒</strong><br />
默认是并行休眠，可能出现多个核同时休眠设备，打印日志比较乱的情况</p>
<pre><code>echo 0 &gt; /sys/power/pm_async # 关闭异步
</code></pre>
<p dir="auto"><strong>3, 设置休眠过程需要执行的动作</strong><br />
/sys/class/sunxi_dump/standby_dump_ctrl 是为了方便在 standby 等流程中读写寄存器的值，增加的接口。</p>
<p dir="auto">其每个bit对应一个动作开关，目前支持一下控制位。 可以通过位操作同时使能多个动作。</p>
<pre><code>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
};
</code></pre>
<p dir="auto">例如</p>
<pre><code># echo 0x11111 &gt; /sys/class/sunxi_dump/standby_dump_ctrl
[ 2750.841496] standby_dump_ctrl change to 0x00011111
</code></pre>
<p dir="auto"><strong>4, 按需要设置，需要读写的寄存器域</strong></p>
<ul>
<li>读取一个区域</li>
</ul>
<pre><code>echo 0x07090100,0x0709010c &gt; /sys/class/sunxi_dump/dump
</code></pre>
<ul>
<li>写一个寄存器</li>
</ul>
<pre><code># echo 0x0709010c 0x12345678 &gt; /sys/class/sunxi_dump/write
[ 2783.442051] Will write it actually when suspend.
</code></pre>
<p dir="auto"><strong>5, 休眠即可</strong></p>
<h1>注意实现</h1>
<p dir="auto">1， 由于该模块在standby中被抽象为设备，因此需要注意该模块与目标设备执行先后顺序是不是满足要求。</p>
<p dir="auto">2， 由于有些设备会关闭自己的时钟，之后访问该设备寄存器可能存在 全 0 值。</p>
<p dir="auto">以上，可以调整执行的动作 来确认和规避。</p>
]]></description><link>https://bbs.aw-ol.com/topic/1054/faq-全志d1芯片-如何在休眠唤醒过程中通过-sunxi_dump-读写外设寄存器</link><generator>RSS for Node</generator><lastBuildDate>Thu, 16 Apr 2026 02:30:16 GMT</lastBuildDate><atom:link href="https://bbs.aw-ol.com/topic/1054.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 22 Feb 2022 06:49:29 GMT</pubDate><ttl>60</ttl></channel></rss>