@@ -84,18 +84,19 @@ const struct dev_entry devs_ft2232spi[] = {
#define BITMODE_BITBANG_NORMAL 1
#define BITMODE_BITBANG_SPI 2
-/* The variables cs_bits and pindir store the values for the "set data bits low byte" MPSSE command that
+/* The variables cs_bit, cfg and pindir store the values for the "set data bits low byte" MPSSE command that
* sets the initial state and the direction of the I/O pins. The pin offsets are as follows:
* SCK is bit 0.
* DO is bit 1.
* DI is bit 2.
- * CS is bit 3.
+ * CS is at cs_bit. Default is bit 3.
*
* The default values (set below) are used for most devices:
* value: 0x08 CS=high, DI=low, DO=low, SK=low
* dir: 0x0b CS=output, DI=input, DO=output, SK=output
*/
-static uint8_t cs_bits = 0x08;
+static uint8_t cs_bit = 0x08;
+static uint8_t cfg = 0x00;
static uint8_t pindir = 0x0b;
static struct ftdi_context ftdic_context;
@@ -209,10 +210,9 @@ int ft2232_spi_init(void)
ft2232_type = AMONTEC_JTAGKEY_PID;
channel_count = 2;
/* JTAGkey(2) needs to enable its output via Bit4 / GPIOL0
- * value: 0x18 OE=high, CS=high, DI=low, DO=low, SK=low
- * dir: 0x1b OE=output, CS=output, DI=input, DO=output, SK=output */
- cs_bits = 0x18;
- pindir = 0x1b;
+ * value: 0x08 #OE=low, CS=high, DI=low, DO=low, SK=low
+ * dir: 0x1b #OE=output, CS=output, DI=input, DO=output, SK=output */
+ pindir |= 0x10;
} else if (!strcasecmp(arg, "picotap")) {
ft2232_vid = GOEPEL_VID;
ft2232_type = GOEPEL_PICOTAP_PID;
@@ -229,8 +229,7 @@ int ft2232_spi_init(void)
/* In its default configuration it is a jtagkey clone */
ft2232_type = FTDI_FT2232H_PID;
channel_count = 2;
- cs_bits = 0x18;
- pindir = 0x1b;
+ pindir |= 0x10;
} else if (!strcasecmp(arg, "openmoko")) {
ft2232_vid = FIC_VID;
ft2232_type = OPENMOKO_DBGBOARD_PID;
@@ -242,8 +241,7 @@ int ft2232_spi_init(void)
/* arm-usb-ocd(-h) has an output buffer that needs to be enabled by pulling ADBUS4 low.
* value: 0x08 #OE=low, CS=high, DI=low, DO=low, SK=low
* dir: 0x1b #OE=output, CS=output, DI=input, DO=output, SK=output */
- cs_bits = 0x08;
- pindir = 0x1b;
+ pindir |= 0x10;
} else if (!strcasecmp(arg, "arm-usb-tiny")) {
ft2232_vid = OLIMEX_VID;
ft2232_type = OLIMEX_ARM_TINY_PID;
@@ -253,8 +251,7 @@ int ft2232_spi_init(void)
ft2232_type = OLIMEX_ARM_OCD_H_PID;
channel_count = 2;
/* See arm-usb-ocd */
- cs_bits = 0x08;
- pindir = 0x1b;
+ pindir |= 0x10;
} else if (!strcasecmp(arg, "arm-usb-tiny-h")) {
ft2232_vid = OLIMEX_VID;
ft2232_type = OLIMEX_ARM_TINY_H_PID;
@@ -338,8 +335,8 @@ int ft2232_spi_init(void)
return -2;
} else {
unsigned int pin = temp + 4;
- cs_bits |= 1 << pin;
- pindir |= 1 << pin;
+ cs_bit = 1 << pin;
+ pindir = (pindir & ~0x08) | cs_bit;
}
}
free(arg);
@@ -425,7 +422,7 @@ int ft2232_spi_init(void)
msg_pdbg("Set data bits\n");
buf[0] = SET_BITS_LOW;
- buf[1] = cs_bits;
+ buf[1] = cfg | cs_bit;
buf[2] = pindir;
if (send_buf(ftdic, buf, 3)) {
ret = -8;
@@ -480,7 +477,7 @@ static int ft2232_spi_send_command(struct flashctx *flash,
*/
msg_pspew("Assert CS#\n");
buf[i++] = SET_BITS_LOW;
- buf[i++] = 0 & ~cs_bits; /* assertive */
+ buf[i++] = cfg & ~cs_bit;
buf[i++] = pindir;
if (writecnt) {
@@ -521,7 +518,7 @@ static int ft2232_spi_send_command(struct flashctx *flash,
msg_pspew("De-assert CS#\n");
buf[i++] = SET_BITS_LOW;
- buf[i++] = cs_bits;
+ buf[i++] = cfg | cs_bit;
buf[i++] = pindir;
ret = send_buf(ftdic, buf, i);
failed |= ret;
"cs_bit[s]" variable stores the bit location for Chip Select, as implied by the name. A new variable "cfg" is added for static configuration bits, like Output Enables. If outputs are disabled during operation, then the result will depend on the target having proper pull-up resistors, which is not always guaranteed. Signed-off-by: Vicente Bergas <vicencb@gmail.com> --- ft2232_spi.c | 33 +++++++++++++++------------------ 1 file changed, 15 insertions(+), 18 deletions(-)