[coreboot-gerrit] Patch set updated for coreboot: 064f1cf usbdebug: Add FTDI FT232H support
Kyösti Mälkki (kyosti.malkki@gmail.com)
gerrit at coreboot.org
Sun May 3 09:29:30 CEST 2015
Kyösti Mälkki (kyosti.malkki at gmail.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/10063
-gerrit
commit 064f1cff354ec2bd8b76c27c51d467c64d1da1fd
Author: Kyösti Mälkki <kyosti.malkki at gmail.com>
Date: Sun May 3 06:27:11 2015 +0300
usbdebug: Add FTDI FT232H support
Tested with gizmosphere/gizmo1 Explorer add-on board, which
exposes the following device:
0x0403 Future Technology Devices International, Ltd
0x6014 FT232H Single HS USB-UART/FIFO IC
For now UART is hard-coded to 115200, 8n1, no flow-control.
Change-Id: I4081f84f7700751ccbf079e7fcbb1467aa71d872
Signed-off-by: Nico Huber <nico.h at gmx.de>
Signed-off-by: Kyösti Mälkki <kyosti.malkki at gmail.com>
---
src/drivers/usb/Kconfig | 6 ++++
src/drivers/usb/gadget.c | 87 ++++++++++++++++++++++++++++++++++++++++++++++--
2 files changed, 91 insertions(+), 2 deletions(-)
diff --git a/src/drivers/usb/Kconfig b/src/drivers/usb/Kconfig
index b0baa42..c5c1ec7 100644
--- a/src/drivers/usb/Kconfig
+++ b/src/drivers/usb/Kconfig
@@ -89,6 +89,12 @@ config USBDEBUG_DONGLE_BEAGLEBONE_BLACK
help
Use this with BeagleBone Black.
+config USBDEBUG_DONGLE_FTDI_FT232H
+ bool "FTDI FT232H UART"
+ help
+ Use this with FT232H usb-to-uart. Configuration is hard-coded
+ to use 115200, 8n1, no flow control.
+
endchoice
config USBDEBUG_OPTIONAL_HUB_PORT
diff --git a/src/drivers/usb/gadget.c b/src/drivers/usb/gadget.c
index 5dd7993..7f88149 100644
--- a/src/drivers/usb/gadget.c
+++ b/src/drivers/usb/gadget.c
@@ -224,6 +224,85 @@ small_write:
return 0;
}
+/* FTDI FT232H UART programming. */
+#define FTDI_SIO_SET_FLOW_CTRL_REQUEST 0x02
+#define FTDI_SIO_SET_BAUDRATE_REQUEST 0x03
+#define FTDI_SIO_SET_DATA_REQUEST 0x04
+#define FTDI_SIO_SET_BITMODE_REQUEST 0x0b
+
+static int probe_for_ftdi(struct ehci_dbg_port *ehci_debug, struct dbgp_pipe *pipe)
+{
+ int ret;
+ u8 devnum = 0;
+ u8 uart_if = 1; /* FTDI_INTERFACE_A 1 */
+
+ /* Move the device to 127 if it isn't already there */
+ ret = dbgp_control_msg(ehci_debug, devnum,
+ USB_DIR_OUT | USB_TYPE_STANDARD | USB_RECIP_DEVICE,
+ USB_REQ_SET_ADDRESS, USB_DEBUG_DEVNUM, 0, NULL, 0);
+ if (ret < 0) {
+ dprintk(BIOS_INFO, "Could not move attached device to %d.\n",
+ USB_DEBUG_DEVNUM);
+ return -2;
+ }
+ devnum = USB_DEBUG_DEVNUM;
+ dprintk(BIOS_INFO, "EHCI debug device renamed to %d.\n", devnum);
+
+ /* Send Set Configure request to device. */
+ ret = dbgp_control_msg(ehci_debug, devnum,
+ USB_DIR_OUT | USB_TYPE_STANDARD | USB_RECIP_DEVICE,
+ USB_REQ_SET_CONFIGURATION, 1, 0, NULL, 0);
+ if (ret < 0) {
+ dprintk(BIOS_INFO, "FTDI set configuration failed.\n");
+ return -2;
+ }
+
+ ret = dbgp_control_msg(ehci_debug, devnum,
+ USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_OUT,
+ FTDI_SIO_SET_BITMODE_REQUEST, 0, uart_if, NULL, 0);
+ if (ret < 0) {
+ dprintk(BIOS_INFO, "FTDI SET_BITMODE failed.\n");
+ return -3;
+ }
+ ret = dbgp_control_msg(ehci_debug, devnum,
+ USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_OUT,
+ FTDI_SIO_SET_BAUDRATE_REQUEST,
+ 0xc068, 0x0200 | uart_if, NULL, 0);
+ if (ret < 0) {
+ dprintk(BIOS_INFO, "FTDI SET_BAUDRATE failed.\n");
+ return -3;
+ }
+ ret = dbgp_control_msg(ehci_debug, devnum,
+ USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_OUT,
+ FTDI_SIO_SET_DATA_REQUEST,
+ 0x0008, uart_if, NULL, 0);
+ if (ret < 0) {
+ dprintk(BIOS_INFO, "FTDI SET_DATA failed.\n");
+ return -3;
+ }
+ ret = dbgp_control_msg(ehci_debug, devnum,
+ USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_OUT,
+ FTDI_SIO_SET_FLOW_CTRL_REQUEST,
+ 0x0000, uart_if, NULL, 0);
+ if (ret < 0) {
+ dprintk(BIOS_INFO, "FTDI SET_FLOW_CTRL failed.\n");
+ return -3;
+ }
+
+ pipe[DBGP_CONSOLE_EPOUT].endpoint = 0x02;
+ pipe[DBGP_CONSOLE_EPIN].endpoint = 0x81;
+
+ ack_set_configuration(pipe, devnum, 1000);
+
+ /* Perform a small write. */
+ ret = dbgp_bulk_write_x(&pipe[DBGP_CONSOLE_EPOUT], "USB\r\n", 5);
+ if (ret < 0) {
+ dprintk(BIOS_INFO, "dbgp_bulk_write failed: %d\n", ret);
+ return -4;
+ }
+ dprintk(BIOS_INFO, "Test write done\n");
+ return 0;
+}
int dbgp_probe_gadget(struct ehci_dbg_port *ehci_debug, struct dbgp_pipe *pipe)
{
@@ -238,9 +317,13 @@ int dbgp_probe_gadget(struct ehci_dbg_port *ehci_debug, struct dbgp_pipe *pipe)
}
}
- ret = probe_for_debug_descriptor(ehci_debug, pipe);
+ if (IS_ENABLED(CONFIG_USBDEBUG_DONGLE_FTDI_FT232H)) {
+ ret = probe_for_ftdi(ehci_debug, pipe);
+ } else {
+ ret = probe_for_debug_descriptor(ehci_debug, pipe);
+ }
if (ret < 0) {
- dprintk(BIOS_INFO, "Could not enable gadget using Debug Descriptor.\n");
+ dprintk(BIOS_INFO, "Could not enable debug dongle.\n");
return ret;
}
More information about the coreboot-gerrit
mailing list