diff src/cs/drivers/drv_app/lcc/lcc_env.c @ 0:4e78acac3d88

src/{condat,cs,gpf,nucleus}: import from Selenite
author Mychaela Falconia <falcon@freecalypso.org>
date Fri, 16 Oct 2020 06:23:26 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/cs/drivers/drv_app/lcc/lcc_env.c	Fri Oct 16 06:23:26 2020 +0000
@@ -0,0 +1,231 @@
+/******************************************************************************
+ * Power Task (pwr)
+ * Design and coding by Svend Kristian Lindholm, skl@ti.com
+ *
+ * Environment (Riviera) functions
+ *
+ * $Id: pwr_env.c 1.2 Wed, 20 Aug 2003 12:54:50 +0200 skl $
+ *
+ ******************************************************************************/
+
+#include "lcc/lcc.h"
+#include "lcc/lcc_env.h"
+#include "lcc/lcc_task.h"
+#include "lcc/lcc_trace.h"
+#include "lcc/lcc_handle_timers.h"
+
+#include "rv/rv_defined_swe.h"
+#include "rvm/rvm_priorities.h"
+#include "rvm/rvm_api.h"
+#include "rvm/rvm_use_id_list.h"
+
+#include <string.h>
+#include "abb/abb.h"
+
+/* Define a pointer to the PWR environment control block */
+T_PWR_CTRL_BLOCK *pwr_ctrl = NULL;
+
+/* Define a pointer to the PWR configuration block */
+T_PWR_CFG_BLOCK  *pwr_cfg  = NULL;
+
+// Function Prototypes
+T_RVM_RETURN pwr_init(void);
+T_RVM_RETURN pwr_start(void);
+T_RVM_RETURN pwr_stop(T_RV_HDR *msg);
+T_RVM_RETURN pwr_kill (void);
+
+void ttr(unsigned trmask, char *format, ...);
+void str(unsigned mask, char *string);
+
+
+T_RVM_RETURN pwr_task_init (void);
+
+/* Define global pointer to the error function */
+static T_RVM_RETURN (*pwr_error_ft) (T_RVM_NAME    swe_name,
+                                     T_RVM_RETURN  error_cause,
+                                     T_RVM_ERROR_TYPE  error_type,
+                                     T_RVM_STRING   error_msg);
+
+// Handle timers
+#include "lcc/lcc_handle_timers.c"
+
+T_RVM_RETURN lcc_get_info (T_RVM_INFO_SWE  *infoSWE)
+{
+#if 1
+   ttw(ttr(TTrEnv, "lcc_get_info(%d):" NL, 0));
+#endif
+   /* SWE info */
+
+   /* TYPE3 : Blocking by using FFS */
+   infoSWE->swe_type = RVM_SWE_TYPE_3; 
+   infoSWE->type_info.type3.swe_use_id = LCC_USE_ID;
+   infoSWE->type_info.type3.stack_size = LCC_STACK_SIZE;
+   infoSWE->type_info.type3.priority   = RVM_LCC_TASK_PRIORITY;
+   infoSWE->type_info.type3.version    = LCC_TASK_VERSION;
+
+   memcpy( infoSWE->type_info.type3.swe_name, "LCC", sizeof("LCC") );
+
+   /* Set the return path */
+   infoSWE->type_info.type3.return_path.callback_func = NULL;
+   infoSWE->type_info.type3.return_path.addr_id       = 0;
+
+   /* memory bank info */
+   infoSWE->type_info.type3.nb_mem_bank = 1;
+
+   memcpy ((UINT8 *) infoSWE->type_info.type3.mem_bank[0].bank_name, "LCC_PRIM", 9);
+   infoSWE->type_info.type3.mem_bank[0].initial_params.size          = LCC_MB_PRIM_SIZE;
+   infoSWE->type_info.type3.mem_bank[0].initial_params.watermark     = LCC_MB_PRIM_WATERMARK;
+
+   /* Linked SW entities : FIXME: LCC needs SPI & FFS */ 
+   infoSWE->type_info.type3.nb_linked_swe = 0;
+
+   /* generic functions */
+   infoSWE->type_info.type3.set_info = pwr_set_info;
+   infoSWE->type_info.type3.init     = pwr_init;
+   infoSWE->type_info.type3.start    = pwr_start;
+   infoSWE->type_info.type3.stop     = pwr_stop;
+   infoSWE->type_info.type3.kill     = pwr_kill;
+
+   return RV_OK;
+
+}
+
+
+T_RVM_RETURN pwr_set_info(T_RVF_ADDR_ID   addr_id,
+                          T_RV_RETURN     return_path[],
+                          T_RVF_MB_ID     mbId[],
+                          T_RVM_RETURN  (*callBackFct) (T_RVM_NAME SWEntName,
+                                                        T_RVM_RETURN errorCause,
+                                                        T_RVM_ERROR_TYPE errorType,
+                                                        T_RVM_STRING errorMsg))
+{
+
+    T_RVF_MB_STATUS   mb_status;
+
+    ttw(ttr(TTrEnv, "pwr_set_info(%d)" NL, addr_id));
+    ttw(ttr(TTrEnvLow, "  mbId[0] = %d" NL, mbId[0]));
+
+    mb_status = rvf_get_buf(mbId[0],sizeof(T_PWR_CTRL_BLOCK),(void **) &pwr_ctrl);
+    if (mb_status == RVF_RED) 
+    {
+        ttr(TTrFatal, "LCC FATAL: no memory: %d" NL, addr_id);
+        return (RVM_MEMORY_ERR);
+    }
+    memset(&pwr_ctrl->state, 0xBA, sizeof(T_PWR_CTRL_BLOCK));
+
+    mb_status = rvf_get_buf(mbId[0],sizeof(T_PWR_CFG_BLOCK),(void **) &pwr_cfg);
+    if (mb_status == RVF_RED) 
+    {
+        ttr(TTrFatal, "LCC FATAL: no memory: %d" NL, addr_id);
+        return (RVM_MEMORY_ERR);
+    }
+    memset(&pwr_cfg->cal.i2v , 0xBA, sizeof(T_PWR_CFG_BLOCK));
+
+    /* store the pointer to the error function */
+    pwr_error_ft = callBackFct ;
+
+    /* Store the addr id */
+    pwr_ctrl->addr_id = addr_id;
+
+
+    /* Store the memory bank id */
+    pwr_ctrl->prim_id = mbId[0];
+
+    /* Battery & charging related initialisation */
+
+    // State initialisation
+    pwr_ctrl->state = CAL;
+
+    // Create timers (Initialize...)
+    pwr_create_timer(&pwr_ctrl->time_begin_T0);
+    pwr_create_timer(&pwr_ctrl->time_begin_T1);
+    pwr_create_timer(&pwr_ctrl->time_begin_T2);
+    pwr_create_timer(&pwr_ctrl->time_begin_T3);
+    pwr_create_timer(&pwr_ctrl->time_begin_T4);
+    pwr_create_timer(&pwr_ctrl->time_begin_mod_cycle);
+    pwr_create_timer(&pwr_ctrl->time_begin_mmi_rep);
+
+    /* Flags initialisation and other state related init */
+
+    // Calibration configuration file not read
+    pwr_ctrl->flag_cal_cfg_read = 0;
+
+    // Charger configuration file not read
+    pwr_ctrl->flag_chg_cfg_read = 0;
+
+    // Default configuration id used
+    pwr_cfg->data.cfg_id = '1';
+
+    // Number of battery identification measurements reported
+    pwr_ctrl->count_bat_type = 0;
+    pwr_ctrl->count_chg_type = 0;
+
+    // Precharge PRE state - Applies only for 3.2V < Vbat < 3.6V
+    pwr_ctrl->flag_prechg_started = 0;
+
+    // Charger Interrupts are disabled from the start
+    pwr_ctrl->flag_chg_int_disabled = 1;
+
+    // First time in INI state
+    pwr_ctrl->flag_ini_virgo = 0;
+
+    // Default charger type is UNREGULATED
+    // Meaning charger interrupts will not be enabled
+    pwr_cfg->chg.type = UNREGULATED;
+
+    // Unplug default is that charger is unplugged (0)
+    memset(&pwr_ctrl->chg_unplug_vec , 0x0, CONSECUTIVE_CHG_UNPLUGS);
+    pwr_ctrl->index = 0;
+
+
+   // MMI hasn't registered
+   pwr_ctrl->flag_mmi_registered = 0;
+
+   // Init of plug/unplug state machine - from default the charger is not plugged
+   pwr_ctrl->flag_chg_prev_plugged = 0;
+
+    return RV_OK;
+}
+
+
+T_RVM_RETURN pwr_init(void)
+{
+   T_RVM_RETURN error;
+   // Mask off the charger interrupts (plug/unplug) - in case it was a linear charger
+   // Don't want to get killed in a vast number of interrupts...
+   ABB_Write_Register_on_page(PAGE0, ITMASK, CHARGER_IT_MSK);
+   pwr_ttr_init(0xff000000);
+   pwr_ctrl->tmask = 0xff000000;
+   ttw(ttr(TTrEnv, "pwr_init(%d)" NL, 0));
+   return RV_OK;
+}
+
+T_RVM_RETURN pwr_start(void)
+{
+   T_RVM_RETURN error;
+   ttw(ttr(TTrEnv, "pwr_start(%d)" NL, 0));
+   pwr_task();
+   ttw(ttr(TTrEnv, "pwr_start(%d)" NL, 0xFF));
+   return RV_OK;
+}
+
+T_RVM_RETURN pwr_stop(T_RV_HDR *msg)
+{
+   ttw(ttr(TTrEnv, "pwr_stop(%d)" NL, 0));
+   return RV_OK;
+}
+
+T_RVM_RETURN pwr_kill (void)
+{
+   T_RVM_RETURN error;
+
+   ttw(ttr(TTrEnv, "pwr_kill(%d)" NL, 0));
+
+   /* free all memory buffer previously allocated */
+   rvf_free_buf ((void *) pwr_ctrl);
+   rvf_free_buf ((void *) pwr_cfg);
+   ttw(ttr(TTrEnv, "pwr_kill(%d)" NL, 0xFF));
+
+   return RV_OK;
+}
+