summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRyan Zhang <Ryan.Zhang@quantatw.com>2015-11-11 15:08:41 +0800
committerchrome-bot <chrome-bot@chromium.org>2015-11-12 21:23:16 -0800
commit4270931936434c47c902ec6bb2a7600fd76037b6 (patch)
treeaae45dbbf169715d8507dc8bbc1005ff3dd3d736
parent5923dd7cd74107685a8289dbcf4085baf1ff8f98 (diff)
downloadchrome-ec-4270931936434c47c902ec6bb2a7600fd76037b6.tar.gz
Lars: update LED control
Following Cyan settings of https://chromium-review.googlesource.com/#/c/272815/ BUG=None BRANCH=lars TEST=`make buildall -j` Change-Id: Idb973363b047eb309ef0ddcfe84355f0b0409e2a Signed-off-by: Ryan Zhang <Ryan.Zhang@quantatw.com> Reviewed-on: https://chromium-review.googlesource.com/312151 Commit-Ready: 志偉 黃 <David.Huang@quantatw.com> Tested-by: 志偉 黃 <David.Huang@quantatw.com> Reviewed-by: Shawn N <shawnn@chromium.org>
-rw-r--r--board/lars/board.h4
-rw-r--r--board/lars/gpio.inc4
-rw-r--r--board/lars/led.c163
3 files changed, 110 insertions, 61 deletions
diff --git a/board/lars/board.h b/board/lars/board.h
index bb9fb2d29f..b1c92dcffa 100644
--- a/board/lars/board.h
+++ b/board/lars/board.h
@@ -104,10 +104,6 @@
#define CONFIG_SYSTEM_UNLOCKED
#define CONFIG_WATCHDOG_HELP
-/* LED signals */
-#define GPIO_BAT_LED_BLUE GPIO_CHARGE_LED1
-#define GPIO_BAT_LED_AMBER GPIO_CHARGE_LED2
-
/* I2C ports */
#define I2C_PORT_PMIC MEC1322_I2C0_0
#define I2C_PORT_USB_CHARGER_2 MEC1322_I2C0_0
diff --git a/board/lars/gpio.inc b/board/lars/gpio.inc
index 051c9da213..d826c8dbcd 100644
--- a/board/lars/gpio.inc
+++ b/board/lars/gpio.inc
@@ -44,10 +44,10 @@ GPIO(FLASH_DSC_OVERRIDE, PIN(065), GPIO_OUT_HIGH) /* Empty */
GPIO(NC_051, PIN(051), GPIO_INPUT | GPIO_PULL_UP)
GPIO(CPU_PROCHOT, PIN(052), GPIO_OUT_LOW)
GPIO(ENABLE_TOUCHPAD, PIN(053), GPIO_OUT_LOW)
-GPIO(SUSLED_L, PIN(127), GPIO_OUT_LOW) /* Empty */
+GPIO(SUSLED_L, PIN(127), GPIO_OUT_LOW)
GPIO(PD_RST_L, PIN(130), GPIO_ODR_HIGH)
GPIO(WLAN_OFF_L, PIN(132), GPIO_OUT_HIGH) /* Empty */
-GPIO(PWRLED_L, PIN(133), GPIO_OUT_LOW) /* Empty */
+GPIO(PWRLED_L, PIN(133), GPIO_OUT_LOW)
/* RCIN# line to PCH for 8042 emulation */
GPIO(PCH_RCIN_L, PIN(135), GPIO_ODR_HIGH)
GPIO(NC_136, PIN(136), GPIO_INPUT | GPIO_PULL_UP)
diff --git a/board/lars/led.c b/board/lars/led.c
index 585580dd66..4a556a035d 100644
--- a/board/lars/led.c
+++ b/board/lars/led.c
@@ -2,9 +2,8 @@
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*
- * Power and battery LED control for Glados.
+ * Power and battery LED control for Lars.
*/
-
#include "battery.h"
#include "charge_state.h"
#include "chipset.h"
@@ -15,64 +14,70 @@
#include "led_common.h"
#include "util.h"
-#define BAT_LED_ON 1
-#define BAT_LED_OFF 0
-
-#define CRITICAL_LOW_BATTERY_PERCENTAGE 3
-#define LOW_BATTERY_PERCENTAGE 10
-
-#define LED_TOTAL_4SECS_TICKS 4
-#define LED_TOTAL_2SECS_TICKS 2
-#define LED_ON_1SEC_TICKS 1
-#define LED_ON_2SECS_TICKS 2
+/* LED signals */
+#define GPIO_BAT_LED_BLUE GPIO_CHARGE_LED1
+#define GPIO_BAT_LED_AMBER GPIO_CHARGE_LED2
+#define GPIO_PWR_LED_BLUE GPIO_PWRLED_L
+#define GPIO_PWR_LED_AMBER GPIO_SUSLED_L
-const enum ec_led_id supported_led_ids[] = {
- EC_LED_ID_BATTERY_LED};
-
-const int supported_led_ids_count = ARRAY_SIZE(supported_led_ids);
+#define CRITICAL_LOW_BATTERY_PERMILLAGE 71
+#define LOW_BATTERY_PERMILLAGE 137
+#define FULL_BATTERY_PERMILLAGE 937
+#define LED_TOTAL_4SECS_TICKS 16
+#define LED_TOTAL_2SECS_TICKS 8
+#define LED_ON_1SEC_TICKS 4
+#define LED_ON_2SECS_TICKS 8
enum led_color {
LED_OFF = 0,
LED_BLUE,
- LED_PURPLE,
LED_AMBER,
+ LED_PINK,
+
LED_COLOR_COUNT /* Number of colors, not a color itself */
};
-static int bat_led_set_color(enum led_color color)
+const enum ec_led_id supported_led_ids[] = {
+ EC_LED_ID_POWER_LED, EC_LED_ID_BATTERY_LED};
+
+const int supported_led_ids_count = ARRAY_SIZE(supported_led_ids);
+
+static int lars_led_set_gpio(enum led_color color,
+ enum gpio_signal gpio_led_blue_l,
+ enum gpio_signal gpio_led_amber_l)
{
switch (color) {
case LED_OFF:
- gpio_set_level(GPIO_BAT_LED_BLUE, BAT_LED_OFF);
- gpio_set_level(GPIO_BAT_LED_AMBER, BAT_LED_OFF);
+ gpio_set_level(gpio_led_blue_l, 1);
+ gpio_set_level(gpio_led_amber_l, 1);
break;
case LED_BLUE:
- gpio_set_level(GPIO_BAT_LED_BLUE, BAT_LED_ON);
- gpio_set_level(GPIO_BAT_LED_AMBER, BAT_LED_OFF);
- break;
- case LED_PURPLE:
- gpio_set_level(GPIO_BAT_LED_BLUE, BAT_LED_ON);
- gpio_set_level(GPIO_BAT_LED_AMBER, BAT_LED_ON);
+ gpio_set_level(gpio_led_blue_l, 0);
+ gpio_set_level(gpio_led_amber_l, 1);
break;
case LED_AMBER:
- gpio_set_level(GPIO_BAT_LED_BLUE, BAT_LED_OFF);
- gpio_set_level(GPIO_BAT_LED_AMBER, BAT_LED_ON);
+ gpio_set_level(gpio_led_blue_l, 1);
+ gpio_set_level(gpio_led_amber_l, 0);
+ break;
+ case LED_PINK:
+ gpio_set_level(gpio_led_blue_l, 0);
+ gpio_set_level(gpio_led_amber_l, 0);
break;
default:
return EC_ERROR_UNKNOWN;
}
+
return EC_SUCCESS;
}
-void led_get_brightness_range(enum ec_led_id led_id, uint8_t *brightness_range)
+static int lars_led_set_color_battery(enum led_color color)
{
- brightness_range[EC_LED_COLOR_BLUE] = 1;
- brightness_range[EC_LED_COLOR_AMBER] = 1;
+ return lars_led_set_gpio(color, GPIO_BAT_LED_BLUE, GPIO_BAT_LED_AMBER);
}
-static int lars_led_set_color_battery(enum led_color color)
+static int lars_led_set_color_power(enum led_color color)
{
- return bat_led_set_color(color);
+ return lars_led_set_gpio(color, GPIO_PWR_LED_BLUE, GPIO_PWR_LED_AMBER);
}
static int lars_led_set_color(enum ec_led_id led_id, enum led_color color)
@@ -80,57 +85,106 @@ static int lars_led_set_color(enum ec_led_id led_id, enum led_color color)
int rv;
led_auto_control(led_id, 0);
+
switch (led_id) {
case EC_LED_ID_BATTERY_LED:
rv = lars_led_set_color_battery(color);
break;
+ case EC_LED_ID_POWER_LED:
+ rv = lars_led_set_color_power(color);
+ break;
default:
return EC_ERROR_UNKNOWN;
}
+
return rv;
}
int led_set_brightness(enum ec_led_id led_id, const uint8_t *brightness)
{
if (brightness[EC_LED_COLOR_BLUE] != 0 &&
- brightness[EC_LED_COLOR_AMBER] != 0)
- lars_led_set_color(led_id, LED_PURPLE);
+ brightness[EC_LED_COLOR_YELLOW] != 0)
+ lars_led_set_color(led_id, LED_PINK);
else if (brightness[EC_LED_COLOR_BLUE] != 0)
lars_led_set_color(led_id, LED_BLUE);
- else if (brightness[EC_LED_COLOR_AMBER] != 0)
+ else if (brightness[EC_LED_COLOR_YELLOW] != 0)
lars_led_set_color(led_id, LED_AMBER);
else
lars_led_set_color(led_id, LED_OFF);
-
return EC_SUCCESS;
}
+void led_get_brightness_range(enum ec_led_id led_id, uint8_t *brightness_range)
+{
+ /* Ignoring led_id as both leds support the same colors */
+ brightness_range[EC_LED_COLOR_BLUE] = 1;
+ brightness_range[EC_LED_COLOR_YELLOW] = 1;
+}
+
+static void lars_led_set_power(void)
+{
+ static int power_ticks;
+ static int previous_state_suspend;
+
+ power_ticks++;
+ if (chipset_in_state(CHIPSET_STATE_SUSPEND)) {
+ /* Reset ticks if entering suspend so LED turns amber
+ * as soon as possible. */
+ if (!previous_state_suspend)
+ power_ticks = 0;
+ /* Blink once every four seconds. */
+ lars_led_set_color_power(
+ (power_ticks % LED_TOTAL_4SECS_TICKS <
+ LED_ON_1SEC_TICKS) ? LED_AMBER : LED_OFF);
+
+ previous_state_suspend = 1;
+ return;
+ }
+
+ previous_state_suspend = 0;
+
+ if (chipset_in_state(CHIPSET_STATE_ANY_OFF))
+ lars_led_set_color_power(LED_OFF);
+ else if (chipset_in_state(CHIPSET_STATE_ON))
+ lars_led_set_color_power(LED_BLUE);
+}
+
static void lars_led_set_battery(void)
{
static int battery_ticks;
uint32_t chflags = charge_get_flags();
+ int remaining_capacity;
+ int full_charge_capacity;
+ int permillage;
battery_ticks++;
+ remaining_capacity = *(int *)host_get_memmap(EC_MEMMAP_BATT_CAP);
+ full_charge_capacity = *(int *)host_get_memmap(EC_MEMMAP_BATT_LFCC);
+ permillage = !full_charge_capacity ? 0 :
+ (1000 * remaining_capacity) / full_charge_capacity;
- /* BAT LED behavior:
- * Same as the chromeos spec
- * Green/Amber for CHARGE_FLAG_FORCE_IDLE
- */
switch (charge_get_state()) {
case PWR_STATE_CHARGE:
- lars_led_set_color_battery(LED_PURPLE);
+ /* Make the percentage approximate to UI shown */
+ lars_led_set_color_battery(permillage <
+ FULL_BATTERY_PERMILLAGE ? LED_AMBER : LED_BLUE);
+ break;
+ case PWR_STATE_CHARGE_NEAR_FULL:
+ lars_led_set_color_battery(LED_BLUE);
break;
case PWR_STATE_DISCHARGE:
- /* Less than 3%, blink one second every two second */
- if (charge_get_percent() < CRITICAL_LOW_BATTERY_PERCENTAGE)
+ /* Less than 3%, blink one second every two seconds */
+ if (!chipset_in_state(CHIPSET_STATE_ANY_OFF) &&
+ permillage <= CRITICAL_LOW_BATTERY_PERMILLAGE)
lars_led_set_color_battery(
(battery_ticks % LED_TOTAL_2SECS_TICKS <
- LED_ON_1SEC_TICKS) ? LED_PURPLE : LED_OFF);
+ LED_ON_1SEC_TICKS) ? LED_AMBER : LED_OFF);
/* Less than 10%, blink one second every four seconds */
- else if (charge_get_percent() < LOW_BATTERY_PERCENTAGE)
+ else if (!chipset_in_state(CHIPSET_STATE_ANY_OFF) &&
+ permillage <= LOW_BATTERY_PERMILLAGE)
lars_led_set_color_battery(
(battery_ticks % LED_TOTAL_4SECS_TICKS <
- LED_ON_1SEC_TICKS) ? LED_PURPLE : LED_OFF);
+ LED_ON_1SEC_TICKS) ? LED_AMBER : LED_OFF);
else
lars_led_set_color_battery(LED_OFF);
break;
@@ -139,14 +193,11 @@ static void lars_led_set_battery(void)
(battery_ticks % LED_TOTAL_2SECS_TICKS <
LED_ON_1SEC_TICKS) ? LED_AMBER : LED_OFF);
break;
- case PWR_STATE_CHARGE_NEAR_FULL:
- lars_led_set_color_battery(LED_BLUE);
- break;
- case PWR_STATE_IDLE: /* External power connected in IDLE */
+ case PWR_STATE_IDLE: /* External power connected in IDLE. */
if (chflags & CHARGE_FLAG_FORCE_IDLE)
lars_led_set_color_battery(
(battery_ticks % LED_TOTAL_4SECS_TICKS <
- LED_ON_2SECS_TICKS) ? LED_AMBER : LED_BLUE);
+ LED_ON_2SECS_TICKS) ? LED_BLUE : LED_AMBER);
else
lars_led_set_color_battery(LED_BLUE);
break;
@@ -156,10 +207,12 @@ static void lars_led_set_battery(void)
}
}
-/** * Called by hook task every 1 sec */
-static void led_second(void)
+/* Called by hook task every 250mSec */
+static void led_tick(void)
{
+ if (led_auto_control_is_enabled(EC_LED_ID_POWER_LED))
+ lars_led_set_power();
if (led_auto_control_is_enabled(EC_LED_ID_BATTERY_LED))
lars_led_set_battery();
}
-DECLARE_HOOK(HOOK_SECOND, led_second, HOOK_PRIO_DEFAULT);
+DECLARE_HOOK(HOOK_TICK, led_tick, HOOK_PRIO_DEFAULT);