diff options
author | Edward Hill <ecgh@chromium.org> | 2019-07-26 11:06:41 -0600 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2019-07-29 23:37:25 +0000 |
commit | 234c5298c8369e18eac135b50fc3dec61afe510e (patch) | |
tree | 84a4140ebd5225ea236259d02f2c55fa85206777 /board | |
parent | e7417e0a9e2c4ea3fee8dad3ab6db063a2a15bc4 (diff) | |
download | chrome-ec-234c5298c8369e18eac135b50fc3dec61afe510e.tar.gz |
Trembyle: Initial GPIO and CONFIG_* definitions
Update GPIOs to match schematic.
First pass at CONFIG_* definitions.
Just enough [base]board.c changes to build.
BUG=none
BRANCH=none
TEST=make BOARD=trembyle
Change-Id: Ia242351f60a5c00d90def77eb5cfcb7ac67c4b8b
Signed-off-by: Edward Hill <ecgh@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/1720861
Reviewed-by: Denis Brockus <dbrockus@chromium.org>
Commit-Queue: Denis Brockus <dbrockus@chromium.org>
Diffstat (limited to 'board')
-rw-r--r-- | board/trembyle/board.c | 240 | ||||
-rw-r--r-- | board/trembyle/board.h | 50 | ||||
-rw-r--r-- | board/trembyle/build.mk | 2 | ||||
-rw-r--r-- | board/trembyle/gpio.inc | 158 | ||||
-rw-r--r-- | board/trembyle/led.c | 94 |
5 files changed, 169 insertions, 375 deletions
diff --git a/board/trembyle/board.c b/board/trembyle/board.c index 879fc2d945..02559cdc6c 100644 --- a/board/trembyle/board.c +++ b/board/trembyle/board.c @@ -3,247 +3,89 @@ * found in the LICENSE file. */ -/* Zork board-specific configuration */ +/* Trembyle board configuration */ -#include "adc.h" -#include "adc_chip.h" #include "button.h" -#include "charge_manager.h" -#include "charge_state.h" -#include "charge_state_v2.h" -#include "common.h" -#include "compile_time_macros.h" -#include "console.h" -#include "driver/accel_kionix.h" -#include "driver/accel_kx022.h" #include "driver/accelgyro_bmi160.h" -#include "driver/led/lm3630a.h" -#include "driver/ppc/sn5s330.h" -#include "driver/tcpm/anx74xx.h" -#include "driver/tcpm/ps8xxx.h" -#include "driver/temp_sensor/sb_tsi.h" -#include "ec_commands.h" #include "extpower.h" #include "gpio.h" -#include "hooks.h" -#include "i2c.h" -#include "keyboard_scan.h" #include "lid_switch.h" -#include "motion_sense.h" #include "power.h" #include "power_button.h" -#include "pwm.h" -#include "pwm_chip.h" -#include "registers.h" #include "switch.h" -#include "system.h" -#include "task.h" -#include "tcpci.h" -#include "temp_sensor.h" -#include "thermistor.h" -#include "usb_mux.h" -#include "usb_pd_tcpm.h" -#include "usbc_ppc.h" -#include "util.h" - -#define CPRINTS(format, args...) cprints(CC_USBCHARGE, format, ## args) -#define CPRINTF(format, args...) cprintf(CC_USBCHARGE, format, ## args) - -#ifdef CONFIG_USB_PD_TCPC_LOW_POWER -static void anx74xx_cable_det_handler(void) -{ - int cable_det = gpio_get_level(GPIO_USB_C0_CABLE_DET); - int reset_n = gpio_get_level(GPIO_USB_C0_PD_RST_L); - - /* - * A cable_det low->high transition was detected. If following the - * debounce time, cable_det is high, and reset_n is low, then ANX3429 is - * currently in standby mode and needs to be woken up. Set the - * TCPC_RESET event which will bring the ANX3429 out of standby - * mode. Setting this event is gated on reset_n being low because the - * ANX3429 will always set cable_det when transitioning to normal mode - * and if in normal mode, then there is no need to trigger a tcpc reset. - */ - if (cable_det && !reset_n) - task_set_event(TASK_ID_PD_C0, PD_EVENT_TCPC_RESET, 0); -} -DECLARE_DEFERRED(anx74xx_cable_det_handler); - -void anx74xx_cable_det_interrupt(enum gpio_signal signal) -{ - /* debounce for 2 msec */ - hook_call_deferred(&anx74xx_cable_det_handler_data, (2 * MSEC)); -} -#endif +#include "usb_charge.h" static void ppc_interrupt(enum gpio_signal signal) { - int port = (signal == GPIO_USB_C0_SWCTL_INT_ODL) ? 0 : 1; - - sn5s330_interrupt(port); + /* TODO */ } #include "gpio_list.h" -/* I2C port map. */ -const struct i2c_port_t i2c_ports[] = { - {"power", I2C_PORT_POWER, 100, GPIO_I2C0_SCL, GPIO_I2C0_SDA}, - {"tcpc0", I2C_PORT_TCPC0, 400, GPIO_I2C1_SCL, GPIO_I2C1_SDA}, - {"tcpc1", I2C_PORT_TCPC1, 400, GPIO_I2C2_SCL, GPIO_I2C2_SDA}, - {"thermal", I2C_PORT_THERMAL, 400, GPIO_I2C3_SCL, GPIO_I2C3_SDA}, - {"kblight", I2C_PORT_KBLIGHT, 100, GPIO_I2C5_SCL, GPIO_I2C5_SDA}, - {"sensor", I2C_PORT_SENSOR, 400, GPIO_I2C7_SCL, GPIO_I2C7_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[] = { - [PWM_CH_KBLIGHT] = { - .channel = 5, - .flags = PWM_CONFIG_DSLEEP, - .freq = 100, - }, - [PWM_CH_LED1_AMBER] = { - .channel = 0, - .flags = (PWM_CONFIG_OPEN_DRAIN | PWM_CONFIG_ACTIVE_LOW - | PWM_CONFIG_DSLEEP), - .freq = 100, - }, - [PWM_CH_LED2_BLUE] = { - .channel = 2, - .flags = (PWM_CONFIG_OPEN_DRAIN | PWM_CONFIG_ACTIVE_LOW - | PWM_CONFIG_DSLEEP), - .freq = 100, - }, -}; -BUILD_ASSERT(ARRAY_SIZE(pwm_channels) == PWM_CH_COUNT); - void board_update_sensor_config_from_sku(void) { /* Enable Gyro interrupts */ gpio_enable_interrupt(GPIO_6AXIS_INT_L); } -void board_overcurrent_event(int port, int is_overcurrented) +int board_is_sourcing_vbus(int port) { - enum gpio_signal signal = (port == 0) ? GPIO_USB_C0_OC_L - : GPIO_USB_C1_OC_L; - /* Note that the levels are inverted because the pin is active low. */ - int lvl = is_overcurrented ? 0 : 1; + /* TODO */ + return 0; +} - gpio_set_level(signal, lvl); +void board_reset_pd_mcu(void) +{ + /* TODO */ +} - CPRINTS("p%d: overcurrent!", port); +uint32_t system_get_sku_id(void) +{ + /* TODO */ + return 0; } -void board_tcpc_init(void) +void usb_charger_set_switches(int port, enum usb_switch setting) { - int port; - - /* Only reset TCPC if not sysjump */ - if (!system_jumped_to_this_image()) - board_reset_pd_mcu(); - - /* Enable PPC interrupts. */ - gpio_enable_interrupt(GPIO_USB_C0_SWCTL_INT_ODL); - gpio_enable_interrupt(GPIO_USB_C1_SWCTL_INT_ODL); - - /* Enable TCPC interrupts. */ - gpio_enable_interrupt(GPIO_USB_C0_PD_INT_ODL); - gpio_enable_interrupt(GPIO_USB_C1_PD_INT_ODL); - -#ifdef CONFIG_USB_PD_TCPC_LOW_POWER - /* Enable CABLE_DET interrupt for ANX3429 wake from standby */ - gpio_enable_interrupt(GPIO_USB_C0_CABLE_DET); -#endif - /* - * Initialize HPD to low; after sysjump SOC needs to see - * HPD pulse to enable video path - */ - for (port = 0; port < CONFIG_USB_PD_PORT_COUNT; port++) { - const struct usb_mux *mux = &usb_muxes[port]; - - mux->hpd_update(port, 0, 0); - } + /* TODO */ } -DECLARE_HOOK(HOOK_INIT, board_tcpc_init, HOOK_PRIO_INIT_I2C + 1); uint16_t tcpc_get_alert_status(void) { - uint16_t status = 0; - - if (!gpio_get_level(GPIO_USB_C0_PD_INT_ODL)) { - if (gpio_get_level(GPIO_USB_C0_PD_RST_L)) - status |= PD_STATUS_TCPC_ALERT_0; - } - - if (!gpio_get_level(GPIO_USB_C1_PD_INT_ODL)) { - if (gpio_get_level(GPIO_USB_C1_PD_RST_L)) - status |= PD_STATUS_TCPC_ALERT_1; - } - - return status; + /* TODO */ + return 0; } -/** - * Power on (or off) a single TCPC. - * minimum on/off delays are included. - * - * @param port Port number of TCPC. - * @param mode 0: power off, 1: power on. - */ -void board_set_tcpc_power_mode(int port, int mode) +void usb_charger_task(void *u) { - if (port != USB_PD_PORT_ANX74XX) - return; - - switch (mode) { - case ANX74XX_NORMAL_MODE: - gpio_set_level(GPIO_EN_USB_C0_TCPC_PWR, 1); - msleep(ANX74XX_PWR_H_RST_H_DELAY_MS); - gpio_set_level(GPIO_USB_C0_PD_RST_L, 1); - break; - case ANX74XX_STANDBY_MODE: - gpio_set_level(GPIO_USB_C0_PD_RST_L, 0); - msleep(ANX74XX_RST_L_PWR_L_DELAY_MS); - gpio_set_level(GPIO_EN_USB_C0_TCPC_PWR, 0); - msleep(ANX74XX_PWR_L_PWR_H_DELAY_MS); - break; - default: - break; - } + /* TODO */ } -void board_reset_pd_mcu(void) +int usb_charger_ramp_allowed(int supplier) { - /* Assert reset to TCPC1 (ps8751) */ - gpio_set_level(GPIO_USB_C1_PD_RST_L, 0); - - /* Assert reset to TCPC0 (anx3429) */ - gpio_set_level(GPIO_USB_C0_PD_RST_L, 0); + /* TODO */ + return 0; +} - /* TCPC1 (ps8751) requires 1ms reset down assertion */ - msleep(MAX(1, ANX74XX_RST_L_PWR_L_DELAY_MS)); +int usb_charger_ramp_max(int supplier, int sup_curr) +{ + /* TODO */ + return 0; +} - /* Deassert reset to TCPC1 */ - gpio_set_level(GPIO_USB_C1_PD_RST_L, 1); - /* Disable TCPC0 power */ - gpio_set_level(GPIO_EN_USB_C0_TCPC_PWR, 0); +void tcpc_alert_event(enum gpio_signal signal) +{ + /* TODO */ +} - /* - * anx3429 requires 10ms reset/power down assertion - */ - msleep(ANX74XX_PWR_L_PWR_H_DELAY_MS); - board_set_tcpc_power_mode(USB_PD_PORT_ANX74XX, 1); +int charger_get_vbus_voltage(int port) +{ + /* TODO */ + return 0; } -static void board_kblight_init(void) +int board_set_active_charge_port(int port) { - /* - * Enable keyboard backlight. This needs to be done here because - * the chip doesn't have power until PP3300_S0 comes up. - */ - gpio_set_level(GPIO_KB_BL_EN, 1); - lm3630a_poweron(); + /* TODO */ + return 0; } -DECLARE_HOOK(HOOK_CHIPSET_RESUME, board_kblight_init, HOOK_PRIO_DEFAULT); diff --git a/board/trembyle/board.h b/board/trembyle/board.h index c7b71e6dd9..d3f80cb8ef 100644 --- a/board/trembyle/board.h +++ b/board/trembyle/board.h @@ -3,7 +3,7 @@ * found in the LICENSE file. */ -/* Zork board configuration */ +/* Trembyle board configuration */ #ifndef __CROS_EC_BOARD_H #define __CROS_EC_BOARD_H @@ -11,39 +11,12 @@ #include "baseboard.h" /* - * By default, enable all console messages excepted HC, ACPI and event: - * The sensor stack is generating a lot of activity. + * Allow dangerous commands. + * TODO: Remove this config before production. */ -#define CC_DEFAULT (CC_ALL & ~(CC_MASK(CC_EVENTS) | CC_MASK(CC_LPC))) -#undef CONFIG_HOSTCMD_DEBUG_MODE -#define CONFIG_HOSTCMD_DEBUG_MODE HCDEBUG_OFF +#define CONFIG_SYSTEM_UNLOCKED -#define CONFIG_MKBP_USE_HOST_EVENT - -/* Work around Zork KSI03 HW bug and rework (b/79758966) */ -#define CONFIG_KEYBOARD_REFRESH_ROW3 -#define CONFIG_KEYBOARD_PWRBTN_ASSERTS_KSI3 - -/* Power and battery LEDs */ -#define CONFIG_LED_COMMON -#define CONFIG_CMD_LEDTEST - -#undef CONFIG_LED_PWM_NEAR_FULL_COLOR -#undef CONFIG_LED_PWM_CHARGE_ERROR_COLOR -#undef CONFIG_LED_PWM_SOC_ON_COLOR -#undef CONFIG_LED_PWM_SOC_SUSPEND_COLOR - -#define CONFIG_LED_PWM_NEAR_FULL_COLOR EC_LED_COLOR_BLUE -#define CONFIG_LED_PWM_CHARGE_ERROR_COLOR EC_LED_COLOR_AMBER -#define CONFIG_LED_PWM_SOC_ON_COLOR EC_LED_COLOR_BLUE -#define CONFIG_LED_PWM_SOC_SUSPEND_COLOR EC_LED_COLOR_BLUE - -#define CONFIG_LED_PWM_COUNT 1 - -#define I2C_PORT_KBLIGHT NPCX_I2C_PORT5_0 - -/* KB backlight driver */ -#define CONFIG_LED_DRIVER_LM3630A +#define CONFIG_MKBP_USE_GPIO /* Motion sensing drivers */ #define CONFIG_ACCELGYRO_BMI160 @@ -58,21 +31,9 @@ #define CONFIG_LID_ANGLE_UPDATE #define CONFIG_LID_ANGLE_SENSOR_BASE BASE_ACCEL #define CONFIG_LID_ANGLE_SENSOR_LID LID_ACCEL -/* - * Slew rate on the PP1800_SENSOR load switch requires a short delay on startup. - */ -#undef CONFIG_MOTION_SENSE_RESUME_DELAY_US -#define CONFIG_MOTION_SENSE_RESUME_DELAY_US (10 * MSEC) #ifndef __ASSEMBLER__ -enum pwm_channel { - PWM_CH_KBLIGHT = 0, - PWM_CH_LED1_AMBER, - PWM_CH_LED2_BLUE, - PWM_CH_COUNT -}; - enum battery_type { BATTERY_PANASONIC, BATTERY_TYPE_COUNT, @@ -80,4 +41,5 @@ enum battery_type { #endif /* !__ASSEMBLER__ */ + #endif /* __CROS_EC_BOARD_H */ diff --git a/board/trembyle/build.mk b/board/trembyle/build.mk index 7508f379d3..4ca0cbd96f 100644 --- a/board/trembyle/build.mk +++ b/board/trembyle/build.mk @@ -8,7 +8,7 @@ CHIP:=npcx CHIP_FAMILY:=npcx7 -CHIP_VARIANT:=npcx7m6f +CHIP_VARIANT:=npcx7m7wc BASEBOARD:=zork board-y=board.o led.o diff --git a/board/trembyle/gpio.inc b/board/trembyle/gpio.inc index a6aaee7b4e..1a21234ac1 100644 --- a/board/trembyle/gpio.inc +++ b/board/trembyle/gpio.inc @@ -8,101 +8,87 @@ /* Declare symbolic names for all the GPIOs that we care about. * Note: Those with interrupt handlers must be declared first. */ -GPIO_INT(USB_C0_PD_INT_ODL, PIN(A, 0), GPIO_INT_FALLING, tcpc_alert_event) -GPIO_INT(USB_C1_PD_INT_ODL, PIN(F, 5), GPIO_INT_FALLING, tcpc_alert_event) -GPIO_INT(USB_C0_SWCTL_INT_ODL, PIN(0, 3), GPIO_INT_FALLING, ppc_interrupt) -GPIO_INT(USB_C1_SWCTL_INT_ODL, PIN(D, 4), GPIO_INT_FALLING, ppc_interrupt) -GPIO_INT(PCH_SLP_S3_L, PIN(A, 6), GPIO_INT_BOTH, power_signal_interrupt) -GPIO_INT(PCH_SLP_S5_L, PIN(A, 3), GPIO_INT_BOTH, power_signal_interrupt) -GPIO_INT(S0_PGOOD, PIN(F, 4), GPIO_INT_BOTH, power_signal_interrupt) -GPIO_INT(S5_PGOOD, PIN(6, 3), GPIO_INT_BOTH | GPIO_PULL_UP, power_signal_interrupt) +GPIO_INT(USB_C0_TCPC_INT_ODL, PIN(3, 4), GPIO_INT_FALLING, tcpc_alert_event) +GPIO_INT(USB_C1_TCPC_INT_ODL, PIN(F, 1), GPIO_INT_FALLING, tcpc_alert_event) +GPIO_INT(USB_C0_PPC_INT_ODL, PIN(6, 3), GPIO_INT_FALLING, ppc_interrupt) +GPIO_INT(USB_C1_PPC_INT_ODL, PIN(D, 4), GPIO_INT_FALLING, ppc_interrupt) +GPIO_INT(PCH_SLP_S3_L, PIN(7, 4), GPIO_INT_BOTH, power_signal_interrupt) +GPIO_INT(PCH_SLP_S5_L, PIN(E, 0), GPIO_INT_BOTH, power_signal_interrupt) +GPIO_INT(S0_PGOOD, PIN(5, 6), GPIO_INT_BOTH, power_signal_interrupt) +GPIO_INT(S5_PGOOD, PIN(3, 7), GPIO_INT_BOTH, power_signal_interrupt) GPIO_INT(POWER_BUTTON_L, PIN(0, 1), GPIO_INT_BOTH, power_button_interrupt) -GPIO_INT(LID_OPEN, PIN(D, 2), GPIO_INT_BOTH | GPIO_HIB_WAKE_HIGH | GPIO_PULL_UP, lid_interrupt) +GPIO_INT(LID_OPEN, PIN(D, 2), GPIO_INT_BOTH | GPIO_HIB_WAKE_HIGH, lid_interrupt) GPIO_INT(AC_PRESENT, PIN(0, 0), GPIO_INT_BOTH | GPIO_HIB_WAKE_HIGH, extpower_interrupt) -GPIO_INT(WP_L, PIN(A, 1), GPIO_INT_BOTH, switch_interrupt) -GPIO_INT(VOLUME_DOWN_L, PIN(7, 0), GPIO_INT_BOTH | GPIO_PULL_UP, button_interrupt) -GPIO_INT(VOLUME_UP_L, PIN(7, 5), GPIO_INT_BOTH | GPIO_PULL_UP, button_interrupt) -GPIO_INT(USB_C0_CABLE_DET, PIN(3, 7), GPIO_INT_RISING, anx74xx_cable_det_interrupt) -GPIO_INT(6AXIS_INT_L, PIN(8, 6), GPIO_INT_FALLING | GPIO_SEL_1P8V, bmi160_interrupt) +GPIO_INT(WP_L, PIN(5, 0), GPIO_INT_BOTH, switch_interrupt) +GPIO_INT(VOLUME_DOWN_L, PIN(A, 6), GPIO_INT_BOTH, button_interrupt) +GPIO_INT(VOLUME_UP_L, PIN(9, 5), GPIO_INT_BOTH, button_interrupt) +GPIO_INT(6AXIS_INT_L, PIN(A, 0), GPIO_INT_FALLING, bmi160_interrupt) -GPIO(EN_PWR_A, PIN(E, 2), GPIO_OUT_LOW) /* Enable Power */ -GPIO(EN_PP1800_SENSOR, PIN(6, 7), GPIO_OUT_LOW) /* Enable Power */ -GPIO(ENABLE_BACKLIGHT_L, PIN(D, 3), GPIO_OUT_HIGH) /* Enable Backlight */ -GPIO(PCH_RSMRST_L, PIN(C, 2), GPIO_OUT_LOW) /* RSMRST# to SOC */ -GPIO(PCH_PWRBTN_L, PIN(C, 1), GPIO_OUT_HIGH) /* Power Button to SOC */ -GPIO(PCH_WAKE_L, PIN(7, 4), GPIO_OUT_HIGH) /* Wake SOC */ -GPIO(SYS_RESET_L, PIN(0, 2), GPIO_ODR_HIGH) /* Cold Reset to SOC */ -GPIO(CCD_MODE_ODL, PIN(E, 3), GPIO_INPUT) /* Case Closed Debug Mode */ -GPIO(ENTERING_RW, PIN(E, 1), GPIO_OUT_LOW) /* EC Entering RW */ -GPIO(EC_BATT_PRES_L, PIN(E, 5), GPIO_INPUT | GPIO_PULL_UP) /* Battery Present */ -GPIO(PCH_SYS_PWROK, PIN(D, 6), GPIO_OUT_LOW) /* Power OK to SOC */ -GPIO(EC_APU_RST, PIN(E, 4), GPIO_INPUT) /* Reset to SOC */ -GPIO(CPU_PROCHOT, PIN(3, 4), GPIO_INPUT | GPIO_SEL_1P8V) /* PROCHOT to SOC */ -GPIO(APU_ALERT_L, PIN(A, 2), GPIO_INPUT) /* Alert to SOC */ -GPIO(3AXIS_INT_L, PIN(5, 0), GPIO_INPUT | GPIO_SEL_1P8V) /* 3 Axis Accel */ -GPIO(KB_BL_EN, PIN(F, 2), GPIO_OUT_LOW) /* Enable KB Backlight */ +/* GPIO_INT_BOTH is required for PSL wake from hibernate, but we don't need an interrupt handler. */ +GPIO(EC_RST_ODL, PIN(0, 2), GPIO_INT_BOTH | GPIO_HIB_WAKE_HIGH) -/* I2C pins - these will be reconfigured for alternate function below */ -GPIO(I2C0_SCL, PIN(B, 5), GPIO_INPUT) /* EC_I2C_POWER_SCL */ -GPIO(I2C0_SDA, PIN(B, 4), GPIO_INPUT) /* EC_I2C_POWER_SDA */ -GPIO(I2C1_SCL, PIN(9, 0), GPIO_INPUT) /* EC_I2C_USB_C0_PD_SCL */ -GPIO(I2C1_SDA, PIN(8, 7), GPIO_INPUT) /* EC_I2C_USB_C0_PD_SDA */ -GPIO(I2C2_SCL, PIN(9, 2), GPIO_INPUT) /* EC_I2C_USB_C1_PD_SCL */ -GPIO(I2C2_SDA, PIN(9, 1), GPIO_INPUT) /* EC_I2C_USB_C1_PD_SDA */ -GPIO(I2C3_SCL, PIN(D, 1), GPIO_INPUT | GPIO_SEL_1P8V) /* APU_SIC */ -GPIO(I2C3_SDA, PIN(D, 0), GPIO_INPUT | GPIO_SEL_1P8V) /* APU_SID */ -GPIO(I2C5_SCL, PIN(3, 3), GPIO_INPUT) /* EC_I2C_EEPROM_SCL and - EC_I2C_KB_BL_SCL */ -GPIO(I2C5_SDA, PIN(3, 6), GPIO_INPUT) /* EC_I2C_EEPROM_SDA and - EC_I2C_KB_BL_SDA */ -GPIO(I2C7_SCL, PIN(B, 3), GPIO_INPUT | GPIO_SEL_1P8V) /* EC_I2C_SENSOR_SCL */ -GPIO(I2C7_SDA, PIN(B, 2), GPIO_INPUT | GPIO_SEL_1P8V) /* EC_I2C_SENSOR_SDA */ +GPIO(3AXIS_INT_L, PIN(9, 6), GPIO_INPUT) /* 3 Axis Accel */ +GPIO(CCD_MODE_ODL, PIN(C, 6), GPIO_INPUT) /* Case Closed Debug Mode */ +GPIO(CPU_PROCHOT, PIN(D, 5), GPIO_INPUT) /* PROCHOT to SOC */ +GPIO(EC_BATT_PRES_L, PIN(4, 1), GPIO_INPUT) /* Battery Present */ +GPIO(EC_INT_L, PIN(A, 3), GPIO_ODR_HIGH) /* Sensor MKBP event to SOC */ +GPIO(EN_PWR_A, PIN(B, 7), GPIO_OUT_LOW) /* Enable Power */ +GPIO(ENABLE_BACKLIGHT_L, PIN(A, 2), GPIO_OUT_HIGH) /* Enable Backlight */ +GPIO(ENTERING_RW, PIN(E, 5), GPIO_OUT_LOW) /* EC Entering RW */ +GPIO(PCH_PWRBTN_L, PIN(8, 6), GPIO_OUT_HIGH) /* Power Button to SOC */ +GPIO(PCH_RSMRST_L, PIN(A, 1), GPIO_OUT_LOW) /* RSMRST# to SOC */ +GPIO(PCH_SYS_PWROK, PIN(7, 5), GPIO_OUT_LOW) /* Power OK to SOC */ +GPIO(PCH_WAKE_L, PIN(0, 3), GPIO_OUT_HIGH) /* Wake SOC */ +GPIO(SYS_RESET_L, PIN(C, 7), GPIO_ODR_HIGH) /* Cold Reset to SOC */ +GPIO(USB_C0_TCPC_RST_L, PIN(E, 1), GPIO_OUT_HIGH) /* C0 TCPC Reset */ +GPIO(USB_C1_TCPC_RST_L, PIN(F, 0), GPIO_OUT_HIGH) /* C1 TCPC Reset */ + +GPIO(LED_FULL_L, PIN(6, 0), GPIO_OUT_HIGH) +GPIO(LED_CHRG_L, PIN(C, 0), GPIO_OUT_HIGH) + +/* IOEX(EN_USB_A0_5V, EXPIN(0, 1, 5), GPIO_OUT_LOW) */ /* Enable A0 5V Charging */ +/* IOEX(EN_USB_A1_5V, EXPIN(1, 1, 6), GPIO_OUT_LOW) */ /* Enable A1 5V Charging */ +/* IOEX(KB_BL_EN, EXPIN(0, 1, 3), GPIO_OUT_LOW) */ /* Enable KB Backlight */ /* - * The NPCX LPC driver configures and controls SCI and SMI, - * so PCH_SCI_ODL [PIN(7, 6)] and PCH_SMI_ODL [PIN(C, 6)] are - * not defined here as GPIOs. + * The NPCX LPC driver configures and controls SCI, so PCH_SCI_ODL [PIN(7, 6)] + * is not defined here as GPIO. */ -GPIO(PCH_SLP_S0_L, PIN(A, 4), GPIO_INPUT) -GPIO(EN_USB_A0_5V, PIN(6, 1), GPIO_OUT_LOW) /* Enable A0 5V Charging */ -GPIO(EN_USB_A1_5V, PIN(C, 0), GPIO_OUT_LOW) /* Enable A1 5V Charging */ -GPIO(EN_USB_C0_TCPC_PWR, PIN(6, 0), GPIO_OUT_LOW) /* Enable C0 TCPC Power */ -GPIO(USB_C0_OC_L, PIN(7, 3), GPIO_OUT_HIGH) /* C0 Over Current */ -GPIO(USB_C1_OC_L, PIN(7, 2), GPIO_OUT_HIGH) /* C1 Over Current */ -GPIO(USB_C0_PD_RST_L, PIN(3, 2), GPIO_OUT_HIGH) /* C0 PD Reset */ -GPIO(USB_C1_PD_RST_L, PIN(D, 5), GPIO_OUT_HIGH) /* C1 PD Reset */ -GPIO(USB_C0_BC12_VBUS_ON_L, PIN(4, 0), GPIO_ODR_HIGH) /* C0 BC1.2 Power */ -GPIO(USB_C1_BC12_VBUS_ON_L, PIN(B, 1), GPIO_ODR_HIGH | GPIO_PULL_UP) /* C1 BC1.2 Power */ -GPIO(USB_C0_BC12_CHG_DET, PIN(6, 2), GPIO_INPUT) /* C0 BC1.2 Detect */ -GPIO(USB_C1_BC12_CHG_DET, PIN(8, 3), GPIO_INPUT | GPIO_PULL_DOWN) /* C1 BC1.2 Detect */ -GPIO(USB_C0_DP_HPD, PIN(9, 5), GPIO_OUT_LOW) /* C0 DP Hotplug Detect */ -GPIO(USB_C1_DP_HPD, PIN(9, 6), GPIO_OUT_LOW) /* C1 DP Hotplug Detect */ +/* I2C pins - these will be reconfigured for alternate function below */ +GPIO(I2C0_SCL, PIN(B, 5), GPIO_INPUT) /* EC_I2C_USB_A0_C0_SCL */ +GPIO(I2C0_SDA, PIN(B, 4), GPIO_INPUT) /* EC_I2C_USB_A0_C0_SDA */ +GPIO(I2C1_SCL, PIN(9, 0), GPIO_INPUT) /* EC_I2C_USB_A1_C1_SCL */ +GPIO(I2C1_SDA, PIN(8, 7), GPIO_INPUT) /* EC_I2C_USB_A1_C1_SDA */ +GPIO(I2C2_SCL, PIN(9, 2), GPIO_INPUT) /* EC_I2C_POWER_CBI_SCL */ +GPIO(I2C2_SDA, PIN(9, 1), GPIO_INPUT) /* EC_I2C_POWER_CBI_SDA */ +GPIO(I2C3_SCL, PIN(D, 1), GPIO_INPUT) /* EC_I2C_USBC_AP_MUX_SCL */ +GPIO(I2C3_SDA, PIN(D, 0), GPIO_INPUT) /* EC_I2C_USBC_AP_MUX_SDA */ +GPIO(I2C4_SCL, PIN(F, 3), GPIO_INPUT) /* FCH_SIC */ +GPIO(I2C4_SDA, PIN(F, 2), GPIO_INPUT) /* FCH_SID */ +GPIO(I2C5_SCL, PIN(3, 3), GPIO_INPUT) /* EC_I2C_SENSOR_SCL */ +GPIO(I2C5_SDA, PIN(3, 6), GPIO_INPUT) /* EC_I2C_SENSOR_SDA */ +GPIO(I2C6_SCL, PIN(E, 4), GPIO_INPUT) /* FCH_I2C_AUDIO_SCL */ +GPIO(I2C6_SDA, PIN(E, 3), GPIO_INPUT) /* FCH_I2C_AUDIO_SDA */ +GPIO(I2C7_SCL, PIN(B, 3), GPIO_INPUT) /* FCH_I2C_HDMI_HUB_3V3_SCL */ +GPIO(I2C7_SDA, PIN(B, 2), GPIO_INPUT) /* FCH_I2C_HDMI_HUB_3V3_SDA */ + +ALTERNATE(PIN_MASK(6, BIT(4) | BIT(5)), 0, MODULE_UART, 0) /* Cr50 requires no pullups. */ + +ALTERNATE(PIN_MASK(B, BIT(4) | BIT(5)), 0, MODULE_I2C, 0) /* I2C0 */ +ALTERNATE(PIN_MASK(9, BIT(0) | BIT(1) | BIT(2)), 0, MODULE_I2C, 0) /* I2C1 SCL / I2C2 */ +ALTERNATE(PIN_MASK(8, BIT(7)), 0, MODULE_I2C, 0) /* I2C1 SDA */ +ALTERNATE(PIN_MASK(D, BIT(0) | BIT(1)), 0, MODULE_I2C, 0) /* I2C3 */ +ALTERNATE(PIN_MASK(F, BIT(2) | BIT(3)), 0, MODULE_I2C, 0) /* I2C4 */ +ALTERNATE(PIN_MASK(3, BIT(3) | BIT(6)), 0, MODULE_I2C, 0) /* I2C5 */ +ALTERNATE(PIN_MASK(E, BIT(3) | BIT(4)), 0, MODULE_I2C, 0) /* I2C6 */ +ALTERNATE(PIN_MASK(B, BIT(2) | BIT(3)), 0, MODULE_I2C, 0) /* I2C7 */ -/* Board ID */ -GPIO(BOARD_VERSION1, PIN(C, 7), GPIO_INPUT) -GPIO(BOARD_VERSION2, PIN(9, 3), GPIO_INPUT) -GPIO(BOARD_VERSION3, PIN(8, 0), GPIO_INPUT) -GPIO(SKU_ID1, PIN(F, 0), GPIO_INPUT) -GPIO(SKU_ID2, PIN(4, 1), GPIO_INPUT) +ALTERNATE(PIN_MASK(4, BIT(2) | BIT(3)), 0, MODULE_ADC, 0) /* ADC2, ADC3 Temp Sensors */ -/* Alternate functions GPIO definitions */ -/* Cr50 requires no pull-ups on UART pins. */ -ALTERNATE(PIN_MASK(6, 0x30), 0, MODULE_UART, 0) /* UART from EC to Servo */ -ALTERNATE(PIN_MASK(B, 0x30), 0, MODULE_I2C, 0) /* I2C0 */ -ALTERNATE(PIN_MASK(9, 0x07), 0, MODULE_I2C, 0) /* I2C1 SCL / I2C2 */ -ALTERNATE(PIN_MASK(8, 0x80), 0, MODULE_I2C, 0) /* I2C1 SDA */ -ALTERNATE(PIN_MASK(D, 0x03), 0, MODULE_I2C, 0) /* I2C3 */ -ALTERNATE(PIN_MASK(3, 0x48), 0, MODULE_I2C, 0) /* I2C5 */ -ALTERNATE(PIN_MASK(B, 0x0C), 0, MODULE_I2C, 0) /* I2C7 */ -ALTERNATE(PIN_MASK(4, 0x30), 0, MODULE_ADC, 0) /* ADC0-1 */ -ALTERNATE(PIN_MASK(4, 0x02), 0, MODULE_ADC, 0) /* ADC4 */ -ALTERNATE(PIN_MASK(F, 0x02), 0, MODULE_ADC, 0) /* ADC8 */ -ALTERNATE(PIN_MASK(F, 0x01), 0, MODULE_ADC, 0) /* ADC9 */ -ALTERNATE(PIN_MASK(B, 0x80), 0, MODULE_PWM, 0) /* KB Backlight */ -ALTERNATE(PIN_MASK(C, 0x18), 0, MODULE_PWM, 0) /* LED 1 & 2 */ +ALTERNATE(PIN_MASK(C, BIT(3)), 0, MODULE_PWM, 0) /* PWM0 LED */ +ALTERNATE(PIN_MASK(8, BIT(0)), 0, MODULE_PWM, 0) /* PWM3 KB Backlight */ -/* Keyboard Pins */ ALTERNATE(PIN_MASK(3, 0x03), 0, MODULE_KEYBOARD_SCAN, GPIO_INPUT) /* KSI_00-01 */ ALTERNATE(PIN_MASK(2, 0xFC), 0, MODULE_KEYBOARD_SCAN, GPIO_INPUT) /* KSI_02-07 */ ALTERNATE(PIN_MASK(2, 0x03), 0, MODULE_KEYBOARD_SCAN, GPIO_ODR_HIGH) /* KSO_00-01 */ @@ -111,5 +97,5 @@ ALTERNATE(PIN_MASK(1, 0x7F), 0, MODULE_KEYBOARD_SCAN, GPIO_ODR_HIGH) /* KSO_03- ALTERNATE(PIN_MASK(0, 0xE0), 0, MODULE_KEYBOARD_SCAN, GPIO_ODR_HIGH) /* KSO_10-12 */ /* Power Switch Logic (PSL) inputs */ -ALTERNATE(PIN_MASK(0, 0x03), 0, MODULE_PMU, 0) /* GPIO00, GPIO01 */ -ALTERNATE(PIN_MASK(D, 0x04), 0, MODULE_PMU, 0) /* GPIOD2 */ +ALTERNATE(PIN_MASK(0, BIT(0) | BIT(1) | BIT(2)), 0, MODULE_PMU, 0) /* AC_PRESENT, POWER_BUTTON_L, EC_RST_ODL */ +ALTERNATE(PIN_MASK(D, BIT(2)), 0, MODULE_PMU, 0) /* LID_OPEN */ diff --git a/board/trembyle/led.c b/board/trembyle/led.c index 8d783c6a87..9f3f7492c0 100644 --- a/board/trembyle/led.c +++ b/board/trembyle/led.c @@ -3,64 +3,68 @@ * found in the LICENSE file. */ -#include "common.h" #include "ec_commands.h" -#include "led_pwm.h" -#include "util.h" +#include "gpio.h" +#include "led_common.h" +#include "led_onoff_states.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); +#define LED_OFF_LVL 1 +#define LED_ON_LVL 0 -/* - * We only have a blue and an amber LED, so setting any other colour results in - * both LEDs being off. - */ -struct pwm_led led_color_map[EC_LED_COLOR_COUNT] = { - /* Amber, Blue */ - [EC_LED_COLOR_RED] = { 0, 0 }, - [EC_LED_COLOR_GREEN] = { 0, 0 }, - [EC_LED_COLOR_BLUE] = { 0, 100 }, - [EC_LED_COLOR_YELLOW] = { 0, 0 }, - [EC_LED_COLOR_WHITE] = { 0, 0 }, - [EC_LED_COLOR_AMBER] = { 100, 0 }, -}; +const int led_charge_lvl_1; +const int led_charge_lvl_2 = 100; -/* One logical LED with amber and blue channels. */ -struct pwm_led pwm_leds[CONFIG_LED_PWM_COUNT] = { - { - PWM_CH_LED1_AMBER, - PWM_CH_LED2_BLUE, - PWM_LED_NO_CHANNEL, - }, +struct led_descriptor led_bat_state_table[LED_NUM_STATES][LED_NUM_PHASES] = { + [STATE_CHARGING_LVL_1] = {{EC_LED_COLOR_GREEN, 2 * LED_ONE_SEC}, + {EC_LED_COLOR_RED, 2 * LED_ONE_SEC} }, + [STATE_CHARGING_LVL_2] = {{EC_LED_COLOR_RED, LED_INDEFINITE} }, + [STATE_CHARGING_FULL_CHARGE] = {{EC_LED_COLOR_GREEN, LED_INDEFINITE} }, + [STATE_DISCHARGE_S0] = {{EC_LED_COLOR_GREEN, LED_INDEFINITE} }, + [STATE_DISCHARGE_S3] = {{EC_LED_COLOR_RED, 1 * LED_ONE_SEC}, + {LED_OFF, 3 * LED_ONE_SEC} }, + [STATE_DISCHARGE_S5] = {{LED_OFF, LED_INDEFINITE} }, + [STATE_BATTERY_ERROR] = {{EC_LED_COLOR_GREEN, 2 * LED_ONE_SEC}, + {EC_LED_COLOR_RED, 2 * LED_ONE_SEC} }, + [STATE_FACTORY_TEST] = {{EC_LED_COLOR_GREEN, LED_INDEFINITE} }, }; +BUILD_ASSERT(ARRAY_SIZE(led_bat_state_table) == LED_NUM_STATES); + +const enum ec_led_id supported_led_ids[] = { EC_LED_ID_BATTERY_LED }; + +const int supported_led_ids_count = ARRAY_SIZE(supported_led_ids); + +void led_set_color_battery(enum ec_led_colors color) +{ + switch (color) { + case EC_LED_COLOR_GREEN: + gpio_set_level(GPIO_LED_FULL_L, LED_ON_LVL); + gpio_set_level(GPIO_LED_CHRG_L, LED_OFF_LVL); + break; + case EC_LED_COLOR_RED: + gpio_set_level(GPIO_LED_FULL_L, LED_OFF_LVL); + gpio_set_level(GPIO_LED_CHRG_L, LED_ON_LVL); + break; + default: /* LED_OFF and other unsupported colors */ + gpio_set_level(GPIO_LED_FULL_L, LED_OFF_LVL); + gpio_set_level(GPIO_LED_CHRG_L, LED_OFF_LVL); + break; + } +} void led_get_brightness_range(enum ec_led_id led_id, uint8_t *brightness_range) { - memset(brightness_range, '\0', - sizeof(*brightness_range) * EC_LED_COLOR_COUNT); - brightness_range[EC_LED_COLOR_AMBER] = 100; - brightness_range[EC_LED_COLOR_BLUE] = 100; + brightness_range[EC_LED_COLOR_GREEN] = 1; + brightness_range[EC_LED_COLOR_RED] = 1; } int led_set_brightness(enum ec_led_id led_id, const uint8_t *brightness) { - enum pwm_led_id pwm_id; - - /* Convert ec_led_id to pwm_led_id. */ - if (led_id == EC_LED_ID_POWER_LED) - pwm_id = PWM_LED0; - else - return EC_ERROR_UNKNOWN; - - if (brightness[EC_LED_COLOR_BLUE]) - set_pwm_led_color(pwm_id, EC_LED_COLOR_BLUE); - else if (brightness[EC_LED_COLOR_AMBER]) - set_pwm_led_color(pwm_id, EC_LED_COLOR_AMBER); + if (brightness[EC_LED_COLOR_GREEN] != 0) + led_set_color_battery(EC_LED_COLOR_GREEN); + else if (brightness[EC_LED_COLOR_RED] != 0) + led_set_color_battery(EC_LED_COLOR_RED); else - /* Otherwise, the "color" is "off". */ - set_pwm_led_color(pwm_id, -1); + led_set_color_battery(LED_OFF); return EC_SUCCESS; } |