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 <[email protected]>

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] == '=')


-- 
http://www.hailfinger.org/

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] == '=')
-- 
coreboot mailing list: [email protected]
http://www.coreboot.org/mailman/listinfo/coreboot

Reply via email to