summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEdward Hill <ecgh@chromium.org>2019-07-26 11:06:41 -0600
committerCommit Bot <commit-bot@chromium.org>2019-07-29 23:37:25 +0000
commit234c5298c8369e18eac135b50fc3dec61afe510e (patch)
tree84a4140ebd5225ea236259d02f2c55fa85206777
parente7417e0a9e2c4ea3fee8dad3ab6db063a2a15bc4 (diff)
downloadchrome-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.c338
-rw-r--r--baseboard/zork/baseboard.h99
-rw-r--r--baseboard/zork/usb_pd_policy.c38
-rw-r--r--board/trembyle/board.c240
-rw-r--r--board/trembyle/board.h50
-rw-r--r--board/trembyle/build.mk2
-rw-r--r--board/trembyle/gpio.inc158
-rw-r--r--board/trembyle/led.c94
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;
}