public boolean SetConfig(
      int index, int baud, byte dataBits, byte stopBits, byte parity, byte flowControl) {
    FT_Device ftDev;

    switch (index) {
      case 0:
        ftDev = ft_device_0;
        break;
      case 1:
        ftDev = ft_device_1;
        break;
      default:
        ftDev = ft_device_0;
        break;
    }

    if (ftDev.isOpen() == false) {
      Log.e(">>@@", "SetConfig: ftDev not open!!!!!!  index:" + index);
    } else {
      Log.e(">>@@", "SetConfig: ftDev open, index:" + index);

      /*			Log.e(">>@@", "port isn:" + ftDev.deviceInfoNode.iSerialNumber
      					+ " bcd:" + ftDev.deviceInfoNode.bcdDevice + " id:"
      					+ ftDev.deviceInfoNode.id + " loc:"
      					+ ftDev.deviceInfoNode.location + " sn:"
      					+ ftDev.deviceInfoNode.serialNumber);
      */ }

    // open our first device
    // ftdid2xx.openByIndex(0);

    // configure our port
    // reset to UART mode for 232 devices
    ftDev.setBitMode((byte) 0, D2xxManager.FT_BITMODE_RESET);

    // set 230400 baud rate
    // ftdid2xx.setBaudRate(9600 );
    ftDev.setBaudRate(baud);

    // set 8 data bits, 1 stop bit, no parity
    // ftdid2xx.setDataCharacteristics(D2xx.FT_DATA_BITS_8,
    // D2xx.FT_STOP_BITS_1, D2xx.FT_PARITY_NONE);

    switch (dataBits) {
      case 7:
        dataBits = D2xxManager.FT_DATA_BITS_7;
        break;
      case 8:
        dataBits = D2xxManager.FT_DATA_BITS_8;
        break;
      default:
        dataBits = D2xxManager.FT_DATA_BITS_8;
        break;
    }

    switch (stopBits) {
      case 1:
        stopBits = D2xxManager.FT_STOP_BITS_1;
        break;
      case 2:
        stopBits = D2xxManager.FT_STOP_BITS_2;
        break;
      default:
        stopBits = D2xxManager.FT_STOP_BITS_1;
        break;
    }

    switch (parity) {
      case 0:
        parity = D2xxManager.FT_PARITY_NONE;
        break;
      case 1:
        parity = D2xxManager.FT_PARITY_ODD;
        break;
      case 2:
        parity = D2xxManager.FT_PARITY_EVEN;
        break;
      case 3:
        parity = D2xxManager.FT_PARITY_MARK;
        break;
      case 4:
        parity = D2xxManager.FT_PARITY_SPACE;
        break;
      default:
        parity = D2xxManager.FT_PARITY_NONE;
        break;
    }

    ftDev.setDataCharacteristics(dataBits, stopBits, parity);

    // set RTS/CTS flow control
    // ftdid2xx.setFlowControl(D2xx.FT_FLOW_RTS_CTS, (byte)0x00,
    // (byte)0x00);
    // ftdid2xx.setFlowControl(D2xx.FT_FLOW_NONE, (byte)0x00, (byte)0x00);

    short flowCtrlSetting;
    switch (flowControl) {
      case 0:
        flowCtrlSetting = D2xxManager.FT_FLOW_NONE;
        break;
      case 1:
        flowCtrlSetting = D2xxManager.FT_FLOW_RTS_CTS;
        break;
      case 2:
        flowCtrlSetting = D2xxManager.FT_FLOW_DTR_DSR;
        break;
      case 3:
        flowCtrlSetting = D2xxManager.FT_FLOW_XON_XOFF;
        break;
      default:
        flowCtrlSetting = D2xxManager.FT_FLOW_NONE;
        break;
    }

    // TODO : check xon, xoff
    // TODO : check xon, xoff
    ftDev.setFlowControl(flowCtrlSetting, (byte) 0x00, (byte) 0x00);

    switch (index) {
      case 0:
        uart_configured_0 = true;
        Toast.makeText(DeviceFT2232HTestContext, "Port 0 config done", Toast.LENGTH_SHORT).show();
        break;
      case 1:
        uart_configured_1 = true;
        Toast.makeText(DeviceFT2232HTestContext, "Port 1 config done", Toast.LENGTH_SHORT).show();
        break;
      default:
        ftDev = ft_device_0;
        break;
    }

    Log.e(
        ">>@@",
        "SCon["
            + index
            + "] 0:0x"
            + Integer.toHexString(ft_device_0.getModemStatus())
            + " 1:0x"
            + Integer.toHexString(ft_device_1.getModemStatus())
        /*+ " 2:0x" + Integer.toHexString(ft_device_2.getModemStatus())*/
        );

    return true;
  }