diff --git a/src/Battery/BQ25120a.cpp b/src/Battery/BQ25120a.cpp index 71da49d9..62c4d126 100644 --- a/src/Battery/BQ25120a.cpp +++ b/src/Battery/BQ25120a.cpp @@ -67,7 +67,7 @@ int BQ25120a::reset() { return 0; } -int BQ25120a::set_wakeup_int() { +int BQ25120a::set_wakeup_int(bool wake_on_power_good) { int ret; ret = device_is_ready(pg_pin.port); //bool @@ -76,21 +76,37 @@ int BQ25120a::set_wakeup_int() { return -1; } - ret = gpio_pin_interrupt_configure_dt(&pg_pin, GPIO_INT_LEVEL_ACTIVE); + ret = gpio_pin_interrupt_configure_dt(&int_pin, GPIO_INT_LEVEL_ACTIVE); if (ret != 0) { - LOG_ERR("Failed to setup interrupt on PG.\n"); + LOG_ERR("Failed to setup interrupt on INT.\n"); return ret; } - ret = gpio_pin_interrupt_configure_dt(&int_pin, GPIO_INT_LEVEL_ACTIVE); + ret = gpio_pin_interrupt_configure_dt(&pg_pin, + wake_on_power_good ? GPIO_INT_LEVEL_ACTIVE : + GPIO_INT_DISABLE); if (ret != 0) { - LOG_ERR("Failed to setup interrupt on INT.\n"); + LOG_ERR("Failed to setup interrupt on PG.\n"); return ret; } return 0; } +void BQ25120a::clear_interrupt_latches() { + for (int attempt = 0; attempt < 3; ++attempt) { + (void)read_fault(); + (void)read_ts_fault(); + + button_state btn = read_button_state(); + if (!btn.wake_1 && !btn.wake_2) { + break; + } + + k_msleep(10); + } +} + bool BQ25120a::readReg(uint8_t reg, uint8_t * buffer, uint16_t len) { int ret; uint64_t now = micros(); @@ -426,4 +442,4 @@ int BQ25120a::set_power_connect_callback(gpio_callback_handler_t handler) { int BQ25120a::set_int_callback(gpio_callback_handler_t handler) { gpio_init_callback(&int_cb_data, handler, int_cb_data.pin_mask | BIT(int_pin.pin)); return gpio_add_callback(int_pin.port, &int_cb_data); -} \ No newline at end of file +} diff --git a/src/Battery/BQ25120a.h b/src/Battery/BQ25120a.h index 38eb75f3..a21b3e80 100644 --- a/src/Battery/BQ25120a.h +++ b/src/Battery/BQ25120a.h @@ -48,7 +48,7 @@ class BQ25120a { BQ25120a(TWIM * i2c); int begin(); - int set_wakeup_int(); + int set_wakeup_int(bool wake_on_power_good = false); int reset(); @@ -79,6 +79,7 @@ class BQ25120a { uint8_t write_LS_control(bool enable); button_state read_button_state(); + void clear_interrupt_latches(); int set_power_connect_callback(gpio_callback_handler_t handler); int set_int_callback(gpio_callback_handler_t handler); @@ -107,4 +108,4 @@ class BQ25120a { extern BQ25120a battery_controller; -#endif \ No newline at end of file +#endif diff --git a/src/Battery/PowerManager.cpp b/src/Battery/PowerManager.cpp index 628739da..13bbb6e2 100644 --- a/src/Battery/PowerManager.cpp +++ b/src/Battery/PowerManager.cpp @@ -583,10 +583,10 @@ int PowerManager::power_down(bool fault) { bool charging = battery_controller.power_connected(); if (!charging) { - ret = battery_controller.set_wakeup_int(); - if (ret != 0) return ret; + battery_controller.exit_high_impedance(); + battery_controller.clear_interrupt_latches(); - ret = fuel_gauge.set_wakeup_int(); + ret = battery_controller.set_wakeup_int(false); if (ret != 0) return ret; // check battery good @@ -758,4 +758,4 @@ SHELL_STATIC_SUBCMD_SET_CREATE(battery_cmd, SHELL_CMD_REGISTER(battery, &battery_cmd, "Power Manager Commands", NULL); -PowerManager power_manager; \ No newline at end of file +PowerManager power_manager;