Edward O'Callaghan submitted this change.

View Change

Approvals: build bot (Jenkins): Verified Xiang Wang: Looks good to me, approved Angel Pons: Looks good to me, approved Edward O'Callaghan: Looks good to me, approved
ft2232_spi.c: Generalize GPIOL pin control

Adds a new arg "gpiol" to allow the four FT2232 GPIOL pins to be set to
any combination of high, low or high-impedance.

The existing arg "csgpiol", is intended to function as an additional
"cs" signal, allowing pins to be set high but not low. This patch
preserves the csgpiol arg for backward compatibility. In the event that
both arguments are specified, gpiol is used.

Signed-off-by: Alan Green <avg@google.com>
Change-Id: I1f2b3b968577e62e3c5b11bcdf4afe2de6eb84ab
Reviewed-on: https://review.coreboot.org/c/flashrom/+/49637
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Xiang Wang <merle@hardenedlinux.org>
Reviewed-by: Edward O'Callaghan <quasisec@chromium.org>
Reviewed-by: Angel Pons <th3fanbus@gmail.com>
---
M ft2232_spi.c
1 file changed, 43 insertions(+), 1 deletion(-)

diff --git a/ft2232_spi.c b/ft2232_spi.c
index c963a45..0d287df 100644
--- a/ft2232_spi.c
+++ b/ft2232_spi.c
@@ -367,7 +367,7 @@
}
free(arg);

- /* Allows setting multiple GPIOL states, for example: csgpiol=012 */
+ /* Allows setting multiple GPIOL pins to high, for example: csgpiol=012 */
arg = extract_programmer_param("csgpiol");
if (arg) {
unsigned int ngpios = strlen(arg);
@@ -388,6 +388,48 @@
}
free(arg);

+ /* Allows setting GPIOL pins high, low or input (high-z) */
+ arg = extract_programmer_param("gpiol");
+ if (arg) {
+ int ok = 0;
+ if (strlen(arg) == 4) {
+ ok = 1;
+ for (int i = 0; i < 4; i++) {
+ unsigned int pin = i + 4;
+ switch (toupper(arg[i])) {
+ case 'H':
+ cs_bits |= 1 << pin;
+ pindir |= 1 << pin;
+ break;
+ case 'L':
+ cs_bits &= ~(1 << pin);
+ pindir |= 1 << pin;
+ break;
+ case 'Z':
+ pindir &= ~(1 << pin);
+ break;
+ case 'X':
+ break;
+ default:
+ ok = 0;
+ }
+ }
+ }
+ if (!ok) {
+ msg_perr("Error: Invalid GPIOLs specified: \"%s\".\n"
+ "Valid values are 4 character strings of H, L, Z and X.\n"
+ " H - Set GPIOL output high\n"
+ " L - Set GPIOL output low\n"
+ " Z - Set GPIOL as input (high impedance)\n"
+ " X - Leave as programmer default\n"
+ "Example: gpiol=LZXH drives GPIOL 0 low, and GPIOL 3 high, sets GPIOL 1\n"
+ "to an input and leaves GPIOL 2 set according to the programmer type.\n", arg);
+ free(arg);
+ return -2;
+ }
+ }
+ free(arg);
+
msg_pdbg("Using device type %s %s ",
get_ft2232_vendorname(ft2232_vid, ft2232_type),
get_ft2232_devicename(ft2232_vid, ft2232_type));

To view, visit change 49637. To unsubscribe, or for help writing mail filters, visit settings.

Gerrit-Project: flashrom
Gerrit-Branch: master
Gerrit-Change-Id: I1f2b3b968577e62e3c5b11bcdf4afe2de6eb84ab
Gerrit-Change-Number: 49637
Gerrit-PatchSet: 11
Gerrit-Owner: Alan Green <avg@google.com>
Gerrit-Reviewer: Angel Pons <th3fanbus@gmail.com>
Gerrit-Reviewer: Edward O'Callaghan <quasisec@chromium.org>
Gerrit-Reviewer: Paul Menzel <paulepanter@users.sourceforge.net>
Gerrit-Reviewer: Xiang Wang <merle@hardenedlinux.org>
Gerrit-Reviewer: build bot (Jenkins) <no-reply@coreboot.org>
Gerrit-MessageType: merged