Author: hailfinger Date: 2009-07-01 02:02:23 +0200 (Wed, 01 Jul 2009) New Revision: 638
Modified: trunk/flash.h trunk/flashrom.8 trunk/flashrom.c trunk/ft2232_spi.c Log: ft2232_spi: Allow runtime selection of FT2232H vs. FT4232H and interface A vs. B.
Signed-off-by: Carl-Daniel Hailfinger c-d.hailfinger.devel.2006@gmx.net Tested-by: Jakob Bornecrantz wallbraker@gmail.com Acked-by: Jakob Bornecrantz wallbraker@gmail.com
Modified: trunk/flash.h =================================================================== --- trunk/flash.h 2009-06-30 12:41:00 UTC (rev 637) +++ trunk/flash.h 2009-07-01 00:02:23 UTC (rev 638) @@ -368,6 +368,9 @@ 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);
Modified: trunk/flashrom.8 =================================================================== --- trunk/flashrom.8 2009-06-30 12:41:00 UTC (rev 637) +++ trunk/flashrom.8 2009-07-01 00:02:23 UTC (rev 638) @@ -183,6 +183,23 @@ 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.
Modified: trunk/flashrom.c =================================================================== --- trunk/flashrom.c 2009-06-30 12:41:00 UTC (rev 637) +++ trunk/flashrom.c 2009-07-01 00:02:23 UTC (rev 638) @@ -649,10 +649,12 @@ 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);
Modified: trunk/ft2232_spi.c =================================================================== --- trunk/ft2232_spi.c 2009-06-30 12:41:00 UTC (rev 637) +++ trunk/ft2232_spi.c 2009-07-01 00:02:23 UTC (rev 638) @@ -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,24 +74,56 @@ 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, ftdi_get_error_string(ftdic)); 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); }