changeset 648:337e6d3a4454

abb.c: disable superdeep sleep on Luna
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 07 May 2020 06:28:56 +0000
parents 94cb5e76b3b5
children 37396b85f3f7
files src/cs/drivers/drv_core/abb/abb.c
diffstat 1 files changed, 26 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/cs/drivers/drv_core/abb/abb.c	Thu Apr 16 16:48:08 2020 +0000
+++ b/src/cs/drivers/drv_core/abb/abb.c	Thu May 07 06:28:56 2020 +0000
@@ -92,6 +92,28 @@
 
 #define	ENABLE_BACKUP_BATTERY	0
 
+/*
+ * The following ABB_sleep_allowed global variable is yet another FreeCalypso
+ * addition.  Here is the issue: some handset boards have the controller/driver
+ * chip in the LCD powered from Iota VRIO, which is generally a very sensible
+ * arrangement.  As one reference example, our 176x220 pixel TFT LCDs which
+ * we are considering for our own FC handset draw about 3 mA from their Vci
+ * supply which we connect to VRIO - perfectly fine when the regulators are
+ * in their normal Active mode.  But what about sleep mode?  Sleep mode VRIO
+ * current limit is only 1 mA, thus the combination of the LCD being on and
+ * drawing 3 mA with the ABB in sleep mode is invalid.  TI's original code
+ * already had a check for VRPCSTS: PWON and RPWON need to be released and
+ * the charger needs to be unplugged in order to enter ABB superdeep sleep.
+ * We are extending this check with one more condition: ABB_sleep_allowed
+ * needs to be nonzero; the intent is that this variable will be set by the
+ * code responsible for putting the LCD into its own powerdown mode.
+ * This logic is included only for affected targets with LCDs.
+ */
+
+#ifdef CONFIG_TARGET_LUNA
+int ABB_sleep_allowed = 0;
+#endif
+
 #if (ABB_SEMAPHORE_PROTECTION)   
 
 static NU_SEMAPHORE abb_sem;
@@ -856,7 +878,11 @@
       // Read VRPCSTS register value and extract status of meaningfull inputs.  
       reg_val = ABB_ReadRegister(VRPCSTS) & 0x0070;
 
+    #ifdef CONFIG_TARGET_LUNA
+      if (reg_val == 0x30 && ABB_sleep_allowed)
+    #else
       if (reg_val == 0x30)
+    #endif
       {
         // start the SLPDLY counter in order to switch the ABB in sleep mode. This transmission sets IOTA sleep bit.
         ABB_WriteRegister(VRPCDEV, 0x02);