diff options
-rw-r--r-- | board/cerise/board.c | 40 | ||||
-rw-r--r-- | board/cerise/board.h | 9 | ||||
-rw-r--r-- | board/cerise/led.c | 39 |
3 files changed, 81 insertions, 7 deletions
diff --git a/board/cerise/board.c b/board/cerise/board.c index 6f7f67a529..53175410c7 100644 --- a/board/cerise/board.c +++ b/board/cerise/board.c @@ -465,3 +465,43 @@ void lid_angle_peripheral_enable(int enable) keyboard_scan_enable(enable, KB_SCAN_DISABLE_LID_ANGLE); } #endif + +/* map from sku id voltage in mv */ +const int16_t sku_id_map[] = { + 109, /* 51.1K , 2.2K ohm */ + 211, /* 51.1k , 6.8K ohm */ +}; +BUILD_ASSERT(ARRAY_SIZE(sku_id_map) == BOARD_SKU_ID_COUNT); + +#define THRESHOLD_MV 56 /* Simply assume 1800/16/2 */ + +int board_get_sku_id(void) +{ + static int version = BOARD_SKU_ID_UNKNOWN; + int mv; + int i; + + if (version != BOARD_SKU_ID_UNKNOWN) + return version; + + mv = adc_read_channel(ADC_EC_SKU_ID); + + if (mv == ADC_READ_ERROR) + mv = adc_read_channel(ADC_EC_SKU_ID); + + for (i = 0; i < BOARD_SKU_ID_COUNT; ++i) { + if (mv < sku_id_map[i] + THRESHOLD_MV) { + version = i; + break; + } + } + /* + * For devices without pogo, Disable ADC module after we detect the + * board version, since this is the only thing ADC module needs to do + * for this board. + */ + if (version != BOARD_SKU_ID_UNKNOWN) + adc_disable(); + + return version; +} diff --git a/board/cerise/board.h b/board/cerise/board.h index 1ee3d931eb..d2aeed1f6c 100644 --- a/board/cerise/board.h +++ b/board/cerise/board.h @@ -50,6 +50,7 @@ #define CONFIG_USB_MUX_IT5205 #define CONFIG_LED_ONOFF_STATES +#define CONFIG_LED_ONOFF_STATES_BAT_LOW 10 #define CONFIG_LED_POWER_LED #define CONFIG_LED_COMMON @@ -127,6 +128,13 @@ enum battery_type { BATTERY_TYPE_COUNT, }; +enum BOARD_SKU_ID { + BOARD_SKU_ID_UNKNOWN = -1, + BOARD_SKU_ID_REV0 = 0, + BOARD_SKU_ID_REV1 = 1, + BOARD_SKU_ID_COUNT, +}; + #include "gpio_signal.h" #include "registers.h" @@ -142,6 +150,7 @@ int board_is_sourcing_vbus(int port); /* returns the i2c port number of charger */ int board_get_charger_i2c(void); +int board_get_sku_id(void); #endif /* !__ASSEMBLER__ */ diff --git a/board/cerise/led.c b/board/cerise/led.c index ff5f9f2373..536733e87c 100644 --- a/board/cerise/led.c +++ b/board/cerise/led.c @@ -10,6 +10,7 @@ #include "ec_commands.h" #include "led_common.h" #include "led_onoff_states.h" +#include "hooks.h" #define LED_ON_LVL 0 #define LED_OFF_LVL 1 @@ -20,21 +21,30 @@ const int led_charge_lvl_2 = 95; struct led_descriptor led_bat_state_table[LED_NUM_STATES][LED_NUM_PHASES] = { [STATE_CHARGING_LVL_1] = {{EC_LED_COLOR_AMBER, LED_INDEFINITE} }, [STATE_CHARGING_LVL_2] = {{EC_LED_COLOR_AMBER, LED_INDEFINITE} }, - [STATE_CHARGING_FULL_CHARGE] = {{EC_LED_COLOR_WHITE, LED_INDEFINITE} }, + [STATE_CHARGING_FULL_CHARGE] = {{EC_LED_COLOR_WHITE, LED_INDEFINITE} }, [STATE_DISCHARGE_S0] = {{LED_OFF, LED_INDEFINITE} }, [STATE_DISCHARGE_S3] = {{LED_OFF, LED_INDEFINITE} }, [STATE_DISCHARGE_S5] = {{LED_OFF, LED_INDEFINITE} }, - [STATE_BATTERY_ERROR] = {{EC_LED_COLOR_AMBER, 1 * LED_ONE_SEC}, - {LED_OFF, 1 * LED_ONE_SEC} }, - [STATE_FACTORY_TEST] = {{EC_LED_COLOR_WHITE, 2 * LED_ONE_SEC}, + [STATE_DISCHARGE_S0_BAT_LOW] = {{EC_LED_COLOR_AMBER, 1 * LED_ONE_SEC}, + {LED_OFF, 3 * LED_ONE_SEC} }, + [STATE_BATTERY_ERROR] = {{EC_LED_COLOR_AMBER, 1 * LED_ONE_SEC}, + {LED_OFF, 1 * LED_ONE_SEC} }, + [STATE_FACTORY_TEST] = {{EC_LED_COLOR_WHITE, 2 * LED_ONE_SEC}, {EC_LED_COLOR_AMBER, 2 * LED_ONE_SEC} }, }; +struct led_descriptor led_bat_clamshell[LED_NUM_STATES][LED_NUM_PHASES] = { + [STATE_DISCHARGE_S0] = {{EC_LED_COLOR_WHITE, LED_INDEFINITE} }, + [STATE_DISCHARGE_S3] = {{EC_LED_COLOR_WHITE, 2 * LED_ONE_SEC}, + {LED_OFF, 2 * LED_ONE_SEC} }, +}; + const struct led_descriptor led_pwr_state_table[PWR_LED_NUM_STATES][LED_NUM_PHASES] = { [PWR_LED_STATE_ON] = {{EC_LED_COLOR_WHITE, LED_INDEFINITE} }, - [PWR_LED_STATE_SUSPEND_AC] = {{EC_LED_COLOR_WHITE, 1 * LED_ONE_SEC}, - {LED_OFF, 3 * LED_ONE_SEC} }, - [PWR_LED_STATE_SUSPEND_NO_AC] = {{LED_OFF, LED_INDEFINITE} }, + [PWR_LED_STATE_SUSPEND_AC] = {{EC_LED_COLOR_WHITE, 2 * LED_ONE_SEC}, + {LED_OFF, 2 * LED_ONE_SEC} }, + [PWR_LED_STATE_SUSPEND_NO_AC] = {{EC_LED_COLOR_WHITE, 2 * LED_ONE_SEC}, + {LED_OFF, 2 * LED_ONE_SEC} }, [PWR_LED_STATE_OFF] = {{LED_OFF, LED_INDEFINITE} }, }; @@ -103,3 +113,18 @@ int led_set_brightness(enum ec_led_id led_id, const uint8_t *brightness) } return EC_SUCCESS; } + +static void cerise_led_init(void) +{ + int i; + + if (board_get_sku_id() == BOARD_SKU_ID_REV0) { + for (i = 0; i < LED_NUM_PHASES; i++) { + led_bat_state_table[STATE_DISCHARGE_S0][i] = + led_bat_clamshell[STATE_DISCHARGE_S0][i]; + led_bat_state_table[STATE_DISCHARGE_S3][i] = + led_bat_clamshell[STATE_DISCHARGE_S3][i]; + } + } +} +DECLARE_HOOK(HOOK_INIT, cerise_led_init, HOOK_PRIO_DEFAULT); |