X-Git-Url: http://developer.intra2net.com/git/?p=libftdi;a=blobdiff_plain;f=src%2Fftdi.c;h=33ed14820a6305cf5f08c8c50ecd2bb610ea6a85;hp=389cf01b9322efdd3f8d06a0497dfb36c6ce11ad;hb=6855afda867f75e0265d815c411a180a0abc139b;hpb=e107f5092fa731fad1aa900b5c736fcb97c76d47 diff --git a/src/ftdi.c b/src/ftdi.c index 389cf01..33ed148 100644 --- a/src/ftdi.c +++ b/src/ftdi.c @@ -2186,34 +2186,34 @@ void ftdi_eeprom_initdefaults(struct ftdi_context *ftdi) return; eeprom = ftdi->eeprom; + memset(eeprom, 0, sizeof(struct ftdi_eeprom)); eeprom->vendor_id = 0x0403; - eeprom->product_id = 0x6001; - - eeprom->self_powered = 1; - eeprom->remote_wakeup = 1; - eeprom->release = 0; - - eeprom->in_is_isochronous = 0; - eeprom->out_is_isochronous = 0; - eeprom->suspend_pull_downs = 0; - - eeprom->use_serial = 0; - eeprom->change_usb_version = 0; + eeprom->use_serial = USE_SERIAL_NUM; + if((ftdi->type == TYPE_AM) || (ftdi->type == TYPE_BM) || + (ftdi->type == TYPE_R)) + eeprom->product_id = 0x6001; + else + eeprom->product_id = 0x6010; + switch (ftdi->type) + { + case TYPE_2232H: + eeprom->release = 0x200; + break; + default: + eeprom->release = 0; + } eeprom->usb_version = 0x0200; - eeprom->max_power = 0; + eeprom->max_power = 100; eeprom->manufacturer = NULL; eeprom->product = NULL; eeprom->serial = NULL; - for (i=0; i < 5; i++) - { - eeprom->cbus_function[i] = 0; - } - eeprom->high_current_a = 0; - eeprom->invert = 0; - eeprom->size = FTDI_MAX_EEPROM_SIZE; + if(ftdi->type == TYPE_R) + eeprom->size = 0x80; + else + eeprom->size = -1; } /** @@ -2294,18 +2294,28 @@ int ftdi_eeprom_build(struct ftdi_context *ftdi, unsigned char *output) if (eeprom->high_current_a) return -5; } - size_check = eeprom->size; - size_check -= 28; // 28 are always in use (fixed) + size_check = 0x80; + switch(ftdi->type) + { + case TYPE_2232H: + case TYPE_4232H: + size_check -= 4; + case TYPE_R: + size_check -= 4; + case TYPE_2232C: + size_check -= 4; + case TYPE_AM: + case TYPE_BM: + size_check -= 0x14*2; + } - // Top half of a 256byte eeprom is used just for strings and checksum - // it seems that the FTDI chip will not read these strings from the lower half - // Each string starts with two bytes; offset and type (0x03 for string) - // the checksum needs two bytes, so without the string data that 8 bytes from the top half - if (eeprom->size>=256) size_check = 120; size_check -= manufacturer_size*2; size_check -= product_size*2; size_check -= serial_size*2; + /* Space for the string type and pointer bytes */ + size_check -= -6; + // eeprom size exceeded? if (size_check < 0) return (-1); @@ -2518,6 +2528,8 @@ int ftdi_eeprom_decode(struct ftdi_context *ftdi, unsigned char *buf, int size, eeprom->channel_b_driver = buf[0x01] & DRIVER_VCP; eeprom->high_current_b = buf[0x01] & HIGH_CURRENT_DRIVE; + eeprom->suspend_dbus7 = buf[0x01] & SUSPEND_DBUS7; + // Addr 02: Vendor ID eeprom->vendor_id = buf[0x02] + (buf[0x03] << 8); @@ -2551,7 +2563,7 @@ int ftdi_eeprom_decode(struct ftdi_context *ftdi, unsigned char *buf, int size, eeprom->in_is_isochronous = buf[0x0A]&0x01; eeprom->out_is_isochronous = buf[0x0A]&0x02; eeprom->suspend_pull_downs = buf[0x0A]&0x04; - eeprom->use_serial = buf[0x0A]&0x08; + eeprom->use_serial = buf[0x0A] & USE_SERIAL_NUM; eeprom->change_usb_version = buf[0x0A]&0x10; @@ -2661,11 +2673,20 @@ int ftdi_eeprom_decode(struct ftdi_context *ftdi, unsigned char *buf, int size, eeprom->cbus_function[3] = (buf[0x15] >> 4) & 0x0f; eeprom->cbus_function[4] = buf[0x16] & 0x0f; } - else if (ftdi->type == TYPE_2232H) - { - } - else if (ftdi->type == TYPE_4232H) - { + else if ((ftdi->type == TYPE_2232H) ||(ftdi->type == TYPE_4232H)) + { + eeprom->group0_drive = buf[0x0c] & DRIVE_16MA; + eeprom->group0_schmitt = buf[0x0c] & IS_SCHMITT; + eeprom->group0_slew = buf[0x0c] & SLOW_SLEW; + eeprom->group1_drive = (buf[0x0c] >> 4) & 0x3; + eeprom->group1_schmitt = (buf[0x0c] >> 4) & IS_SCHMITT; + eeprom->group1_slew = (buf[0x0c] >> 4) & SLOW_SLEW; + eeprom->group2_drive = buf[0x0d] & DRIVE_16MA; + eeprom->group2_schmitt = buf[0x0d] & IS_SCHMITT; + eeprom->group2_slew = buf[0x0d] & SLOW_SLEW; + eeprom->group3_drive = (buf[0x0d] >> 4) & DRIVE_16MA; + eeprom->group3_schmitt = (buf[0x0d] >> 4) & IS_SCHMITT; + eeprom->group3_slew = (buf[0x0d] >> 4) & SLOW_SLEW; } if(verbose) @@ -2687,16 +2708,45 @@ int ftdi_eeprom_decode(struct ftdi_context *ftdi, unsigned char *buf, int size, if(eeprom->serial) fprintf(stdout, "Serial: %s\n",eeprom->serial); fprintf(stdout, "Checksum : %04x\n", checksum); - if ((ftdi->type = TYPE_2232C) || (ftdi->type = TYPE_R)) + if(eeprom->suspend_dbus7) + fprintf(stdout, "Suspend on DBUS7\n"); + if(eeprom->suspend_pull_downs) + fprintf(stdout, "Pull IO pins low during suspend\n"); + if(eeprom->remote_wakeup) + fprintf(stdout, "Enable Remote Wake Up\n"); + if (ftdi->type >= TYPE_2232C) 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) + if (ftdi->type >= TYPE_2232C) 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":""); + if ((ftdi->type == TYPE_2232H) || (ftdi->type == TYPE_4232H)) + { + fprintf(stdout,"%s has %d mA drive%s%s\n", + (ftdi->type == TYPE_2232H)?"AL":"A", + (eeprom->group0_drive+1) *4, + (eeprom->group0_schmitt)?" Schmitt Input":"", + (eeprom->group0_slew)?" Slow Slew":""); + fprintf(stdout,"%s has %d mA drive%s%s\n", + (ftdi->type == TYPE_2232H)?"AH":"B", + (eeprom->group1_drive+1) *4, + (eeprom->group1_schmitt)?" Schmitt Input":"", + (eeprom->group1_slew)?" Slow Slew":""); + fprintf(stdout,"%s has %d mA drive%s%s\n", + (ftdi->type == TYPE_2232H)?"BL":"C", + (eeprom->group2_drive+1) *4, + (eeprom->group2_schmitt)?" Schmitt Input":"", + (eeprom->group2_slew)?" Slow Slew":""); + fprintf(stdout,"%s has %d mA drive%s%s\n", + (ftdi->type == TYPE_2232H)?"BH":"D", + (eeprom->group3_drive+1) *4, + (eeprom->group3_schmitt)?" Schmitt Input":"", + (eeprom->group3_slew)?" Slow Slew":""); + } }