20250607在荣品的PRO-RK3566开发板的Android13系统下实现长按开机之后出现插入适配器不会自动启动的问题的解决
2025/6/7 17:20
缘起:
1、根据RK809的DATASHEET,短按开机【100ms/500ms】/长按关机,长按关机。6s/8s/10s
我在网上找到的DATASHEET是V1.0的,据说有V1.4的或者更新的?
如果有,方便的话,发一下。
2、我们希望长按2s开机。
如果 RK809的开机模式是写死了。我司需要 等待 2s时间 【以防 误操作/误触发】
可以使用这个上电逻辑不?
先让 RK809检测到500ms 开机指令,如果检测到,先【清除掉 寄存器中的开机指示?】,然后让 RK809等待1.5s == 1500ms,
现在 在 检测 电源键 是否还是按下的。如果是的。走正常的开机逻辑。
如果不是,就判定为 误操作,关机了。
或者您这边有更好的 上电逻辑/建议?
【已知的/已经测试出来的BUG:】
这个PATCH可以实现 按键2s 开机。
但是有一个问题。
现在 插电/适配器之后,RK3566不会自动开机。
追问一下。是否可以解决这个问题?
uboot_longpress_power_on.patch
diff --git a/drivers/power/pmic/rk8xx.c b/drivers/power/pmic/rk8xx.c
old mode 100644
new mode 100755
index e361015337..e44c38448a
--- a/drivers/power/pmic/rk8xx.c
+++ b/drivers/power/pmic/rk8xx.c
@@ -6,6 +6,7 @@
*/
#include <common.h>
+#include <boot_rkimg.h>
#include <dm.h>
#include <errno.h>
#include <irq-generic.h>
@@ -486,6 +487,8 @@ static int rk8xx_probe(struct udevice *dev)
uint8_t power_en0, power_en1, power_en2, power_en3;
uint8_t on, off;
uint8_t value;
+ int mode;
+
/* read Chip variant */
if (device_is_compatible(dev, "rockchip,rk817") ||
@@ -618,6 +621,31 @@ static int rk8xx_probe(struct udevice *dev)
printf("IRQ chip initial failed\n");
return ret;
}
+ /* 10*100ms */
+ mode = rockchip_get_boot_mode();
+ printf("xxxx: mode: %d\n", mode);
+ value=pmic_reg_read(dev, 0xf0)&0x80;
+ printf("value=0x%x\n",value );
+ if((pmic_reg_read(dev, 0xf0)&0x80) && mode == BOOT_MODE_UNDEFINE )
+ {
+ printf("xxxx: power off\n");
+ rk8xx_shutdown(dev);
+ }
+ if ((pmic_reg_read(dev, 0xf0) & 0x80)==0 &&
+ mode == BOOT_MODE_UNDEFINE) {
+ i = 0;
+ while (i < 10) {
+ value = pmic_reg_read(dev, 0xf0) & 0x80;
+ printf("value=0x%x\n",value );
+ if ((value & 0x80)) {
+ printf("xxxx: power off\n");
+ rk8xx_shutdown(dev);
+ }
+ mdelay(100);
+ i++;
+ }
+ printf("xxxx: power on\n");
+ }
return 0;
}
Z:\Android13.0\u-boot\drivers\power\pmic\rk8xx.c
ret = rk8xx_irq_chip_init(dev);
if (ret) {
printf("IRQ chip initial failed\n");
return ret;
}
/* 10*100ms */
mode = rockchip_get_boot_mode();
printf("xxxx: mode: %d\n", mode);
for j = 0;
//for(j=0; j<256; j++)
//{
// //printf("0x%02x, ", pmic_reg_read(dev, j) );
// printf("0x%02x = 0x%02x\n", j, pmic_reg_read(dev, j) );
//}
//if( 0x82 == pmic_reg_read(dev, 0xf0) )
if( 0x40 == pmic_reg_read(dev, 0xf5) )
//if( 0 )
{
printf("**** Success 2025/6/5 20:12 %s %s %d have +12V !\n", __FILE__, __FUNCTION__, __LINE__);
}
else
{
value=pmic_reg_read(dev, 0xf0)&0x80;
printf("value=0x%x\n",value );
if((pmic_reg_read(dev, 0xf0)&0x80) && mode == BOOT_MODE_UNDEFINE )
{
printf("xxxx: power off\n");
rk8xx_shutdown(dev);
}
if ((pmic_reg_read(dev, 0xf0) & 0x80)==0 &&
mode == BOOT_MODE_UNDEFINE) {
i = 0;
//while (i < 30) {
//while (i < 5) {
while (i < 2) {
value = pmic_reg_read(dev, 0xf0) & 0x80;
printf("value=0x%x\n",value );
if ((value & 0x80)) {
printf("xxxx: power off\n");
rk8xx_shutdown(dev);
}
mdelay(10);
printf("**** wyb 2025/6/4 17:43 %s %s %d i=%d s! loop 2 ---- mdelay 10ms\n", __FILE__, __FUNCTION__, __LINE__, i);
//mdelay(1000);
i++;
}
printf("xxxx: power on\n");
}
}
return 0;
}
U-Boot 2017.09 (Jun 07 2025 - 17:34:50 +0800)
Model: Rockchip RK3568 Evaluation Board
MPIDR: 0x81000000
PreSerial: 2, raw, 0xfe660000
DRAM: 4 GiB
Sysmem: init
Relocation Offset: ed218000
Relocation fdt: eb9f8aa8 - eb9fecd0
CR: M/C/I
Using default environment
optee api revision: 2.0
dwmmc@fe2b0000: 1, dwmmc@fe2c0000: 2, sdhci@fe310000: 0
Bootdev(atags): mmc 0
MMC0: HS200, 200Mhz
PartType: EFI
DM: v1
Android 13.0, Build 2023.8, v2
boot mode: None
RESC: 'boot', blk@0x0001da6c
Device is: UNLOCKED
DTB: rk-kernel.dtb
HASH(c): OK
ANDROID: fdt overlay OK
**** wyb 2025/5/30 17:47 drivers/power/pmic/rk8xx.c rk8xx_bind 334
I2c0 speed: 100000Hz
**** wyb 2025/5/30 17:47 drivers/power/pmic/rk8xx.c rk8xx_ofdata_to_platdata 389
**** wyb 2025/5/30 17:47 drivers/power/pmic/rk8xx.c rk8xx_probe 521
PMIC: RK8090 (on=0x40, off=0x80)
**** wyb 2025/5/30 17:47 drivers/power/pmic/rk8xx.c rk8xx_irq_chip_init 447
xxxx: mode: 11
value=0x80
xxxx: power off
**** wyb 2025/5/30 17:47 drivers/power/pmic/rk8xx.c rk8xx_shutdown 293
逻辑是对的,对了一下原理图,vdc应该只有dc上电时才有一瞬间的电压导通启动,应该通过其他电路放电
查看手册,可以通过PMIC_ON_SOURCE 寄存器来获取启动方式
可以获取0xf5第 6 位的值来判定目前是什么方式启动,如果是1 就是dc触发开机,就不跑power判定逻辑
ret = rk8xx_irq_chip_init(dev);
if (ret) {
printf("IRQ chip initial failed\n");
return ret;
}
/* 10*100ms */
mode = rockchip_get_boot_mode();
printf("xxxx: mode: %d\n", mode);
for j = 0;
//for(j=0; j<256; j++)
//{
// //printf("0x%02x, ", pmic_reg_read(dev, j) );
// printf("0x%02x = 0x%02x\n", j, pmic_reg_read(dev, j) );
//}
//if( 0x82 == pmic_reg_read(dev, 0xf0) )
if( 0x40 == pmic_reg_read(dev, 0xf5) )
//if( 0 )
{
printf("**** Success 2025/6/5 20:12 %s %s %d have +12V !\n", __FILE__, __FUNCTION__, __LINE__);
}
else
{
value=pmic_reg_read(dev, 0xf0)&0x80;
printf("value=0x%x\n",value );
if((pmic_reg_read(dev, 0xf0)&0x80) && mode == BOOT_MODE_UNDEFINE )
{
printf("xxxx: power off\n");
rk8xx_shutdown(dev);
}
if ((pmic_reg_read(dev, 0xf0) & 0x80)==0 &&
mode == BOOT_MODE_UNDEFINE) {
i = 0;
//while (i < 30) {
//while (i < 5) {
while (i < 2) {
value = pmic_reg_read(dev, 0xf0) & 0x80;
printf("value=0x%x\n",value );
if ((value & 0x80)) {
printf("xxxx: power off\n");
rk8xx_shutdown(dev);
}
mdelay(10);
printf("**** wyb 2025/6/4 17:43 %s %s %d i=%d s! loop 2 ---- mdelay 10ms\n", __FILE__, __FUNCTION__, __LINE__, i);
//mdelay(1000);
i++;
}
printf("xxxx: power on\n");
}
}
return 0;
}