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 | |
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>
-rw-r--r-- | baseboard/zork/baseboard.c | 338 | ||||
-rw-r--r-- | baseboard/zork/baseboard.h | 99 | ||||
-rw-r--r-- | baseboard/zork/usb_pd_policy.c | 38 | ||||
-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 |
8 files changed, 272 insertions, 747 deletions
diff --git a/baseboard/zork/baseboard.c b/baseboard/zork/baseboard.c index 9d2158195b..bedb37e0c4 100644 --- a/baseboard/zork/baseboard.c +++ b/baseboard/zork/baseboard.c @@ -18,9 +18,6 @@ #include "driver/accel_kionix.h" #include "driver/accel_kx022.h" #include "driver/accelgyro_bmi160.h" -#include "driver/bc12/max14637.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" @@ -33,6 +30,8 @@ #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" @@ -46,31 +45,20 @@ #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) - const enum gpio_signal hibernate_wake_pins[] = { GPIO_LID_OPEN, GPIO_AC_PRESENT, GPIO_POWER_BUTTON_L, + GPIO_EC_RST_ODL, }; const int hibernate_wake_pins_used = ARRAY_SIZE(hibernate_wake_pins); const struct adc_t adc_channels[] = { [ADC_TEMP_SENSOR_CHARGER] = { - "CHARGER", NPCX_ADC_CH0, ADC_MAX_VOLT, ADC_READ_MAX+1, 0 + "CHARGER", NPCX_ADC_CH2, ADC_MAX_VOLT, ADC_READ_MAX+1, 0 }, [ADC_TEMP_SENSOR_SOC] = { - "SOC", NPCX_ADC_CH1, ADC_MAX_VOLT, ADC_READ_MAX+1, 0 - }, - [ADC_VBUS] = { - "VBUS", NPCX_ADC_CH8, ADC_MAX_VOLT*10, ADC_READ_MAX+1, 0 - }, - [ADC_SKU_ID1] = { - "SKU1", NPCX_ADC_CH9, ADC_MAX_VOLT, ADC_READ_MAX+1, 0 - }, - [ADC_SKU_ID2] = { - "SKU2", NPCX_ADC_CH4, ADC_MAX_VOLT, ADC_READ_MAX+1, 0 + "SOC", NPCX_ADC_CH3, ADC_MAX_VOLT, ADC_READ_MAX+1, 0 }, }; BUILD_ASSERT(ARRAY_SIZE(adc_channels) == ADC_CH_COUNT); @@ -84,201 +72,83 @@ const struct power_signal_info power_signal_list[] = { }; BUILD_ASSERT(ARRAY_SIZE(power_signal_list) == POWER_SIGNAL_COUNT); +/* I2C port map. */ +const struct i2c_port_t i2c_ports[] = { + {"tcpc0", I2C_PORT_TCPC0, 400, GPIO_I2C0_SCL, GPIO_I2C0_SDA}, + {"tcpc1", I2C_PORT_TCPC1, 400, GPIO_I2C1_SCL, GPIO_I2C1_SDA}, + {"power", I2C_PORT_BATTERY, 100, GPIO_I2C2_SCL, GPIO_I2C2_SDA}, + {"mux", I2C_PORT_MUX, 400, GPIO_I2C3_SCL, GPIO_I2C3_SDA}, + {"thermal", I2C_PORT_THERMAL, 400, GPIO_I2C4_SCL, GPIO_I2C4_SDA}, + {"sensor", I2C_PORT_SENSOR, 400, GPIO_I2C5_SCL, GPIO_I2C5_SDA}, + {"ap_audio", I2C_PORT_AP_AUDIO, 400, GPIO_I2C6_SCL, GPIO_I2C6_SDA}, + {"ap_hdmi", I2C_PORT_AP_HDMI, 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 = 3, + .flags = PWM_CONFIG_DSLEEP, + .freq = 100, + }, +}; +BUILD_ASSERT(ARRAY_SIZE(pwm_channels) == PWM_CH_COUNT); + +#define USB_PD_PORT_TCPC_0 0 +#define USB_PD_PORT_TCPC_1 1 + const struct tcpc_config_t tcpc_config[CONFIG_USB_PD_PORT_COUNT] = { - [USB_PD_PORT_ANX74XX] = { + [USB_PD_PORT_TCPC_0] = { .bus_type = EC_BUS_TYPE_I2C, .i2c_info = { .port = I2C_PORT_TCPC0, - .addr_flags = ANX74XX_I2C_ADDR1_FLAGS, + .addr_flags = PS8751_I2C_ADDR1_FLAGS, }, - .drv = &anx74xx_tcpm_drv, - /* Alert is active-low, open-drain */ - .flags = TCPC_FLAGS_ALERT_OD, + .drv = &ps8xxx_tcpm_drv, + .flags = TCPC_FLAGS_RESET_ACTIVE_HIGH, }, - [USB_PD_PORT_PS8751] = { + [USB_PD_PORT_TCPC_1] = { .bus_type = EC_BUS_TYPE_I2C, .i2c_info = { .port = I2C_PORT_TCPC1, .addr_flags = PS8751_I2C_ADDR1_FLAGS, }, .drv = &ps8xxx_tcpm_drv, - /* Alert is active-low, push-pull */ - .flags = 0, }, }; -void tcpc_alert_event(enum gpio_signal signal) -{ - int port = -1; - - switch (signal) { - case GPIO_USB_C0_PD_INT_ODL: - port = 0; - break; - case GPIO_USB_C1_PD_INT_ODL: - port = 1; - break; - default: - return; - } - - schedule_deferred_pd_interrupt(port); -} - struct usb_mux usb_muxes[CONFIG_USB_PD_PORT_COUNT] = { - [USB_PD_PORT_ANX74XX] = { - .driver = &anx74xx_tcpm_usb_mux_driver, - .hpd_update = &anx74xx_tcpc_update_hpd_status, + [USB_PD_PORT_TCPC_0] = { + .driver = &tcpci_tcpm_usb_mux_driver, + .hpd_update = &ps8xxx_tcpc_update_hpd_status, }, - [USB_PD_PORT_PS8751] = { + [USB_PD_PORT_TCPC_1] = { .driver = &tcpci_tcpm_usb_mux_driver, .hpd_update = &ps8xxx_tcpc_update_hpd_status, - /* TODO(ecgh): ps8751_tune_mux needed? */ } }; -struct ppc_config_t ppc_chips[] = { - { - .i2c_port = I2C_PORT_TCPC0, - .i2c_addr_flags = SN5S330_ADDR0_FLAGS, - .drv = &sn5s330_drv - }, - { - .i2c_port = I2C_PORT_TCPC1, - .i2c_addr_flags = SN5S330_ADDR0_FLAGS, - .drv = &sn5s330_drv - }, -}; -unsigned int ppc_cnt = ARRAY_SIZE(ppc_chips); - -int ppc_get_alert_status(int port) -{ - if (port == 0) - return gpio_get_level(GPIO_USB_C0_SWCTL_INT_ODL) == 0; - else - return gpio_get_level(GPIO_USB_C1_SWCTL_INT_ODL) == 0; -} - - -/* BC 1.2 chip Configuration */ -const struct max14637_config_t max14637_config[CONFIG_USB_PD_PORT_COUNT] = { - [USB_PD_PORT_ANX74XX] = { - .chip_enable_pin = GPIO_USB_C0_BC12_VBUS_ON_L, - .chg_det_pin = GPIO_USB_C0_BC12_CHG_DET, - .flags = MAX14637_FLAGS_ENABLE_ACTIVE_LOW, - }, - [USB_PD_PORT_PS8751] = { - .chip_enable_pin = GPIO_USB_C1_BC12_VBUS_ON_L, - .chg_det_pin = GPIO_USB_C1_BC12_CHG_DET, - .flags = MAX14637_FLAGS_ENABLE_ACTIVE_LOW, - }, -}; - -const int usb_port_enable[USB_PORT_COUNT] = { - GPIO_EN_USB_A0_5V, - GPIO_EN_USB_A1_5V, -}; - static void baseboard_chipset_suspend(void) { - /* - * Turn off display backlight. This ensures that the backlight stays off - * in S3, no matter what the AP has it set to. The AP also controls it. - * This is here more for legacy reasons. - */ + /* Disable display and keyboard backlights. */ gpio_set_level(GPIO_ENABLE_BACKLIGHT_L, 1); + /* TODO gpio_set_level(GPIO_KB_BL_EN, 0); */ } DECLARE_HOOK(HOOK_CHIPSET_SUSPEND, baseboard_chipset_suspend, HOOK_PRIO_DEFAULT); static void baseboard_chipset_resume(void) { - /* Allow display backlight to turn on. See above backlight comment */ + /* Enable display and keyboard backlights. */ gpio_set_level(GPIO_ENABLE_BACKLIGHT_L, 0); - + /* TODO gpio_set_level(GPIO_KB_BL_EN, 1); */ } DECLARE_HOOK(HOOK_CHIPSET_RESUME, baseboard_chipset_resume, HOOK_PRIO_DEFAULT); -static void baseboard_chipset_startup(void) -{ - /* - * Enable sensor power (lid accel, gyro) in S3 for calculating the lid - * angle (needed on convertibles to disable resume from keyboard in - * tablet mode). - */ - gpio_set_level(GPIO_EN_PP1800_SENSOR, 1); -} -DECLARE_HOOK(HOOK_CHIPSET_STARTUP, baseboard_chipset_startup, - HOOK_PRIO_DEFAULT); - -static void baseboard_chipset_shutdown(void) -{ - /* Disable sensor power (lid accel, gyro) in S5. */ - gpio_set_level(GPIO_EN_PP1800_SENSOR, 0); -} -DECLARE_HOOK(HOOK_CHIPSET_SHUTDOWN, baseboard_chipset_shutdown, - HOOK_PRIO_DEFAULT); - -int board_is_i2c_port_powered(int port) -{ - if (port != I2C_PORT_SENSOR) - return 1; - - /* Sensor power (lid accel, gyro) is off in S5 (and G3). */ - return chipset_in_state(CHIPSET_STATE_ANY_OFF) ? 0 : 1; -} - -int board_set_active_charge_port(int port) -{ - int i; - - CPRINTS("New chg p%d", port); - - if (port == CHARGE_PORT_NONE) { - /* Disable all ports. */ - for (i = 0; i < ppc_cnt; i++) { - if (ppc_vbus_sink_enable(i, 0)) - CPRINTS("p%d: sink disable failed.", i); - } - - return EC_SUCCESS; - } - - /* Check if the port is sourcing VBUS. */ - if (ppc_is_sourcing_vbus(port)) { - CPRINTF("Skip enable p%d", port); - return EC_ERROR_INVAL; - } - - /* - * Turn off the other ports' sink path FETs, before enabling the - * requested charge port. - */ - for (i = 0; i < ppc_cnt; i++) { - if (i == port) - continue; - - if (ppc_vbus_sink_enable(i, 0)) - CPRINTS("p%d: sink disable failed.", i); - } - - /* Enable requested charge port. */ - if (ppc_vbus_sink_enable(port, 1)) { - CPRINTS("p%d: sink enable failed."); - return EC_ERROR_UNKNOWN; - } - - return EC_SUCCESS; -} - void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, int charge_mv) { - /* - * Limit the input current to 95% negotiated limit, - * to account for the charger chip margin. - */ - charge_ma = charge_ma * 95 / 100; charge_set_input_current_limit(MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT), charge_mv); @@ -463,111 +333,26 @@ void lid_angle_peripheral_enable(int enable) } #endif -static const int sku_thresh_mv[] = { - /* Vin = 3.3V, Ideal voltage, R2 values listed below */ - /* R1 = 51.1 kOhm */ - 200, /* 124 mV, 2.0 Kohm */ - 366, /* 278 mV, 4.7 Kohm */ - 550, /* 456 mV, 8.2 Kohm */ - 752, /* 644 mV, 12.4 Kohm */ - 927, /* 860 mV, 18.0 Kohm */ - 1073, /* 993 mV, 22.0 Kohm */ - 1235, /* 1152 mV, 27.4 Kohm */ - 1386, /* 1318 mV, 34.0 Kohm */ - 1552, /* 1453 mV, 40.2 Kohm */ - /* R1 = 10.0 kOhm */ - 1739, /* 1650 mV, 10.0 Kohm */ - 1976, /* 1827 mV, 12.4 Kohm */ - 2197, /* 2121 mV, 18.0 Kohm */ - 2344, /* 2269 mV, 22.0 Kohm */ - 2484, /* 2418 mV, 27.4 Kohm */ - 2636, /* 2550 mV, 34.0 Kohm */ - 2823, /* 2721 mV, 47.0 Kohm */ -}; - -static int board_read_sku_adc(enum adc_channel chan) -{ - int mv; - int i; - - mv = adc_read_channel(chan); - - if (mv == ADC_READ_ERROR) - return -1; - - for (i = 0; i < ARRAY_SIZE(sku_thresh_mv); i++) - if (mv < sku_thresh_mv[i]) - return i; - - return -1; -} - -static uint32_t board_get_adc_sku_id(void) -{ - int sku_id1, sku_id2; - - sku_id1 = board_read_sku_adc(ADC_SKU_ID1); - sku_id2 = board_read_sku_adc(ADC_SKU_ID2); - - if (sku_id1 < 0 || sku_id2 < 0) - return 0; - - return (sku_id2 << 4) | sku_id1; -} - -static int board_get_gpio_board_version(void) +static void cbi_init(void) { - return - (!!gpio_get_level(GPIO_BOARD_VERSION1) << 0) | - (!!gpio_get_level(GPIO_BOARD_VERSION2) << 1) | - (!!gpio_get_level(GPIO_BOARD_VERSION3) << 2); -} + uint32_t board_version = 0; + uint32_t sku_id = 0; + uint32_t val; -static int board_version; -static uint32_t sku_id; + if (cbi_get_board_version(&val) == EC_SUCCESS) + board_version = val; + ccprints("Board Version: %d (0x%x)", board_version, board_version); -static void cbi_init(void) -{ - board_version = board_get_gpio_board_version(); - sku_id = board_get_adc_sku_id(); - - /* - * Use board version and SKU ID from CBI EEPROM if the board supports - * it and the SKU ID set via resistors + ADC is not valid. - */ -#ifdef CONFIG_CROS_BOARD_INFO - if (sku_id == 0 || sku_id == 0xff) { - uint32_t val; - - if (cbi_get_board_version(&val) == EC_SUCCESS) - board_version = val; - if (cbi_get_sku_id(&val) == EC_SUCCESS) - sku_id = val; - } -#endif + if (cbi_get_sku_id(&val) == EC_SUCCESS) + sku_id = val; + ccprints("SKU: %d (0x%x)", sku_id, sku_id); #ifdef HAS_TASK_MOTIONSENSE board_update_sensor_config_from_sku(); #endif - ccprints("Board Version: %d (0x%x)", board_version, board_version); - ccprints("SKU: %d (0x%x)", sku_id, sku_id); -} -/* - * Reading the SKU resistors requires the ADC module. If we are using EEPROM - * then we also need the I2C module, but that is available before ADC. - */ -DECLARE_HOOK(HOOK_INIT, cbi_init, HOOK_PRIO_INIT_ADC + 1); - -uint32_t system_get_sku_id(void) -{ - return sku_id; -} - -int board_get_version(void) -{ - return board_version; } +DECLARE_HOOK(HOOK_INIT, cbi_init, HOOK_PRIO_INIT_I2C + 1); /* * Returns 1 for boards that are convertible into tablet mode, and zero for @@ -593,16 +378,3 @@ uint32_t board_override_feature_flags1(uint32_t flags1) { return flags1; } - -void board_hibernate(void) -{ - /* - * Some versions of some boards keep the port 0 PPC powered on while - * the EC hibernates (so Closed Case Debugging keeps working). - * Make sure the source FET is off and turn on the sink FET, so that - * plugging in AC will wake the EC. This matches the dead-battery - * behavior of the powered off PPC. - */ - ppc_vbus_source_enable(0, 0); - ppc_vbus_sink_enable(0, 1); -} diff --git a/baseboard/zork/baseboard.h b/baseboard/zork/baseboard.h index 4028ebca62..f12f94e90b 100644 --- a/baseboard/zork/baseboard.h +++ b/baseboard/zork/baseboard.h @@ -3,18 +3,27 @@ * found in the LICENSE file. */ -/* Zork family-specific configuration */ +/* Zork baseboard configuration */ #ifndef __CROS_EC_BASEBOARD_H #define __CROS_EC_BASEBOARD_H +/* + * By default, enable all console messages excepted HC, ACPI and event: + * The sensor stack is generating a lot of activity. + */ +#define CC_DEFAULT (CC_ALL & ~(CC_MASK(CC_EVENTS) | CC_MASK(CC_LPC))) +#define CONFIG_SUPPRESSED_HOST_COMMANDS \ + EC_CMD_CONSOLE_SNAPSHOT, EC_CMD_CONSOLE_READ, EC_CMD_USB_PD_DISCOVERY,\ + EC_CMD_USB_PD_POWER_INFO, EC_CMD_PD_GET_LOG_ENTRY, \ + EC_CMD_MOTION_SENSE_CMD, EC_CMD_GET_NEXT_EVENT + /* NPCX7 config */ #define NPCX_UART_MODULE2 1 /* GPIO64/65 are used as UART pins. */ #define NPCX_TACH_SEL2 0 /* No tach. */ #define NPCX7_PWM1_SEL 0 /* GPIO C2 is not used as PWM1. */ /* Internal SPI flash on NPCX7 */ -/* Flash is 1MB but reserve half for future use. */ #define CONFIG_FLASH_SIZE (512 * 1024) #define CONFIG_SPI_FLASH_REGS #define CONFIG_SPI_FLASH_W25Q80 /* Internal SPI flash type. */ @@ -29,14 +38,12 @@ #define CONFIG_ADC #define CONFIG_BACKLIGHT_LID #define CONFIG_BACKLIGHT_LID_ACTIVE_LOW -#define CONFIG_BOARD_VERSION_CUSTOM #define CONFIG_CMD_AP_RESET_LOG #define CONFIG_EC_FEATURE_BOARD_OVERRIDE #define CONFIG_HIBERNATE_PSL #define CONFIG_HOSTCMD_ESPI #define CONFIG_HOSTCMD_SKUID #define CONFIG_I2C -#define CONFIG_I2C_BUS_MAY_BE_UNPOWERED #define CONFIG_I2C_MASTER #define CONFIG_LOW_POWER_IDLE #define CONFIG_LOW_POWER_S0 @@ -48,41 +55,31 @@ #define CONFIG_VBOOT_HASH #define CONFIG_VOLUME_BUTTONS +/* CBI EEPROM for board version and SKU ID */ +#define CONFIG_CROS_BOARD_INFO +#define CONFIG_BOARD_VERSION_CBI +#define I2C_ADDR_EEPROM_FLAGS 0x50 +#define CONFIG_CRC8 + #define CONFIG_BATTERY_CUT_OFF #define CONFIG_BATTERY_FUEL_GAUGE #define CONFIG_BATTERY_PRESENT_GPIO GPIO_EC_BATT_PRES_L #define CONFIG_BATTERY_REVIVE_DISCONNECT #define CONFIG_BATTERY_SMART -#define CONFIG_BC12_DETECT_MAX14637 #define CONFIG_CHARGER #define CONFIG_CHARGER_V2 #define CONFIG_CHARGE_MANAGER #define CONFIG_CHARGER_DISCHARGE_ON_AC - -/* - * This limit impairs compatibility with BC1.2 chargers that are not actually - * capable of supplying 500 mA of current. When the charger is paralleled with - * the battery, raising this limit allows the power system to draw more current - * from the charger during startup. This improves compatibility with system - * batteries that may become excessively imbalanced after extended periods of - * rest. - * - * See also b/111214767 - */ #define CONFIG_CHARGER_INPUT_CURRENT 512 #define CONFIG_CHARGER_ISL9241 #define CONFIG_CHARGER_SENSE_RESISTOR 10 #define CONFIG_CHARGER_SENSE_RESISTOR_AC 20 #define CONFIG_CHARGE_RAMP_HW -#define CONFIG_USB_CHARGER #define CONFIG_CHIPSET_STONEY #define CONFIG_CHIPSET_RESET_HOOK -/* - * ACOK from ISL9238 sometimes has a negative pulse after connecting - * USB-C power. We want to ignore it. b/77455171 - */ + #undef CONFIG_EXTPOWER_DEBOUNCE_MS #define CONFIG_EXTPOWER_DEBOUNCE_MS 200 #define CONFIG_EXTPOWER_GPIO @@ -91,6 +88,10 @@ #define CONFIG_POWER_BUTTON #define CONFIG_POWER_BUTTON_X86 +#define CONFIG_LED_COMMON +#define CONFIG_CMD_LEDTEST +#define CONFIG_LED_ONOFF_STATES + /* * On power-on, H1 releases the EC from reset but then quickly asserts and * releases the reset a second time. This means the EC sees 2 resets: @@ -104,33 +105,16 @@ #define CONFIG_KEYBOARD_COL2_INVERTED #define CONFIG_KEYBOARD_PROTOCOL_8042 +#define CONFIG_USB_CHARGER #define CONFIG_USB_POWER_DELIVERY -#define CONFIG_CMD_PD_CONTROL -#define CONFIG_USB_PD_ALT_MODE -#define CONFIG_USB_PD_ALT_MODE_DFP -#define CONFIG_USB_PD_COMM_LOCKED -#define CONFIG_USB_PD_DISCHARGE_PPC #define CONFIG_USB_PD_DUAL_ROLE -#define CONFIG_USB_PD_DUAL_ROLE_AUTO_TOGGLE -#define CONFIG_USB_PD_LOGGING #define CONFIG_USB_PD_PORT_COUNT 2 -#define CONFIG_USB_PD_TCPC_LOW_POWER -#define CONFIG_USB_PD_TCPM_ANX3429 +#define CONFIG_USB_PD_VBUS_MEASURE_CHARGER +#define CONFIG_USB_PD_5V_EN_CUSTOM #define CONFIG_USB_PD_TCPM_MUX #define CONFIG_USB_PD_TCPM_PS8751 #define CONFIG_USB_PD_TCPM_TCPCI -#define CONFIG_USB_PD_TRY_SRC -#define CONFIG_USB_PD_VBUS_DETECT_PPC -#define CONFIG_USBC_PPC_SN5S330 -#define CONFIG_USBC_PPC_DEDICATED_INT #define CONFIG_USBC_SS_MUX -#define CONFIG_USBC_SS_MUX_DFP_ONLY -#define CONFIG_USBC_VCONN -#define CONFIG_USBC_VCONN_SWAP - -/* USB-A config */ -#define CONFIG_USB_PORT_POWER_DUMB -#define USB_PORT_COUNT 2 #define PD_POWER_SUPPLY_TURN_ON_DELAY 30000 /* us */ #define PD_POWER_SUPPLY_TURN_OFF_DELAY 30000 /* us */ @@ -159,15 +143,17 @@ #undef CONFIG_PORT80_HISTORY_LEN #define CONFIG_PORT80_HISTORY_LEN 256 -#define I2C_PORT_BATTERY I2C_PORT_POWER -#define I2C_PORT_CHARGER I2C_PORT_POWER -#define I2C_PORT_POWER NPCX_I2C_PORT0_0 -#define I2C_PORT_TCPC0 NPCX_I2C_PORT1_0 -#define I2C_PORT_TCPC1 NPCX_I2C_PORT2_0 -#define I2C_PORT_THERMAL NPCX_I2C_PORT3_0 -#define I2C_PORT_SENSOR NPCX_I2C_PORT7_0 -/* Accelerometer and Gyroscope are the same device. */ -#define I2C_PORT_ACCEL I2C_PORT_SENSOR +#define I2C_PORT_TCPC0 NPCX_I2C_PORT0_0 +#define I2C_PORT_TCPC1 NPCX_I2C_PORT1_0 +#define I2C_PORT_BATTERY NPCX_I2C_PORT2_0 +#define I2C_PORT_CHARGER NPCX_I2C_PORT2_0 +#define I2C_PORT_EEPROM NPCX_I2C_PORT2_0 +#define I2C_PORT_MUX NPCX_I2C_PORT3_0 +#define I2C_PORT_THERMAL NPCX_I2C_PORT4_1 +#define I2C_PORT_SENSOR NPCX_I2C_PORT5_0 +#define I2C_PORT_ACCEL NPCX_I2C_PORT5_0 +#define I2C_PORT_AP_AUDIO NPCX_I2C_PORT6_1 +#define I2C_PORT_AP_HDMI NPCX_I2C_PORT7_0 /* Sensors */ #define CONFIG_MKBP_EVENT @@ -182,9 +168,6 @@ /* Depends on how fast the AP boots and typical ODRs. */ #define CONFIG_ACCEL_FIFO_THRES (CONFIG_ACCEL_FIFO / 3) -#define USB_PD_PORT_ANX74XX 0 -#define USB_PD_PORT_PS8751 1 - #ifndef __ASSEMBLER__ #include "gpio_signal.h" @@ -194,9 +177,6 @@ enum adc_channel { ADC_TEMP_SENSOR_CHARGER, ADC_TEMP_SENSOR_SOC, - ADC_VBUS, - ADC_SKU_ID1, - ADC_SKU_ID2, ADC_CH_COUNT }; @@ -215,6 +195,11 @@ enum temp_sensor_id { TEMP_SENSOR_COUNT }; +enum pwm_channel { + PWM_CH_KBLIGHT = 0, + PWM_CH_COUNT +}; + enum sensor_id { LID_ACCEL, BASE_ACCEL, @@ -247,9 +232,9 @@ void board_reset_pd_mcu(void); /* Common definition for the USB PD interrupt handlers. */ void tcpc_alert_event(enum gpio_signal signal); -int board_get_version(void); int board_is_convertible(void); void board_update_sensor_config_from_sku(void); +int board_is_sourcing_vbus(int port); #endif /* !__ASSEMBLER__ */ diff --git a/baseboard/zork/usb_pd_policy.c b/baseboard/zork/usb_pd_policy.c index 89be349157..a2ac33700c 100644 --- a/baseboard/zork/usb_pd_policy.c +++ b/baseboard/zork/usb_pd_policy.c @@ -111,40 +111,12 @@ int pd_is_valid_input_voltage(int mv) void pd_power_supply_reset(int port) { - int prev_en; - - prev_en = ppc_is_sourcing_vbus(port); - - /* Disable VBUS. */ - ppc_vbus_source_enable(port, 0); - - /* Enable discharge if we were previously sourcing 5V */ - if (prev_en) - pd_set_vbus_discharge(port, 1); - - /* Notify host of power info change. */ - pd_send_host_event(PD_EVENT_POWER_CHANGE); + /* TODO */ } int pd_set_power_supply_ready(int port) { - int rv; - - /* Disable charging. */ - rv = ppc_vbus_sink_enable(port, 0); - if (rv) - return rv; - - pd_set_vbus_discharge(port, 0); - - /* Provide Vbus. */ - rv = ppc_vbus_source_enable(port, 1); - if (rv) - return rv; - - /* Notify host of power info change. */ - pd_send_host_event(PD_EVENT_POWER_CHANGE); - + /* TODO */ return EC_SUCCESS; } @@ -155,12 +127,14 @@ void pd_transition_voltage(int idx) int pd_snk_is_vbus_provided(int port) { - return ppc_is_vbus_present(port); + /* TODO */ + return 0; } int board_vbus_source_enabled(int port) { - return ppc_is_sourcing_vbus(port); + /* TODO */ + return 0; } /* ----------------- Vendor Defined Messages ------------------ */ 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; } |