From: Thomas Jarosch Date: Thu, 14 May 2020 20:38:37 +0000 (+0200) Subject: eeprom handling: Unify handling of boolean bit flags X-Git-Tag: v1.5rc1~4 X-Git-Url: http://developer.intra2net.com/git/?p=libftdi;a=commitdiff_plain;h=37388ecee483f0facac38486741d4e1680ddc51b eeprom handling: Unify handling of boolean bit flags Boolean bit flags should be zero or one in memory, not the actual eeprom value FTDI assigned to them. Example of the code change in ftdi_eeprom_build(): ftdi_eeprom_build(): - if (eeprom->suspend_dbus7 == SUSPEND_DBUS7_BIT) + if (eeprom->suspend_dbus7) The changes should not break any backward compatibility in ftdi_build_eeprom(). The function ftdi_decode_eeprom() will return slightly different values for boolean fields, but callers should test using "if (flag_enabled)" instead of "if (flag_enabled == specific_value)" anyway. Test done: Decoded eeprom of a FT232 serial cable stayed the same. $ diff -u dump-old.txt dump-new.txt -> no change --- diff --git a/src/ftdi.c b/src/ftdi.c index e82514e..d86d98e 100644 --- a/src/ftdi.c +++ b/src/ftdi.c @@ -3136,7 +3136,7 @@ int ftdi_eeprom_build(struct ftdi_context *ftdi) case TYPE_2232C: output[0x00] = type2bit(eeprom->channel_a_type, TYPE_2232C); - if (eeprom->channel_a_driver == DRIVER_VCP) + if (eeprom->channel_a_driver) output[0x00] |= DRIVER_VCP; else output[0x00] &= ~DRIVER_VCP; @@ -3147,7 +3147,7 @@ int ftdi_eeprom_build(struct ftdi_context *ftdi) output[0x00] &= ~HIGH_CURRENT_DRIVE; output[0x01] = type2bit(eeprom->channel_b_type, TYPE_2232C); - if (eeprom->channel_b_driver == DRIVER_VCP) + if (eeprom->channel_b_driver) output[0x01] |= DRIVER_VCP; else output[0x01] &= ~DRIVER_VCP; @@ -3182,7 +3182,7 @@ int ftdi_eeprom_build(struct ftdi_context *ftdi) output[0x00] = type2bit(eeprom->channel_a_type, TYPE_R); if (eeprom->high_current) output[0x00] |= HIGH_CURRENT_DRIVE_R; - if (eeprom->channel_a_driver == DRIVER_VCP) + if (eeprom->channel_a_driver) output[0x00] |= DRIVER_VCP; if (eeprom->external_oscillator) output[0x00] |= 0x02; @@ -3223,17 +3223,18 @@ int ftdi_eeprom_build(struct ftdi_context *ftdi) break; case TYPE_2232H: output[0x00] = type2bit(eeprom->channel_a_type, TYPE_2232H); - if ( eeprom->channel_a_driver == DRIVER_VCP) + if (eeprom->channel_a_driver) output[0x00] |= DRIVER_VCP; else output[0x00] &= ~DRIVER_VCP; output[0x01] = type2bit(eeprom->channel_b_type, TYPE_2232H); - if ( eeprom->channel_b_driver == DRIVER_VCP) + if (eeprom->channel_b_driver) output[0x01] |= DRIVER_VCP; else output[0x01] &= ~DRIVER_VCP; - if (eeprom->suspend_dbus7 == SUSPEND_DBUS7_BIT) + + if (eeprom->suspend_dbus7) output[0x01] |= SUSPEND_DBUS7_BIT; else output[0x01] &= ~SUSPEND_DBUS7_BIT; @@ -3247,55 +3248,55 @@ int ftdi_eeprom_build(struct ftdi_context *ftdi) output[0x0c] |= DRIVE_16MA; else output[0x0c] |= eeprom->group0_drive; - if (eeprom->group0_schmitt == IS_SCHMITT) + if (eeprom->group0_schmitt) output[0x0c] |= IS_SCHMITT; - if (eeprom->group0_slew == SLOW_SLEW) + if (eeprom->group0_slew) output[0x0c] |= SLOW_SLEW; if (eeprom->group1_drive > DRIVE_16MA) output[0x0c] |= DRIVE_16MA<<4; else output[0x0c] |= eeprom->group1_drive<<4; - if (eeprom->group1_schmitt == IS_SCHMITT) + if (eeprom->group1_schmitt) output[0x0c] |= IS_SCHMITT<<4; - if (eeprom->group1_slew == SLOW_SLEW) + if (eeprom->group1_slew) output[0x0c] |= SLOW_SLEW<<4; if (eeprom->group2_drive > DRIVE_16MA) output[0x0d] |= DRIVE_16MA; else output[0x0d] |= eeprom->group2_drive; - if (eeprom->group2_schmitt == IS_SCHMITT) + if (eeprom->group2_schmitt) output[0x0d] |= IS_SCHMITT; - if (eeprom->group2_slew == SLOW_SLEW) + if (eeprom->group2_slew) output[0x0d] |= SLOW_SLEW; if (eeprom->group3_drive > DRIVE_16MA) output[0x0d] |= DRIVE_16MA<<4; else output[0x0d] |= eeprom->group3_drive<<4; - if (eeprom->group3_schmitt == IS_SCHMITT) + if (eeprom->group3_schmitt) output[0x0d] |= IS_SCHMITT<<4; - if (eeprom->group3_slew == SLOW_SLEW) + if (eeprom->group3_slew) output[0x0d] |= SLOW_SLEW<<4; output[0x18] = eeprom->chip; break; case TYPE_4232H: - if (eeprom->channel_a_driver == DRIVER_VCP) + if (eeprom->channel_a_driver) output[0x00] |= DRIVER_VCP; else output[0x00] &= ~DRIVER_VCP; - if (eeprom->channel_b_driver == DRIVER_VCP) + if (eeprom->channel_b_driver) output[0x01] |= DRIVER_VCP; else output[0x01] &= ~DRIVER_VCP; - if (eeprom->channel_c_driver == DRIVER_VCP) + if (eeprom->channel_c_driver) output[0x00] |= (DRIVER_VCP << 4); else output[0x00] &= ~(DRIVER_VCP << 4); - if (eeprom->channel_d_driver == DRIVER_VCP) + if (eeprom->channel_d_driver) output[0x01] |= (DRIVER_VCP << 4); else output[0x01] &= ~(DRIVER_VCP << 4); @@ -3326,36 +3327,36 @@ int ftdi_eeprom_build(struct ftdi_context *ftdi) output[0x0c] |= DRIVE_16MA; else output[0x0c] |= eeprom->group0_drive; - if (eeprom->group0_schmitt == IS_SCHMITT) + if (eeprom->group0_schmitt) output[0x0c] |= IS_SCHMITT; - if (eeprom->group0_slew == SLOW_SLEW) + if (eeprom->group0_slew) output[0x0c] |= SLOW_SLEW; if (eeprom->group1_drive > DRIVE_16MA) output[0x0c] |= DRIVE_16MA<<4; else output[0x0c] |= eeprom->group1_drive<<4; - if (eeprom->group1_schmitt == IS_SCHMITT) + if (eeprom->group1_schmitt) output[0x0c] |= IS_SCHMITT<<4; - if (eeprom->group1_slew == SLOW_SLEW) + if (eeprom->group1_slew) output[0x0c] |= SLOW_SLEW<<4; if (eeprom->group2_drive > DRIVE_16MA) output[0x0d] |= DRIVE_16MA; else output[0x0d] |= eeprom->group2_drive; - if (eeprom->group2_schmitt == IS_SCHMITT) + if (eeprom->group2_schmitt) output[0x0d] |= IS_SCHMITT; - if (eeprom->group2_slew == SLOW_SLEW) + if (eeprom->group2_slew) output[0x0d] |= SLOW_SLEW; if (eeprom->group3_drive > DRIVE_16MA) output[0x0d] |= DRIVE_16MA<<4; else output[0x0d] |= eeprom->group3_drive<<4; - if (eeprom->group3_schmitt == IS_SCHMITT) + if (eeprom->group3_schmitt) output[0x0d] |= IS_SCHMITT<<4; - if (eeprom->group3_slew == SLOW_SLEW) + if (eeprom->group3_slew) output[0x0d] |= SLOW_SLEW<<4; output[0x18] = eeprom->chip; @@ -3363,10 +3364,11 @@ int ftdi_eeprom_build(struct ftdi_context *ftdi) break; case TYPE_232H: output[0x00] = type2bit(eeprom->channel_a_type, TYPE_232H); - if ( eeprom->channel_a_driver == DRIVER_VCP) + if (eeprom->channel_a_driver) output[0x00] |= DRIVER_VCPH; else output[0x00] &= ~DRIVER_VCPH; + if (eeprom->powersave) output[0x01] |= POWER_SAVE_DISABLE_H; else @@ -3389,22 +3391,23 @@ int ftdi_eeprom_build(struct ftdi_context *ftdi) output[0x01] |= FT1284_FLOW_CONTROL; else output[0x01] &= ~FT1284_FLOW_CONTROL; + if (eeprom->group0_drive > DRIVE_16MA) output[0x0c] |= DRIVE_16MA; else output[0x0c] |= eeprom->group0_drive; - if (eeprom->group0_schmitt == IS_SCHMITT) + if (eeprom->group0_schmitt) output[0x0c] |= IS_SCHMITT; - if (eeprom->group0_slew == SLOW_SLEW) + if (eeprom->group0_slew) output[0x0c] |= SLOW_SLEW; if (eeprom->group1_drive > DRIVE_16MA) output[0x0d] |= DRIVE_16MA; else output[0x0d] |= eeprom->group1_drive; - if (eeprom->group1_schmitt == IS_SCHMITT) + if (eeprom->group1_schmitt) output[0x0d] |= IS_SCHMITT; - if (eeprom->group1_slew == SLOW_SLEW) + if (eeprom->group1_slew) output[0x0d] |= SLOW_SLEW; set_ft232h_cbus(eeprom, output); @@ -3568,8 +3571,8 @@ int ftdi_eeprom_decode(struct ftdi_context *ftdi, int verbose) // Bit 7: always 1 // Bit 6: 1 if this device is self powered, 0 if bus powered // Bit 5: 1 if this device uses remote wakeup - eeprom->self_powered = buf[0x08] & 0x40; - eeprom->remote_wakeup = buf[0x08] & 0x20; + eeprom->self_powered = !!(buf[0x08] & 0x40); + eeprom->remote_wakeup = !!(buf[0x08] & 0x20); // Addr 09: Max power consumption: max power = value * 2 mA eeprom->max_power = MAX_POWER_MILLIAMP_PER_UNIT * buf[0x09]; @@ -3584,9 +3587,9 @@ int ftdi_eeprom_decode(struct ftdi_context *ftdi, int verbose) // Bit 1: 1 - Out EndPoint is Isochronous // Bit 0: 1 - In EndPoint is Isochronous // - eeprom->in_is_isochronous = buf[0x0A]&0x01; - eeprom->out_is_isochronous = buf[0x0A]&0x02; - eeprom->suspend_pull_downs = buf[0x0A]&0x04; + 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] & USE_SERIAL_NUM); eeprom->use_usb_version = !!(buf[0x0A] & USE_USB_VERSION_BIT); @@ -3690,19 +3693,19 @@ int ftdi_eeprom_decode(struct ftdi_context *ftdi, int verbose) else if (ftdi->type == TYPE_2232C) { eeprom->channel_a_type = bit2type(buf[0x00] & 0x7); - eeprom->channel_a_driver = buf[0x00] & DRIVER_VCP; - eeprom->high_current_a = buf[0x00] & HIGH_CURRENT_DRIVE; + 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->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; - eeprom->external_oscillator = buf[0x00] & 0x02; + /* TYPE_R flags D2XX, not VCP as all others */ + eeprom->channel_a_driver = !(buf[0x00] & DRIVER_VCP); /* note: inverted flag, use a single NOT */ + eeprom->high_current = !!(buf[0x00] & HIGH_CURRENT_DRIVE_R); + eeprom->external_oscillator = !!(buf[0x00] & 0x02); if ( (buf[0x01]&0x40) != 0x40) fprintf(stderr, "TYPE_R EEPROM byte[0x01] Bit 6 unexpected Endpoint size." @@ -3713,7 +3716,7 @@ int ftdi_eeprom_decode(struct ftdi_context *ftdi, int verbose) eeprom->chip = buf[0x16]; // Addr 0B: Invert data lines // Works only on FT232R, not FT245R, but no way to distinguish - eeprom->invert = buf[0x0B]; + eeprom->invert = buf[0x0B]; /* note: not a bitflag */ // Addr 14: CBUS function: CBUS0, CBUS1 // Addr 15: CBUS function: CBUS2, CBUS3 // Addr 16: CBUS function: CBUS5 @@ -3725,53 +3728,53 @@ int ftdi_eeprom_decode(struct ftdi_context *ftdi, int verbose) } else if ((ftdi->type == TYPE_2232H) || (ftdi->type == TYPE_4232H)) { - eeprom->channel_a_driver = buf[0x00] & DRIVER_VCP; - eeprom->channel_b_driver = buf[0x01] & DRIVER_VCP; + eeprom->channel_a_driver = !!(buf[0x00] & DRIVER_VCP); + eeprom->channel_b_driver = !!(buf[0x01] & DRIVER_VCP); if (ftdi->type == TYPE_2232H) { eeprom->channel_a_type = bit2type(buf[0x00] & 0x7); eeprom->channel_b_type = bit2type(buf[0x01] & 0x7); - eeprom->suspend_dbus7 = buf[0x01] & SUSPEND_DBUS7_BIT; + eeprom->suspend_dbus7 = !!(buf[0x01] & SUSPEND_DBUS7_BIT); } else { - eeprom->channel_c_driver = (buf[0x00] >> 4) & DRIVER_VCP; - eeprom->channel_d_driver = (buf[0x01] >> 4) & DRIVER_VCP; - eeprom->channel_a_rs485enable = buf[0x0b] & (CHANNEL_IS_RS485 << 0); - eeprom->channel_b_rs485enable = buf[0x0b] & (CHANNEL_IS_RS485 << 1); - eeprom->channel_c_rs485enable = buf[0x0b] & (CHANNEL_IS_RS485 << 2); - eeprom->channel_d_rs485enable = buf[0x0b] & (CHANNEL_IS_RS485 << 3); + eeprom->channel_c_driver = !!((buf[0x00] >> 4) & DRIVER_VCP); + eeprom->channel_d_driver = !!((buf[0x01] >> 4) & DRIVER_VCP); + eeprom->channel_a_rs485enable = !!(buf[0x0b] & (CHANNEL_IS_RS485 << 0)); + eeprom->channel_b_rs485enable = !!(buf[0x0b] & (CHANNEL_IS_RS485 << 1)); + eeprom->channel_c_rs485enable = !!(buf[0x0b] & (CHANNEL_IS_RS485 << 2)); + eeprom->channel_d_rs485enable = !!(buf[0x0b] & (CHANNEL_IS_RS485 << 3)); } eeprom->chip = buf[0x18]; - 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; + eeprom->group0_drive = buf[0x0c] & DRIVE_16MA; /* not a bitflag */ + eeprom->group0_schmitt = !!(buf[0x0c] & IS_SCHMITT); + eeprom->group0_slew = !!(buf[0x0c] & SLOW_SLEW); + eeprom->group1_drive = (buf[0x0c] >> 4) & DRIVE_16MA; /* not a bitflag */ + eeprom->group1_schmitt = !!((buf[0x0c] >> 4) & IS_SCHMITT); + eeprom->group1_slew = !!((buf[0x0c] >> 4) & SLOW_SLEW); + eeprom->group2_drive = buf[0x0d] & DRIVE_16MA; /* not a bitflag */ + eeprom->group2_schmitt = !!(buf[0x0d] & IS_SCHMITT); + eeprom->group2_slew = !!(buf[0x0d] & SLOW_SLEW); + eeprom->group3_drive = (buf[0x0d] >> 4) & DRIVE_16MA; /* not a bitflag */ + eeprom->group3_schmitt = !!((buf[0x0d] >> 4) & IS_SCHMITT); + eeprom->group3_slew = !!((buf[0x0d] >> 4) & SLOW_SLEW); } else if (ftdi->type == TYPE_232H) { eeprom->channel_a_type = buf[0x00] & 0xf; - eeprom->channel_a_driver = (buf[0x00] & DRIVER_VCPH)?DRIVER_VCP:0; - eeprom->clock_polarity = buf[0x01] & FT1284_CLK_IDLE_STATE; - eeprom->data_order = buf[0x01] & FT1284_DATA_LSB; - eeprom->flow_control = buf[0x01] & FT1284_FLOW_CONTROL; - eeprom->powersave = buf[0x01] & POWER_SAVE_DISABLE_H; - 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[0x0d] & DRIVE_16MA; - eeprom->group1_schmitt = buf[0x0d] & IS_SCHMITT; - eeprom->group1_slew = buf[0x0d] & SLOW_SLEW; + eeprom->channel_a_driver = !!(buf[0x00] & DRIVER_VCPH); + eeprom->clock_polarity = !!(buf[0x01] & FT1284_CLK_IDLE_STATE); + eeprom->data_order = !!(buf[0x01] & FT1284_DATA_LSB); + eeprom->flow_control = !!(buf[0x01] & FT1284_FLOW_CONTROL); + eeprom->powersave = !!(buf[0x01] & POWER_SAVE_DISABLE_H); + eeprom->group0_drive = buf[0x0c] & DRIVE_16MA; /* not a bitflag */ + eeprom->group0_schmitt = !!(buf[0x0c] & IS_SCHMITT); + eeprom->group0_slew = !!(buf[0x0c] & SLOW_SLEW); + eeprom->group1_drive = buf[0x0d] & DRIVE_16MA; /* not a bitflag */ + eeprom->group1_schmitt = !!(buf[0x0d] & IS_SCHMITT); + eeprom->group1_slew = !!(buf[0x0d] & SLOW_SLEW); for(i=0; i<5; i++) { @@ -3787,14 +3790,14 @@ int ftdi_eeprom_decode(struct ftdi_context *ftdi, int verbose) { eeprom->cbus_function[i] = buf[0x1a + i] & 0xFF; } - eeprom->group0_drive = buf[0x0c] & 0x03; - eeprom->group0_schmitt = buf[0x0c] & IS_SCHMITT; - eeprom->group0_slew = buf[0x0c] & SLOW_SLEW; - eeprom->group1_drive = (buf[0x0c] >> 4) & 0x03; - eeprom->group1_schmitt = (buf[0x0c] >> 4) & IS_SCHMITT; - eeprom->group1_slew = (buf[0x0c] >> 4) & SLOW_SLEW; - - eeprom->invert = buf[0xb]; + eeprom->group0_drive = buf[0x0c] & DRIVE_16MA; /* not a bitflag */ + eeprom->group0_schmitt = !!(buf[0x0c] & IS_SCHMITT); + eeprom->group0_slew = !!(buf[0x0c] & SLOW_SLEW); + eeprom->group1_drive = (buf[0x0c] >> 4) & DRIVE_16MA; /* not a bitflag */ + eeprom->group1_schmitt = !!((buf[0x0c] >> 4) & IS_SCHMITT); + eeprom->group1_slew = !!((buf[0x0c] >> 4) & SLOW_SLEW); + + eeprom->invert = buf[0xb]; /* not a bitflag */ } if (verbose)