diff options
author | Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net> | 2009-07-01 00:02:23 +0000 |
---|---|---|
committer | Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net> | 2009-07-01 00:02:23 +0000 |
commit | d82ac75907e8b3cc28c9d001b763e492ec7438d8 (patch) | |
tree | 7976f18e7aa76f8a7e2f04e09e8a989bec3a1d9b | |
parent | f29e0ffb17b8d184cbf1b19caa198da7cfc38519 (diff) | |
download | flashrom-d82ac75907e8b3cc28c9d001b763e492ec7438d8.zip flashrom-d82ac75907e8b3cc28c9d001b763e492ec7438d8.tar.gz |
ft2232_spi: Allow runtime selection of FT2232H vs FT4232H and interface A vs
B. Tested-by: Jakob Bornecrantz <wallbraker@gmail.com>
Corresponding to flashrom svn r638.
Signed-off-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net>
Acked-by: Jakob Bornecrantz <wallbraker@gmail.com>
-rw-r--r-- | flash.h | 3 | ||||
-rw-r--r-- | flashrom.8 | 17 | ||||
-rw-r--r-- | flashrom.c | 10 | ||||
-rw-r--r-- | ft2232_spi.c | 45 |
4 files changed, 66 insertions, 9 deletions
@@ -368,6 +368,9 @@ uint8_t satasii_chip_readb(const chipaddr addr); extern struct pcidev_status satas_sii[]; /* ft2232_spi.c */ +#define FTDI_FT2232H 0x6010 +#define FTDI_FT4232H 0x6011 +extern char *ft2232spi_param; int ft2232_spi_init(void); int ft2232_spi_command(unsigned int writecnt, unsigned int readcnt, const unsigned char *writearr, unsigned char *readarr); int ft2232_spi_read(struct flashchip *flash, uint8_t *buf, int start, int len); @@ -183,6 +183,23 @@ Example: Currently the following programmers support this mechanism: .BR nic3com , .BR satasii . +.sp +The ft2232spi has an optional parameter specifying the controller type and +interface/port it should support. For that you have to use the +.B "flashrom -p ft2232spi=model,port=interface" +syntax where +.B model +can be any of +.B 2232H 4232H +and +.B interface +can be any of +.B A +.BR B . +The default model is +.B 4232H +and the default interface is +.BR B . .TP .B "\-h, \-\-help" Show a help text and exit. @@ -649,10 +649,12 @@ int main(int argc, char *argv[]) programmer = PROGRAMMER_IT87SPI; } else if (strncmp(optarg, "ft2232spi", 9) == 0) { programmer = PROGRAMMER_FT2232SPI; - } else if (strncmp(optarg, "serprog", 7) == 0) { - programmer = PROGRAMMER_SERPROG; - if (optarg[7] == '=') - serprog_param = strdup(optarg + 8); + if (optarg[9] == '=') + ft2232spi_param = strdup(optarg + 10); + } else if (strncmp(optarg, "serprog", 7) == 0) { + programmer = PROGRAMMER_SERPROG; + if (optarg[7] == '=') + serprog_param = strdup(optarg + 8); } else { printf("Error: Unknown programmer.\n"); exit(1); diff --git a/ft2232_spi.c b/ft2232_spi.c index 36b8969..d8ca743 100644 --- a/ft2232_spi.c +++ b/ft2232_spi.c @@ -22,9 +22,12 @@ #include <stdint.h> #include <string.h> #include <stdlib.h> +#include <ctype.h> #include "flash.h" #include "spi.h" +char *ft2232spi_param = NULL; + #if FT2232_SPI_SUPPORT == 1 #include <ftdi.h> @@ -71,15 +74,47 @@ int ft2232_spi_init(void) struct ftdi_context *ftdic = &ftdic_context; unsigned char buf[512]; unsigned char port_val = 0; - + char *portpos = NULL; + int ft2232_type = FTDI_FT4232H; + enum ftdi_interface ft2232_interface = INTERFACE_B; if (ftdi_init(ftdic) < 0) { fprintf(stderr, "ftdi_init failed\n"); return EXIT_FAILURE; } - // f = ftdi_usb_open(ftdic, 0x0403, 0x6010); // FT2232 - f = ftdi_usb_open(ftdic, 0x0403, 0x6011); // FT4232 + if (ft2232spi_param && !strlen(ft2232spi_param)) { + free(ft2232spi_param); + ft2232spi_param = NULL; + } + if (ft2232spi_param) { + if (strstr(ft2232spi_param, "2232")) + ft2232_type = FTDI_FT2232H; + if (strstr(ft2232spi_param, "4232")) + ft2232_type = FTDI_FT4232H; + portpos = strstr(ft2232spi_param, "port="); + if (portpos) { + portpos += 5; + switch (toupper(*portpos)) { + case 'A': + ft2232_interface = INTERFACE_A; + break; + case 'B': + ft2232_interface = INTERFACE_B; + break; + default: + fprintf(stderr, "Invalid interface specified, " + "using default.\n"); + } + } + free(ft2232spi_param); + } + printf_debug("Using device type %s ", + (ft2232_type == FTDI_FT2232H) ? "2232H" : "4232H"); + printf_debug("interface %s\n", + (ft2232_interface == INTERFACE_A) ? "A" : "B"); + + f = ftdi_usb_open(ftdic, 0x0403, ft2232_type); if (f < 0 && f != -5) { fprintf(stderr, "Unable to open ftdi device: %d (%s)\n", f, @@ -87,8 +122,8 @@ int ft2232_spi_init(void) exit(-1); } - if (ftdi_set_interface(ftdic, INTERFACE_B) < 0) { - fprintf(stderr, "Unable to select FT2232 channel B: %s\n", + if (ftdi_set_interface(ftdic, ft2232_interface) < 0) { + fprintf(stderr, "Unable to select interface: %s\n", ftdic->error_str); } |