view src/cs/drivers/drv_app/lcc/lcc.h @ 303:f76436d19a7a default tip

!GPRS config: fix long-standing AT+COPS chance hanging bug There has been a long-standing bug in FreeCalypso going back years: sometimes in the AT command bring-up sequence of an ACI-only MS, the AT+COPS command would produce only a power scan followed by cessation of protocol stack activity (only L1 ADC traces), instead of the expected network search sequence. This behaviour was seen in different FC firmware versions going back to Citrine, and seemed to follow some law of chance, not reliably repeatable. This bug has been tracked down and found to be specific to !GPRS configuration, stemming from our TCS2/TCS3 hybrid and reconstruction of !GPRS support that was bitrotten in TCS3.2/LoCosto version. ACI module psa_mms.c, needed only for !GPRS, was missing in the TCS3 version and had to be pulled from TCS2 - but as it turns out, there is a new field in the MMR_REG_REQ primitive that needs to be set correctly, and that psa_mms.c module is the place where this initialization needed to be added.
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 08 Jun 2023 08:23:37 +0000
parents 4e78acac3d88
children
line wrap: on
line source

/******************************************************************************
 * Power Task (pwr)
 * Design and coding by Svend Kristian Lindholm, skl@ti.com
 *
 * PWR Types and globals
 *
 * $Id: pwr.h 1.2 Wed, 20 Aug 2003 12:54:50 +0200 skl $
 *
 ******************************************************************************/

#ifndef _LCC_H_
#define _LCC_H_

#include "lcc/lcc_cfg.h"

#ifdef _RVF
#include "rvf/rvf_api.h"
#include "rv/rv_general.h"
#include "lcc/lcc_api.h"
#include "lcc/lcc_cfg_i.h"
#endif

#define PWRVERSION 0x0202

/******************************************************************************
 * Types
 ******************************************************************************/

#ifndef BASIC_TYPES
#define BASIC_TYPES
typedef signed   char  int8;
typedef unsigned char  uint8;
typedef signed   short int16;
typedef unsigned short uint16;
typedef signed   int   int32;
typedef unsigned int   uint32;
#endif

typedef int8   epwr_t;      // error type



/******************************************************************************
 * RVF Types
 ******************************************************************************/

// Mail namings (REQ,IND,RSP) according to RIV010

// Request mail
struct pwr_req_s {
     T_RV_HDR header;
};

// Indication mail with ADC measurements
struct pwr_adc_ind_s {
     T_RV_HDR header;
     unsigned short data[9+1]; // ADC measurements + status of VRPCSTS register
};

// Response mail sent to ETM
struct pwr_tm_req_s {
     T_RV_HDR header;
};

typedef epwr_t                T_PWR_RET;
typedef struct pwr_req_s      T_PWR_REQ;

typedef struct
{
    uint16   alfa_num;     // Slope numerator
    uint16   alfa_denom;   // Slope denominator
    int16    beta;         // Offset
} T_PWR_I2V_CAL_BLOCK;

typedef struct
{
    uint16   alfa_num;     // Slope numerator
    uint16   alfa_denom;   // Slope denominator
    int16    beta;         // Offset
} T_PWR_VBAT_CAL_BLOCK;

// Corresponds to /pwr/i2v.cal and /pwr/vbat.cal
typedef struct
{
    T_PWR_I2V_CAL_BLOCK   i2v;
    T_PWR_VBAT_CAL_BLOCK vbat;
} T_PWR_CAL_BLOCK;

// Corresponds to /pwr/common.cfg
typedef struct
{
    uint32   sampling;     /* 4 */ // The sampling time [ms] used
    uint32   mod_cycle;    /* 4 */ // The modulation cycle time [ms] used when performing modulation (Lithium only)
    uint8    pins;         /* 1 */ // Number of battery pins 2 - 3 - 4
    uint8    chg_dedic;    /* 1 */ // Charging performed (TRUE) or not (FALSE) in dedicated mode
    uint8    alfa1;        /* 1 */ // The regulation parameter N (Exponentially Weighted Moving Average) for Vbat
    uint8    alfa2;        /* 1 */ // The regulation parameter N (Exponentially Weighted Moving Average) for Tbat
    uint8    alfa3;        /* 1 */ // The regulation parameter N (Exponentially Weighted Moving Average) for Trf
    uint8    rise_thr;     /* 1 */ // The battery rise temperature follows RF rise temperature threshold (Nickel only)
} T_PWR_COMMON_CFG_BLOCK;

