IMX91&IMX93和PMIC PCA9451A&&内部看门狗
前言
BSP开发的时候就先配置下PMIC,为之后的调试打好基础。这个随笔主要是PMIC复位和reboot命令之间的逻辑,其他的也写下。
说明
手册
可以先在NXP官网上下载手册。
https://docs.nxp.com/bundle/PCA9451A/page/topics/general_description_9451.html
框图


硬件部分
关于一些控制引脚
| 引脚 | 用途 | 作用 |
|---|---|---|
| PMIC_ON_REQ | 控制 PMIC 开/关机。正常运行时保持高;关机(poweroff) 时 SoC 把它拉低,PMIC 走 PWRDN 下电 | 关机 |
| PMIC_STBY_REQ | 控制 PMIC standby / 低功耗挂起(suspend),睡眠时 SoC 拉高 | 睡眠 |
| WDOG_B | 控制 PMIC 复位,低脉冲触发 warm/cold reset | 重启 |
PMIC 用 POR_B连接 SOC 的 POR_B 去复位/复位 SoC, PMIC → SoC 方向。
上电时序
数据手册上有的,7.3.4 PWRUP mode章节,就是等待DDR,SOC的电源稳定之后再进行下一步。

上电时序:整条上电序列走完、各路电源稳定后,PMIC 最后释放 POR_B(拉高),SoC 才开始跑。
SNVS mode
SNVS = Secure Non-Volatile Storage,中文一般叫“安全非易失存储域/模块”。
它是 i.MX 处理器里一个 始终供电(always-on)的域,即使主 SoC 掉电、系统处于关机状态,只要那路常电还在,SNVS 就还能工作。
之前IMX6ULL SOC里面就有的,但是有区别,见下面。
VSYS 上电超过 UVLO 后,PF9453 只打开 LDO_SNVS,给 SoC 的 SNVS/BBNSM 域供电;其余主电源(BUCK/LDO)全部关闭。
然后它在那儿等:
PMIC_ON_REQ 被拉高 或按键/PMIC_RST_B 触发
满足后才会进入 PWRUP → RUN,把主电源一路一路打开,系统才真正启动。
区别
-
SNVS state(PMIC 的) = 只留 SNVS 供电的低功耗/关机状态。
-
SNVS 域(SoC 的) = 一个始终供电的功能模块,不等于整个 SoC 在运行。
MMC的电源域配置
sdio 3.0 是1.8V的,之前2.0是3.3V的,PMIC就配置了如下的开关:

