kevin / gru: Warn users when incompatible GPIO config is used

Old kevin / gru boards are no longer supported by our current GPIO
configuration and must revert a CL to boot properly. Detect if old
boards are used with an incompatible config and warn users of this fact
by spamming the EC console and blinking the LED red.

BUG=chrome-os-partner:55561
BRANCH=None
TEST=Boot new kevin, verify no console spam or LED blinkage is seen. Verify
old kevin + old gru spam the console and blink LED.

Change-Id: I6d49720f760a6bef2bb3db6872857a5f61259e06
Signed-off-by: Shawn Nematbakhsh <shawnn@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/362653
Commit-Ready: Shawn N <shawnn@chromium.org>
Tested-by: Shawn N <shawnn@chromium.org>
Reviewed-by: Aseda Aboagye <aaboagye@chromium.org>
Reviewed-by: Randall Spangler <rspangler@chromium.org>
This commit is contained in:
Shawn Nematbakhsh
2016-07-22 11:41:36 -07:00
committed by chrome-bot
parent 29d42a5e39
commit 1f99b58bd3

View File

@@ -24,6 +24,7 @@
#include "host_command.h"
#include "i2c.h"
#include "keyboard_scan.h"
#include "led_common.h"
#include "lid_switch.h"
#include "power.h"
#include "power_button.h"
@@ -315,6 +316,11 @@ int board_get_version(void)
/* Wait to allow cap charge */
msleep(10);
mv = adc_read_channel(ADC_BOARD_ID);
/* TODO(crosbug.com/p/54971): Fix failure on first ADC conversion. */
if (mv == ADC_READ_ERROR)
mv = adc_read_channel(ADC_BOARD_ID);
gpio_set_level(GPIO_EC_BOARD_ID_EN_L, 1);
for (i = 0; i < BOARD_VERSION_COUNT; ++i) {
@@ -327,6 +333,52 @@ int board_get_version(void)
return version;
}
/*
* Detect 'old' boards which are incompatible with our new GPIO configuration
* and warn the user about the incompatibility by spamming the EC console and
* blinking our red LED.
*
* TODO(crosbug.com/p/55561): Remove version checking / warning prints once
* old boards are obsoleted.
*/
#ifdef BOARD_KEVIN
#define BOARD_VERSION_NEW_GPIO_CFG BOARD_VERSION_REV3
#else
#define BOARD_VERSION_NEW_GPIO_CFG BOARD_VERSION_REV1
#endif
/* CONFIG removed in CL:351151. */
#ifndef CONFIG_USB_PD_5V_EN_ACTIVE_LOW
static void board_config_warning(void);
DECLARE_DEFERRED(board_config_warning);
static void board_config_warning(void)
{
static int led_toggle;
ccprintf("WARNING: Invalid GPIO config detected.\n"
"PLEASE REVERT CL:351151 in local EC source:\n"
"`git revert d1138722`\n");
/* Flash red LED as warning */
led_auto_control(EC_LED_ID_POWER_LED, 0);
led_auto_control(EC_LED_ID_BATTERY_LED, 0);
pwm_set_duty(PWM_CH_LED_RED, led_toggle ? 0 : 100);
led_toggle = !led_toggle;
hook_call_deferred(&board_config_warning_data, SECOND);
}
static void board_config_check(void)
{
int board_ver = board_get_version();
if (board_ver < BOARD_VERSION_NEW_GPIO_CFG)
hook_call_deferred(&board_config_warning_data, 0);
}
DECLARE_HOOK(HOOK_INIT, board_config_check, HOOK_PRIO_LAST);
#endif /* ifndef CONFIG_USB_PD_5V_EN_ACTIVE_LOW */
static void overtemp_interrupt_enable(void)
{
gpio_enable_interrupt(GPIO_AP_OVERTEMP);