有些行业产品,不需要休眠,希望供电就自动开机。
实现该功能主要需要:
1.硬件上将Power key直接接地,实现长按Power key。 2.软件设置中关闭长按关机或重启的功能。 preloader层
vendor/mediatek/proprietary/bootable/bootloader/preloader/platform/mt6771/src/drivers/pmic.c
void PMIC_enable_long_press_reboot(void)
{
#if :!=0
#if ONEKEY_REBOOT_NORMAL_MODE_PL
pmic_config_interface(PMIC_RG_PWRKEY_RST_EN_ADDR, 0x01, PMIC_RG_PWRKEY_RST_EN_MASK, PMIC_RG_PWRKEY_RST_EN_SHIFT);
pmic_config_interface(PMIC_RG_HOMEKEY_RST_EN_ADDR, 0x00, PMIC_RG_HOMEKEY_RST_EN_MASK, PMIC_RG_HOMEKEY_RST_EN_SHIFT);
pmic_config_interface(PMIC_RG_PWRKEY_RST_TD_ADDR, (U32)KPD_PMIC_LPRST_TD,
PMIC_RG_PWRKEY_RST_TD_MASK, PMIC_RG_PWRKEY_RST_TD_SHIFT);
#else
pmic_config_interface(PMIC_RG_PWRKEY_RST_EN_ADDR, 0x01, PMIC_RG_PWRKEY_RST_EN_MASK, PMIC_RG_PWRKEY_RST_EN_SHIFT);
pmic_config_interface(PMIC_RG_HOMEKEY_RST_EN_ADDR, 0x01, PMIC_RG_HOMEKEY_RST_EN_MASK, PMIC_RG_HOMEKEY_RST_EN_SHIFT);
pmic_config_interface(PMIC_RG_PWRKEY_RST_TD_ADDR, (U32)KPD_PMIC_LPRST_TD, PMIC_RG_PWRKEY_RST_TD_MASK, PMIC_RG_PWRKEY_RST_TD_SHIFT);
#endif /* ONEKEY_REBOOT_NORMAL_MODE_PL */
#else
/*** 逻辑代码跑此处长按powerkey pl/lk 层不会重启 ***/
pmic_config_interface(PMIC_RG_PWRKEY_RST_EN_ADDR, 0x00, PMIC_RG_PWRKEY_RST_EN_MASK, PMIC_RG_PWRKEY_RST_EN_SHIFT);
pmic_config_interface(PMIC_RG_HOMEKEY_RST_EN_ADDR, 0x00, PMIC_RG_HOMEKEY_RST_EN_MASK, PMIC_RG_HOMEKEY_RST_EN_SHIFT);
#endif /* KPD_PMIC_LPRST_TD!=0 */
}
可以通过如下配置,关闭长按power功能复位。
diff --git a/vendor/mediatek/proprietary/bootable/bootloader/preloader/platform/mt6771/default.mak b/vendor/mediatek/proprietary/bootable/bootloader/preloader/platform/mt6771/default.mak
index 50f8913353..a09fe84125 100644
--- a/vendor/mediatek/proprietary/bootable/bootloader/preloader/platform/mt6771/default.mak
+++ b/vendor/mediatek/proprietary/bootable/bootloader/preloader/platform/mt6771/default.mak
@@ -75,7 +75,7 @@ CFG_WORLD_PHONE_SUPPORT :=1
CFG_SVP3_PLATFORM :=0
ONEKEY_REBOOT_NORMAL_MODE_PL :=1
-KPD_PMIC_LPRST_TD :=1
+KPD_PMIC_LPRST_TD :=0
CFG_USB_AUTO_DETECT :=0
CFG_USB_AUTO_DETECT_TIMEOUT_MS :=1000*3
Kernel 层
kernel-4.14/drivers/input/keyboard/mediatek/mt6771/hal_kpd.c
void long_press_reboot_function_setting(void)
{
#ifdef CONFIG_MTK_PMIC_NEW_ARCH /*for pmic not ready*/
if (kpd_enable_lprst && get_boot_mode() == NORMAL_BOOT) {
kpd_info("Normal Boot long press reboot selection\n");
#ifdef CONFIG_KPD_PMIC_LPRST_TD
kpd_info("Enable normal mode LPRST\n");
#ifdef CONFIG_ONEKEY_REBOOT_NORMAL_MODE
pmic_set_register_value(PMIC_RG_PWRKEY_RST_EN, 0x01);
pmic_set_register_value(PMIC_RG_HOMEKEY_RST_EN, 0x00);
pmic_set_register_value(PMIC_RG_PWRKEY_RST_TD,
CONFIG_KPD_PMIC_LPRST_TD);
#endif
#ifdef CONFIG_TWOKEY_REBOOT_NORMAL_MODE
pmic_set_register_value(PMIC_RG_PWRKEY_RST_EN, 0x01);
pmic_set_register_value(PMIC_RG_HOMEKEY_RST_EN, 0x01);
pmic_set_register_value(PMIC_RG_PWRKEY_RST_TD,
CONFIG_KPD_PMIC_LPRST_TD);
#endif
#else
/*** 逻辑代码跑此处长按powerkey Kernel层不会重启 ***/
kpd_info("disable normal mode LPRST\n");
pmic_set_register_value(PMIC_RG_PWRKEY_RST_EN, 0x00);
pmic_set_register_value(PMIC_RG_HOMEKEY_RST_EN, 0x00);
#endif
} else {
kpd_info("Other Boot Mode long press reboot selection\n");
#ifdef CONFIG_KPD_PMIC_LPRST_TD
kpd_info("Enable other mode LPRST\n");
#ifdef CONFIG_ONEKEY_REBOOT_OTHER_MODE
pmic_set_register_value(PMIC_RG_PWRKEY_RST_EN, 0x01);
pmic_set_register_value(PMIC_RG_HOMEKEY_RST_EN, 0x00);
pmic_set_register_value(PMIC_RG_PWRKEY_RST_TD,
CONFIG_KPD_PMIC_LPRST_TD);
#endif
#ifdef CONFIG_TWOKEY_REBOOT_OTHER_MODE
pmic_set_register_value(PMIC_RG_PWRKEY_RST_EN, 0x01);
pmic_set_register_value(PMIC_RG_HOMEKEY_RST_EN, 0x01);
pmic_set_register_value(PMIC_RG_PWRKEY_RST_TD,
CONFIG_KPD_PMIC_LPRST_TD);
#endif
#else
/*** 逻辑代码跑此处长按powerkey Kernel层不会重启 ***/
kpd_info("disable other mode LPRST\n");
pmic_set_register_value(PMIC_RG_PWRKEY_RST_EN, 0x00);
pmic_set_register_value(PMIC_RG_HOMEKEY_RST_EN, 0x00);
#endif
}
#endif
}
可以通过如下配置,关闭长按power功能复位。
diff --git a/kernel-4.14/drivers/input/keyboard/mediatek/Kconfig b/kernel-4.14/drivers/input/keyboard/mediatek/Kconfig
index 67c0a6b47c..92ff46e54a 100644
--- a/kernel-4.14/drivers/input/keyboard/mediatek/Kconfig
+++ b/kernel-4.14/drivers/input/keyboard/mediatek/Kconfig
@@ -52,9 +52,7 @@ config TWOKEY_REBOOT_OTHER_MODE
config KPD_PMIC_LPRST_TD
int "Long press reboot timeout period"
- depends on ONEKEY_REBOOT_NORMAL_MODE || TWOKEY_REBOOT_NORMAL_MODE
- range 0 3
- default "0"
+ default n
---help---
0->8s, 1->11s, 2->14s, 3->5s
如果用的是MTK的charger IC,比如MT6370,6371。power key有拉到charger IC的话。还需要将charger IC的长按reboot关闭,关闭的方法:(未验证,具体修改寄存器需要根据pmic的规格书)
1./kernel-4.4/drivers/misc/mediatek/pmic/mt6370/mt6370_pmu_charger.c
static int mt6370_pmu_charger_probe(struct platform_device *pdev){
int ret = 0;
.......................................
/* Do initial setting */
start add /
dev_err(chg_data->dev, "%s: start MT6370_PMU_REG_CHGPUMP\n", __func__);
ret = mt6370_pmu_reg_set_bit(chg_data->chip,MT6370_PMU_REG_CHGPUMP, 0xE0);
if (ret < 0) {
dev_err(chg_data->dev, "%s: sw init failed\n", __func__);
goto err_chg_init_setting;
}
ret = mt6370_pmu_reg_read(chg_data->chip,MT6370_PMU_REG_CHGPUMP);
if (ret < 0)
dev_err(chg_data->dev, "%s: read reg0x2A failed\n",__func__);
else
dev_err(chg_data->dev, "%s: reg0x2A = 0x%02X\n",__func__, ret);
dev_err(chg_data->dev, "%s: end MT6370_PMU_REG_CHGPUMP\n", __func__);
end add /
ret = mt6370_chg_init_setting(chg_data);
if (ret < 0) {
dev_err(chg_data->dev, "%s: sw init failed\n", __func__);
goto err_chg_init_setting;
}
..................................
}
2./vendor/mediatek/proprietary/bootable/bootloader/preloader/platform/mtXXXX/src/drivers/mt6370.c
#ifdef MTK_EXT_CHGDET_SUPPORT
int mtk_ext_chgdet(CHARGER_TYPE *chg_type)
{
int ret = 0, i = 0;
const int max_retry_cnt = 5;
unsigned char usb_status = 0;
Charger_Detect_Init();
*chg_type = CHARGER_UNKNOWN;
+ mt6370_set_bit(0x2A,0x80);
/* Toggle chgdet flow */
ret = mt6370_enable_chgdet_flow(false);
if (ret != I2C_OK)
goto out;
ret = mt6370_enable_chgdet_flow(true);
if (ret != I2C_OK)
goto out;
...