diff options
-rw-r--r-- | board/kitty/board.c | 82 | ||||
-rw-r--r-- | board/kitty/board.h | 85 | ||||
-rw-r--r-- | board/kitty/build.mk | 13 | ||||
-rw-r--r-- | board/kitty/ec.tasklist | 22 | ||||
-rw-r--r-- | board/kitty/led.c | 85 | ||||
-rw-r--r-- | chip/stm32/clock-stm32l.c | 4 | ||||
-rw-r--r-- | power/tegra.c | 3 | ||||
-rwxr-xr-x | util/flash_ec | 3 |
8 files changed, 295 insertions, 2 deletions
diff --git a/board/kitty/board.c b/board/kitty/board.c new file mode 100644 index 0000000000..f0abfc12b3 --- /dev/null +++ b/board/kitty/board.c @@ -0,0 +1,82 @@ +/* Copyright (c) 2014 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. + */ +/* Kitty board-specific configuration */ + +#include "chipset.h" +#include "common.h" +#include "extpower.h" +#include "gpio.h" +#include "i2c.h" +#include "power.h" +#include "power_button.h" +#include "pwm.h" +#include "pwm_chip.h" +#include "registers.h" +#include "spi.h" +#include "task.h" +#include "util.h" +#include "timer.h" + + +/* GPIO signal list. Must match order from enum gpio_signal. */ +const struct gpio_info gpio_list[] = { + /* Inputs with interrupt handlers are first for efficiency */ + {"POWER_BUTTON_L", GPIO_B, (1<<5), GPIO_INT_BOTH, + power_button_interrupt}, + {"XPSHOLD", GPIO_A, (1<<3), GPIO_INT_BOTH, + power_signal_interrupt}, + {"LID_OPEN", GPIO_C, (1<<13), GPIO_DEFAULT, NULL}, + {"SUSPEND_L", GPIO_C, (1<<7), GPIO_INT_BOTH, + power_signal_interrupt}, + {"SPI1_NSS", GPIO_A, (1<<4), GPIO_INT_BOTH | GPIO_PULL_UP, + spi_event}, + {"AC_PRESENT", GPIO_A, (1<<0), GPIO_DEFAULT, NULL}, + {"USB_CTL3", GPIO_C, (1<<11), GPIO_ODR_HIGH, NULL}, + {"USB_CTL2", GPIO_C, (1<<12), GPIO_ODR_HIGH, NULL}, + {"USB_CTL1", GPIO_C, (1<<15), GPIO_OUT_LOW, NULL}, + {"WP_L", GPIO_B, (1<<4), GPIO_INPUT, NULL}, + {"AP_RESET_L", GPIO_B, (1<<3), GPIO_ODR_HIGH, NULL}, + {"EC_INT", GPIO_B, (1<<9), GPIO_ODR_HIGH, NULL}, + {"ENTERING_RW", GPIO_H, (1<<0), GPIO_OUT_LOW, NULL}, + {"I2C1_SCL", GPIO_B, (1<<6), GPIO_ODR_HIGH, NULL}, + {"I2C1_SDA", GPIO_B, (1<<7), GPIO_ODR_HIGH, NULL}, + {"PMIC_PWRON_L", GPIO_A, (1<<12), GPIO_OUT_HIGH, NULL}, + {"PMIC_RESET", GPIO_A, (1<<15), GPIO_OUT_LOW, NULL}, + {"PWR_LED0", GPIO_B, (1<<10), GPIO_OUT_LOW, NULL}, + {"USB_ILIM_SEL", GPIO_A, (1<<8), GPIO_OUT_LOW, NULL}, + {"USB_STATUS_L", GPIO_A, (1<<11), GPIO_INT_BOTH, NULL}, + {"EC_BL_OVERRIDE", GPIO_H, (1<<1), GPIO_ODR_HIGH, NULL}, + {"PMIC_THERM_L", GPIO_A, (1<<1), GPIO_ODR_HIGH, NULL}, + {"PMIC_WARM_RESET_L", GPIO_C, (1<<3), GPIO_ODR_HIGH, NULL}, +}; +BUILD_ASSERT(ARRAY_SIZE(gpio_list) == GPIO_COUNT); + +/* Pins with alternate functions */ +const struct gpio_alt_func gpio_alt_funcs[] = { + {GPIO_A, 0x00f0, GPIO_ALT_SPI, MODULE_SPI, GPIO_DEFAULT}, + {GPIO_A, 0x0600, GPIO_ALT_USART, MODULE_UART, GPIO_DEFAULT}, + {GPIO_B, 0x00c0, GPIO_ALT_I2C, MODULE_I2C, GPIO_DEFAULT}, +}; +const int gpio_alt_funcs_count = ARRAY_SIZE(gpio_alt_funcs); + +/* power signal list. Must match order of enum power_signal. */ +const struct power_signal_info power_signal_list[] = { + {GPIO_SOC1V8_XPSHOLD, 1, "XPSHOLD"}, + {GPIO_SUSPEND_L, 0, "SUSPEND#_ASSERTED"}, +}; +BUILD_ASSERT(ARRAY_SIZE(power_signal_list) == POWER_SIGNAL_COUNT); + +/* I2C ports */ +const struct i2c_port_t i2c_ports[] = { + {"master", I2C_PORT_MASTER, 100, GPIO_I2C1_SCL, GPIO_I2C1_SDA}, +}; +const unsigned int i2c_ports_used = ARRAY_SIZE(i2c_ports); + +/* PWM channels. Must be in the exactly same order as in enum pwm_channel. */ +const struct pwm_t pwm_channels[] = { + {STM32_TIM(2), STM32_TIM_CH(3), + PWM_CONFIG_ACTIVE_LOW, GPIO_PWR_LED0}, +}; +BUILD_ASSERT(ARRAY_SIZE(pwm_channels) == PWM_CH_COUNT); diff --git a/board/kitty/board.h b/board/kitty/board.h new file mode 100644 index 0000000000..a906d7dd10 --- /dev/null +++ b/board/kitty/board.h @@ -0,0 +1,85 @@ +/* Copyright (c) 2014 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. + */ + +/* kitty board configuration */ + +#ifndef __BOARD_H +#define __BOARD_H + +/* Optional features */ +#define CONFIG_AP_HANG_DETECT +#define CONFIG_CHIPSET_TEGRA +#define CONFIG_POWER_COMMON +#define CONFIG_EXTPOWER_GPIO +#define CONFIG_HOST_COMMAND_STATUS +#define CONFIG_I2C +#define CONFIG_SPI +#define CONFIG_PWM +#define CONFIG_POWER_BUTTON +#define CONFIG_VBOOT_HASH +#define CONFIG_LED_COMMON + +#ifndef __ASSEMBLER__ + + + +/* Single I2C port, where the EC is the master. */ +#define I2C_PORT_MASTER 0 + +/* Timer selection */ +#define TIM_CLOCK_MSB 3 +#define TIM_CLOCK_LSB 9 +#define TIM_POWER_LED 2 +#define TIM_WATCHDOG 4 + +/* GPIO signal list */ +enum gpio_signal { + /* Inputs with interrupt handlers are first for efficiency */ + GPIO_POWER_BUTTON_L = 0, + GPIO_SOC1V8_XPSHOLD, + GPIO_LID_OPEN, + GPIO_SUSPEND_L, + GPIO_SPI1_NSS, + GPIO_AC_PRESENT, + GPIO_USB_CTL3, + GPIO_USB_CTL2, + GPIO_USB_CTL1, + GPIO_WP_L, + GPIO_AP_RESET_L, + GPIO_EC_INT, + GPIO_ENTERING_RW, + GPIO_I2C1_SCL, + GPIO_I2C1_SDA, + GPIO_PMIC_PWRON_L, + GPIO_PMIC_RESET, + GPIO_PWR_LED0, + GPIO_USB_ILIM_SEL, + GPIO_USB_STATUS_L, + GPIO_EC_BL_OVERRIDE, + GPIO_PMIC_THERM_L, + GPIO_PMIC_WARM_RESET_L, + /* Number of GPIOs; not an actual GPIO */ + GPIO_COUNT +}; + +enum power_signal { + TEGRA_XPSHOLD = 0, + TEGRA_SUSPEND_ASSERTED, + + /* Number of power signals */ + POWER_SIGNAL_COUNT +}; + +enum pwm_channel { + PWM_CH_POWER_LED = 0, + /* Number of PWM channels */ + PWM_CH_COUNT +}; + + + +#endif /* !__ASSEMBLER__ */ + +#endif /* __BOARD_H */ diff --git a/board/kitty/build.mk b/board/kitty/build.mk new file mode 100644 index 0000000000..7598dc3eac --- /dev/null +++ b/board/kitty/build.mk @@ -0,0 +1,13 @@ +# -*- makefile -*- +# Copyright (c) 2014 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. +# +# Board specific files build + +# the IC is STmicro STM32L100RBT6 +CHIP:=stm32 +CHIP_FAMILY:=stm32l +CHIP_VARIANT:=stm32l100 + +board-y=board.o led.o diff --git a/board/kitty/ec.tasklist b/board/kitty/ec.tasklist new file mode 100644 index 0000000000..df91c86a55 --- /dev/null +++ b/board/kitty/ec.tasklist @@ -0,0 +1,22 @@ +/* Copyright (c) 2014 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. + */ + +/** + * List of enabled tasks in the priority order + * + * The first one has the lowest priority. + * + * For each task, use the macro TASK(n, r, d, s) where : + * 'n' in the name of the task + * 'r' in the main routine of the task + * 'd' in an opaque parameter passed to the routine at startup + * 's' is the stack size in bytes; must be a multiple of 8 + */ +#define CONFIG_TASK_LIST \ + TASK_ALWAYS(HOOKS, hook_task, NULL, LARGER_TASK_STACK_SIZE) \ + TASK_NOTEST(POWERLED, power_led_task, NULL, 256) \ + TASK_NOTEST(CHIPSET, chipset_task, NULL, LARGER_TASK_STACK_SIZE) \ + TASK_ALWAYS(HOSTCMD, host_command_task, NULL, TASK_STACK_SIZE) \ + TASK_ALWAYS(CONSOLE, console_task, NULL, TASK_STACK_SIZE) diff --git a/board/kitty/led.c b/board/kitty/led.c new file mode 100644 index 0000000000..82772ca527 --- /dev/null +++ b/board/kitty/led.c @@ -0,0 +1,85 @@ +/* Copyright (c) 2014 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 LED control for Kitty + */ + +#include "gpio.h" +#include "hooks.h" +#include "chipset.h" +#include "led_common.h" +#include "util.h" + +const enum ec_led_id supported_led_ids[] = {EC_LED_ID_POWER_LED}; + +const int supported_led_ids_count = ARRAY_SIZE(supported_led_ids); + +enum led_color { + LED_OFF = 0, + LED_WHITE, + LED_COLOR_COUNT /* Number of colors, not a color itself */ +}; + +static int pwr_led_set_color(enum led_color color) +{ + switch (color) { + case LED_OFF: + gpio_set_level(GPIO_PWR_LED0, 0); + break; + case LED_WHITE: + gpio_set_level(GPIO_PWR_LED0, 1); + break; + default: + return EC_ERROR_UNKNOWN; + } + return EC_SUCCESS; +} + +void led_get_brightness_range(enum ec_led_id led_id, uint8_t *brightness_range) +{ + brightness_range[EC_LED_COLOR_WHITE] = 1; +} + +int led_set_brightness(enum ec_led_id led_id, const uint8_t *brightness) +{ + switch (led_id) { + case EC_LED_ID_POWER_LED: + if (brightness[EC_LED_COLOR_WHITE] != 0) + pwr_led_set_color(LED_WHITE); + else + pwr_led_set_color(LED_OFF); + break; + default: + return EC_ERROR_UNKNOWN; + } + return EC_SUCCESS; +} + +static void kitty_led_set_power(void) +{ + static int power_second; + + power_second++; + + /* PWR LED behavior: + * Power on: White + * Suspend: White in breeze mode ( 1 sec on/ 3 sec off) + * Power off: OFF + */ + if (chipset_in_state(CHIPSET_STATE_ANY_OFF)) + pwr_led_set_color(LED_OFF); + else if (chipset_in_state(CHIPSET_STATE_ON)) + pwr_led_set_color(LED_WHITE); + else if (chipset_in_state(CHIPSET_STATE_SUSPEND)) + pwr_led_set_color((power_second & 3) ? LED_OFF : LED_WHITE); +} + +/** * Called by hook task every 1 sec */ +static void led_second(void) +{ + if (led_auto_control_is_enabled(EC_LED_ID_POWER_LED)) + kitty_led_set_power(); +} +DECLARE_HOOK(HOOK_SECOND, led_second, HOOK_PRIO_DEFAULT); + diff --git a/chip/stm32/clock-stm32l.c b/chip/stm32/clock-stm32l.c index 502a8187c3..3d320a4982 100644 --- a/chip/stm32/clock-stm32l.c +++ b/chip/stm32/clock-stm32l.c @@ -196,7 +196,9 @@ void clock_enable_module(enum module_id module, int enable) */ void __enter_hibernate(uint32_t seconds, uint32_t microseconds) { +#ifdef CONFIG_KEYBOARD_PROTOCOL_MKBP int i; +#endif fake_hibernate = 1; #ifdef CONFIG_POWER_COMMON @@ -218,6 +220,7 @@ void __enter_hibernate(uint32_t seconds, uint32_t microseconds) power_set_state(POWER_G3); #endif +#ifdef CONFIG_KEYBOARD_PROTOCOL_MKBP /* * Change keyboard outputs to high-Z to reduce power draw. * We don't need corresponding code to change them back, @@ -227,6 +230,7 @@ void __enter_hibernate(uint32_t seconds, uint32_t microseconds) */ for (i = GPIO_KB_OUT00; i < GPIO_KB_OUT00 + KEYBOARD_COLS; i++) gpio_set_flags(i, GPIO_INPUT); +#endif ccprints("fake hibernate. waits for power button/lid/RTC/AC"); cflush(); diff --git a/power/tegra.c b/power/tegra.c index 41c1e83b16..60f9044277 100644 --- a/power/tegra.c +++ b/power/tegra.c @@ -270,8 +270,9 @@ enum power_state power_chipset_init(void) * Some batteries use clock stretching feature, which requires * more time to be stable. See http://crosbug.com/p/28289 */ +#ifndef BOARD_KITTY battery_wait_for_stable(); - +#endif return init_power_state; } diff --git a/util/flash_ec b/util/flash_ec index 3bfee7c61d..2af7475668 100755 --- a/util/flash_ec +++ b/util/flash_ec @@ -239,7 +239,8 @@ fi save="$(servo_save)" case "${BOARD}" in - big | blaze | discovery | nyan | pit | snow | spring ) flash_stm32 ;; + big | blaze | discovery | kitty | nyan | pit | snow | spring ) \ + flash_stm32 ;; fruitpie | zinger) flash_stm32 ;; falco | peppy | rambi | samus | squawks ) flash_lm4 ;; link ) flash_link ;; |