diff options
author | Nicolas Boichat <drinkcat@google.com> | 2017-01-19 21:05:51 +0800 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2017-01-24 22:03:50 -0800 |
commit | 92a79b2bf19df7bad5b25aa36193cd113b9c16a8 (patch) | |
tree | 0cfae087f130ca90f51a78d3b74264bc7ef089ff /driver/charger/isl923x.c | |
parent | 92cda018f88ffa10f3d5bf898c839da0c35d8337 (diff) | |
download | chrome-ec-92a79b2bf19df7bad5b25aa36193cd113b9c16a8.tar.gz |
isl9238: Add support for battery discharging BMON current monitor
ISL9238 is able to measure currents when battery is discharging
(like ISL9237), and charging (new feature).
Reverse AMON (OTG output current) is also supported by ISL9238,
but isn't very interesting on our boards.
BRANCH=none
BUG=chrome-os-partner:61166
TEST=Plug charger, "amon" in EC console, check that values match
current meter + "battery" information. Unplug charger,
values match "battery" information.
Change-Id: I9ecae6bec9e2049d17ef1a4596dbd4e3ff59919e
Reviewed-on: https://chromium-review.googlesource.com/430474
Commit-Ready: Nicolas Boichat <drinkcat@chromium.org>
Tested-by: Nicolas Boichat <drinkcat@chromium.org>
Reviewed-by: Shawn N <shawnn@chromium.org>
Diffstat (limited to 'driver/charger/isl923x.c')
-rw-r--r-- | driver/charger/isl923x.c | 105 |
1 files changed, 74 insertions, 31 deletions
diff --git a/driver/charger/isl923x.c b/driver/charger/isl923x.c index 81a9dd3582..a570768e05 100644 --- a/driver/charger/isl923x.c +++ b/driver/charger/isl923x.c @@ -429,49 +429,92 @@ DECLARE_CONSOLE_COMMAND(psys, console_command_psys, #endif /* CONFIG_CHARGER_PSYS */ #ifdef CONFIG_CMD_CHARGER_ADC_AMON_BMON -/** - * Get charger AMON and BMON current. - */ -static int console_command_amon_bmon(int argc, char **argv) +enum amon_bmon { AMON, BMON }; + +static int print_amon_bmon(enum amon_bmon amon, int direction, + int resistor, char *text) { - int adc, curr, val, ret; + int adc, curr, reg, ret; + +#ifdef CONFIG_CHARGER_ISL9238 + ret = i2c_read16(I2C_PORT_CHARGER, I2C_ADDR_CHARGER, + ISL9238_REG_CONTROL3, ®); + if (ret) + return ret; + + /* Switch direction */ + if (direction) + reg |= ISL9238_C3_AMON_BMON_DIRECTION; + else + reg &= ~ISL9238_C3_AMON_BMON_DIRECTION; + ret = i2c_write16(I2C_PORT_CHARGER, I2C_ADDR_CHARGER, + ISL9238_REG_CONTROL3, reg); + if (ret) + return ret; +#endif ret = i2c_read16(I2C_PORT_CHARGER, I2C_ADDR_CHARGER, - ISL923X_REG_CONTROL1, &val); + ISL923X_REG_CONTROL1, ®); if (ret) return ret; + /* Switch between AMON/BMON */ + if (amon == AMON) + reg &= ~ISL923X_C1_SELECT_BMON; + else + reg |= ISL923X_C1_SELECT_BMON; + /* Enable monitor */ - val &= ~ISL923X_C1_DISABLE_MON; - if (argc == 1 || (argc >= 2 && argv[1][0] == 'a')) { - /* Switch to AMON */ - val &= ~ISL923X_C1_SELECT_BMON; - ret = i2c_write16(I2C_PORT_CHARGER, I2C_ADDR_CHARGER, - ISL923X_REG_CONTROL1, val); - if (ret) - return ret; - - adc = adc_read_channel(ADC_AMON_BMON); - curr = adc / CONFIG_CHARGER_SENSE_RESISTOR_AC; - CPRINTF("AMON: %d uV, %d mA\n", adc, curr); - } + reg &= ~ISL923X_C1_DISABLE_MON; + ret = i2c_write16(I2C_PORT_CHARGER, I2C_ADDR_CHARGER, + ISL923X_REG_CONTROL1, reg); + if (ret) + return ret; - if (argc == 1 || (argc >= 2 && argv[1][0] == 'b')) { - /* Switch to BMON */ - val |= ISL923X_C1_SELECT_BMON; - ret = i2c_write16(I2C_PORT_CHARGER, I2C_ADDR_CHARGER, - ISL923X_REG_CONTROL1, val); - if (ret) - return ret; - - adc = adc_read_channel(ADC_AMON_BMON); - curr = adc / CONFIG_CHARGER_SENSE_RESISTOR; - CPRINTF("BMON: %d uV, %d mA\n", adc, curr); - } + adc = adc_read_channel(ADC_AMON_BMON); + curr = adc / resistor; + CPRINTF("%s: %d uV, %d mA\n", text, adc, curr); + + return ret; +} + +/** + * Get charger AMON and BMON current. + */ +static int console_command_amon_bmon(int argc, char **argv) +{ + int ret = EC_SUCCESS; + + if (argc == 1 || (argc >= 2 && argv[1][0] == 'a')) + ret |= print_amon_bmon(AMON, 0, + CONFIG_CHARGER_SENSE_RESISTOR_AC, + "AMON"); + + if (argc == 1 || (argc >= 2 && argv[1][0] == 'b' && + (argv[1][1] == '\0' || argv[1][1] == 'd'))) + ret |= print_amon_bmon(BMON, 1, + CONFIG_CHARGER_SENSE_RESISTOR, + "BMON(discharging)"); + +#ifdef CONFIG_CHARGER_ISL9238 + if (argc == 1 || (argc >= 2 && argv[1][0] == 'b' && + (argv[1][1] == '\0' || argv[1][1] == 'c'))) + ret |= print_amon_bmon(BMON, 0, + /* + * charging current monitor has + * 2x amplification factor + */ + 2*CONFIG_CHARGER_SENSE_RESISTOR, + "BMON(charging)"); +#endif return ret; } DECLARE_CONSOLE_COMMAND(amonbmon, console_command_amon_bmon, +#ifdef CONFIG_CHARGER_ISL9237 "amonbmon [a|b]", +#else + "amonbmon [a|b[c|d]]", +#endif "Get charger AMON/BMON voltage diff, current"); #endif /* CONFIG_CMD_CHARGER_ADC_AMON_BMON */ |