// Corresponds to /pwr/bat/bat<N>.cfg
typedef struct
{
    uint16   type;          /* 2 */ // Battery type - Nickel or Lithium
    uint16   rf_temp;       /* 2 */ // Use rf temperature (TRUE) or not (FALSE) if no battery temperature is availlable
    uint32   id_low;        /* 4 */ // Low battery id limit - used for identification
    uint32   id_high;       /* 4 */ // High battery id limit - used for identification
    uint16   cbat;          /* 2 */ // Standard battery capacity [mAh]
    uint16   ratio;         /* 2 */ // Time ratio of charge current [C] (%) - ratio x cbat = max charger current
    uint32   T1;            /* 4 */ // The total time charging counter
    uint32   T2;            /* 4 */ // The CV charging complete timer (-Nickel)
    uint32   T3;            /* 4 */ // The re-charge attempt timer counter
    uint16   chg_start_thr; /* 2 */ // The CV charge begin battery voltage threshold value (-Nickel)
    uint16   chg_stop_thr;  /* 2 */ // The (CI and CV) charge end (stop) battery voltage threshold value
    uint16   chg_ctrl_thr;  /* 2 */ // The minimal charge control ('k_min') value threshold
    uint16   chg_again_thr; /* 2 */ // The charge again capacity threshold (t=20 degrees)
} T_PWR_BAT_CFG_BLOCK;

// Corresponds to /pwr/bat/temp<N>.cfg
typedef struct
{
    int16      tbat_min;  /* 2 */  // Minimum battery temperature allowed
    int16      tbat_max;  /* 2*/  // Maximum battery temperature allowed

    uint16    a0;         /* 2 */  // Capacity temperature compensation a0 (a2*t*t + a1*t +a0)
    uint16    a1;         /* 2 */  // Capacity temperature compensation a1 (a2*t*t + a1*t +a0)
    uint16    a2;         /* 2 */  // Capacity temperature compensation a2 (a2*t*t + a1*t +a0)
                          // Capacity compensation function relative to t=20 degrees
                          // C(t=0) = C(t=20) + capacity compensation function(t=-20)

    uint16   cap[9+1];      /* 20 */ // Capacity as a function of voltage measured at t=20 degrees - C(t=20)
                          // Capacity vector : 100%, 90%, 80%, 70% ,60% ,50%, 40%, 30%, 20%, 10%

    uint16     i_meas1;   /* 2 */  // The choosen measurement current, i_measure (typically 10uA and 50uA)
    uint16     i_meas2;   /* 2 */  // The choosen measurement current, i_measure (typically 10uA and 50uA)
    uint16     v2t_1[8+1];  /* 18 */ // The voltage to temperature mapper for i_measure
    uint16     v2t_2[8+1];  /* 18 */ // The voltage to temperature mapper for i_measure
                          // Temperature vector : -20, -10, 0, 10 ,20 ,30, 40, 50, 60
                          // Interpolation is applied when mapping


} T_PWR_BAT_TEMP_CFG_BLOCK;

// Corresponds to /pwr/chg/chg<N>.cfg
typedef struct
{
    uint16   type;       /* 2 */ // Charger type - Regulated (CI or CV) or unregulated (UNREGULATED)
    uint16   ichg_max;   /* 2 */ // Maximum charger current [mA] - normally decides the fast charging current
    uint16   vchg_low;   /* 2 */ // Low charger voltage limit  (Open circuit - used for identification )
    uint16   vchg_high;  /* 2 */ // High charger voltage limit (Open circuit- used for identification)
} T_PWR_CHG_CFG_BLOCK;

// The power data block - dynamical data collected
typedef struct
{
    uint16       bat_id;             // Measured battery ID
    uint16       chg_id;             // Measured charger ID

    uint16       Vbat;               // Latest measured battery voltage
    uint16       Vbat_avg;           // Latest _average_ battery voltage
    uint16       Vbat_avg_mV;        // Latest _average_ battery voltage

    uint16       Tbat;               // Latest measured battery temperature
    uint16       Tbat_avg;           // Latest _average_ battery temperature

    uint16       T_rf;               // Latest measured RF temperature
    uint16       T_rf_avg;           // Latest _average_ RF temperature

    uint16       Vchg;               // Latest measured charger voltage
    uint16       Ichg;               // Latest measured charger current

    uint16       Cbat;               // Battery capacity in %

    char         cfg_id;             // Configuration ID (bat<n>.cfg)
    char         chg_cfg_id;         // Charger Configuration ID (chg<n>.cfg)
    char         bforce;             // Force usage of battery configuration
    char         cforce;             // Force usage of charger configuration
    uint16       k;                  // Modulation value
    uint32       T4;                 // The modulation ON T4 timer counter (variable!!)
} T_PWR_DATA_BLOCK;

