3572_a16_3566_A11_A9等解决机器接电池或者插DC电源上电的时候不要立马开机,要通过电源按键按下之后才开机

 3566_A19   解决机器接电池或者插DC电源上电的时候不要立马开机,要通过电源按键按下之后才开机

diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3566-box-demo-v10.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3566-box-demo-v10.dtsi
index fb47c15..4bbc4d1 100644
--- a/kernel/arch/arm64/boot/dts/rockchip/rk3566-box-demo-v10.dtsi
+++ b/kernel/arch/arm64/boot/dts/rockchip/rk3566-box-demo-v10.dtsi
@@ -323,6 +323,9 @@
         pmic-reset-func = <0>;
         /* not save the PMIC_POWER_EN register in uboot */
         not-save-power-en = <1>;
+        /* [XHF CUSTOM] shutdown VSYS (VCC3V3_SYS) in PWR_OFF mode,
+         * so VDC divider loses power -> no auto power-on after poweroff */
+        vsys-off-shutdown;
 
         vcc1-supply = <&vcc3v3_sys>;
         vcc2-supply = <&vcc3v3_sys>;
diff --git a/u-boot/drivers/power/pmic/rk8xx.c b/u-boot/drivers/power/pmic/rk8xx.c
index 64c48f8..0b858f7 100644
--- a/u-boot/drivers/power/pmic/rk8xx.c
+++ b/u-boot/drivers/power/pmic/rk8xx.c
@@ -834,6 +834,42 @@ static int rk8xx_probe(struct udevice *dev)
     }
     printf("\n");
 
+    /* ============================================================
+     * [XHF CUSTOM] Power-on source gate for RK809
+     * Only allow boot when powered on by PWRON key press.
+     *  - ON_SOURCE(0xF5) bit7 (0x80): PWRON key   -> boot normally
+     *  - ON_SOURCE(0xF5) bit6 (0x40): PLUG_IN      -> shutdown
+     *    (DC/battery plugged in triggers auto power-on)
+     *  - Verified by experiment 2026-08-07:
+     *    power key boot -> 0x80, DC plug boot -> 0x40
+     * Runs after PMIC init (I2C ready). pmic_shutdown() triggers
+     * DEV_OFF; PMIC powers off all rails -> CPU dies here.
+     * ============================================================ */
+    if (on_source && off_source &&
+        device_is_compatible(dev, "rockchip,rk809")) {
+        uint8_t on_val = 0;
+
+        ret = rk8xx_read(dev, on_source, &on_val, 1);
+        if (ret) {
+            printf("%s: read ON_SOURCE(0x%02x) failed, ret=%d\n",
+                   __func__, on_source, ret);
+        } else {
+            /* Only PWRON key (bit7) is allowed to boot */
+            if (!(on_val & 0x80)) {
+                printf("PMIC: on=0x%02x (no PWRON key), power off!\n",
+                       on_val);
+                pmic_shutdown(dev);
+                /* pmic_shutdown() should not return.
+                 * If it does, stall here instead of booting. */
+                while (1)
+                    ;
+            } else {
+                printf("PMIC: on=0x%02x (PWRON key), boot OK\n",
+                       on_val);
+            }
+        }
+    }
+
     if (pwron_key) {
         ret = rk8xx_read(dev, pwron_key, &value, 1);
         if (ret)
 


3566_A11解决机器接电池或者插DC电源上电的时候不要立马开机,要通过电源按键按下之后才开机

diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3566-box-demo-v10.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3566-box-demo-v10.dtsi
index f91deb8..6e2a598 100644
--- a/kernel/arch/arm64/boot/dts/rockchip/rk3566-box-demo-v10.dtsi
+++ b/kernel/arch/arm64/boot/dts/rockchip/rk3566-box-demo-v10.dtsi
@@ -246,6 +246,9 @@
         pmic-reset-func = <0>;
         /* not save the PMIC_POWER_EN register in uboot */
         not-save-power-en = <1>;
+        /* [XHF CUSTOM] shutdown VSYS (VCC3V3_SYS) in PWR_OFF mode,
+         * so VDC divider loses power -> no auto power-on after poweroff */
+        vsys-off-shutdown;
 
         vcc1-supply = <&vcc3v3_sys>;
         vcc2-supply = <&vcc3v3_sys>;
diff --git a/u-boot/drivers/power/pmic/rk8xx.c b/u-boot/drivers/power/pmic/rk8xx.c
index e361015..9eb1b95 100644
--- a/u-boot/drivers/power/pmic/rk8xx.c
+++ b/u-boot/drivers/power/pmic/rk8xx.c
@@ -408,6 +408,10 @@ static int rk8xx_ofdata_to_platdata(struct udevice *dev)
     val = dev_read_u32_default(dev, "not-save-power-en", 0);
     rk8xx->not_save_power_en = val;
 
+    /* [XHF CUSTOM] vsys-off-shutdown: power off VSYS in PWR_OFF mode
+     * (prevents auto power-on ~5min after software poweroff) */
+    rk8xx->sys_can_sd = dev_read_bool(dev, "vsys-off-shutdown");
+
     return 0;
 }
 
@@ -541,6 +545,26 @@ static int rk8xx_probe(struct udevice *dev)
         lp_act_msk = RK8XX_LP_ACTION_MSK;
         init_data = rk817_init_reg;
         init_data_num = ARRAY_SIZE(rk817_init_reg);
