mirror of
https://github.com/Telecominfraproject/OpenCellular.git
synced 2026-01-11 18:35:28 +00:00
Since pretty much always, we've declared console commands to take a "longhelp" argument with detailed explanations of what the command does. But since almost as long, we've never actually used that argument for anything - we just silently throw it away in the macro. There's only one command (usbchargemode) that even thinks it defines that argument. We're never going to use this, let's just get rid of it. BUG=none BRANCH=none CQ-DEPEND=CL:*279060 CQ-DEPEND=CL:*279158 CQ-DEPEND=CL:*279037 TEST=make buildall; tested on Cr50 hardware Everything builds. Since we never used this arg anyway, there had better not be any difference in the result. Change-Id: Id3f71a53d02e3dc625cfcc12aa71ecb50e35eb9f Signed-off-by: Bill Richardson <wfrichar@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/374163 Reviewed-by: Myles Watson <mylesgw@chromium.org> Reviewed-by: Randall Spangler <rspangler@chromium.org>
207 lines
4.8 KiB
C
207 lines
4.8 KiB
C
/* Copyright 2015 The Chromium OS Authors. All rights reserved.
|
|
* Use of this source code is governed by a BSD-style license that can be
|
|
* found in the LICENSE file.
|
|
*
|
|
* Power/Battery LED control for Strago
|
|
*/
|
|
|
|
#include "charge_state.h"
|
|
#include "chipset.h"
|
|
#include "console.h"
|
|
#include "extpower.h"
|
|
#include "gpio.h"
|
|
#include "hooks.h"
|
|
#include "led_common.h"
|
|
#include "pwm.h"
|
|
#include "registers.h"
|
|
#include "util.h"
|
|
|
|
#define CPRINTF(format, args...) cprintf(CC_PWM, format, ## args)
|
|
#define CPRINTS(format, args...) cprints(CC_PWM, format, ## args)
|
|
|
|
#define LED_TOTAL_TICKS 16
|
|
#define LED_ON_TICKS 4
|
|
|
|
static int led_debug;
|
|
|
|
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);
|
|
|
|
enum led_color {
|
|
LED_OFF = 0,
|
|
LED_RED,
|
|
LED_AMBER,
|
|
LED_GREEN,
|
|
|
|
/* Number of colors, not a color itself */
|
|
LED_COLOR_COUNT
|
|
};
|
|
|
|
/* Brightness vs. color, in the order of off, red, amber, and green */
|
|
static const uint8_t color_brightness[LED_COLOR_COUNT][3] = {
|
|
/* {Red, Blue, Green}, */
|
|
[LED_OFF] = { 0, 0, 0},
|
|
[LED_RED] = {100, 0, 0},
|
|
[LED_AMBER] = { 75, 0, 10},
|
|
[LED_GREEN] = { 0, 0, 100},
|
|
};
|
|
|
|
/**
|
|
* Set LED color
|
|
*
|
|
* @param color Enumerated color value
|
|
*/
|
|
static void set_color(enum led_color color)
|
|
{
|
|
pwm_set_duty(PWM_CH_LED_RED, color_brightness[color][0]);
|
|
pwm_set_duty(PWM_CH_LED_BLUE, color_brightness[color][1]);
|
|
pwm_set_duty(PWM_CH_LED_GREEN, color_brightness[color][2]);
|
|
}
|
|
|
|
void led_get_brightness_range(enum ec_led_id led_id, uint8_t *brightness_range)
|
|
{
|
|
brightness_range[EC_LED_COLOR_RED] = 100;
|
|
brightness_range[EC_LED_COLOR_BLUE] = 100;
|
|
brightness_range[EC_LED_COLOR_GREEN] = 100;
|
|
}
|
|
|
|
int led_set_brightness(enum ec_led_id led_id, const uint8_t *brightness)
|
|
{
|
|
pwm_set_duty(PWM_CH_LED_RED, brightness[EC_LED_COLOR_RED]);
|
|
pwm_set_duty(PWM_CH_LED_BLUE, brightness[EC_LED_COLOR_BLUE]);
|
|
pwm_set_duty(PWM_CH_LED_GREEN, brightness[EC_LED_COLOR_GREEN]);
|
|
return EC_SUCCESS;
|
|
}
|
|
|
|
static void strago_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. */
|
|
set_color(
|
|
(power_ticks % LED_TOTAL_TICKS) < LED_ON_TICKS ?
|
|
LED_AMBER : LED_OFF);
|
|
|
|
previous_state_suspend = 1;
|
|
return;
|
|
}
|
|
|
|
previous_state_suspend = 0;
|
|
|
|
if (chipset_in_state(CHIPSET_STATE_ANY_OFF))
|
|
set_color(LED_OFF);
|
|
else if (chipset_in_state(CHIPSET_STATE_ON))
|
|
set_color(LED_GREEN);
|
|
}
|
|
|
|
static void strago_led_set_battery(void)
|
|
{
|
|
static int battery_ticks;
|
|
|
|
battery_ticks++;
|
|
|
|
switch (charge_get_state()) {
|
|
case PWR_STATE_CHARGE:
|
|
set_color(LED_AMBER);
|
|
break;
|
|
case PWR_STATE_ERROR:
|
|
set_color(LED_RED);
|
|
break;
|
|
case PWR_STATE_CHARGE_NEAR_FULL:
|
|
case PWR_STATE_IDLE: /* External power connected in IDLE. */
|
|
set_color(LED_GREEN);
|
|
break;
|
|
default:
|
|
/* Other states don't alter LED behavior */
|
|
break;
|
|
}
|
|
}
|
|
|
|
static void led_init(void)
|
|
{
|
|
/*
|
|
* Enable PWMs and set to 0% duty cycle. If they're disabled,
|
|
* seems to ground the pins instead of letting them float.
|
|
*/
|
|
pwm_enable(PWM_CH_LED_RED, 1);
|
|
pwm_enable(PWM_CH_LED_GREEN, 1);
|
|
pwm_enable(PWM_CH_LED_BLUE, 1);
|
|
|
|
set_color(LED_OFF);
|
|
}
|
|
DECLARE_HOOK(HOOK_INIT, led_init, HOOK_PRIO_DEFAULT);
|
|
|
|
/**
|
|
* Called by hook task every 250 ms
|
|
*/
|
|
static void led_tick(void)
|
|
{
|
|
if (led_debug)
|
|
return;
|
|
|
|
if (extpower_is_present()) {
|
|
if (led_auto_control_is_enabled(EC_LED_ID_BATTERY_LED)) {
|
|
strago_led_set_battery();
|
|
return;
|
|
}
|
|
} else if (led_auto_control_is_enabled(EC_LED_ID_POWER_LED)) {
|
|
strago_led_set_power();
|
|
return;
|
|
}
|
|
|
|
set_color(LED_OFF);
|
|
}
|
|
DECLARE_HOOK(HOOK_TICK, led_tick, HOOK_PRIO_DEFAULT);
|
|
|
|
static void dump_pwm_channels(void)
|
|
{
|
|
int ch;
|
|
for (ch = 0; ch < 4; ch++) {
|
|
CPRINTF("channel = %d\n", ch);
|
|
CPRINTF("0x%04X 0x%04X 0x%04X\n",
|
|
MEC1322_PWM_CFG(ch),
|
|
MEC1322_PWM_ON(ch),
|
|
MEC1322_PWM_OFF(ch));
|
|
}
|
|
}
|
|
/******************************************************************/
|
|
/* Console commands */
|
|
static int command_led_color(int argc, char **argv)
|
|
{
|
|
if (argc > 1) {
|
|
if (!strcasecmp(argv[1], "debug")) {
|
|
led_debug ^= 1;
|
|
CPRINTF("led_debug = %d\n", led_debug);
|
|
} else if (!strcasecmp(argv[1], "off")) {
|
|
set_color(LED_OFF);
|
|
} else if (!strcasecmp(argv[1], "red")) {
|
|
set_color(LED_RED);
|
|
} else if (!strcasecmp(argv[1], "green")) {
|
|
set_color(LED_GREEN);
|
|
} else if (!strcasecmp(argv[1], "amber")) {
|
|
set_color(LED_AMBER);
|
|
} else {
|
|
/* maybe handle charger_discharge_on_ac() too? */
|
|
return EC_ERROR_PARAM1;
|
|
}
|
|
}
|
|
|
|
if (led_debug == 1)
|
|
dump_pwm_channels();
|
|
return EC_SUCCESS;
|
|
}
|
|
DECLARE_CONSOLE_COMMAND(ledcolor, command_led_color,
|
|
"[debug|red|green|amber|off]",
|
|
"Change LED color");
|
|
|