summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMary Ruthven <mruthven@chromium.org>2021-10-12 19:28:18 -0500
committerCommit Bot <commit-bot@chromium.org>2021-10-13 21:01:26 +0000
commit29c152bcf67e09d60d28f519458b7fd7a0e8a1cd (patch)
tree3cee0b187a5827da26a23ea25d300d23982130ae
parent39447a20c6e663d83b8581330378275530b3b2f3 (diff)
downloadchrome-ec-29c152bcf67e09d60d28f519458b7fd7a0e8a1cd.tar.gz
ccdblock: add option to tri-state the EC UART
Block EC UART output and EC COMM with 'ccdblock TRISTATE_EC enable'. This removes the EC UART output, prevents EC-EFS2, and removes the pulldown from the EC RX signal. This is used for flashing the EC with c2d2. It's only available when CCD is enabled. BUG=b:202464674 TEST=manual # Disconnect servo. Verify EC tx is disabled and there's no pull # down after tristating the EC > ccdblock TRISTATE_EC enable CCD ports blocked: EC IGNORE_SERVO WARNING: enabling UART while servo is connected may damage hardware EC_CR50_COMM TRISTATE_EC > pinmux ... 400600c8: DIOB5 0 IN 400600d0: DIOB6 16 IN GPIO0_GPIO15 ... > ccdstate ... State flags: UARTAP USBEC+TX CCD ports blocked: EC EC_CR50_COMM TRISTATE_EC ... # Check UART TX is re-enabled after disabling TRISTATE_EC > ccdblock TRISTATE_EC disable CCD ports blocked: (none) > ccdstate ... State flags: UARTAP+TX UARTEC+TX I2C SPI USBEC+TX CCD ports blocked: (none) ... > pinmux ... 400600c8: DIOB5 78 IN UART2_TX 400600d0: DIOB6 16 IN GPIO0_GPIO15 ... # Connect servo, so cr50 disables the EC UART on it's own. # Verify the pulldown is removed after tristating the EC. > ccdstate ... State flags: UARTAP UARTEC USBEC+TX CCD ports blocked: (none) > pinmux ... 400600c8: DIOB5 0 IN PD 400600d0: DIOB6 16 IN GPIO0_GPIO15 ... > ccdblock TRISTATE_EC enable CCD ports blocked: EC EC_CR50_COMM TRISTATE_EC > ccdstate ... State flags: UARTAP USBEC+TX CCD ports blocked: EC EC_CR50_COMM TRISTATE_EC # Check PD is removed from DIOB5 > pinmux ... 400600c8: DIOB5 0 IN 400600d0: DIOB6 16 IN GPIO0_GPIO15 ... # Check PD is re-enabled after disabling TRISTATE_EC > ccdblock TRISTATE_EC disable CCD ports blocked: (none) > ccdstate ... State flags: UARTAP UARTEC USBEC+TX CCD ports blocked: (none) > pinmux ... 400600c8: DIOB5 0 IN PD 400600d0: DIOB6 16 IN GPIO0_GPIO15 Change-Id: I7bde996be3914bd5d625ad99e418f9bd2c0f41d1 Signed-off-by: Mary Ruthven <mruthven@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3219760 Reviewed-by: Vadim Bendebury <vbendeb@chromium.org>
-rw-r--r--board/cr50/rdd.c36
1 files changed, 30 insertions, 6 deletions
diff --git a/board/cr50/rdd.c b/board/cr50/rdd.c
index 0f6fcc6674..e7727c3ac8 100644
--- a/board/cr50/rdd.c
+++ b/board/cr50/rdd.c
@@ -62,7 +62,13 @@ enum ccd_block_flags {
* This will block EC-CR50-communication. CR50 should not enable EC
* UART.
*/
- CCD_BLOCK_EC_CR50_COMM = BIT(4)
+ CCD_BLOCK_EC_CR50_COMM = BIT(4),
+
+ /*
+ * This will block EC-CR50-communication. CR50 should not enable EC
+ * UART.
+ */
+ CCD_BLOCK_TRISTATE_EC = BIT(5)
};
/* Which UARTs are blocked by console command */
@@ -107,8 +113,13 @@ static void uartn_tx_disconnect(int uart)
} else {
GWRITE(PINMUX, DIOB5_SEL, 0);
- /* Set up the pulldown */
- GWRITE_FIELD(PINMUX, DIOB5_CTL, PD, 1);
+ /*
+ * Set up the pulldown on EC RX unless the EC UART is supposed
+ * to be tri-stated. If it's supposed to be tristated, disable
+ * TX and remove the pull-down from RX.
+ */
+ GWRITE_FIELD(PINMUX, DIOB5_CTL, PD,
+ !(ccd_block & CCD_BLOCK_TRISTATE_EC));
}
}
@@ -452,6 +463,8 @@ static void print_ccd_ports_blocked(void)
}
if (ccd_block & CCD_BLOCK_EC_CR50_COMM)
ccputs(" EC_CR50_COMM");
+ if (ccd_block & CCD_BLOCK_TRISTATE_EC)
+ ccputs(" TRISTATE_EC");
if (!ccd_block)
ccputs(" (none)");
ccputs("\n");
@@ -494,6 +507,10 @@ static int command_ccd_block(int argc, char **argv)
block_flag = CCD_BLOCK_IGNORE_SERVO;
else if (!strcasecmp(argv[1], "EC_CR50_COMM"))
block_flag = CCD_BLOCK_EC_CR50_COMM;
+ else if (!strcasecmp(argv[1], "TRISTATE_EC"))
+ block_flag = (CCD_BLOCK_TRISTATE_EC |
+ CCD_BLOCK_EC_UART |
+ CCD_BLOCK_EC_CR50_COMM);
else
return EC_ERROR_PARAM1;
@@ -507,9 +524,16 @@ static int command_ccd_block(int argc, char **argv)
if (block_flag == CCD_BLOCK_IGNORE_SERVO)
servo_ignore(new_state);
- else if (block_flag == CCD_BLOCK_EC_CR50_COMM)
+ else if (block_flag & CCD_BLOCK_EC_CR50_COMM)
ec_comm_block(new_state);
+ /*
+ * Call uartn_tx_disconnect to make sure the pulldown gets
+ * removed even if the EC uart is already disabled.
+ */
+ if (block_flag & CCD_BLOCK_TRISTATE_EC)
+ uartn_tx_disconnect(UART_EC);
+
/* Update blocked state in deferred function */
ccd_update_state();
}
@@ -519,6 +543,6 @@ static int command_ccd_block(int argc, char **argv)
return EC_SUCCESS;
}
DECLARE_CONSOLE_COMMAND(ccdblock, command_ccd_block,
- "[<AP | EC | SERVO | IGNORE_SERVO | EC_CR50_COMM>"
- " [BOOLEAN]]",
+ "[<AP | EC | SERVO | IGNORE_SERVO | EC_CR50_COMM | "
+ "TRISTATE_EC> [BOOLEAN]]",
"Force CCD ports disabled");