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