On 27.06.2009 13:43, Jakob Bornecrantz wrote:
These are the changes I had to do the flashrom to get my in circuit programer working. Not much as you can see.
Alternative patch which allows runtime selection of FT2232H/FT4232H and interface A/B.
Signed-off-by: Carl-Daniel Hailfinger c-d.hailfinger.devel.2006@gmx.net
Index: flashrom-ft2232_parameter/flashrom.8 =================================================================== --- flashrom-ft2232_parameter/flashrom.8 (Revision 636) +++ flashrom-ft2232_parameter/flashrom.8 (Arbeitskopie) @@ -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. Index: flashrom-ft2232_parameter/flash.h =================================================================== --- flashrom-ft2232_parameter/flash.h (Revision 636) +++ flashrom-ft2232_parameter/flash.h (Arbeitskopie) @@ -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); Index: flashrom-ft2232_parameter/ft2232_spi.c =================================================================== --- flashrom-ft2232_parameter/ft2232_spi.c (Revision 636) +++ flashrom-ft2232_parameter/ft2232_spi.c (Arbeitskopie) @@ -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,55 @@ 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"); + } + } + } + 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); }
Index: flashrom-ft2232_parameter/flashrom.c =================================================================== --- flashrom-ft2232_parameter/flashrom.c (Revision 636) +++ flashrom-ft2232_parameter/flashrom.c (Arbeitskopie) @@ -649,6 +649,8 @@ programmer = PROGRAMMER_IT87SPI; } else if (strncmp(optarg, "ft2232spi", 9) == 0) { programmer = PROGRAMMER_FT2232SPI; + if (optarg[9] == '=') + ft2232spi_param = strdup(optarg + 10); } else if (strncmp(optarg, "serprog", 7) == 0) { programmer = PROGRAMMER_SERPROG; if (optarg[7] == '=')