summaryrefslogtreecommitdiff
path: root/board/yorp/led.c
diff options
context:
space:
mode:
authorDiana Z <dzigterman@chromium.org>2018-06-14 08:32:08 -0600
committerchrome-bot <chrome-bot@chromium.org>2018-06-15 15:26:29 -0700
commit81be36bfe7f242c029f08c1f053c0736a472648d (patch)
tree4aa5c1b8f71e352cde35fca134c44f984beb67ae /board/yorp/led.c
parentaa88b43aa684a0eeda6d94dba1dd58fbb5811e69 (diff)
downloadchrome-ec-81be36bfe7f242c029f08c1f053c0736a472648d.tar.gz
octopus: move LED battery state functions to common code
Currently on other platforms, each board creates its own LED charging and power state functions (unless they use the std LEDs). In order to reduce the amount of repeated code between the different octopus boards, the LED power states and corresponding logic have been put into a common file which all boards can use for their LED tasks. Individual boards will still need to implement the LED common functions and their tables to indicate what their LED behavior is. This is implemented for yorp's LED only currently. BRANCH=none BUG=none TEST=make buildall, loaded EC code onto yorp to ensure LEDs still flash as they did before Change-Id: I05b704363e213306717d9728111477d6d7743a92 Signed-off-by: Diana Z <dzigterman@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/1101167 Reviewed-by: Jett Rink <jettrink@chromium.org>
Diffstat (limited to 'board/yorp/led.c')
-rw-r--r--board/yorp/led.c161
1 files changed, 16 insertions, 145 deletions
diff --git a/board/yorp/led.c b/board/yorp/led.c
index 2ad61775f8..6945a2e2f6 100644
--- a/board/yorp/led.c
+++ b/board/yorp/led.c
@@ -5,76 +5,39 @@
* Power and battery LED control for Yorp
*/
-#include "battery.h"
-#include "charge_state.h"
-#include "chipset.h"
#include "ec_commands.h"
-#include "extpower.h"
#include "gpio.h"
-#include "hooks.h"
#include "led_common.h"
-#include "system.h"
-#include "util.h"
+#include "led_states.h"
#define LED_OFF_LVL 1
#define LED_ON_LVL 0
-#define LED_INDEFINITE UINT8_MAX
-#define LED_ONE_SEC (1000 / HOOK_TICK_INTERVAL_MS)
-#define STATE_DEFAULT LED_NUM_STATES
-
-enum led_phase {
- LED_PHASE_0,
- LED_PHASE_1,
- LED_NUM_PHASES
-};
-
-enum led_color {
- LED_OFF = 0,
- LED_COLOR_BLUE,
- LED_COLOR_AMBER,
- LED_COLOR_COUNT /* Max colors */
-};
-
-enum led_states {
- STATE_CHARGING,
- STATE_CHARGING_FULLY_CHARGED,
- STATE_DISCHARGE_S0,
- STATE_DISCHARGE_S3,
- STATE_DISCHARGE_S5,
- STATE_BATTERY_ERROR,
- LED_NUM_STATES
-};
-
-struct led_descriptor {
- int8_t color;
- uint8_t time;
-};
/* Yorp: Note there is only LED for charge / power */
-static const struct led_descriptor
- led_state_table[LED_NUM_STATES][LED_NUM_PHASES] = {
- [STATE_CHARGING] = { {LED_COLOR_AMBER, LED_INDEFINITE} },
- [STATE_CHARGING_FULLY_CHARGED] = { {LED_COLOR_BLUE, LED_INDEFINITE} },
- [STATE_DISCHARGE_S0] = { {LED_COLOR_BLUE, LED_INDEFINITE} },
- [STATE_DISCHARGE_S3] = { {LED_COLOR_AMBER, 4 * LED_ONE_SEC},
- {LED_OFF, 1 * LED_ONE_SEC} },
- [STATE_DISCHARGE_S5] = { {LED_OFF, LED_INDEFINITE } },
- [STATE_BATTERY_ERROR] = { {LED_COLOR_BLUE, 2 * LED_ONE_SEC},
- {LED_COLOR_AMBER, 2 * LED_ONE_SEC} },
+const struct led_descriptor
+ led_bat_state_table[LED_NUM_STATES][LED_NUM_PHASES] = {
+ [STATE_CHARGING] = {{EC_LED_COLOR_AMBER, LED_INDEFINITE} },
+ [STATE_CHARGING_FULL_CHARGE] = {{EC_LED_COLOR_BLUE, LED_INDEFINITE} },
+ [STATE_DISCHARGE_S0] = {{EC_LED_COLOR_BLUE, LED_INDEFINITE} },
+ [STATE_DISCHARGE_S3] = {{EC_LED_COLOR_AMBER, 4 * LED_ONE_SEC},
+ {LED_OFF, 1 * LED_ONE_SEC} },
+ [STATE_DISCHARGE_S5] = {{LED_OFF, LED_INDEFINITE} },
+ [STATE_BATTERY_ERROR] = {{EC_LED_COLOR_BLUE, 2 * LED_ONE_SEC},
+ {EC_LED_COLOR_AMBER, 2 * LED_ONE_SEC} },
};
const enum ec_led_id supported_led_ids[] = { EC_LED_ID_BATTERY_LED };
const int supported_led_ids_count = ARRAY_SIZE(supported_led_ids);
-static void led_set_color_battery(enum led_color color)
+void led_set_color_battery(enum ec_led_colors color)
{
switch (color) {
- case LED_COLOR_BLUE:
+ case EC_LED_COLOR_BLUE:
gpio_set_level(GPIO_BAT_LED_BLUE_L, LED_ON_LVL);
gpio_set_level(GPIO_BAT_LED_ORANGE_L, LED_OFF_LVL);
break;
- case LED_COLOR_AMBER:
+ case EC_LED_COLOR_AMBER:
gpio_set_level(GPIO_BAT_LED_BLUE_L, LED_OFF_LVL);
gpio_set_level(GPIO_BAT_LED_ORANGE_L, LED_ON_LVL);
break;
@@ -94,104 +57,12 @@ void led_get_brightness_range(enum ec_led_id led_id, uint8_t *brightness_range)
int led_set_brightness(enum ec_led_id led_id, const uint8_t *brightness)
{
if (brightness[EC_LED_COLOR_BLUE] != 0)
- led_set_color_battery(LED_COLOR_BLUE);
+ led_set_color_battery(EC_LED_COLOR_BLUE);
else if (brightness[EC_LED_COLOR_AMBER] != 0)
- led_set_color_battery(LED_COLOR_AMBER);
+ led_set_color_battery(EC_LED_COLOR_AMBER);
else
led_set_color_battery(LED_OFF);
return EC_SUCCESS;
}
-static enum led_states led_get_state(void)
-{
- enum led_states new_state = LED_NUM_STATES;
-
- switch (charge_get_state()) {
- case PWR_STATE_CHARGE:
- new_state = STATE_CHARGING;
- break;
- case PWR_STATE_DISCHARGE_FULL:
- if (extpower_is_present()) {
- new_state = STATE_CHARGING_FULLY_CHARGED;
- break;
- }
- /* Intentional fall-through */
- case PWR_STATE_DISCHARGE /* and PWR_STATE_DISCHARGE_FULL */:
- if (chipset_in_state(CHIPSET_STATE_ON))
- new_state = STATE_DISCHARGE_S0;
- else if (chipset_in_state(CHIPSET_STATE_ANY_SUSPEND))
- new_state = STATE_DISCHARGE_S3;
- else
- new_state = STATE_DISCHARGE_S5;
- break;
- case PWR_STATE_ERROR:
- new_state = STATE_BATTERY_ERROR;
- break;
- case PWR_STATE_CHARGE_NEAR_FULL:
- new_state = STATE_CHARGING_FULLY_CHARGED;
- break;
- case PWR_STATE_IDLE: /* External power connected in IDLE */
- new_state = STATE_DISCHARGE_S0;
- break;
- default:
- /* Other states don't alter LED behavior */
- break;
- }
-
- return new_state;
-}
-
-static void led_update_battery(void)
-{
- static uint8_t ticks, period;
- static int led_state = STATE_DEFAULT;
- int phase;
- enum led_states desired_state = led_get_state();
-
- /* Get updated state based on power state and charge level */
- if (desired_state != led_state) {
- /* State is changing */
- led_state = desired_state;
- /* Reset ticks and period when state changes */
- ticks = 0;
- period = led_state_table[led_state][LED_PHASE_0].time +
- led_state_table[led_state][LED_PHASE_1].time;
- } else if (period == UINT8_MAX)
- /*
- * No change of state so no LED change needed
- * for indefinite phase 0.
- */
- return;
-
- if (led_state == STATE_DEFAULT) /* No change needed */
- return;
-
- /*
- * Determine which phase of the state table to use. The phase is
- * determined if it falls within first phase time duration.
- */
- phase = ticks < led_state_table[led_state][LED_PHASE_0].time ? 0 : 1;
- ticks = (ticks + 1) % period;
-
- /* Set the color for the given state and phase */
- led_set_color_battery(led_state_table[led_state][phase].color);
-}
-
-static void led_init(void)
-{
- led_set_color_battery(LED_OFF);
-}
-DECLARE_HOOK(HOOK_INIT, led_init, HOOK_PRIO_DEFAULT);
-
-/* Called by hook task every hook tick (200 msec) */
-static void led_update(void)
-{
- /*
- * Yorp only has one LED, so overload it to act as both
- * power LED and battery LED.
- */
- if (led_auto_control_is_enabled(EC_LED_ID_BATTERY_LED))
- led_update_battery();
-}
-DECLARE_HOOK(HOOK_TICK, led_update, HOOK_PRIO_DEFAULT);