diff options
author | Vic Yang <victoryang@chromium.org> | 2014-08-27 15:42:25 -0700 |
---|---|---|
committer | chrome-internal-fetch <chrome-internal-fetch@google.com> | 2014-09-02 04:21:07 +0000 |
commit | 31a935f520210e71dc9bddc3ec06911a8af8140a (patch) | |
tree | 73612b185dfed5198401b2a1cd9d46765a74bca5 /board | |
parent | e523cf49b208593eefd76eec0b0d7f0d39bff00a (diff) | |
download | chrome-ec-31a935f520210e71dc9bddc3ec06911a8af8140a.tar.gz |
plankton: Update board configuration to Plankton V2
*** This breaks Plankton V1 support ***
This CL updates GPIO and PD configuration.
BUG=chrome-os-partner:31633
TEST=Build successfully. No board to test.
BRANCH=None
Change-Id: I9bbcde8aed15aa488e659a69dc87978532f33f13
Signed-off-by: Vic Yang <victoryang@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/214823
Reviewed-by: Alec Berg <alecaberg@chromium.org>
Diffstat (limited to 'board')
-rw-r--r-- | board/plankton/board.c | 50 | ||||
-rw-r--r-- | board/plankton/board.h | 4 | ||||
-rw-r--r-- | board/plankton/gpio.inc | 79 | ||||
-rw-r--r-- | board/plankton/usb_pd_config.h | 47 | ||||
-rw-r--r-- | board/plankton/usb_pd_policy.c | 14 |
5 files changed, 109 insertions, 85 deletions
diff --git a/board/plankton/board.c b/board/plankton/board.c index e6649bc57d..db3d51c473 100644 --- a/board/plankton/board.c +++ b/board/plankton/board.c @@ -26,7 +26,9 @@ static enum gpio_signal button_pressed; enum usbc_action { USBC_ACT_5V_TO_DUT, USBC_ACT_12V_TO_DUT, + USBC_ACT_20V_TO_DUT, USBC_ACT_DEVICE, + USBC_ACT_USBDP_TOGGLE, USBC_ACT_USB_EN, USBC_ACT_DP_EN, USBC_ACT_CABLE_FLIP, @@ -45,9 +47,17 @@ static void set_usbc_action(enum usbc_action act) board_set_source_cap(SRC_CAP_12V); pd_set_dual_role(PD_DRP_FORCE_SOURCE); break; + case USBC_ACT_20V_TO_DUT: + board_set_source_cap(SRC_CAP_20V); + pd_set_dual_role(PD_DRP_FORCE_SOURCE); + break; case USBC_ACT_DEVICE: pd_set_dual_role(PD_DRP_FORCE_SINK); break; + case USBC_ACT_USBDP_TOGGLE: + gpio_set_level(GPIO_USBC_SS_USB_MODE, + !gpio_get_level(GPIO_USBC_SS_USB_MODE)); + break; case USBC_ACT_USB_EN: gpio_set_level(GPIO_USBC_SS_USB_MODE, 1); break; @@ -55,14 +65,14 @@ static void set_usbc_action(enum usbc_action act) gpio_set_level(GPIO_USBC_SS_USB_MODE, 0); break; case USBC_ACT_CABLE_FLIP: - gpio_set_level(GPIO_USBC_DP_POLARITY, - !gpio_get_level(GPIO_USBC_DP_POLARITY)); + gpio_set_level(GPIO_USBC_POLARITY, + !gpio_get_level(GPIO_USBC_POLARITY)); break; case USBC_ACT_CABLE_POLARITY0: - gpio_set_level(GPIO_USBC_DP_POLARITY, 0); + gpio_set_level(GPIO_USBC_POLARITY, 0); break; case USBC_ACT_CABLE_POLARITY1: - gpio_set_level(GPIO_USBC_DP_POLARITY, 1); + gpio_set_level(GPIO_USBC_POLARITY, 1); break; default: break; @@ -72,10 +82,6 @@ static void set_usbc_action(enum usbc_action act) /* Handle debounced button press */ static void button_deferred(void) { - /* don't do anything if not in debug mode */ - if (!gpio_get_level(GPIO_DBG_MODE_EN)) - return; - /* bounce ? */ if (gpio_get_level(button_pressed) != 0) return; @@ -87,14 +93,14 @@ static void button_deferred(void) case GPIO_DBG_12V_TO_DUT_L: set_usbc_action(USBC_ACT_12V_TO_DUT); break; + case GPIO_DBG_20V_TO_DUT_L: + set_usbc_action(USBC_ACT_20V_TO_DUT); + break; case GPIO_DBG_CHG_TO_DEV_L: set_usbc_action(USBC_ACT_DEVICE); break; - case GPIO_DBG_USB_EN_L: - set_usbc_action(USBC_ACT_USB_EN); - break; - case GPIO_DBG_DP_EN_L: - set_usbc_action(USBC_ACT_DP_EN); + case GPIO_DBG_USB_TOGGLE_L: + set_usbc_action(USBC_ACT_USBDP_TOGGLE); break; case GPIO_DBG_CABLE_FLIP_L: set_usbc_action(USBC_ACT_CABLE_FLIP); @@ -126,14 +132,15 @@ void vbus_event(enum gpio_signal signal) /* ADC channels */ const struct adc_t adc_channels[] = { /* USB PD CC lines sensing. Converted to mV (3300mV/4096). */ - [ADC_CH_CC1_PD] = {"CC1_PD", 3300, 4096, 0, STM32_AIN(1)}, + [ADC_CH_CC1_PD] = {"CC1_PD", 3300, 4096, 0, STM32_AIN(0)}, + [ADC_CH_CC2_PD] = {"CC2_PD", 3300, 4096, 0, STM32_AIN(4)}, }; BUILD_ASSERT(ARRAY_SIZE(adc_channels) == ADC_CH_COUNT); /* I2C ports */ const struct i2c_port_t i2c_ports[] = { - {"slave", I2C_PORT_SLAVE, 100, - GPIO_SLAVE_I2C_SCL, GPIO_SLAVE_I2C_SDA}, + {"master", I2C_PORT_MASTER, 100, + GPIO_MASTER_I2C_SCL, GPIO_MASTER_I2C_SDA}, }; const unsigned int i2c_ports_used = ARRAY_SIZE(i2c_ports); @@ -143,12 +150,11 @@ static void board_init(void) gpio_enable_interrupt(GPIO_VBUS_WAKE); /* Enable button interrupts. */ + gpio_enable_interrupt(GPIO_DBG_5V_TO_DUT_L); gpio_enable_interrupt(GPIO_DBG_12V_TO_DUT_L); + gpio_enable_interrupt(GPIO_DBG_20V_TO_DUT_L); gpio_enable_interrupt(GPIO_DBG_CHG_TO_DEV_L); - gpio_enable_interrupt(GPIO_DBG_5V_TO_DUT_L); - gpio_enable_interrupt(GPIO_DBG_USB_EN_L); - gpio_enable_interrupt(GPIO_DBG_DP_EN_L); - gpio_enable_interrupt(GPIO_DBG_STATUS_CLEAR_L); + gpio_enable_interrupt(GPIO_DBG_USB_TOGGLE_L); gpio_enable_interrupt(GPIO_DBG_CABLE_FLIP_L); } DECLARE_HOOK(HOOK_INIT, board_init, HOOK_PRIO_DEFAULT); @@ -164,6 +170,8 @@ static int cmd_usbc_action(int argc, char *argv[]) act = USBC_ACT_5V_TO_DUT; else if (!strcasecmp(argv[1], "12v")) act = USBC_ACT_12V_TO_DUT; + else if (!strcasecmp(argv[1], "20v")) + act = USBC_ACT_20V_TO_DUT; else if (!strcasecmp(argv[1], "dev")) act = USBC_ACT_DEVICE; else if (!strcasecmp(argv[1], "usb")) @@ -184,6 +192,6 @@ static int cmd_usbc_action(int argc, char *argv[]) return EC_SUCCESS; } DECLARE_CONSOLE_COMMAND(usbc_action, cmd_usbc_action, - "<5v | 12v | dev | usb | dp | flip | pol0 | pol1>", + "<5v|12v|20v|dev|usb|dp|flip|pol0|pol1>", "Set Plankton type-C port state", NULL); diff --git a/board/plankton/board.h b/board/plankton/board.h index 045fa8b6c8..e5a036e7fe 100644 --- a/board/plankton/board.h +++ b/board/plankton/board.h @@ -29,7 +29,7 @@ #undef CONFIG_TASK_PROFILING /* I2C ports configuration */ -#define I2C_PORT_SLAVE 0 +#define I2C_PORT_MASTER 1 /* * Allow dangerous commands all the time, since we don't have a write protect @@ -48,6 +48,7 @@ /* ADC signal */ enum adc_channel { ADC_CH_CC1_PD = 0, + ADC_CH_CC2_PD, /* Number of ADC channels */ ADC_CH_COUNT }; @@ -55,6 +56,7 @@ enum adc_channel { enum board_src_cap { SRC_CAP_5V = 0, SRC_CAP_12V, + SRC_CAP_20V, }; /* Set USB PD source capability */ diff --git a/board/plankton/gpio.inc b/board/plankton/gpio.inc index 5a1122c292..f1b09fb213 100644 --- a/board/plankton/gpio.inc +++ b/board/plankton/gpio.inc @@ -6,66 +6,61 @@ */ /* Inputs with interrupt handlers are first for efficiency */ -GPIO(VBUS_WAKE, B, 5, GPIO_INT_BOTH, vbus_event) -GPIO(DBG_12V_TO_DUT_L, A, 4, GPIO_INT_FALLING, button_event) -GPIO(DBG_CHG_TO_DEV_L, A, 7, GPIO_INT_FALLING, button_event) -GPIO(DBG_5V_TO_DUT_L, B, 8, GPIO_INT_FALLING, button_event) -GPIO(DBG_MODE_EN, B, 10, GPIO_INT_BOTH, button_event) -GPIO(DBG_USB_EN_L, B, 11, GPIO_INT_FALLING, button_event) -GPIO(DBG_DP_EN_L, B, 12, GPIO_INT_FALLING, button_event) -GPIO(DBG_STATUS_CLEAR_L,C, 13, GPIO_INT_FALLING, button_event) -GPIO(DBG_CABLE_FLIP_L, B, 15, GPIO_INT_FALLING, button_event) +GPIO(VBUS_WAKE, B, 5, GPIO_INT_BOTH, vbus_event) +GPIO(DBG_20V_TO_DUT_L, C, 13, GPIO_INT_FALLING, button_event) +GPIO(DBG_12V_TO_DUT_L, B, 14, GPIO_INT_FALLING, button_event) +GPIO(DBG_CHG_TO_DEV_L, F, 1, GPIO_INT_FALLING, button_event) +GPIO(DBG_5V_TO_DUT_L, B, 8, GPIO_INT_FALLING, button_event) +GPIO(DBG_USB_TOGGLE_L, F, 0, GPIO_INT_FALLING, button_event) +GPIO(DBG_CASE_CLOSE_EN_L, B, 12, GPIO_INT_FALLING, button_event) +GPIO(DBG_CABLE_FLIP_L, B, 15, GPIO_INT_FALLING, button_event) /* PD RX/TX */ -GPIO(USBC_PD_REF, A, 0, GPIO_ANALOG, NULL) -GPIO(USBC_CC1_PD, A, 1, GPIO_ANALOG, NULL) -GPIO(USBC_CC_TX_EN, A, 3, GPIO_OUT_LOW, NULL) -GPIO(USBC_CC_TX_DATA, A, 6, GPIO_OUT_LOW, NULL) +GPIO(USBC_PD_REF, A, 1, GPIO_ANALOG, NULL) +GPIO(USBC_CC1_PD, A, 0, GPIO_ANALOG, NULL) +GPIO(USBC_CC1_TX_EN, A, 3, GPIO_OUT_LOW, NULL) +GPIO(USBC_CC2_PD, A, 4, GPIO_ANALOG, NULL) +GPIO(USBC_CC2_TX_EN, B, 2, GPIO_OUT_LOW, NULL) +GPIO(USBC_CC_TX_DATA, A, 6, GPIO_OUT_LOW, NULL) #if 0 /* Alternate functions */ -GPIO(USBC_TX_CLKOUT, B, 9, GPIO_OUT_LOW, NULL) -GPIO(USBC_TX_CLKIN, A, 5, GPIO_OUT_LOW, NULL) +GPIO(USBC_TX_CLKOUT, B, 9, GPIO_OUT_LOW, NULL) +GPIO(USBC_TX_CLKIN, A, 5, GPIO_OUT_LOW, NULL) #endif /* USB-C Power and muxes control */ -GPIO(USBC_CHARGE_EN, A, 8, GPIO_OUT_HIGH, NULL) -GPIO(USBC_CC_DEVICE_ODL,A, 9, GPIO_OUT_LOW, NULL) -GPIO(USBC_CC_HOST, A, 2, GPIO_INPUT, NULL) -GPIO(USBC_5V_EN, A, 10, GPIO_OUT_LOW, NULL) -GPIO(USBC_12V_EN, C, 14, GPIO_OUT_LOW, NULL) -GPIO(USBC_DP_MODE_L, B, 0, GPIO_OUT_LOW, NULL) -GPIO(USBC_DP_POLARITY, B, 1, GPIO_OUT_HIGH, NULL) -GPIO(USBC_SS_USB_MODE, B, 3, GPIO_OUT_LOW, NULL) -GPIO(USBC_SS_EN_L, B, 4, GPIO_OUT_LOW, NULL) +GPIO(USBC_CHARGE_EN, A, 8, GPIO_OUT_HIGH, NULL) +GPIO(USBC_CC1_DEVICE_ODL, A, 9, GPIO_OUT_LOW, NULL) +GPIO(USBC_CC1_HOST, A, 2, GPIO_INPUT, NULL) +GPIO(USBC_CC2_DEVICE_ODL, B, 7, GPIO_OUT_LOW, NULL) +GPIO(USBC_CC2_HOST, B, 6, GPIO_INPUT, NULL) +GPIO(USBC_POLARITY, B, 1, GPIO_OUT_HIGH, NULL) +GPIO(USBC_SS_USB_MODE, B, 3, GPIO_OUT_LOW, NULL) +GPIO(USBC_SS_EN_L, B, 4, GPIO_OUT_LOW, NULL) +GPIO(USB_CC1_VCONN_EN_L, A, 11, GPIO_OUT_HIGH, NULL) +GPIO(USB_CC2_VCONN_EN_L, A, 12, GPIO_OUT_HIGH, NULL) + +GPIO(VBUS_CHARGER_EN, B, 0, GPIO_OUT_LOW, NULL) +/* VSEL_0/1: 0/0 = 5V, 1/0 = 12V, 1/1 = 20V */ +GPIO(USBC_VSEL_1, A, 10, GPIO_OUT_LOW, NULL) +GPIO(USBC_VSEL_0, C, 14, GPIO_OUT_LOW, NULL) /* Alternate functions */ #if 0 -GPIO(USB_DM, A, 11, GPIO_ANALOG, NULL) -GPIO(USB_DP, A, 12, GPIO_ANALOG, NULL) -GPIO(UART_TX, A, 14, GPIO_OUT_LOW, NULL) -GPIO(UART_RX, A, 15, GPIO_OUT_LOW, NULL) +GPIO(UART_TX, A, 14, GPIO_OUT_LOW, NULL) +GPIO(UART_RX, A, 15, GPIO_OUT_LOW, NULL) #endif /* * I2C pins should be configured as inputs until I2C module is * initialized. This will avoid driving the lines unintentionally. */ -GPIO(SLAVE_I2C_SCL, B, 6, GPIO_INPUT, NULL) -GPIO(SLAVE_I2C_SDA, B, 7, GPIO_INPUT, NULL) - -/* Outputs */ -GPIO(SLAVE_I2C_INT_L, B, 2, GPIO_OUT_HIGH, NULL) -GPIO(RAIDEN_CC1_EN_L, B, 13, GPIO_OUT_LOW, NULL) -GPIO(RAIDEN_CC2_EN_L, B, 14, GPIO_OUT_HIGH, NULL) - -/* Inputs */ -GPIO(SLOT_PLN_A0, C, 15, GPIO_INPUT, NULL) -GPIO(SLOT_PLN_A1, F, 0, GPIO_INPUT, NULL) -GPIO(SLOT_PLN_A2, F, 1, GPIO_INPUT, NULL) +GPIO(MASTER_I2C_SCL, B, 10, GPIO_INPUT, NULL) +GPIO(MASTER_I2C_SDA, B, 11, GPIO_INPUT, NULL) /* Test points */ -GPIO(TP9, A, 13, GPIO_ODR_HIGH, NULL) +GPIO(TP1, A, 13, GPIO_ODR_HIGH, NULL) /* Unimplemented signals which we need to emulate for now */ UNIMPLEMENTED(ENTERING_RW) @@ -74,5 +69,5 @@ UNIMPLEMENTED(WP_L) ALTERNATE(A, 0x0020, 0, MODULE_USB_PD, 0) /* SPI1: SCK(PA5) */ ALTERNATE(B, 0x0200, 2, MODULE_USB_PD, 0) /* TIM17_CH1: (PB9) */ ALTERNATE(A, 0xC000, 1, MODULE_UART, 0) /* USART2: PA14/PA15 */ -ALTERNATE(B, 0x00C0, 1, MODULE_I2C, 0) /* I2C SLAVE:PB6/7 */ +ALTERNATE(B, 0x0C00, 1, MODULE_I2C, 0) /* I2C MASTER:PB10/11 */ diff --git a/board/plankton/usb_pd_config.h b/board/plankton/usb_pd_config.h index e2209a7ad9..71389c13c2 100644 --- a/board/plankton/usb_pd_config.h +++ b/board/plankton/usb_pd_config.h @@ -62,10 +62,10 @@ static inline void spi_enable_clock(int port) /* the pins used for communication need to be hi-speed */ static inline void pd_set_pins_speed(int port) { - /* 40 MHz pin speed on SPI1 PA5/6 */ - STM32_GPIO_OSPEEDR(GPIO_A) |= 0x00003C00; - /* 40 MHz pin speed on TIM17_CH1 (PB9) */ - STM32_GPIO_OSPEEDR(GPIO_B) |= 0x000C0000; + /* 40 MHz pin speed on SPI1 (PA5/6) and CC1_TX_EN (PA3) */ + STM32_GPIO_OSPEEDR(GPIO_A) |= 0x00003CC0; + /* 40 MHz pin speed on TIM17_CH1 (PB9) and CC2_TX_EN (PB2) */ + STM32_GPIO_OSPEEDR(GPIO_B) |= 0x000C0030; } /* Reset SPI peripheral used for TX */ @@ -83,8 +83,9 @@ static inline void pd_tx_enable(int port, int polarity) /* PA6 is SPI1 MISO */ gpio_set_alternate_function(GPIO_A, 0x0040, 0); - /* set the low level reference */ - gpio_set_level(GPIO_USBC_CC_TX_EN, 1); + /* set the polarity */ + gpio_set_level(GPIO_USBC_CC1_TX_EN, !polarity); + gpio_set_level(GPIO_USBC_CC2_TX_EN, polarity); } /* Put the TX driver in Hi-Z state */ @@ -96,7 +97,8 @@ static inline void pd_tx_disable(int port, int polarity) & ~(3 << (2*6))) | (1 << (2*6)); /* put the low level reference in Hi-Z */ - gpio_set_level(GPIO_USBC_CC_TX_EN, 0); + gpio_set_level(GPIO_USBC_CC1_TX_EN, 0); + gpio_set_level(GPIO_USBC_CC2_TX_EN, 0); } /* we know the plug polarity, do the right configuration */ @@ -105,7 +107,9 @@ static inline void pd_select_polarity(int port, int polarity) /* use the right comparator non inverted input for COMP1 */ STM32_COMP_CSR = (STM32_COMP_CSR & ~STM32_COMP_CMP1INSEL_MASK) | STM32_COMP_CMP1EN - | STM32_COMP_CMP1INSEL_INM6; + | (polarity ? + STM32_COMP_CMP1INSEL_INM4 : + STM32_COMP_CMP1INSEL_INM6); } /* Initialize pins used for TX and put them in Hi-Z */ @@ -121,18 +125,27 @@ static inline void pd_set_host_mode(int port, int enable) if (enable) { /* Source mode, disable charging */ gpio_set_level(GPIO_USBC_CHARGE_EN, 0); - /* High Z for no pull-down resistor on CC */ + /* High Z for no pull-down resistor on CC1 */ gpio_set_flags_by_mask(GPIO_A, (1 << 9), GPIO_INPUT); - /* Set pull-up resistor on CC */ + /* Set pull-up resistor on CC1 */ gpio_set_flags_by_mask(GPIO_A, (1 << 2), GPIO_OUT_HIGH); + /* High Z for no pull-down resistor on CC2 */ + gpio_set_flags_by_mask(GPIO_B, (1 << 7), GPIO_INPUT); + /* Set pull-up resistor on CC2 */ + gpio_set_flags_by_mask(GPIO_B, (1 << 6), GPIO_OUT_HIGH); } else { /* Device mode, disable VBUS */ - gpio_set_level(GPIO_USBC_5V_EN, 0); - gpio_set_level(GPIO_USBC_12V_EN, 0); - /* High Z for no pull-up resistor on CC */ + gpio_set_level(GPIO_VBUS_CHARGER_EN, 0); + gpio_set_level(GPIO_USBC_VSEL_0, 0); + gpio_set_level(GPIO_USBC_VSEL_1, 0); + /* High Z for no pull-up resistor on CC1 */ gpio_set_flags_by_mask(GPIO_A, (1 << 2), GPIO_INPUT); - /* Set pull-down resistor on CC. */ + /* Set pull-down resistor on CC1 */ gpio_set_flags_by_mask(GPIO_A, (1 << 9), GPIO_OUT_LOW); + /* High Z for no pull-up resistor on CC2 */ + gpio_set_flags_by_mask(GPIO_B, (1 << 6), GPIO_INPUT); + /* Set pull-down resistor on CC2 */ + gpio_set_flags_by_mask(GPIO_B, (1 << 7), GPIO_OUT_LOW); /* Set charge enable */ gpio_set_level(GPIO_USBC_CHARGE_EN, 1); } @@ -140,8 +153,10 @@ static inline void pd_set_host_mode(int port, int enable) static inline int pd_adc_read(int port, int cc) { - /* Always return CC1 */ - return adc_read_channel(ADC_CH_CC1_PD); + if (cc == 0) + return adc_read_channel(ADC_CH_CC1_PD); + else + return adc_read_channel(ADC_CH_CC2_PD); } static inline int pd_snk_is_vbus_provided(int port) diff --git a/board/plankton/usb_pd_policy.c b/board/plankton/usb_pd_policy.c index c2ac2fd155..a49e81e07b 100644 --- a/board/plankton/usb_pd_policy.c +++ b/board/plankton/usb_pd_policy.c @@ -24,10 +24,12 @@ const uint32_t pd_src_pdo[] = { PDO_FIXED(5000, 500, PDO_FIXED_EXTERNAL), PDO_FIXED(12000, 3000, PDO_FIXED_EXTERNAL), + PDO_FIXED(20000, 3000, PDO_FIXED_EXTERNAL), }; -static const int pd_src_pdo_cnts[2] = { +static const int pd_src_pdo_cnts[3] = { [SRC_CAP_5V] = 1, [SRC_CAP_12V] = 2, + [SRC_CAP_20V] = 3, }; static int pd_src_pdo_idx; @@ -124,8 +126,9 @@ int pd_request_voltage(uint32_t rdo) int pd_set_power_supply_ready(int port) { /* Output the correct voltage */ - gpio_set_level(requested_voltage_idx ? GPIO_USBC_12V_EN : - GPIO_USBC_5V_EN, 1); + gpio_set_level(GPIO_VBUS_CHARGER_EN, 1); + gpio_set_level(GPIO_USBC_VSEL_0, requested_voltage_idx >= 1); + gpio_set_level(GPIO_USBC_VSEL_1, requested_voltage_idx >= 2); return EC_SUCCESS; } @@ -134,8 +137,9 @@ void pd_power_supply_reset(int port) { /* Kill VBUS */ requested_voltage_idx = 0; - gpio_set_level(GPIO_USBC_5V_EN, 0); - gpio_set_level(GPIO_USBC_12V_EN, 0); + gpio_set_level(GPIO_VBUS_CHARGER_EN, 0); + gpio_set_level(GPIO_USBC_VSEL_0, 0); + gpio_set_level(GPIO_USBC_VSEL_1, 0); } int pd_board_checks(void) |