// The PWR control block - state and debug info
typedef struct
{
    int      state;                  // The battery & charging state of the PWR task
    uint8    flag_chg_plugged;       // Charger has been plugged (1) or not (0) flag
    uint8    flag_chg_prev_plugged;  // The previous charger poll said plugged (1) or not plugged (0) flag
    uint8    flag_chg_cfg_read;      // Charger configuration has been read (1) or not (0) flag
    uint8    flag_cal_cfg_read;      // Calibration files has been read (1) or not (0) flag
    uint8    flag_bat_unknown;       // Battery was unknown (1) - or not (0) - the MMI must be told
    uint8    flag_chg_unknown;       // Charger plugged  was unknown (1) - or not (0) - the MMI must be told
    uint8    flag_mmi_registered;    // MMI has registered (1) or not (0)
    uint8    flag_prechg_started;    // Stay in precharge state PRE - Apply fast charging no matter what charger type
    uint8    flag_chg_int_disabled;  // Charger interrupts are disabled (1) or enabled (0)
    uint8    flag_ini_virgo;         // Entering INI state for the very first time - in order to control some very basic initialization
    uint8    cfg_id;                 // Applied battery configuration id
    uint8    chg_cfg_id;             // Applied charger configuration id
    uint8    count_bat_type;         // The number of battery identification measurements reported in state INI
    uint8    count_chg_type;         // The number of charger identification measurements made in state SUP
    uint8    chg_unplug_vec[CONSECUTIVE_CHG_UNPLUGS];    // The charger unplug vector keeps the latest polled values of charger unplug
    uint8    index;                  // The current index of the charger unplug vector
    uint16   capacity;               // The current capacity : 0..100%

    // Timers
    UINT32   time_begin_T0;          // T0: Sampling timer  (constant but modulo ADC updates)
    UINT32   time_elapsed_T0;
    UINT32   time_begin_T1;          // T1: The total charging time timer (constant)
    UINT32   time_elapsed_T1;
    UINT32   time_begin_T2;          // T2: The total CV charging time timer (constant)
    UINT32   time_elapsed_T2;
    UINT32   time_begin_T3;          // T3: The charge-again-without start-stop of charging (constant)
    UINT32   time_elapsed_T3;
    UINT32   time_begin_T4;          // T4: The duty cycle timer
    UINT32   time_elapsed_T4;
    UINT32   time_begin_mod_cycle;   // The modulation cycle timer
    UINT32   time_elapsed_mod_cycle;
    UINT32   time_begin_mmi_rep;     // MMI repetition
    UINT32   time_elapsed_mmi_rep;

    UINT32   tmask;                  // The trace mask used for the PWR process - activated by test mode

    T_RVF_ADDR_ID addr_id;           // Task address id assigned by Riviera framework
    T_RVF_MB_ID   prim_id;           // Memory bank id assigned by Riviera framework

    T_RV_RETURN rpath;               // Return path of the MMI - initialized in pwr_register
    struct mmi_info_ind_s *mmi_ptr;  // Pointer to mmi event memory assigned by the MMI
} T_PWR_CTRL_BLOCK;

// The PWR configuration block - common, charger and battery
typedef struct
{
    T_PWR_CAL_BLOCK cal;             // Calibration matrix
    T_PWR_COMMON_CFG_BLOCK common;   // Common configuration
    T_PWR_BAT_CFG_BLOCK bat;         // Battery configuration
    T_PWR_BAT_TEMP_CFG_BLOCK temp;   // Battery temperature configuration
    T_PWR_CHG_CFG_BLOCK chg;         // Charger configuration
    T_PWR_MMI_CFG_BLOCK mmi;         // MMI configuration
    T_PWR_DATA_BLOCK data;           // Data (dynamic) related to configuration
} T_PWR_CFG_BLOCK;

// Use these values if no FFS files are found
// Units: [ms], [mV] and [mA]
#ifndef PWR_FFS_CFG
    #define PWR_T0_THR            10000
    #define PWR_T1_THR            1800000 // 1/2 hour
    #define PWR_T2_THR            25000
    #define PWR_T3_THR            10000
    #define PWR_MOD_CYCLE_THR    10000
    #define PWR_MMI_REP_THR       60000
    #define PWR_ICHG_MAX          400
    #define EXP_MOVING_AVG_FILTER1 5
    #define EXP_MOVING_AVG_FILTER2 10
    #define EXP_MOVING_AVG_FILTER3 10
    #define PWR_TEMPERATURE_LOW   -20
    #define PWR_TEMPERATURE_HIGH   45
    #define PWR_CV_START_THR      4050
    #define PWR_CHG_STOP_THR      4100
    #define PWR_RISE_THR          4
    #define PWR_MIN_K             20
    #define PWR_MAX_K             200
#endif

