diff options
-rw-r--r-- | driver/battery/smart.c | 42 | ||||
-rw-r--r-- | include/battery.h | 7 |
2 files changed, 49 insertions, 0 deletions
diff --git a/driver/battery/smart.c b/driver/battery/smart.c index 3fda584910..4f6c2f349d 100644 --- a/driver/battery/smart.c +++ b/driver/battery/smart.c @@ -7,11 +7,19 @@ #include "battery.h" #include "battery_smart.h" +#include "console.h" #include "host_command.h" #include "i2c.h" #include "timer.h" #include "util.h" +/* Console output macros */ +#define CPUTS(outstr) cputs(CC_CHARGER, outstr); +#define CPRINTF(format, args...) cprintf(CC_CHARGER, format, ## args) + +#define BATTERY_WAIT_TIMEOUT (2800*MSEC) +#define BATTERY_NO_RESPONSE_TIMEOUT (1000*MSEC) + test_mockable int sbc_read(int cmd, int *param) { return i2c_read16(I2C_PORT_CHARGER, CHARGER_ADDR, cmd, param); @@ -304,6 +312,40 @@ void battery_get_params(struct batt_params *batt) memcpy(batt, &batt_new, sizeof(*batt)); } +/* Wait until battery is totally stable */ +int battery_wait_for_stable(void) +{ + int status, got_response; + uint64_t wait_timeout = get_time().val + BATTERY_WAIT_TIMEOUT; + uint64_t no_response_timeout = get_time().val + + BATTERY_NO_RESPONSE_TIMEOUT; + + got_response = 0; + + CPRINTF("[%T Wait for battery stabilized during %d]\n", + BATTERY_WAIT_TIMEOUT); + while (get_time().val < wait_timeout) { + /* Starting pinging battery */ + if (battery_status(&status) == EC_SUCCESS) { + got_response = 1; + /* Battery is stable */ + if (status & STATUS_INITIALIZED) { + CPRINTF("[%T battery initialized]\n"); + return EC_SUCCESS; + } + } + /* Assume no battery connected if no response for a while */ + else if (!got_response && + get_time().val > no_response_timeout) { + CPRINTF("[%T battery not responding]\n"); + return EC_ERROR_NOT_POWERED; + } + msleep(25); /* clock stretching could hold 25ms */ + } + CPRINTF("[%T battery wait stable timeout]\n"); + return EC_ERROR_TIMEOUT; +} + /*****************************************************************************/ /* Smart battery pass-through */ diff --git a/include/battery.h b/include/battery.h index cfc358bf4e..e395839546 100644 --- a/include/battery.h +++ b/include/battery.h @@ -302,4 +302,11 @@ int battery_get_vendor_param(uint32_t param, uint32_t *value); */ int battery_set_vendor_param(uint32_t param, uint32_t value); +/** + * Wait for battery stable. + * + * @return non-zero if error. + */ +int battery_wait_for_stable(void); + #endif /* __CROS_EC_BATTERY_H */ |