/* * Copyright (C) 2010 Freescale Semiconductor, Inc. All Rights Reserved. */ /* * The code contained herein is licensed under the GNU General Public * License. You may obtain a copy of the GNU General Public License * Version 2 or later at the following locations: * * http://www.opensource.org/licenses/gpl-license.html * http://www.gnu.org/copyleft/gpl.html */ #ifndef _DDI_BC_H #define _DDI_BC_H #include #define DDI_BC_MAX_RESTART_CYCLES 100 #define DDI_BC_LIION_CHARGING_VOLTAGE 4200 #define DDI_BC_ALKALINE_NIMH_CHARGING_VOLTAGE 1750 /* brief Defines battery charger states. */ typedef enum _ddi_bc_State { /* brief TBD */ DDI_BC_STATE_UNINITIALIZED = 0, /* brief TBD */ DDI_BC_STATE_BROKEN = 1, /* brief TBD */ DDI_BC_STATE_DISABLED = 2, /* brief TBD */ DDI_BC_STATE_WAITING_TO_CHARGE = 3, /* brief TBD */ DDI_BC_STATE_CONDITIONING = 4, /* brief TBD */ DDI_BC_STATE_CHARGING = 5, /* brief TBD */ DDI_BC_STATE_TOPPING_OFF = 6, /* brief TBD */ DDI_BC_STATE_DCDC_MODE_WAITING_TO_CHARGE = 7, } ddi_bc_State_t; typedef enum _ddi_bc_BrokenReason { /* brief TBD */ DDI_BC_BROKEN_UNINITIALIZED = 0, /* brief TBD */ DDI_BC_BROKEN_CHARGING_TIMEOUT = 1, /* brief TBD */ DDI_BC_BROKEN_FORCED_BY_APPLICATION = 2, /* brief TBD */ DDI_BC_BROKEN_EXTERNAL_BATTERY_VOLTAGE_DETECTED = 3, /* brief TBD */ DDI_BC_BROKEN_NO_BATTERY_DETECTED = 4, } ddi_bc_BrokenReason_t; /* brief Defines the battery charger configuration. */ typedef struct _ddi_bc_Cfg { /* brief Units in milliseconds. */ /* */ /* This field configures the expected period between calls to */ /* ddi_bc_StateMachine. If die temperature monitoring is */ /* enabled, then the data sheet recommends the period be around */ /* 100ms or less. */ /* */ /* Note that this period defines the minimum time resolution of */ /* the battery charger. */ uint32_t u32StateMachinePeriod; /* brief Units in mA/s. */ /* */ /* This field configures the slope of the current ramp. Any */ /* time the battery charger increases its current draw, it will */ /* ramp up the current no faster than this rate. */ /* */ /* Note that the minimum time resolution of the battery charger */ /* is the configured period between calls to advance the state */ /* machine. Also, the hardware has a minimum current resolution */ /* of 10mA. If the given ramp slope cannot be expressed */ /* exactly, then the largest expressible smaller slope will be */ /* the result. If the actual period between calls to */ /* ddi_bc_StateMachine is irregular, the current may ramp faster */ /* than indicated. */ uint16_t u16CurrentRampSlope; /* brief Units in millivolts. */ /* */ /* This field configures the threshold conditioning voltage. If */ /* the battery's voltage is below this value, it will be */ /* conditioned until its voltage rises above the maximum */ /* conditioning voltage. After that, the battery will be */ /* charged normally. */ /* */ /* Note that the hardware has a minimum resolution of 8mV. If */ /* the given voltage cannot be expressed exactly, then the */ /* smallest expressible larger value will be used. */ uint16_t u16ConditioningThresholdVoltage; /* brief Units in millivolts. */ /* */ /* This field configures the maximum conditioning voltage. If */ /* the battery charger is conditioning a battery, normal */ /* charging begins when the voltage rises above this value. */ /* */ /* This value should be slightly higher than the threshold */ /* conditioning voltage because it is measured while a */ /* conditioning current is actually flowing to the battery. */ /* With a conditioning current of 0.1C, reasonable values for */ /* the threshold and maximum conditioning voltages are 2.9V */ /* and 3.0V respectively. */ /* */ /* Note that the hardware has a minimum resolution of 8mV. If */ /* the given voltage cannot be expressed exactly, then the */ /* smallest expressible larger value will be used. */ uint16_t u16ConditioningMaxVoltage; /* brief Units in milliamps. */ /* */ /* This field configures the maximum conditioning current. */ /* This is the maximum current that will be offered to a */ /* battery while it is being conditioned. A typical value is */ /* 0.1C. */ /* */ /* Note that the hardware has a minimum resolution of 10mA */ /* (see the data sheet for details). If the given current */ /* cannot be expressed exactly, then the largest expressible */ /* smaller value will be used. */ uint16_t u16ConditioningCurrent; /* brief Units in milliseconds. */ /* */ /* This field configures the conditioning time-out. This is */ /* the maximum amount of time that a battery will be */ /* conditioned before the battery charger declares it to be */ /* broken. */ /* */ /* Note that the minimum time resolution of the battery */ /* charger is the configured period between calls to advance */ /* the state machine. If the given time-out cannot be */ /* expressed exactly, then the shortest expressible longer */ /* value will be used. */ uint32_t u32ConditioningTimeout; /* brief Units in millivolts. */ /* */ /* This field configures the final charging voltage. At this */ /* writing, only two values are permitted: 4100 or 4200. */ uint16_t u16ChargingVoltage; /* brief Units in milliamps. */ /* */ /* This field configures the maximum current offered to a */ /* charging battery. */ /* */ /* Note that the hardware has a minimum resolution of 10mA */ /* (see the data sheet for details). If the given current */ /* cannot be expressed exactly, then the largest expressible */ /* smaller value will be used. */ uint16_t u16ChargingCurrent; /* brief Units in milliamps. */ /* */ /* This field configures the current flow below which a */ /* charging battery is regarded as fully charged (typical */ /* 0.1C). At this point, the battery will be topped off. */ /* */ /* Note that the hardware has a minimum resolution of 10mA */ /* (see the data sheet for details). If the given current */ /* cannot be expressed exactly, then the largest expressible */ /* smaller value will be used. */ uint16_t u16ChargingThresholdCurrent; /* brief Units in milliamps. */ /* */ /* When charging while the DCDC converter's are enabled, the charger */ /* is suppling current to both the battery and the Vbat input of the */ /* DCDC converter. Once the total battery charger current falls */ /* below this level, the charger will then stop charging until the */ /* the battery voltage reaches the BC_LOW_DCDCMODE_BATTERY_VOLTAGE */ /* threshold or until the DCDCs are no longer enabled. */ /* */ /* Typically, this value should be left at 180 to avoid the risk */ /* of topping off the battery too long in DCDC mode and avoid */ /* exceeding the BC_CHARGING_TIMEOUT time which would put the charger */ /* driver in the broken state and completely disable charging. */ /* */ /* Note that the hardware has a minimum resolution of 10mA */ /* (see the data sheet for details). If the given current */ /* cannot be expressed exactly, then the largest expressible */ /* smaller value will be used. */ uint16_t u16DdcdModeChargingThresholdCurrent; /* brief Units in milliseconds. */ /* */ /* This field configures the charging time-out. This is the */ /* maximum amount of time that a battery will be charged */ /* before the battery charger declares it to be broken. */ /* */ /* Note that the minimum time resolution of the battery */ /* charger is the configured period between calls to advance */ /* the state machine. If the given time-out cannot be */ /* expressed exactly, then the shortest expressible longer */ /* value will be used. */ uint32_t u32ChargingTimeout; /* brief Units in milliseconds. */ /* */ /* This field configures the top-off period. This is the */ /* amount of time a battery will be held in the Topping Off */ /* state before it is declared fully charged. */ /* */ /* Note that the minimum time resolution of the battery */ /* charger is the configured period between calls to advance */ /* the state machine. If the given time-out cannot be */ /* expressed exactly, then the shortest expressible longer */ /* value will be used. */ uint32_t u32TopOffPeriod; /* brief Units in milliseconds. */ /* */ /* This field configures the top-off period when the DCDC */ /* converters are enabled. To avoid topping off the LiIon */ /* battery too long and reducing it's long term capacity, */ /* This time should be kept failry short. */ /* */ /* Note that the minimum time resolution of the battery */ /* charger is the configured period between calls to advance */ /* the state machine. If the given time-out cannot be */ /* expressed exactly, then the shortest expressible longer */ /* value will be used. */ uint32_t u32DcdcModeTopOffPeriod; /* brief Causes the battery charger to use an externally generated bias current */ /* */ /* If cleared, this causes the battery charger to use an */ /* externally generated bias current, which is expected to be */ /* quite precise. Otherwise, the battery charger will */ /* generate a lesser-quality bias current internally. */ uint8_t useInternalBias:1; /* brief Indicates that the battery charger is to monitor the die temperature. */ /* */ /* If set, this field indicates that the battery charger is to */ /* monitor the die temperature. See below for fields that */ /* configure the details. */ uint8_t monitorDieTemp:1; /* brief Indicates that the battery charger is to monitor the battery temperature. */ /* */ /* If set, this field indicates that the battery charger is to */ /* monitor the battery temperature. See below for fields that */ /* configure the details. */ uint8_t monitorBatteryTemp:1; /* brief Units in degrees centigrade. */ /* */ /* Note that the hardware reports die temperature in ranges of */ /* 10 degree resolution minimum (see the data sheet for */ /* details). If the battery charger is monitoring the die */ /* temperature, and it rises to a range that includes a */ /* temperature greater than or equal to this value, the */ /* charging current will be clamped to the safe current. */ int8_t u8DieTempHigh; /* brief Units in degrees centigrade. */ /* */ /* Note that the hardware reports die temperature in ranges of */ /* 10 degrees minimum (see the data sheet for details). If the */ /* charging current is being clamped because of a high die */ /* temperature, and it falls to a range that doesn't include a */ /* temperatures greater than or equal to this value, the */ /* charging current clamp will be released. */ int8_t u8DieTempLow; /* brief Units in milliamps. */ /* */ /* If the battery charger detects a high die temperature, it */ /* will clamp the charging current at or below this value. */ uint16_t u16DieTempSafeCurrent; /* brief If the battery charger is monitoring the battery */ /* temperature, this field indicates the LRADC channel to */ /* read. */ uint8_t u8BatteryTempChannel; /* brief If the battery charger is monitoring the battery */ /* temperature, and it rises to a measurement greater than or */ /* equal to this value, the charging current will be clamped */ /* to the corresponding safe current. */ uint16_t u16BatteryTempHigh; /* brief If the charging current is being clamped because of a high */ /* battery temperature, and it falls below this value, the */ /* charging current clamp will be released. */ uint16_t u16BatteryTempLow; /* brief Units in milliamps. */ /* */ /* If the battery charger detects a high battery temperature, */ /* it will clamp the charging current at or below this value. */ uint16_t u16BatteryTempSafeCurrent; /* brief Units in millivolts. */ /* */ /* In the WaitingToCharge state, if we are in DCDC */ /* operating modes, if the battery voltage measurement */ /* is below this value, we immediately proceed with charging. */ /* the low criteria for this value is that it must be high */ /* to not risk the battery voltage getting too low. The */ /* upper criteria is that you do not want the IR voltage */ /* drop under heavy loads to make you start charging too soon */ /* because the goal in DCDC operating mode is to not be constantly */ /* topping off the battery which can shorten its life */ uint16_t u16LowDcdcBatteryVoltage_mv; uint32_t u32StateMachineNonChargingPeriod; } ddi_bc_Cfg_t; /* Status returned by Battery Charger functions. */ typedef enum _ddi_bc_Status { /* brief TBD */ DDI_BC_STATUS_SUCCESS = 0, /* brief TBD */ DDI_BC_STATUS_HARDWARE_DISABLED, /* brief TBD */ DDI_BC_STATUS_BAD_BATTERY_MODE, /* brief TBD */ DDI_BC_STATUS_CLOCK_GATE_CLOSED, /* brief TBD */ DDI_BC_STATUS_NOT_INITIALIZED, /* brief TBD */ DDI_BC_STATUS_ALREADY_INITIALIZED, /* brief TBD */ DDI_BC_STATUS_BROKEN, /* brief TBD */ DDI_BC_STATUS_NOT_BROKEN, /* brief TBD */ DDI_BC_STATUS_NOT_DISABLED, /* brief TBD */ DDI_BC_STATUS_BAD_ARGUMENT, /* brief TBD */ DDI_BC_STATUS_CFG_BAD_BATTERY_TEMP_CHANNEL, /* brief TBD */ DDI_BC_STATUS_CFG_BAD_CHARGING_VOLTAGE, } ddi_bc_Status_t; /* BCM Event Codes */ /* These are the codes that might be published to PMI Subscribers. */ #define DDI_BC_EVENT_GROUP (11<<10) /* brief TBD */ /* todo [PUBS] Add definition(s)... */ typedef enum { /* Use the error code group value to make events unique for the EOI */ /* brief TBD */ ddi_bc_MinEventCode = DDI_BC_EVENT_GROUP, /* brief TBD */ ddi_bc_WaitingToChargeCode, /* brief TBD */ ddi_bc_State_ConditioningCode, /* brief TBD */ ddi_bc_State_Topping_OffCode, /* brief TBD */ ddi_bc_State_BrokenCode, /* brief TBD */ ddi_bc_SettingChargeCode, /* brief TBD */ ddi_bc_RaisingDieTempAlarmCode, /* brief TBD */ ddi_bc_DroppingDieTempAlarmCode, /* brief TBD */ ddi_bc_MaxEventCode, /* brief TBD */ ddi_bc_DcdcModeWaitingToChargeCode } ddi_bc_Event_t; /* Prototypes */ /* brief Initialize the Battery Charger. */ /* */ /* fntype Function */ /* */ /* This function initializes the Battery Charger. */ /* */ /* param[in] pCfg A pointer to the new configuration. */ /* */ /* retval DDI_BC_STATUS_SUCCESS */ /* If the operation succeeded. */ /* retval DDI_BC_STATUS_ALREADY_INITIALIZED */ /* If the Battery Charger is already initialized. */ /* retval DDI_BC_STATUS_HARDWARE_DISABLED */ /* If the Battery Charger hardware is disabled by a laser fuse. */ /* retval DDI_BC_STATUS_BAD_BATTERY_MODE */ /* If the power supply is set up for a non-rechargeable battery. */ /* retval DDI_BC_STATUS_CLOCK_GATE_CLOSED */ /* If the clock gate for the power supply registers is closed. */ /* retval DDI_BC_STATUS_CFG_BAD_CHARGING_VOLTAGE */ /* If the charging voltage is not either 4100 or 4200. */ /* retval DDI_BC_STATUS_CFG_BAD_BATTERY_TEMP_CHANNEL */ /* If the LRADC channel number for monitoring battery temperature */ /* is bad. */ /* */ /* internal */ /* see To view the function definition, see ddi_bc_init.c. */ extern ddi_bc_Status_t ddi_bc_Init(ddi_bc_Cfg_t *pCfg); /* */ /* brief Report the Battery Charger configuration. */ /* */ /* fntype Function */ /* */ /* This function reports the Battery Charger configuration. */ /* */ /* Note that, if the Battery Charger has not yet been initialized, the data */ /* returned by this function is unknown. */ /* */ /* param[in,out] pCfg A pointer to a structure that will receive the data. */ /* */ /* internal */ /* see To view the function definition, see ddi_bc_api.c. */ extern void ddi_bc_QueryCfg(ddi_bc_Cfg_t *pCfg); /* */ /* brief Shut down the Battery Charger. */ /* */ /* fntype Function */ /* */ /* This function immediately shuts down the Battery Charger hardware and */ /* returns the state machine to the Uninitialized state. Use this function to */ /* safely mummify the battery charger before retiring it from memory. */ /* */ /* internal */ /* see To view the function definition, see ddi_bc_api.c. */ extern void ddi_bc_ShutDown(void); /* */ /* brief Advances the state machine. */ /* */ /* fntype Function */ /* */ /* This function advances the state machine. */ /* */ /* retval DDI_BC_STATUS_SUCCESS If all goes well */ /* retval DDI_BC_STATUS_NOT_INITIALIZED If the Battery Charger is not yet */ /* initialized. */ /* retval DDI_BC_STATUS_BROKEN If the battery violated a time-out */ /* and has been declared broken. */ /* */ /* internal */ /* see To view the function definition, see ddi_bc_api.c. */ extern ddi_bc_Status_t ddi_bc_StateMachine(void); /* */ /* brief Get the Battery Charger's current state. */ /* */ /* fntype Function */ /* */ /* This function returns the current state. */ /* */ /* retval The current state. */ /* */ /* internal */ /* see To view the function definition, see ddi_bc_api.c. */ extern ddi_bc_State_t ddi_bc_GetState(void); /* */ /* brief Disable the Battery Charger. */ /* */ /* fntype Function */ /* */ /* This function forces the Battery Charger into the Disabled state. */ /* */ /* retval DDI_BC_STATUS_SUCCESS If all goes well */ /* retval DDI_BC_STATUS_NOT_INITIALIZED If the Battery Charger is not yet */ /* initialized. */ /* */ /* internal */ /* see To view the function definition, see ddi_bc_api.c. */ extern ddi_bc_Status_t ddi_bc_SetDisable(void); /* */ /* brief Enable the Battery Charger. */ /* */ /* fntype Function */ /* */ /* If the Battery Charger is in the Disabled state, this function moves it to */ /* the Waiting to Charge state. */ /* */ /* retval DDI_BC_STATUS_SUCCESS If all goes well */ /* retval DDI_BC_STATUS_NOT_INITIALIZED If the Battery Charger is not yet */ /* initialized. */ /* retval DDI_BC_STATUS_NOT_DISABLED If the Battery Charger is not */ /* disabled. */ /* */ /* internal */ /* see To view the function definition, see ddi_bc_api.c. */ extern ddi_bc_Status_t ddi_bc_SetEnable(void); /* */ /* brief Declare the battery to be broken. */ /* */ /* fntype Function */ /* */ /* This function forces the Battery Charger into the Broken state. */ /* */ /* retval DDI_BC_STATUS_SUCCESS If all goes well */ /* retval DDI_BC_STATUS_NOT_INITIALIZED If the Battery Charger is not yet */ /* initialized. */ /* */ /* internal */ /* see To view the function definition, see ddi_bc_api.c. */ extern ddi_bc_Status_t ddi_bc_SetBroken(void); /* */ /* brief Declare the battery to be fixed. */ /* */ /* fntype Function */ /* */ /* If the Battery Charger is in the Broken state, this function moves it to */ /* the Disabled state. */ /* */ /* retval DDI_BC_STATUS_SUCCESS If all goes well */ /* retval DDI_BC_STATUS_NOT_INITIALIZED If the Battery Charger is not yet */ /* initialized. */ /* retval DDI_BC_STATUS_NOT_BROKEN If the Battery Charger is not broken. */ /* */ /* internal */ /* see To view the function definition, see ddi_bc_api.c. */ extern ddi_bc_Status_t ddi_bc_SetFixed(void); /* */ /* brief Set the current limit. */ /* */ /* fntype Function */ /* */ /* This function applies a limit to the current that the Battery Charger can */ /* draw. */ /* */ /* param[in] u16Limit The maximum current the Battery Charger can draw */ /* (in mA). */ /* */ /* retval The expressible version of the limit. */ /* */ /* internal */ /* see To view the function definition, see ddi_bc_api.c. */ extern uint16_t ddi_bc_SetCurrentLimit(uint16_t u16Limit); /* */ /* brief Report the current limit. */ /* */ /* fntype Function */ /* */ /* This function reports the limit to the current that the Battery Charger can */ /* draw. */ /* */ /* retval The current limit. */ /* */ /* internal */ /* see To view the function definition, see ddi_bc_api.c. */ extern uint16_t ddi_bc_GetCurrentLimit(void); /* */ /* brief Set the current threshold. */ /* */ /* fntype Function */ /* */ /* */ /* param[in] u16Current Current threshold where charger deactivates (in mA). */ /* */ /* */ extern uint16_t ddi_bc_SetCurrentThreshold(uint16_t u16Current); /* */ /* brief Set the battery charger state machine period. */ /* */ /* fntype Function */ /* */ /* This function sets a new state machine period. The Period and Slope should */ /* be coordinated to achieve the minimal ramp step current which will minimize */ /* transients on the system. */ /* */ /* param[in] u32StateMachinePeriod (in milliseconds) */ /* param[in] u16CurrentRampSlope (in mA/s) */ /* */ /* retval SUCCESS If all goes well */ /* retval ERROR_DDI_BCM_NOT_INITIALIZED If the Battery Charger is not yet */ /* initialized. */ /* */ extern ddi_bc_Status_t ddi_bc_SetNewPeriodAndSlope(uint32_t u32StateMachinePeriod, uint16_t u16CurrentRampSlope); /* */ /* brief Report the state machine period. */ /* */ /* fntype Function */ /* */ /* This function reports the battery charger period. */ /* */ /* retval The battery charger period (in milliseconds). */ /* */ extern uint32_t ddi_bc_GetStateMachinePeriod(void); /* */ /* brief Report the current ramp slope. */ /* */ /* fntype Function */ /* */ /* This function reports the current ramp slope. */ /* */ /* retval The current ramp slope (in mA/s). */ /* */ extern uint32_t ddi_bc_GetCurrentRampSlope(void); /* */ /* brief Report the time spent in the present state (milliseconds) */ /* */ /* fntype Function */ /* */ /* This function reports the time spent in the present charging state. Note that */ /* for the states that actually charge the battery, this time does not include the */ /* time spent under alarm conditions such as die termperature alarm or battery */ /* temperature alarm. */ /* */ /* retval The time spent in the current state in milliseconds. */ /* */ uint32_t ddi_bc_GetStateTime(void); /* */ /* brief Report the reason for being in the broken state */ /* */ /* fntype Function */ /* */ /* */ /* retval ddi_bc_BrokenReason_t enumeration */ /* */ ddi_bc_BrokenReason_t ddi_bc_GetBrokenReason(void); /* */ /* brief Restart the charge cycle */ /* */ /* fntype Function */ /* */ /* retval SUCCESS */ /* */ ddi_bc_Status_t ddi_bc_ForceChargingToStart(void); void fsl_enable_usb_plugindetect(void); int fsl_is_usb_plugged(void); /* End of file */ #endif /* _DDI_BC_H */ /* @} */