diff --git a/src/board/system76/darp5/battery.c b/src/board/system76/darp5/battery.c index f76cd76..9defbd5 100644 --- a/src/board/system76/darp5/battery.c +++ b/src/board/system76/darp5/battery.c @@ -1,3 +1,4 @@ +#include #include #include @@ -75,6 +76,7 @@ uint16_t battery_current = 0; uint16_t battery_charge = 0; uint16_t battery_remaining_capacity = 0; uint16_t battery_full_capacity = 0; +uint16_t battery_status = 0; uint16_t battery_design_capacity = 0; uint16_t battery_design_voltage = 0; @@ -85,7 +87,6 @@ void battery_event(void) { res = smbus_read(0x0B, V, &N); \ if (res < 0) { \ N = 0; \ - return; \ } \ } @@ -95,10 +96,27 @@ void battery_event(void) { command(battery_charge, 0x0D); command(battery_remaining_capacity, 0x0F); command(battery_full_capacity, 0x10); + command(battery_status, 0x16); command(battery_design_capacity, 0x18); command(battery_design_voltage, 0x19); #undef command + + if (gpio_get(&ACIN_N)) { + // Discharging (no AC adapter) + gpio_set(&LED_BAT_CHG, false); + gpio_set(&LED_BAT_FULL, false); + } else if (battery_status & 0x0020) { + // Fully charged + // TODO: turn off charger + gpio_set(&LED_BAT_CHG, false); + gpio_set(&LED_BAT_FULL, true); + } else { + // Charging + // TODO: detect no battery connected + gpio_set(&LED_BAT_CHG, true); + gpio_set(&LED_BAT_FULL, false); + } } void battery_debug(void) { @@ -120,6 +138,7 @@ void battery_debug(void) { command(Voltage, 0x0B, 0x09); command(Current, 0x0B, 0x0A); command(Charge, 0x0B, 0x0D); + command(Status, 0x0B, 0x16); DEBUG("Charger:\n"); command(ChargeOption0, 0x09, 0x12); diff --git a/src/board/system76/darp5/include/board/battery.h b/src/board/system76/darp5/include/board/battery.h index fcb9b2d..d5d87d4 100644 --- a/src/board/system76/darp5/include/board/battery.h +++ b/src/board/system76/darp5/include/board/battery.h @@ -9,6 +9,7 @@ extern uint16_t battery_current; extern uint16_t battery_charge; extern uint16_t battery_remaining_capacity; extern uint16_t battery_full_capacity; +extern uint16_t battery_status; extern uint16_t battery_design_capacity; extern uint16_t battery_design_voltage; diff --git a/src/board/system76/galp3-c/battery.c b/src/board/system76/galp3-c/battery.c index d107622..488599c 100644 --- a/src/board/system76/galp3-c/battery.c +++ b/src/board/system76/galp3-c/battery.c @@ -1,3 +1,4 @@ +#include #include #include @@ -75,6 +76,7 @@ uint16_t battery_current = 0; uint16_t battery_charge = 0; uint16_t battery_remaining_capacity = 0; uint16_t battery_full_capacity = 0; +uint16_t battery_status = 0; uint16_t battery_design_capacity = 0; uint16_t battery_design_voltage = 0; @@ -85,7 +87,6 @@ void battery_event(void) { res = smbus_read(0x0B, V, &N); \ if (res < 0) { \ N = 0; \ - return; \ } \ } @@ -95,10 +96,27 @@ void battery_event(void) { command(battery_charge, 0x0D); command(battery_remaining_capacity, 0x0F); command(battery_full_capacity, 0x10); + command(battery_status, 0x16); command(battery_design_capacity, 0x18); command(battery_design_voltage, 0x19); #undef command + + if (gpio_get(&ACIN_N)) { + // Discharging (no AC adapter) + gpio_set(&LED_BAT_CHG, false); + gpio_set(&LED_BAT_FULL, false); + } else if (battery_status & 0x0020) { + // Fully charged + // TODO: turn off charger + gpio_set(&LED_BAT_CHG, false); + gpio_set(&LED_BAT_FULL, true); + } else { + // Charging + // TODO: detect no battery connected + gpio_set(&LED_BAT_CHG, true); + gpio_set(&LED_BAT_FULL, false); + } } void battery_debug(void) { @@ -120,6 +138,7 @@ void battery_debug(void) { command(Voltage, 0x0B, 0x09); command(Current, 0x0B, 0x0A); command(Charge, 0x0B, 0x0D); + command(Status, 0x0B, 0x16); DEBUG("Charger:\n"); command(ChargeOption0, 0x09, 0x12); diff --git a/src/board/system76/galp3-c/include/board/battery.h b/src/board/system76/galp3-c/include/board/battery.h index fcb9b2d..d5d87d4 100644 --- a/src/board/system76/galp3-c/include/board/battery.h +++ b/src/board/system76/galp3-c/include/board/battery.h @@ -9,6 +9,7 @@ extern uint16_t battery_current; extern uint16_t battery_charge; extern uint16_t battery_remaining_capacity; extern uint16_t battery_full_capacity; +extern uint16_t battery_status; extern uint16_t battery_design_capacity; extern uint16_t battery_design_voltage; diff --git a/src/board/system76/lemp9/battery.c b/src/board/system76/lemp9/battery.c index 1eb87c9..2ec1af3 100644 --- a/src/board/system76/lemp9/battery.c +++ b/src/board/system76/lemp9/battery.c @@ -75,6 +75,7 @@ uint16_t battery_current = 0; uint16_t battery_charge = 0; uint16_t battery_remaining_capacity = 0; uint16_t battery_full_capacity = 0; +uint16_t battery_status = 0; uint16_t battery_design_capacity = 0; uint16_t battery_design_voltage = 0; @@ -85,7 +86,6 @@ void battery_event(void) { res = smbus_read(0x0B, V, &N); \ if (res < 0) { \ N = 0; \ - return; \ } \ } @@ -95,6 +95,7 @@ void battery_event(void) { command(battery_charge, 0x0D); command(battery_remaining_capacity, 0x0F); command(battery_full_capacity, 0x10); + command(battery_status, 0x16); command(battery_design_capacity, 0x18); command(battery_design_voltage, 0x19); diff --git a/src/board/system76/lemp9/include/board/battery.h b/src/board/system76/lemp9/include/board/battery.h index fcb9b2d..d5d87d4 100644 --- a/src/board/system76/lemp9/include/board/battery.h +++ b/src/board/system76/lemp9/include/board/battery.h @@ -9,6 +9,7 @@ extern uint16_t battery_current; extern uint16_t battery_charge; extern uint16_t battery_remaining_capacity; extern uint16_t battery_full_capacity; +extern uint16_t battery_status; extern uint16_t battery_design_capacity; extern uint16_t battery_design_voltage;