From edbcf0b0f4fc7c4a4315fc1eec24ac37723c9f8e Mon Sep 17 00:00:00 2001 From: Solomon Peachy Date: Thu, 10 Oct 2024 10:12:29 -0400 Subject: [PATCH] erosq: Initial PM support for "hw4" variant (They renamed the battery from 'battery' to 'axp_battery') Change-Id: Ic42c31e1d5c01eafc3fe01b144d9f22d88933e04 --- firmware/export/config/hibylinux.h | 2 + firmware/target/hosted/aigo/power-erosq.c | 55 ++++++++++++++++++++--- firmware/target/hosted/power-linux.c | 5 +++ 3 files changed, 56 insertions(+), 6 deletions(-) diff --git a/firmware/export/config/hibylinux.h b/firmware/export/config/hibylinux.h index ad168c9c01..2da7633389 100644 --- a/firmware/export/config/hibylinux.h +++ b/firmware/export/config/hibylinux.h @@ -86,5 +86,7 @@ #define ROOTDRIVE_DEV "/sys/block/mmcblk0" /* More common stuff */ +#ifndef EROS_Q #define BATTERY_DEV_NAME "battery" +#endif #define POWER_DEV_NAME "usb" diff --git a/firmware/target/hosted/aigo/power-erosq.c b/firmware/target/hosted/aigo/power-erosq.c index 73fa5fe972..664ee144af 100644 --- a/firmware/target/hosted/aigo/power-erosq.c +++ b/firmware/target/hosted/aigo/power-erosq.c @@ -28,17 +28,34 @@ #include "power.h" #include "panic.h" #include "sysfs.h" +#include "tick.h" -const char * const sysfs_bat_voltage = - "/sys/class/power_supply/battery/voltage_now"; +const char * const sysfs_bat_voltage[2] = { + "/sys/class/power_supply/battery/voltage_now", + "/sys/class/power_supply/axp_battery/voltage_now", +}; -const char * const sysfs_bat_capacity = - "/sys/class/power_supply/battery/capacity"; +const char * const sysfs_bat_capacity[2] = { + "/sys/class/power_supply/battery/capacity", + "/sys/class/power_supply/axp_battery/capacity", +}; + +const char * const sysfs_bat_status[2] = { + "/sys/class/power_supply/battery/status", + "/sys/class/power_supply/axp_battery/status", +}; + +static int hwver = 0; unsigned int erosq_power_get_battery_voltage(void) { int battery_voltage; - sysfs_get_int(sysfs_bat_voltage, &battery_voltage); + int x = sysfs_get_int(sysfs_bat_voltage[hwver], &battery_voltage); + + if (!x) { + hwver ^= 1; + sysfs_get_int(sysfs_bat_voltage[hwver], &battery_voltage); + } return battery_voltage/1000; } @@ -46,7 +63,33 @@ unsigned int erosq_power_get_battery_voltage(void) unsigned int erosq_power_get_battery_capacity(void) { int battery_capacity; - sysfs_get_int(sysfs_bat_capacity, &battery_capacity); + int x = sysfs_get_int(sysfs_bat_capacity[hwver], &battery_capacity); + + if (!x) { + hwver ^= 1; + sysfs_get_int(sysfs_bat_capacity[hwver], &battery_capacity); + } return battery_capacity; } + +/* We get called multiple times per tick, let's cut that back! */ +static long last_tick = 0; +static bool last_power = false; + +bool charging_state(void) +{ + if ((current_tick - last_tick) > HZ/2 ) { + char buf[12] = {0}; + int x = sysfs_get_string(sysfs_bat_status[hwver], buf, sizeof(buf)); + + if (!x) { + hwver ^= 1; + sysfs_get_string(sysfs_bat_status[hwver], buf, sizeof(buf)); + } + + last_tick = current_tick; + last_power = (strncmp(buf, "Charging", 8) == 0); + } + return last_power; +} diff --git a/firmware/target/hosted/power-linux.c b/firmware/target/hosted/power-linux.c index ddd7ad63e3..8d263eebec 100644 --- a/firmware/target/hosted/power-linux.c +++ b/firmware/target/hosted/power-linux.c @@ -33,9 +33,13 @@ #include "usb.h" #endif +#ifdef BATTERY_DEV_NAME #define BATTERY_STATUS_PATH "/sys/class/power_supply/" BATTERY_DEV_NAME "/status" +#endif + #define POWER_STATUS_PATH "/sys/class/power_supply/" POWER_DEV_NAME "/online" +#ifdef BATTERY_DEV_NAME /* We get called multiple times per tick, let's cut that back! */ static long last_tick = 0; static bool last_power = false; @@ -51,6 +55,7 @@ bool charging_state(void) } return last_power; } +#endif unsigned int power_input_status(void) {