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;
}