summaryrefslogtreecommitdiff
path: root/board/waddledee
diff options
context:
space:
mode:
authorDiana Z <dzigterman@chromium.org>2020-03-19 12:04:13 -0600
committerCommit Bot <commit-bot@chromium.org>2020-03-24 23:19:25 +0000
commitbb4aee8eaf39ef68da363786771439d3c330c912 (patch)
treea978b2726892686295492a33db9fee3a1d99e21f /board/waddledee
parentdc71caed2ee356da20d308f720dd281fc5826c4b (diff)
downloadchrome-ec-bb4aee8eaf39ef68da363786771439d3c330c912.tar.gz
Waddledee: Complete basic EC tasks
This commit adds tasks to cover PD functionality, charging, and LED behavior. The charger and TCPC functionality are a part of the ITE variant code for now, but may be moved out as OEM boards are determined. BUG=b:146557556 BRANCH=None TEST=make -j buldall Signed-off-by: Diana Z <dzigterman@chromium.org> Change-Id: I50df3caabfae5e3981d7a8b76c0a76332f7d00a1 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2110532 Reviewed-by: Aseda Aboagye <aaboagye@chromium.org>
Diffstat (limited to 'board/waddledee')
-rw-r--r--board/waddledee/board.c85
-rw-r--r--board/waddledee/board.h52
-rw-r--r--board/waddledee/build.mk2
-rw-r--r--board/waddledee/ec.tasklist8
-rw-r--r--board/waddledee/gpio.inc6
-rw-r--r--board/waddledee/led.c73
6 files changed, 179 insertions, 47 deletions
diff --git a/board/waddledee/board.c b/board/waddledee/board.c
index ce9d4a8a6d..d25858c30c 100644
--- a/board/waddledee/board.c
+++ b/board/waddledee/board.c
@@ -8,8 +8,12 @@
#include "button.h"
#include "driver/accel_lis2dh.h"
#include "driver/accelgyro_lsm6dsm.h"
+#include "driver/charger/sm5803.h"
#include "driver/sync.h"
+#include "driver/retimer/tusb544.h"
#include "driver/temp_sensor/thermistor.h"
+#include "driver/tcpm/anx7447.h"
+#include "driver/usb_mux/it5205.h"
#include "gpio.h"
#include "intc.h"
#include "keyboard_scan.h"
@@ -23,19 +27,79 @@
#include "task.h"
#include "temp_sensor.h"
#include "uart.h"
+#include "usb_charge.h"
+#include "usb_mux.h"
+#include "usb_pd.h"
-static void filler_interrupt_handler(enum gpio_signal s)
+#define CPRINTUSB(format, args...) cprints(CC_USBCHARGE, format, ## args)
+
+/* C0 interrupt line shared by BC 1.2 and charger */
+static void usb_c0_interrupt(enum gpio_signal s)
+{
+ task_set_event(TASK_ID_USB_CHG_P0, USB_CHG_EVENT_BC12, 0);
+ sm5803_interrupt(0);
+}
+
+/* C1 interrupt line shared by BC 1.2, TCPC, and charger */
+static void usb_c1_interrupt(enum gpio_signal s)
{
- /* TODO(b/146557556): placeholder for TCPC, charger, fault protector */
+ schedule_deferred_pd_interrupt(1);
+ task_set_event(TASK_ID_USB_CHG_P1, USB_CHG_EVENT_BC12, 0);
+ sm5803_interrupt(1);
+}
+
+static void c0_ccsbu_ovp_interrupt(enum gpio_signal s)
+{
+ cprints(CC_USBPD, "C0: CC OVP, SBU OVP, or thermal event");
+ /*pd_handle_cc_overvoltage(0);*/
}
/* Must come after other header files and interrupt handler declarations */
#include "gpio_list.h"
-int extpower_is_present(void)
+/* USB Retimer */
+const struct usb_mux usbc1_retimer = {
+ .usb_port = 1,
+ .i2c_port = I2C_PORT_SUB_USB_C1,
+ .i2c_addr_flags = TUSB544_I2C_ADDR_FLAGS0,
+ .driver = &tusb544_drv,
+};
+
+/* USB Muxes */
+const struct usb_mux usb_muxes[CONFIG_USB_PD_PORT_MAX_COUNT] = {
+ {
+ .usb_port = 0,
+ .i2c_port = I2C_PORT_USB_C0,
+ .i2c_addr_flags = IT5205_I2C_ADDR1_FLAGS,
+ .driver = &it5205_usb_mux_driver,
+ },
+ {
+ .usb_port = 1,
+ .i2c_port = I2C_PORT_SUB_USB_C1,
+ .i2c_addr_flags = AN7447_TCPC0_I2C_ADDR_FLAGS,
+ .driver = &anx7447_usb_mux_driver,
+ .next_mux = &usbc1_retimer,
+ },
+};
+
+void board_init(void)
{
- /* TODO(b/146651778): retrieve from chargers */
- return 0;
+ int on;
+
+ gpio_enable_interrupt(GPIO_USB_C0_INT_ODL);
+ gpio_enable_interrupt(GPIO_USB_C1_INT_ODL);
+ gpio_enable_interrupt(GPIO_USB_C0_CCSBU_OVP_ODL);
+
+ /* Charger on the MB will be outputting PROCHOT and OD CHG_DET */
+ sm5803_configure_gpio0(CHARGER_PRIMARY, GPIO0_MODE_PROCHOT);
+ sm5803_configure_chg_det_od(CHARGER_PRIMARY, 1);
+
+ /* Charger on the sub-board will be a GPIO */
+ sm5803_configure_gpio0(CHARGER_SECONDARY, GPIO0_MODE_OUTPUT);
+
+ /* Turn on 5V if the system is on, otherwise turn it off */
+ on = chipset_in_state(CHIPSET_STATE_ON | CHIPSET_STATE_ANY_SUSPEND);
+ board_power_5v_enable(on);
}
void board_reset_pd_mcu(void)
@@ -46,6 +110,17 @@ void board_reset_pd_mcu(void)
*/
}
+__override void board_power_5v_enable(int enable)
+{
+ /*
+ * Motherboard has a GPIO to turn on the 5V regulator, but the sub-board
+ * sets it through the charger GPIO.
+ */
+ gpio_set_level(GPIO_EN_PP5000, !!enable);
+ if (sm5803_set_gpio0_level(1, !!enable))
+ CPRINTUSB("Failed to %sable sub rails!", enable ? "en" : "dis");
+}
+
/* PWM channels. Must be in the exactly same order as in enum pwm_channel. */
const struct pwm_t pwm_channels[] = {
[PWM_CH_KBLIGHT] = {
diff --git a/board/waddledee/board.h b/board/waddledee/board.h
index a2fe3ead84..13eb9b64d3 100644
--- a/board/waddledee/board.h
+++ b/board/waddledee/board.h
@@ -12,46 +12,15 @@
#define VARIANT_DEDEDE_EC_IT8320
#include "baseboard.h"
-/* Undef battery, charger, LED, PD functions until charger is in */
-#undef CONFIG_BATTERY_CUT_OFF
-#undef CONFIG_BATTERY_PRESENT_GPIO
-#undef CONFIG_BATTERY_REVIVE_DISCONNECT
-#undef CONFIG_BATTERY_SMART
-#undef CONFIG_CHARGE_MANAGER
-#undef CONFIG_CHARGER
-#undef CONFIG_CHARGER_INPUT_CURRENT
-#undef CONFIG_LED_COMMON
-#undef CONFIG_LED_PWM
-#undef CONFIG_USB_MUX_PI3USB31532
-#undef CONFIG_USBC_SS_MUX
-#undef CONFIG_USBC_SS_MUX_DFP_ONLY
-#undef CONFIG_USBC_VCONN
-#undef CONFIG_USBC_VCONN_SWAP
-#undef CONFIG_USB_CHARGER
-#undef CONFIG_USB_PD_5V_EN_CUSTOM
-#undef CONFIG_TRICKLE_CHARGING
-#undef CONFIG_USB_PD_ALT_MODE
-#undef CONFIG_USB_PD_ALT_MODE_DFP
-#undef CONFIG_USB_PD_DISCHARGE_TCPC
-#undef CONFIG_USB_PD_DP_HPD_GPIO
-#undef CONFIG_USB_PD_DUAL_ROLE
-#undef CONFIG_USB_PD_DUAL_ROLE_AUTO_TOGGLE
-#undef CONFIG_USB_PD_LOGGING
-#undef CONFIG_USB_PD_PORT_MAX_COUNT
-#undef CONFIG_USB_PD_TCPM_MUX
-#undef CONFIG_USB_PD_TCPM_TCPCI
-#undef CONFIG_USB_PD_TRY_SRC
-#undef CONFIG_USB_PD_VBUS_DETECT_TCPC
-#undef CONFIG_USB_PD_VBUS_MEASURE_CHARGER
-#undef CONFIG_USB_PD_DECODE_SOP
-#undef CONFIG_USB_PID
-#undef CONFIG_USB_POWER_DELIVERY
-#undef CONFIG_USB_PD_TCPMV2
-#undef CONFIG_USB_TYPEC_DRP_ACC_TRYSRC
-
/* System unlocked in early development */
#define CONFIG_SYSTEM_UNLOCKED
+/* Battery */
+#define CONFIG_BATTERY_FUEL_GAUGE
+
+/* LED */
+#define CONFIG_LED_PWM_COUNT 1
+
/* Sensors */
#define CONFIG_ACCEL_LIS2DE /* Lid accel */
#define CONFIG_ACCELGYRO_LSM6DSM /* Base accel */
@@ -78,6 +47,13 @@
#define CONFIG_TABLET_MODE_SWITCH
#define CONFIG_GMR_TABLET_MODE
+/* USB Mux and Retimer */
+#define CONFIG_USB_MUX_IT5205 /* C1: ITE Mux */
+#define I2C_PORT_USB_MUX I2C_PORT_USB_C0 /* Required for ITE Mux */
+
+#define CONFIG_USBC_RETIMER_TUSB544 /* C1 Redriver: TUSB544 */
+
+
/* Thermistors */
#define CONFIG_TEMP_SENSOR
#define CONFIG_THERMISTOR
@@ -118,6 +94,8 @@ enum battery_type {
BATTERY_TYPE_COUNT,
};
+int board_is_sourcing_vbus(int port);
+
#endif /* !__ASSEMBLER__ */
#endif /* __CROS_EC_BOARD_H */
diff --git a/board/waddledee/build.mk b/board/waddledee/build.mk
index 382ec57971..0450a2d57f 100644
--- a/board/waddledee/build.mk
+++ b/board/waddledee/build.mk
@@ -11,5 +11,5 @@ CHIP_FAMILY:=it8320
CHIP_VARIANT:=it8320dx
BASEBOARD:=dedede
-board-y=board.o
+board-y=board.o led.o
board-$(CONFIG_BATTERY_SMART)+=battery.o
diff --git a/board/waddledee/ec.tasklist b/board/waddledee/ec.tasklist
index bf1b5b19c3..307c7a82a1 100644
--- a/board/waddledee/ec.tasklist
+++ b/board/waddledee/ec.tasklist
@@ -10,10 +10,16 @@
#define CONFIG_TASK_LIST \
TASK_ALWAYS(HOOKS, hook_task, NULL, VENTI_TASK_STACK_SIZE) \
TASK_ALWAYS(MOTIONSENSE, motion_sense_task, NULL, VENTI_TASK_STACK_SIZE) \
+ TASK_ALWAYS(USB_CHG_P0, usb_charger_task, 0, LARGER_TASK_STACK_SIZE) \
+ TASK_ALWAYS(USB_CHG_P1, usb_charger_task, 1, LARGER_TASK_STACK_SIZE) \
+ TASK_ALWAYS(CHARGER, charger_task, NULL, VENTI_TASK_STACK_SIZE) \
TASK_NOTEST(CHIPSET, chipset_task, NULL, VENTI_TASK_STACK_SIZE) \
TASK_NOTEST(KEYPROTO, keyboard_protocol_task, NULL, TASK_STACK_SIZE) \
TASK_NOTEST(PDCMD, pd_command_task, NULL, TASK_STACK_SIZE) \
TASK_ALWAYS(HOSTCMD, host_command_task, NULL, VENTI_TASK_STACK_SIZE) \
TASK_ALWAYS(CONSOLE, console_task, NULL, VENTI_TASK_STACK_SIZE) \
TASK_ALWAYS(POWERBTN, power_button_task, NULL, VENTI_TASK_STACK_SIZE) \
- TASK_NOTEST(KEYSCAN, keyboard_scan_task, NULL, TASK_STACK_SIZE)
+ TASK_NOTEST(KEYSCAN, keyboard_scan_task, NULL, TASK_STACK_SIZE) \
+ TASK_ALWAYS(PD_C0, pd_task, NULL, VENTI_TASK_STACK_SIZE) \
+ TASK_ALWAYS(PD_C1, pd_task, NULL, VENTI_TASK_STACK_SIZE) \
+ TASK_ALWAYS(PD_INT_C1, pd_interrupt_handler_task, 1, VENTI_TASK_STACK_SIZE)
diff --git a/board/waddledee/gpio.inc b/board/waddledee/gpio.inc
index 6d86813bf9..c1ed840f37 100644
--- a/board/waddledee/gpio.inc
+++ b/board/waddledee/gpio.inc
@@ -29,9 +29,9 @@ GPIO_INT(UART1_RX, PIN(B, 0), GPIO_INT_BOTH, uart_deepsleep_interrupt) /* UART_
#endif
/* USB-C interrupts */
-GPIO_INT(USB_C0_INT_ODL, PIN(K, 0), GPIO_INT_FALLING, filler_interrupt_handler) /* BC12 and charger */
-GPIO_INT(USB_C1_INT_ODL, PIN(B, 5), GPIO_INT_FALLING, filler_interrupt_handler) /* TCPC, charger, BC12 */
-GPIO_INT(USB_C0_CCSBU_OVP_ODL, PIN(K, 6), GPIO_INT_FALLING, filler_interrupt_handler) /* Fault protection */
+GPIO_INT(USB_C0_INT_ODL, PIN(K, 0), GPIO_INT_FALLING | GPIO_PULL_UP, usb_c0_interrupt) /* BC12 and charger */
+GPIO_INT(USB_C1_INT_ODL, PIN(B, 5), GPIO_INT_FALLING | GPIO_PULL_UP, usb_c1_interrupt) /* TCPC, charger, BC12 */
+GPIO_INT(USB_C0_CCSBU_OVP_ODL, PIN(K, 6), GPIO_INT_FALLING | GPIO_PULL_UP, c0_ccsbu_ovp_interrupt) /* Fault protection */
/* Other interrupts */
GPIO_INT(LID_OPEN, PIN(F, 3), GPIO_INT_BOTH, lid_interrupt)
diff --git a/board/waddledee/led.c b/board/waddledee/led.c
new file mode 100644
index 0000000000..f8c34eb078
--- /dev/null
+++ b/board/waddledee/led.c
@@ -0,0 +1,73 @@
+/* Copyright 2020 The Chromium OS Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+/* Waddledee specific PWM LED settings. */
+
+#include "common.h"
+#include "ec_commands.h"
+#include "led_pwm.h"
+#include "pwm.h"
+#include "util.h"
+
+const enum ec_led_id supported_led_ids[] = {
+ EC_LED_ID_POWER_LED,
+};
+const int supported_led_ids_count = ARRAY_SIZE(supported_led_ids);
+
+/*
+ * Board has one physical LED with red, green, and blue
+ */
+struct pwm_led led_color_map[EC_LED_COLOR_COUNT] = {
+ /* Red, Green, Blue */
+ [EC_LED_COLOR_RED] = { 100, 0, 0 },
+ [EC_LED_COLOR_GREEN] = { 0, 100, 0 },
+ [EC_LED_COLOR_BLUE] = { 0, 0, 100 },
+ [EC_LED_COLOR_YELLOW] = { 0, 0, 0 },
+ [EC_LED_COLOR_WHITE] = { 0, 0, 0 },
+ [EC_LED_COLOR_AMBER] = { 0, 0, 0 },
+};
+
+/* One logical LED with red, green, and blue channels. */
+struct pwm_led pwm_leds[CONFIG_LED_PWM_COUNT] = {
+ {
+ .ch0 = PWM_CH_LED_RED,
+ .ch1 = PWM_CH_LED_GREEN,
+ .ch2 = PWM_CH_LED_BLUE,
+ .enable = &pwm_enable,
+ .set_duty = &pwm_set_duty,
+ },
+};
+
+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_RED] = 100;
+ brightness_range[EC_LED_COLOR_GREEN] = 100;
+ brightness_range[EC_LED_COLOR_BLUE] = 100;
+}
+
+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_RED])
+ set_pwm_led_color(pwm_id, EC_LED_COLOR_RED);
+ else if (brightness[EC_LED_COLOR_GREEN])
+ set_pwm_led_color(pwm_id, EC_LED_COLOR_GREEN);
+ else if (brightness[EC_LED_COLOR_BLUE])
+ set_pwm_led_color(pwm_id, EC_LED_COLOR_BLUE);
+ else
+ /* Otherwise, the "color" is "off". */
+ set_pwm_led_color(pwm_id, -1);
+
+ return EC_SUCCESS;
+}