X-Git-Url: http://developer.intra2net.com/git/?a=blobdiff_plain;f=src%2Fftdi.c;h=7ae48cb96a794efd6102f60c6a72246426577b3d;hb=6123f7abcc98374ffcfa00bf5eb3bfe9062ada50;hp=a80fb491d6c18d1e36845ca5fe0408bacb68a81c;hpb=87f66e30002a1d48b7f1b835944c0dc4342ff077;p=libftdi diff --git a/src/ftdi.c b/src/ftdi.c index a80fb49..7ae48cb 100644 --- a/src/ftdi.c +++ b/src/ftdi.c @@ -2195,17 +2195,6 @@ void ftdi_eeprom_initdefaults(struct ftdi_context *ftdi) eeprom->product_id = 0x6001; else eeprom->product_id = 0x6010; - switch (ftdi->type) - { - case TYPE_2232C: - eeprom->release = 0x500; - break; - case TYPE_2232H: - eeprom->release = 0x200; - break; - default: - eeprom->release = 0; - } if (ftdi->type == TYPE_AM) eeprom->usb_version = 0x0101; else @@ -2336,7 +2325,7 @@ int ftdi_eeprom_build(struct ftdi_context *ftdi, unsigned char *output) // Addr 06: Device release number (0400h for BM features) output[0x06] = 0x00; - switch (eeprom->release) { + switch (ftdi->type) { case TYPE_AM: output[0x07] = 0x02; break; @@ -2349,6 +2338,12 @@ int ftdi_eeprom_build(struct ftdi_context *ftdi, unsigned char *output) case TYPE_R: output[0x07] = 0x06; break; + case TYPE_2232H: + output[0x07] = 0x07; + break; + case TYPE_4232H: + output[0x07] = 0x08; + break; default: output[0x07] = 0x00; } @@ -2509,26 +2504,6 @@ int ftdi_eeprom_decode(struct ftdi_context *ftdi, unsigned char *buf, int size, eeprom_size = 0x80; eeprom = ftdi->eeprom; - // Addr 00: Channel A setting - - eeprom->channel_a_type = buf[0x00] & 0x7; - eeprom->high_current = buf[0x00] & HIGH_CURRENT_DRIVE_R; - eeprom->channel_a_driver = buf[0x00] & DRIVER_VCP; - eeprom->high_current_a = buf[0x00] & HIGH_CURRENT_DRIVE; - - // Addr 01: Channel B setting - - eeprom->channel_b_type = buf[0x01] & 0x7; - eeprom->channel_b_driver = buf[0x01] & DRIVER_VCP; - eeprom->high_current_b = buf[0x01] & HIGH_CURRENT_DRIVE; - - eeprom->suspend_dbus7 = buf[0x01] & SUSPEND_DBUS7; - - if((ftdi->type == TYPE_R) && (buf[0x01]&0x40)) - fprintf(stderr, - "TYPE_R EEPROM byte[0x01] Bit 6 unexpected Endpoint size. If this happened with the\n" - " EEPROM programmed by FTDI tools, please report to libftdi@developer.intra2net.com\n"); - // Addr 02: Vendor ID eeprom->vendor_id = buf[0x02] + (buf[0x03] << 8); @@ -2650,16 +2625,33 @@ int ftdi_eeprom_decode(struct ftdi_context *ftdi, unsigned char *buf, int size, ftdi_error_return(-1,"EEPROM checksum error"); } - else if ((ftdi->type == TYPE_AM) || (ftdi->type == TYPE_BM)) + eeprom->channel_a_type = 0; + if ((ftdi->type == TYPE_AM) || (ftdi->type == TYPE_BM)) { eeprom->chip = -1; } else if(ftdi->type == TYPE_2232C) { + eeprom->channel_a_type = buf[0x00] & 0x7; + eeprom->channel_a_driver = buf[0x00] & DRIVER_VCP; + eeprom->high_current_a = buf[0x00] & HIGH_CURRENT_DRIVE; + eeprom->channel_b_type = buf[0x01] & 0x7; + eeprom->channel_b_driver = buf[0x01] & DRIVER_VCP; + eeprom->high_current_b = buf[0x01] & HIGH_CURRENT_DRIVE; eeprom->chip = buf[0x14]; } else if(ftdi->type == TYPE_R) { + /* TYPE_R flags D2XX, not VCP as all others*/ + eeprom->channel_a_driver = (~buf[0x00]) & DRIVER_VCP; + eeprom->high_current = buf[0x00] & HIGH_CURRENT_DRIVE_R; + if( (buf[0x01]&0x40) != 0x40) + fprintf(stderr, + "TYPE_R EEPROM byte[0x01] Bit 6 unexpected Endpoint size." + " If this happened with the\n" + " EEPROM programmed by FTDI tools, please report " + "to libftdi@developer.intra2net.com\n"); + eeprom->chip = buf[0x16]; // Addr 0B: Invert data lines // Works only on FT232R, not FT245R, but no way to distinguish @@ -2675,6 +2667,14 @@ int ftdi_eeprom_decode(struct ftdi_context *ftdi, unsigned char *buf, int size, } else if ((ftdi->type == TYPE_2232H) ||(ftdi->type == TYPE_4232H)) { + eeprom->high_current = buf[0x00] & HIGH_CURRENT_DRIVE_R; + eeprom->channel_a_driver = buf[0x00] & DRIVER_VCP; + eeprom->channel_b_type = buf[0x01] & 0x7; + eeprom->channel_b_driver = buf[0x01] & DRIVER_VCP; + + if(ftdi->type == TYPE_2232H) + eeprom->suspend_dbus7 = buf[0x01] & SUSPEND_DBUS7; + eeprom->chip = buf[0x18]; eeprom->group0_drive = buf[0x0c] & DRIVE_16MA; eeprom->group0_schmitt = buf[0x0c] & IS_SCHMITT; @@ -2723,12 +2723,12 @@ int ftdi_eeprom_decode(struct ftdi_context *ftdi, unsigned char *buf, int size, fprintf(stdout,"Channel A has Mode %s%s%s\n", channel_mode[eeprom->channel_a_type], (eeprom->channel_a_driver)?" VCP":"", - (eeprom->high_current_a)?" High Currenr IO":""); - if (ftdi->type >= TYPE_2232C) + (eeprom->high_current_a)?" High Current IO":""); + if ((ftdi->type >= TYPE_2232C) && (ftdi->type != TYPE_R)) fprintf(stdout,"Channel B has Mode %s%s%s\n", channel_mode[eeprom->channel_b_type], (eeprom->channel_b_driver)?" VCP":"", - (eeprom->high_current_b)?" High Currenr IO":""); + (eeprom->high_current_b)?" High Current IO":""); if ((ftdi->type == TYPE_2232H) || (ftdi->type == TYPE_4232H)) { fprintf(stdout,"%s has %d mA drive%s%s\n",