libftdi-git Archives

Subject: A library to talk to FTDI chips branch, master, updated. v1.1-5-gf45f423

From: libftdi-git@xxxxxxxxxxxxxxxxxxxxxxx
To: libftdi-git@xxxxxxxxxxxxxxxxxxxxxxx
Date: Fri, 16 May 2014 16:55:33 +0200 (CEST)
The branch, master has been updated
       via  f45f42373318c5504e7d42168991808fb017ca0c (commit)
       via  e659737ab6228e2da955057637d567c64822825e (commit)
       via  519bbce162c907e93cef6fd372f3224387828034 (commit)
       via  6ae693b23c410578d6179dec7e61bd36b932c851 (commit)
      from  16257d60fb84f09b0d66ad881fe47e7b6faa84ef (commit)


- Log -----------------------------------------------------------------
commit f45f42373318c5504e7d42168991808fb017ca0c
Author: Uwe Bonnes <bon@xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx>
Date:   Thu Apr 24 20:38:22 2014 +0200

    ft230x: Fix more eeprom decode pathes.

commit e659737ab6228e2da955057637d567c64822825e
Author: Uwe Bonnes <bon@xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx>
Date:   Thu Apr 24 19:25:27 2014 +0200

    ft230x: Use factory values for drive strength.

commit 519bbce162c907e93cef6fd372f3224387828034
Author: Uwe Bonnes <bon@xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx>
Date:   Thu Apr 24 19:14:32 2014 +0200

    ft230x: Include Factory Configuration Data when building new eeprom data.

commit 6ae693b23c410578d6179dec7e61bd36b932c851
Author: Uwe Bonnes <bon@xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx>
Date:   Thu Apr 24 16:35:52 2014 +0200

    FT230X is a USB FS device, so maximum packet size is only 64 bytes.
    
    No Baudrate > 3 MBaud neither.

-----------------------------------------------------------------------

Summary of changes:
 src/ftdi.c |   34 +++++++++++++++++++++++-----------
 1 files changed, 23 insertions(+), 11 deletions(-)

