diff options
-rw-r--r-- | ft2232_spi.c | 44 |
1 files changed, 43 insertions, 1 deletions
diff --git a/ft2232_spi.c b/ft2232_spi.c index c963a45b..0d287dff 100644 --- a/ft2232_spi.c +++ b/ft2232_spi.c @@ -367,7 +367,7 @@ int ft2232_spi_init(void) } 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 @@ int ft2232_spi_init(void) } 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)); |