diff options
-rw-r--r-- | init/Android.mk | 8 | ||||
-rw-r--r-- | init/init.cpp | 21 |
2 files changed, 28 insertions, 1 deletions
diff --git a/init/Android.mk b/init/Android.mk index b060f04..75a3f29 100644 --- a/init/Android.mk +++ b/init/Android.mk @@ -50,6 +50,14 @@ LOCAL_SRC_FILES:= \ watchdogd.cpp \ vendor_init.cpp +SYSTEM_CORE_INIT_DEFINES := BOARD_CHARGING_MODE_BOOTING_LPM + +$(foreach system_core_init_define,$(SYSTEM_CORE_INIT_DEFINES), \ + $(if $($(system_core_init_define)), \ + $(eval LOCAL_CFLAGS += -D$(system_core_init_define)=\"$($(system_core_init_define))\") \ + ) \ +) + LOCAL_MODULE:= init LOCAL_C_INCLUDES += \ system/extras/ext4_utils \ diff --git a/init/init.cpp b/init/init.cpp index 9eb2958..d49ece7 100644 --- a/init/init.cpp +++ b/init/init.cpp @@ -986,6 +986,24 @@ static void selinux_initialize(bool in_kernel_domain) { } } +static int charging_mode_booting(void) { +#ifndef BOARD_CHARGING_MODE_BOOTING_LPM + return 0; +#else + int f; + char cmb; + f = open(BOARD_CHARGING_MODE_BOOTING_LPM, O_RDONLY); + if (f < 0) + return 0; + + if (1 != read(f, (void *)&cmb,1)) + return 0; + + close(f); + return ('1' == cmb); +#endif +} + int main(int argc, char** argv) { if (!strcmp(basename(argv[0]), "ueventd")) { return ueventd_main(argc, argv); @@ -1097,7 +1115,8 @@ int main(int argc, char** argv) { // Don't mount filesystems or start core system services in charger mode. char bootmode[PROP_VALUE_MAX]; - if (property_get("ro.bootmode", bootmode) > 0 && strcmp(bootmode, "charger") == 0) { + if ((property_get("ro.bootmode", bootmode) > 0 && strcmp(bootmode, "charger") == 0) + || charging_mode_booting()) { action_for_each_trigger("charger", action_add_queue_tail); } else if (strncmp(bootmode, "ffbm", 4) == 0) { KLOG_ERROR("Booting into ffbm mode\n"); |