#define TYPEN 0x0080               /* Enables the 10uA bias current for the main battery type reading */
#define THERMAL_SENSOR_10uA 0x0041 /* THSENS0 , THSENS1, THSENS2 = 0, 0, 0  MESBAT = 1 */
#define THERMAL_SENSOR_30uA 0x0051 /* THSENS0 , THSENS1, THSENS2 = 0, 1, 0  MESBAT = 1 */
#define THERMAL_SENSOR_50uA 0x0061 /* THSENS0 , THSENS1, THSENS2 = 0, 0, 1  MESBAT = 1 */
#define THERMAL_SENSOR_80uA 0x0079 /* THSENS0 , THSENS1, THSENS2 = 1, 1, 1  MESBAT = 1 */
#define MESBAT              0x0001 /* Resistive divider connected to main battery */
#define CHARGER_IT_MSK      0x0008 /* Mask the charger plug/unplug interrupts */
#define ALL_IT_UMSK         0x0000 /* Unmask all interrupt 2 register related interrupts */

// Convert functions
#define ADC_to_mV(ADC) ((pwr_cfg->cal.vbat.alfa_num*(ADC))/(pwr_cfg->cal.vbat.alfa_denom) + pwr_cfg->cal.vbat.beta)
#define ADC_to_mA(ADC) ((pwr_cfg->cal.i2v.alfa_num*(ADC))/(pwr_cfg->cal.i2v.alfa_denom) + pwr_cfg->cal.i2v.beta)

// Inverse convert functions
#define mV_to_ADC(V) (pwr_cfg->cal.vbat.alfa_num*((V)/pwr_cfg->cal.vbat.alfa_denom) - pwr_cfg->cal.vbat.beta)
#define mA_to_ADC(I) (pwr_cfg->cal.i2v.alfa_num*((I)/pwr_cfg->cal.i2v.alfa_denom) - pwr_cfg->cal.i2v.beta)

/******************************************************************************
 * Errors
 ******************************************************************************/

enum PWR_ERRORS {
    EPWR_OK          =  0  /* ok */
};

/******************************************************************************
 * Enumerations
 ******************************************************************************/

// Message IDs for all PWR module messages
typedef enum PWR_MESSAGES {
    NOP = 0,

    /* Requests */
        /* ABB */
        /* MMI */
    MMI_REGISTER_REQ         = 20,

    /* Timers*/
    TIMER_T1_EXPIRED         = 30,
    TIMER_T2_EXPIRED,
    TIMER_T3_EXPIRED,
    TIMER_T4_EXPIRED,
    TIMER_MOD_CYCLE_EXPIRED,
    TIMER_MMI_INFO_EXPIRED,

    /* Indications */
    /* PWR */
    PWR_CHARGER_PLUGGED_IND  = 40,
    PWR_CHARGER_UNPLUGGED_IND,

    /* Confirmations */

    /* Test mode */
    /* Request */
    PWR_TM_READ_REQ = 70,
    PWR_TM_WRITE_REQ,

    /* Indications */
    PWR_TM_READ_IND = 80,
    PWR_TM_WRITE_IND,

    PWR_ADC_IND = 90

} pwr_msg_e;

// See LCC Detailed Design Specification
typedef enum PWR_STATES {
    CAL = 0, // Reading calibration file(s)
    PRE = 1, // Pre-charging no matter which charger type
    INI = 2, // Reading configuration files
    SUP = 3, // No charging - supervision only
    CCI = 4, // Charging using CI/CV charger
    LCI = 5, // Charging using linear charger
    CCV = 6, // Charging using CI/CV charger
    LCV = 7  // Charging using linear charger
} pwr_states_e;

// See RD818
typedef enum CHG_TYPES {
    CI = 1,
    CV = 2,
    UNREGULATED = 3
} chg_types_e;

// See RD818
typedef enum BAT_TYPES {
    LITHIUM = 1,
    NICKEL = 2
} bat_types_e;

// See RIV261
typedef enum CAUSE_TYPES {
    BATTERY_TEMPERATURE_OK   = 0,
    BATTERY_TEMPERATURE_LOW  = 1,
    BATTERY_TEMPERATURE_HIGH = 2
} cause_types_e;

enum PWR_Errors {
    // PWR Common Target Errors
    PWR_OK          =    0,  // Ok
    PWR_INDEX       =  -1,   // Unknown index
    PWR_OK_MORE     = -63,   // Ok, more data coming
    PWR_PACKET      = -62,   // Packet error (checksum or other)
    PWR_FATAL       = -61,   // System fatal error
    PWR_NOSYS       = -60,   // Module or function not present
    PWR_INVAL       = -59,   // Invalid parameter/argument
    PWR_BADOP       = -58,   // Operation not possible in current context
    PWR_AGAIN       = -57,   // Not ready, try again later
    PWR_NOMEM       = -56,   // Out of memory
    PWR_MESSAGE     = -55,   // Received unknown message

    // Errors that are related to the Riv env.
    PWR_RV_NOT_SUPPORTED = -51, //
    PWR_RV_MEMORY_ERR    = -50, //
    PWR_RV_INTERNAL_ERR  = -49, //
    PWR_RV_FATAL         = -48 //

};

#endif //_LCC_H_