diff --git a/board/reMarkable/zero-sugar/max77818_battery.c b/board/reMarkable/zero-sugar/max77818_battery.c index 5aedb2c288..ee007f8c5f 100644 --- a/board/reMarkable/zero-sugar/max77818_battery.c +++ b/board/reMarkable/zero-sugar/max77818_battery.c @@ -10,6 +10,8 @@ #define MAX77818_FG_CONFIG__FGCC_ENABLED 0x0800 #define MAX77818_FG_CONFIG__FGCC_DISABLED 0x0000 +#define MAX77818_REG_FG_REPSOC 0x06 + static struct udevice *fgDev = NULL; int max77818_init_fg_device(void) @@ -124,3 +126,48 @@ int max77818_restore_fgcc(bool restore_state) return max77818_set_fgcc_state(false, NULL); } } + +int max77818_get_battery_capacity(u8 *capacity) +{ + int ret; + u16 value; + + if (!fgDev) { + ret = max77818_init_fg_device(); + if (ret) + return ret; + } + + ret = max77818_i2c_reg_read16(fgDev, + MAX77818_REG_FG_REPSOC, + &value); + if (ret) + return ret; + + *capacity = (u8)(value >> 8); + + return 0; +} + +static int do_max77818_get_battery_capacity(cmd_tbl_t *cmdtp, + int flag, + int argc, + char * const argv[]) +{ + int ret; + u8 capacity; + + ret = max77818_get_battery_capacity(&capacity); + if (ret) + return ret; + + printf("Capacity: %u%%\n", capacity); + + return 0; +} + +U_BOOT_CMD( + max77818_get_battery_capacity, 1, 1, do_max77818_get_battery_capacity, + "Get battery state of charge", + "" +); diff --git a/board/reMarkable/zero-sugar/max77818_battery.h b/board/reMarkable/zero-sugar/max77818_battery.h index a02554d7d6..b74ba74b28 100644 --- a/board/reMarkable/zero-sugar/max77818_battery.h +++ b/board/reMarkable/zero-sugar/max77818_battery.h @@ -8,4 +8,6 @@ int max77818_read_fgcc_state(bool *state); int max77818_set_fgcc_state(bool enabled, bool *restore_state); int max77818_restore_fgcc(bool restore_state); +int max77818_get_battery_capacity(u8 *capacity); + #endif /* FG_INIT_H */ diff --git a/board/reMarkable/zero-sugar/zero-sugar.c b/board/reMarkable/zero-sugar/zero-sugar.c index a79d95ba6b..dc6bc82b63 100644 --- a/board/reMarkable/zero-sugar/zero-sugar.c +++ b/board/reMarkable/zero-sugar/zero-sugar.c @@ -14,6 +14,7 @@ #include "digitizer_init.h" #include "max77818.h" #include "max77818_charger.h" +#include "max77818_battery.h" #include "serial_download_trap.h" #include @@ -47,7 +48,6 @@ #include #include -#define SNVS_BASE_ADDR 0x30370000 #define SNVS_REG_LPCR SNVS_BASE_ADDR + 0x38 #define SNVS_MASK_POWEROFF (BIT(5) | BIT(6)) @@ -102,6 +102,7 @@ static void power_perfs(void) static void init_charger(void) { int ret; + u8 capacity; printf("Enabling SAFEOUT1\n"); ret = max77818_enable_safeout1(); @@ -116,6 +117,19 @@ static void init_charger(void) printf("%s: Failed to set charger config: %d\n", __func__, ret); } + + printf("Reading remaining battery capacity\n"); + ret = max77818_get_battery_capacity(&capacity); + if (ret) { + printf("%s: Failed to read battery capacity: %d\n", __func__, ret); + } + else if (capacity < 5) { + printf("Battery too low (%u%% < 5%%), turning off\n", capacity); + snvs_poweroff(); + } + else { + printf("Battery currently at %u%%\n", capacity); + } } static void save_serial(void)