diff --git a/src/ftdi.c b/src/ftdi.c
index ff26166..03a10be 100644
--- a/src/ftdi.c
+++ b/src/ftdi.c
@@ -470,7 +470,7 @@ static unsigned int _ftdi_determine_max_packet_size(struct 
ftdi_context *ftdi, l
     // Determine maximum packet size. Init with default value.
     // New hi-speed devices from FTDI use a packet size of 512 bytes
     // but could be connected to a normal speed USB hub -> 64 bytes packet 
size.
-    if (ftdi->type == TYPE_2232H || ftdi->type == TYPE_4232H || ftdi->type == 
TYPE_232H || ftdi->type == TYPE_230X)
+    if (ftdi->type == TYPE_2232H || ftdi->type == TYPE_4232H || ftdi->type == 
TYPE_232H)
         packet_size = 512;
     else
         packet_size = 64;
@@ -1175,7 +1175,7 @@ static int ftdi_convert_baudrate(int baudrate, struct 
ftdi_context *ftdi,
 
 #define H_CLK 120000000
 #define C_CLK  48000000
-    if ((ftdi->type == TYPE_2232H) || (ftdi->type == TYPE_4232H) || 
(ftdi->type == TYPE_232H) || (ftdi->type == TYPE_230X))
+    if ((ftdi->type == TYPE_2232H) || (ftdi->type == TYPE_4232H) || 
(ftdi->type == TYPE_232H))
     {
         if(baudrate*10 > H_CLK /0x3fff)
         {
@@ -1200,7 +1200,7 @@ static int ftdi_convert_baudrate(int baudrate, struct 
ftdi_context *ftdi,
     }
     // Split into "value" and "index" values
     *value = (unsigned short)(encoded_divisor & 0xFFFF);
-    if (ftdi->type == TYPE_2232H || ftdi->type == TYPE_4232H || ftdi->type == 
TYPE_232H || ftdi->type == TYPE_230X)
+    if (ftdi->type == TYPE_2232H || ftdi->type == TYPE_4232H || ftdi->type == 
TYPE_232H)
     {
         *index = (unsigned short)(encoded_divisor >> 8);
         *index &= 0xFF00;
@@ -3059,7 +3059,8 @@ int ftdi_eeprom_build(struct ftdi_context *ftdi)
         case TYPE_230X:
             output[0x00] = 0x80; /* Actually, leave the default value */
             output[0x0a] = 0x08; /* Enable USB Serial Number */
-            output[0x0c] = (0x01) | (0x3 << 4); /* DBUS drive 4mA, CBUS drive 
16mA */
+            /*FIXME: Make DBUS & CBUS Control configurable*/
+            output[0x0c] = 0;    /* DBUS drive 4mA, CBUS drive 4 mA like 
factory default */
             for (j = 0; j <= 6; j++)
             {
                 output[0x1a + j] = eeprom->cbus_function[j];
@@ -3077,9 +3078,18 @@ int ftdi_eeprom_build(struct ftdi_context *ftdi)
             /* FT230X has a user section in the MTP which is not part of the 
checksum */
             i = 0x40;
         }
-        value = output[i*2];
-        value += output[(i*2)+1] << 8;
-
+        if ((ftdi->type == TYPE_230X) && (i >=  0x40) && (i < 0x50)) {
+            uint16_t data;
+            if (ftdi_read_eeprom_location(ftdi, i, &data)) {
+                fprintf(stderr, "Reading Factory Configuration Data failed\n");
+                i = 0x50;
+            }
+            value = data;
+        }
+        else {
+            value = output[i*2];
+            value += output[(i*2)+1] << 8;
+        }
         checksum = value^checksum;
         checksum = (checksum << 1) | (checksum >> 15);
     }
@@ -3113,6 +3123,8 @@ static unsigned char bit2type(unsigned char bits)
 /**
    Decode binary EEPROM image into an ftdi_eeprom structure.
 
+   For FT-X devices use AN_201 FT-X MTP memory Configuration to decode.
+
    \param ftdi pointer to ftdi_context
    \param verbose Decode EEPROM on stdout
 
@@ -3421,14 +3433,14 @@ int ftdi_eeprom_decode(struct ftdi_context *ftdi, int 
verbose)
                     channel_mode[eeprom->channel_a_type],
                     (eeprom->channel_a_driver)?" VCP":"",
                     (eeprom->high_current_a)?" High Current IO":"");
-        if (ftdi->type >= TYPE_232H)
+        if (ftdi->type == TYPE_232H)
         {
             fprintf(stdout,"FT1284 Mode Clock is idle %s, %s first, %sFlow 
Control\n",
                     (eeprom->clock_polarity)?"HIGH":"LOW",
                     (eeprom->data_order)?"LSB":"MSB",
                     (eeprom->flow_control)?"":"No ");
         }
-        if ((ftdi->type >= TYPE_2232C) && (ftdi->type != TYPE_R) && 
(ftdi->type != TYPE_232H))
+        if ((ftdi->type == TYPE_2232H) || (ftdi->type == TYPE_4232H))
             fprintf(stdout,"Channel B has Mode %s%s%s\n",
                     channel_mode[eeprom->channel_b_type],
                     (eeprom->channel_b_driver)?" VCP":"",
@@ -3491,7 +3503,7 @@ int ftdi_eeprom_decode(struct ftdi_context *ftdi, int 
verbose)
                                  "I2C_TXE#", "I2C_RXF#", "VBUS_SENSE", 
"BB_WR#",
                                  "BBRD#", "TIME_STAMP", "AWAKE#",
                                 };
-            fprintf(stdout,"IOBUS has %d mA drive%s%s\n",
+            fprintf(stdout,"DBUS has %d mA drive%s%s\n",
                     (eeprom->group0_drive+1) *4,
                     (eeprom->group0_schmitt)?" Schmitt Input":"",
                     (eeprom->group0_slew)?" Slow Slew":"");
@@ -4217,7 +4229,7 @@ int ftdi_erase_eeprom(struct ftdi_context *ftdi)
     if (ftdi == NULL || ftdi->usb_dev == NULL)
         ftdi_error_return(-2, "USB device unavailable");
 
-    if (ftdi->type == TYPE_R)
+    if ((ftdi->type == TYPE_R) || (ftdi->type == TYPE_230X))
     {
         ftdi->eeprom->chip = 0;
         return 0;


hooks/post-receive
-- 
A library to talk to FTDI chips

--
libftdi-git - see http://www.intra2net.com/en/developer/libftdi for details.
To unsubscribe send a mail to libftdi-git+unsubscribe@xxxxxxxxxxxxxxxxxxxxxxx   

Current Thread
  • A library to talk to FTDI chips branch, master, updated. v1.1-5-gf45f423, libftdi-git <=