IMX91&IMX93和PMIC PCA9451A&&内部看门狗

前言

BSP开发的时候就先配置下PMIC,为之后的调试打好基础。这个随笔主要是PMIC复位和reboot命令之间的逻辑,其他的也写下。

说明

手册

可以先在NXP官网上下载手册。

https://docs.nxp.com/bundle/PCA9451A/page/topics/general_description_9451.html

框图

alt text

alt text

硬件部分

关于一些控制引脚

引脚 用途 作用
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的电源稳定之后再进行下一步。

alt text

上电时序:整条上电序列走完、各路电源稳定后,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就配置了如下的开关:

alt text

配置引脚就可以配置sdio的电源域,NXP也有对这个部分的实现,只要配置下设备树(sd-vsel-gpios属性对应GPIO和专门的引脚MX91_PAD_SD2_VSELECT__USDHC2_VSELECT两种方式)就会自动切换,里面是涉及到MMC驱动部分的,通过cmd命令识别是哪种sdio然后配置这个引脚。这部分先不表。

  1. 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;
            };
        };
    };
};
  1. 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,然后死等复位
posted @ 2026-09-15 20:04  杨旭0324  阅读(18)  评论(0)    收藏  举报