diff --git a/buspirate_spi.c b/buspirate_spi.c index 72c28b0ad..3a1e41437 100644 --- a/buspirate_spi.c +++ b/buspirate_spi.c @@ -325,6 +325,7 @@ static int buspirate_spi_init(const struct programmer_cfg *cfg) int spispeed = 0x7; int serialspeed_index = -1; int ret = 0; + bool hiz = false; bool pullup = false; bool psu = false; bool aux = true; @@ -370,23 +371,49 @@ static int buspirate_spi_init(const struct programmer_cfg *cfg) tmp = extract_programmer_param_str(cfg, "pullups"); if (tmp) { - if (strcasecmp("on", tmp) == 0) + if (strcasecmp("on", tmp) == 0) { pullup = true; - else if (strcasecmp("off", tmp) == 0) + } else if (strcasecmp("off", tmp) == 0) { ; // ignore - else - msg_perr("Invalid pullups state, not using them.\n"); + } else { + msg_perr("Invalid pullups state. Use on/off.\n"); + free(tmp); + return 1; + } + } + free(tmp); + + tmp = extract_programmer_param_str(cfg, "hiz"); + if (tmp) { + if (strcasecmp("on", tmp) == 0) { + hiz = true; + } else if (strcasecmp("off", tmp) == 0) { + if (pullup) { + msg_perr("Invalid combination: pullups=on & hiz=off at same time is not possible.\n"); + free(tmp); + return 1; + } else { + ; // ignore + } + } else { + msg_perr("Invalid hiz state. Use on/off.\n"); + free(tmp); + return 1; + } } free(tmp); tmp = extract_programmer_param_str(cfg, "psus"); if (tmp) { - if (strcasecmp("on", tmp) == 0) + if (strcasecmp("on", tmp) == 0) { psu = true; - else if (strcasecmp("off", tmp) == 0) + } else if (strcasecmp("off", tmp) == 0) { ; // ignore - else - msg_perr("Invalid psus state, not enabling.\n"); + } else { + msg_perr("Invalid psus state. Use on/off.\n"); + free(tmp); + return 1; + } } free(tmp); @@ -692,9 +719,9 @@ static int buspirate_spi_init(const struct programmer_cfg *cfg) /* Set SPI config: output type, idle, clock edge, sample */ bp_commbuf[0] = 0x80 | 0xa; - if (pullup) { + if (pullup || hiz) { bp_commbuf[0] &= ~(1 << 3); - msg_pdbg("Pull-ups enabled, so using HiZ pin output! (Open-Drain mode)\n"); + msg_pdbg("Pull-ups or HiZ enabled, so using HiZ pin output! (Open-Drain mode)\n"); } ret = buspirate_sendrecv(bp_commbuf, 1, 1); if (ret) diff --git a/doc/classic_cli_manpage.rst b/doc/classic_cli_manpage.rst index 5d6b7ef05..0cd45caae 100644 --- a/doc/classic_cli_manpage.rst +++ b/doc/classic_cli_manpage.rst @@ -772,6 +772,14 @@ where ``state`` can be ``on`` or ``off``. More information about the Bus Pirate pull-up resistors and their purpose is available `in a guide by dangerousprototypes `_. +When working with low-voltage chips, the internal 10k pull-ups of the Bus Pirate might be too high. In such cases, it's necessary to create an external pull-up using lower-value resistors. + +For this, you can use the ``hiz`` parameter. This way, the Bus Pirate will operate as an open drain. Syntax is:: + + flashrom -p buspirate_spi:hiz=state + +where ``state`` can be ``on`` or ``off``. + The state of the Bus Pirate power supply pins is controllable through an optional ``psus`` parameter. Syntax is:: flashrom -p buspirate_spi:psus=state