From e0824843975631356d6ce233c245bfc97d189d5d Mon Sep 17 00:00:00 2001 From: Rahix <rahix@rahix.de> Date: Wed, 21 Aug 2019 00:44:00 +0200 Subject: [PATCH] feat(pmic): Switch off if battery is low Signed-off-by: Rahix <rahix@rahix.de> --- epicardium/modules/modules.h | 3 +++ epicardium/modules/pmic.c | 36 +++++++++++++++++++++++++++++++++--- 2 files changed, 36 insertions(+), 3 deletions(-) diff --git a/epicardium/modules/modules.h b/epicardium/modules/modules.h index 57ebe425..484e951f 100644 --- a/epicardium/modules/modules.h +++ b/epicardium/modules/modules.h @@ -34,6 +34,9 @@ int personal_state_enabled(); /* ---------- PMIC --------------------------------------------------------- */ void vPmicTask(void *pvParameters); +/* Critical battery voltage */ +#define BATTERY_CRITICAL 3.40f + enum pmic_amux_signal { PMIC_AMUX_CHGIN_U = 0x1, PMIC_AMUX_CHGIN_I = 0x2, diff --git a/epicardium/modules/pmic.c b/epicardium/modules/pmic.c index ef97392c..48a311c9 100644 --- a/epicardium/modules/pmic.c +++ b/epicardium/modules/pmic.c @@ -154,6 +154,36 @@ pmic_poll_interrupts(TickType_t *button_start_tick, TickType_t duration) } } +__attribute__((noreturn)) static void pmic_die(float u_batt) +{ + /* Stop core 1 */ + core1_stop(); + + /* Grab the screen */ + disp_forcelock(); + + /* Draw an error screen */ + epic_disp_clear(0x0000); + + epic_disp_print(0, 0, " Battery", 0xffff, 0x0000); + epic_disp_print(0, 20, " critical", 0xffff, 0x0000); + epic_disp_print(0, 40, " !!!!", 0xffff, 0x0000); + epic_disp_update(); + + /* Vibrate violently */ + epic_vibra_set(true); + + /* Wait a bit */ + for (int i = 0; i < 50000000; i++) + __NOP(); + + LOG_WARN("pmic", "Poweroff"); + MAX77650_setSFT_RST(0x2); + + while (1) + __WFI(); +} + /* * Check the battery voltage. If it drops too low, turn card10 off. */ @@ -175,9 +205,9 @@ static void pmic_check_battery() (int)(u_batt * 1000.0) % 1000 ); - /* - * TODO: Handle voltage value - */ + if (u_batt < BATTERY_CRITICAL) { + pmic_die(u_batt); + } } /* -- GitLab