+
+        /* [XHF CUSTOM] whether the system voltage can be shutdown in PWR_off mode */
+        if (priv->sys_can_sd) {
+            ret = rk8xx_read(dev, RK817_PMIC_CHRG_TERM, &value, 1);
+            if (ret)
+                return ret;
+            value |= 0x80;
+            ret = rk8xx_write(dev, RK817_PMIC_CHRG_TERM, &value, 1);
+            if (ret)
+                return ret;
+        } else {
+            ret = rk8xx_read(dev, RK817_PMIC_CHRG_TERM, &value, 1);
+            if (ret)
+                return ret;
+            value &= 0x7f;
+            ret = rk8xx_write(dev, RK817_PMIC_CHRG_TERM, &value, 1);
+            if (ret)
+                return ret;
+        }
+
         /* judge whether save the PMIC_POWER_EN register */
         if (priv->not_save_power_en)
             break;
@@ -601,6 +625,42 @@ static int rk8xx_probe(struct udevice *dev)
     }
     printf("\n");
 
+    /* ============================================================
+     * [XHF CUSTOM] Power-on source gate for RK809
+     * Only allow boot when powered on by PWRON key press.
+     *  - ON_SOURCE(0xF5) bit7 (0x80): PWRON key   -> boot normally
+     *  - ON_SOURCE(0xF5) bit6 (0x40): PLUG_IN      -> shutdown
+     *    (DC/battery plugged in triggers auto power-on)
+     *  - Verified by experiment 2026-08-07:
+     *    power key boot -> 0x80, DC plug boot -> 0x40
+     * Runs after PMIC init (I2C ready). pmic_shutdown() triggers
+     * DEV_OFF; PMIC powers off all rails -> CPU dies here.
+     * ============================================================ */
+    if (on_source && off_source &&
+        device_is_compatible(dev, "rockchip,rk809")) {
+        uint8_t on_val = 0;
+
+        ret = rk8xx_read(dev, on_source, &on_val, 1);
+        if (ret) {
+            printf("%s: read ON_SOURCE(0x%02x) failed, ret=%d\n",
+                   __func__, on_source, ret);
+        } else {
+            /* Only PWRON key (bit7) is allowed to boot */
+            if (!(on_val & 0x80)) {
+                printf("PMIC: on=0x%02x (no PWRON key), power off!\n",
+                       on_val);
+                pmic_shutdown(dev);
+                /* pmic_shutdown() should not return.
+                 * If it does, stall here instead of booting. */
+                while (1)
+                    ;
+            } else {
+                printf("PMIC: on=0x%02x (PWRON key), boot OK\n",
+                       on_val);
+            }
+        }
+    }
+
     if (pwron_key) {
         ret = rk8xx_read(dev, pwron_key, &value, 1);
         if (ret)
diff --git a/u-boot/include/power/rk8xx_pmic.h b/u-boot/include/power/rk8xx_pmic.h
index aa51e88..a491835 100644
--- a/u-boot/include/power/rk8xx_pmic.h
+++ b/u-boot/include/power/rk8xx_pmic.h
@@ -209,6 +209,7 @@ enum {
 #define RK817_PMIC_SYS_CFG1    0xf1
 #define RK817_PMIC_SYS_CFG3    0xf4
 #define RK817_GPIO_INT_CFG    0xfe
+#define RK817_PMIC_CHRG_TERM    0xe6
 
 #define RK8XX_ON_SOURCE        0xae
 #define RK8XX_OFF_SOURCE    0xaf
@@ -287,6 +288,7 @@ struct rk8xx_priv {
     uint8_t sleep_pin;
     uint8_t rst_fun;
     int not_save_power_en;
+    int sys_can_sd;
 };
 
 int rk8xx_spl_configure_buck(struct udevice *pmic, int buck, int uvolt);
 


3572_a16 解决机器接电池或者插DC电源上电的时候不要立马开机,要通过电源按键按下之后才开机

diff --git a/u-boot/drivers/power/pmic/rk8xx.c b/u-boot/drivers/power/pmic/rk8xx.c
index a5e97ea..d6829c5 100755
--- a/u-boot/drivers/power/pmic/rk8xx.c
+++ b/u-boot/drivers/power/pmic/rk8xx.c
@@ -1003,6 +1003,41 @@ static int rk8xx_probe(struct udevice *dev)
     }
     printf("\n");
 
+    /* ============================================================
+     * [XHF CUSTOM] Power-on source gate for RK806/RK809
+     * Only allow boot when powered on by PWRON key press.
+     *  - ON_SOURCE bit7 (0x80): PWRON key   -> boot normally
+     *  - ON_SOURCE bit6 (0x40): VDC/DC/battery plugged in -> shutdown
+     *  Verified on RK3572 (RK806) 2026-08-08:
+     *    DC plug boot -> 0x40, battery boot -> 0x40, PWRON -> 0x80
+     *  Runs after PMIC init (I2C ready). pmic_shutdown() triggers
+     *  DEV_OFF; PMIC powers off all rails -> CPU dies here.
+     * ============================================================ */
+    if (on_source && off_source &&
+        device_is_compatible(dev, "rockchip,rk806")) {
+        uint8_t on_val = 0;
+
+        ret = rk8xx_read(dev, on_source, &on_val, 1);
+        if (ret) {
+            printf("%s: read ON_SOURCE(0x%02x) failed, ret=%d\n",
+                   __func__, on_source, ret);
+        } else {
+            /* Only PWRON key (bit7) is allowed to boot */
+            if (!(on_val & 0x80)) {
+                printf("PMIC: on=0x%02x (no PWRON key), power off!\n",
+                       on_val);
+                pmic_shutdown(dev);
+                /* pmic_shutdown() should not return.
+                 * If it does, stall here instead of booting. */
+                while (1)
+                    ;
+            } else {
+                printf("PMIC: on=0x%02x (PWRON key), boot OK\n",
+                       on_val);
+            }
+        }
+    }
+
     if (pwron_key) {
         ret = rk8xx_read(dev, pwron_key, &value, 1);
         if (ret)
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liu_sir_

你的打赏是码农最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值