配置引脚就可以配置sdio的电源域,NXP也有对这个部分的实现,只要配置下设备树(sd-vsel-gpios属性对应GPIO和专门的引脚MX91_PAD_SD2_VSELECT__USDHC2_VSELECT两种方式)就会自动切换,里面是涉及到MMC驱动部分的,通过cmd命令识别是哪种sdio然后配置这个引脚。这部分先不表。
- sd-vsel-gpios属性对应GPIO
设备树部分:
&lpi2c2 {
pmic@32 {
compatible = "nxp,pf9453";
reg = <0x32>;
interrupt-parent = <&gpio1>;
interrupts = <10 IRQ_TYPE_EDGE_FALLING>;
/* 新增:SD_VSEL 由 GPIO 控制,probe 时拉高 sd-vsel-gpios 属性的GPIO方式*/
sd-vsel-gpios = <&gpio3 19 GPIO_ACTIVE_HIGH>;
regulators {
...
ldo1: LDO1 {
regulator-name = "LDO1";
regulator-min-microvolt = <1800000>;
regulator-max-microvolt = <3300000>;
regulator-boot-on;
regulator-always-on;
};
};
};
};
- USDHC2_VSELECT 硬件控制的方式:
PF9453 的 LDO1 有两个电压寄存器:
| 寄存器 | 地址 |
|---|---|
| LDO1OUT_L | 0x36 |
| LDO1OUT_H | 0x38 |
PMIC 的 SD_VSEL 引脚决定当前用哪一组:
-
SD_VSEL = 低 → LDO1OUT_L 生效
-
SD_VSEL = 高 → LDO1OUT_H 生效
reboot重启
主要是PMIC的复位寄存器配置。
reboot之后,有不重启的情况。
把重启的流程梳理下:
reboot命令 → WDOG3(芯片内部看门狗)超时 → SOC的WDOG_ANY 拉低 → 拉低PMIC的WDOG_B脚 → PMIC 看门狗超时 0x51 warm reset → 拉低SOC的POR_B → 正常重启
&wdog3 {
// 这个属性就是wdog3控制WDOG_ANY脚,这个看门狗超时后,要让它的“外部复位输出”也动作(把复位信号送出去,比如送到 PMIC / 外部器件),而不只是内部处理。
fsl,ext-reset-output;
status = "okay";
};
PMIC 的 冷重启 & 暖重启
设备树属性会有个nxp,wdog_b-warm-reset;
相关的patch
commit 48fed3f54b7d31e8c28025f076fee594e83737db
Author: Yangx <@qq.com>
Date: Tue Jun 17 10:43:28 2025 +0800
QY: 设置pmic(pf9453)的PMIC_RST_CFG 和 RESETKEY_TIMER 可以使复位键正常使用
diff --git a/drivers/regulator/pf9453-regulator.c b/drivers/regulator/pf9453-regulator.c
index fa6a76706f19..63bca745e947 100644
--- a/drivers/regulator/pf9453-regulator.c
+++ b/drivers/regulator/pf9453-regulator.c
@@ -717,12 +717,20 @@ static int pf9453_i2c_probe(struct i2c_client *i2c)
/* Set reset behavior on assertion of WDOG_B signal */
ret = pf9453_pmic_write(pf9453, PF9453_REG_RESET_CTRL,
- WDOG_B_CFG_MASK, reset_ctrl);
+ WDOG_B_CFG_MASK, 0x50);
if (ret) {
dev_err(&i2c->dev, "Failed to set WDOG_B reset behavior\n");
return ret;
}
+ /* Set reset key time */
+ ret = pf9453_pmic_write(pf9453, PF9453_REG_CONFIG1,
+ PF9453_REG_CONFIG1_MASK, 0x00);
+ if (ret) {
+ dev_err(&i2c->dev, "Failed to set reset key time\n");
+ return ret;
+ }
+
/*
* The driver uses the LDO1OUT_H register to control the LDO1 regulator.
* This is only valid if the SD_VSEL input of the PMIC is high. Let's
diff --git a/include/linux/regulator/pf9453.h b/include/linux/regulator/pf9453.h
index c52ecef04b01..892ad0ec9aa8 100644
--- a/include/linux/regulator/pf9453.h
+++ b/include/linux/regulator/pf9453.h
@@ -161,10 +161,11 @@ enum {
#define IRQ_THERM_80 0x01
/* PF9453_REG_RESET_CTRL bits */
-#define WDOG_B_CFG_MASK 0xC0
+#define WDOG_B_CFG_MASK 0xF0
#define WDOG_B_CFG_NONE 0x00
#define WDOG_B_CFG_WARM 0x40
#define WDOG_B_CFG_COLD 0x80
+#define PF9453_REG_CONFIG1_MASK 0x1C
/* PF9453_REG_CONFIG2 bits */
#define I2C_LT_MASK 0x03
buck输出模式对ADC的影响
PMIC的Buck转换器在-40℃下的有纹波劣化。
参考之前的随笔:
https://www.cnblogs.com/allalonewithyou/p/20797169
额外 PSCI && reboot
内核相关日志:
root@imx93evk:~# dmesg | grep -i "psci\|smc calling"
[ 0.000000] psci: probing for conduit method from DT.
[ 0.000000] psci: PSCIv1.1 detected in firmware.
[ 0.000000] psci: Using standard PSCI v0.2 function IDs
[ 0.000000] psci: MIGRATE_INFO_TYPE not supported.
[ 0.000000] psci: SMC Calling Convention v1.4
root@imx93evk:~# ls /sys/firmware/devicetree/base/psci
compatible method name
root@imx93evk:~#
root@imx93evk:~# cat /sys/firmware/devicetree/base/psci/method
smc
root@imx93evk:~#
PSCI 固件存在且已注册(PSCIv1.1,SMC conduit),这个会让系统重启的,不需要开启看门狗, 节点是给 Linux 驱动用的,ATF 在 EL3 直接写 WDOG3 的寄存器,和 DT 没关系。
你觉得“没节点就不该触发”,是把 Linux 和 ATF 混在一起了。
reboot 的 restart handler 里,PSCI 优先级是 129,比 watchdog(128) 高,会先执行。
reboot 命令的调用流程:
reboot
→ PSCI SYSTEM_RESET (通过 SMC 调 ATF)
→ ATF imx_system_reset()
→ 解锁并触发 WDOG3,然后死等复位
本文来自博客园,作者:杨旭0324,转载请注明原文链接:https://www.cnblogs.com/allalonewithyou/p/22987155,个人邮箱:yaonie4444@foxmail.com

浙公网安备 33010602011771号