From e496195bd97e9e88565b77fa75eabe212f33b857 Mon Sep 17 00:00:00 2001 From: kai-morich Date: Tue, 14 Jul 2020 21:14:28 +0200 Subject: [PATCH 1/4] rewrite ftdi driver without LGPL code from libftdi --- README.md | 3 - .../publishToMavenLocal.gradle | 2 +- .../hoho/android/usbserial/DeviceTest.java | 40 +- .../usbserial/driver/FtdiSerialDriver.java | 525 ++++++------------ .../hoho/android/usbserial/driver/UsbId.java | 1 - 5 files changed, 213 insertions(+), 358 deletions(-) diff --git a/README.md b/README.md index fbffc91..ac84f5c 100644 --- a/README.md +++ b/README.md @@ -158,9 +158,6 @@ complete license. Copyright 2011-2012, Google Inc. All Rights Reserved. -Portions of this library are based on [libftdi](http://www.intra2net.com/en/developer/libftdi). -Please see FtdiSerialDriver.java for more information. - ## Help & Discussion For common problems, see the diff --git a/usbSerialForAndroid/publishToMavenLocal.gradle b/usbSerialForAndroid/publishToMavenLocal.gradle index 3f66137..27c07d3 100644 --- a/usbSerialForAndroid/publishToMavenLocal.gradle +++ b/usbSerialForAndroid/publishToMavenLocal.gradle @@ -5,7 +5,7 @@ publishing { maven(MavenPublication) { groupId 'com.github.mik3y' artifactId 'usb-serial-for-android' - version '2.2.2a' + version '3.0.0beta' afterEvaluate { artifact androidSourcesJar artifact bundleReleaseAar diff --git a/usbSerialForAndroid/src/androidTest/java/com/hoho/android/usbserial/DeviceTest.java b/usbSerialForAndroid/src/androidTest/java/com/hoho/android/usbserial/DeviceTest.java index bee9139..ab07212 100644 --- a/usbSerialForAndroid/src/androidTest/java/com/hoho/android/usbserial/DeviceTest.java +++ b/usbSerialForAndroid/src/androidTest/java/com/hoho/android/usbserial/DeviceTest.java @@ -383,6 +383,44 @@ public class DeviceTest { assertThat("42000/8N1", data2, equalTo(buf2)); } } + if (usbSerialDriver instanceof FtdiSerialDriver) { + try { + usbParameters(183, 8, 1, UsbSerialPort.PARITY_NONE); + fail("baud rate to low expected"); + } catch (IOException ignored) { + } + usbParameters(184, 8, 1, UsbSerialPort.PARITY_NONE); + usbParameters( 960000, 8, 1, UsbSerialPort.PARITY_NONE); + usbParameters(1000000, 8, 1, UsbSerialPort.PARITY_NONE); + usbParameters(1043478, 8, 1, UsbSerialPort.PARITY_NONE); + usbParameters(1090909, 8, 1, UsbSerialPort.PARITY_NONE); + usbParameters(1142857, 8, 1, UsbSerialPort.PARITY_NONE); + usbParameters(1200000, 8, 1, UsbSerialPort.PARITY_NONE); + usbParameters(1263157, 8, 1, UsbSerialPort.PARITY_NONE); + usbParameters(1333333, 8, 1, UsbSerialPort.PARITY_NONE); + usbParameters(1411764, 8, 1, UsbSerialPort.PARITY_NONE); + usbParameters(1500000, 8, 1, UsbSerialPort.PARITY_NONE); + try { + usbParameters((int)(2000000/1.04), 8, 1, UsbSerialPort.PARITY_NONE); + fail("baud rate error expected"); + } catch (IOException ignored) { + } + usbParameters((int)(2000000/1.03), 8, 1, UsbSerialPort.PARITY_NONE); + usbParameters(2000000, 8, 1, UsbSerialPort.PARITY_NONE); + usbParameters((int)(2000000*1.03), 8, 1, UsbSerialPort.PARITY_NONE); + try { + usbParameters((int)(2000000*1.04), 8, 1, UsbSerialPort.PARITY_NONE); + fail("baud rate error expected"); + } catch (IOException ignored) { + } + usbParameters(2000000, 8, 1, UsbSerialPort.PARITY_NONE); + usbParameters(3000000, 8, 1, UsbSerialPort.PARITY_NONE); + try { + usbParameters(4000000, 8, 1, UsbSerialPort.PARITY_NONE); + fail("baud rate to high expected"); + } catch (IOException ignored) { + } + } { // non matching baud rate telnet.setParameters(19200, 8, 1, UsbSerialPort.PARITY_NONE); usb.setParameters(2400, 8, 1, UsbSerialPort.PARITY_NONE); @@ -1366,8 +1404,6 @@ public class DeviceTest { // control lines retained over close+open boolean inputRetained = inputLinesConnected; boolean outputRetained = true; - if(usb.serialDriver instanceof FtdiSerialDriver) - outputRetained = false; // todo usb.close(EnumSet.of(UsbWrapper.OpenCloseFlags.NO_CONTROL_LINE_INIT)); usb.open(EnumSet.of(UsbWrapper.OpenCloseFlags.NO_CONTROL_LINE_INIT, UsbWrapper.OpenCloseFlags.NO_IOMANAGER_THREAD)); usb.setParameters(19200, 8, 1, UsbSerialPort.PARITY_NONE); diff --git a/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/FtdiSerialDriver.java b/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/FtdiSerialDriver.java index bb60df9..62331da 100644 --- a/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/FtdiSerialDriver.java +++ b/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/FtdiSerialDriver.java @@ -1,5 +1,6 @@ /* Copyright 2011-2013 Google Inc. * Copyright 2013 mike wakerly + * Copyright 2020 kai morich * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -33,73 +34,22 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -/** - * A {@link CommonUsbSerialPort} implementation for a variety of FTDI devices - *

- * This driver is based on libftdi, and is - * copyright and subject to the following terms: +/* + * driver is implemented from various information scattered over FTDI documentation * - *

- *   Copyright (C) 2003 by Intra2net AG
+ * baud rate calculation https://www.ftdichip.com/Support/Documents/AppNotes/AN232B-05_BaudRates.pdf
+ * control bits https://www.ftdichip.com/Firmware/Precompiled/UM_VinculumFirmware_V205.pdf
+ * device type https://www.ftdichip.com/Support/Documents/AppNotes/AN_233_Java_D2XX_for_Android_API_User_Manual.pdf -> bvdDevice
  *
- *   This program is free software; you can redistribute it and/or modify
- *   it under the terms of the GNU Lesser General Public License
- *   version 2.1 as published by the Free Software Foundation;
- *
- *   opensource@intra2net.com
- *   http://www.intra2net.com/en/developer/libftdi
- * 
- * - *

- *

- * Some FTDI devices have not been tested; see later listing of supported and - * unsupported devices. Devices listed as "supported" support the following - * features: - *

    - *
  • Read and write of serial data (see - * {@link CommonUsbSerialPort#read(byte[], int)} and - * {@link CommonUsbSerialPort#write(byte[], int)}.
  • - *
  • Setting serial line parameters (see - * {@link CommonUsbSerialPort#setParameters(int, int, int, int)}.
  • - *
- *

- *

- * Supported and tested devices: - *

    - *
  • {@value DeviceType#TYPE_R}
  • - *
  • {@value DeviceType#TYPE_2232H}
  • - *
  • {@value DeviceType#TYPE_4232H}
  • - *
- *

- *

- * Unsupported but possibly working devices (please contact the author with - * feedback or patches): - *

    - *
  • {@value DeviceType#TYPE_2232C}
  • - *
  • {@value DeviceType#TYPE_AM}
  • - *
  • {@value DeviceType#TYPE_BM}
  • - *
- *

- * - * @author mike wakerly (opensource@hoho.com) - * @see USB Serial - * for Android project page - * @see FTDI Homepage - * @see libftdi */ + public class FtdiSerialDriver implements UsbSerialDriver { + private static final String TAG = FtdiSerialPort.class.getSimpleName(); + private final UsbDevice mDevice; private final List mPorts; - /** - * FTDI chip types. - */ - private static enum DeviceType { - TYPE_BM, TYPE_AM, TYPE_2232C, TYPE_R, TYPE_2232H, TYPE_4232H; - } - public FtdiSerialDriver(UsbDevice device) { mDevice = device; mPorts = new ArrayList<>(); @@ -120,96 +70,35 @@ public class FtdiSerialDriver implements UsbSerialDriver { public class FtdiSerialPort extends CommonUsbSerialPort { - private static final int USB_TYPE_STANDARD = 0x00 << 5; - private static final int USB_TYPE_CLASS = 0x00 << 5; - private static final int USB_TYPE_VENDOR = 0x00 << 5; - private static final int USB_TYPE_RESERVED = 0x00 << 5; - - private static final int USB_RECIP_DEVICE = 0x00; - private static final int USB_RECIP_INTERFACE = 0x01; - private static final int USB_RECIP_ENDPOINT = 0x02; - private static final int USB_RECIP_OTHER = 0x03; - - private static final int USB_ENDPOINT_IN = 0x80; - private static final int USB_ENDPOINT_OUT = 0x00; - private static final int USB_WRITE_TIMEOUT_MILLIS = 5000; - private static final int USB_READ_TIMEOUT_MILLIS = 5000; + private static final int READ_HEADER_LENGTH = 2; // contains MODEM_STATUS - // From ftdi.h - /** - * Reset the port. - */ - private static final int SIO_RESET_REQUEST = 0; + private static final int REQTYPE_HOST_TO_DEVICE = UsbConstants.USB_TYPE_VENDOR | UsbConstants.USB_DIR_OUT; + private static final int REQTYPE_DEVICE_TO_HOST = UsbConstants.USB_TYPE_VENDOR | UsbConstants.USB_DIR_IN; - /** - * Set the modem control register. - */ - private static final int SIO_MODEM_CTRL_REQUEST = 1; + private static final int RESET_REQUEST = 0; + private static final int MODEM_CONTROL_REQUEST = 1; + private static final int SET_BAUD_RATE_REQUEST = 3; + private static final int SET_DATA_REQUEST = 4; + private static final int GET_MODEM_STATUS_REQUEST = 5; + private static final int SET_LATENCY_TIMER_REQUEST = 9; + private static final int GET_LATENCY_TIMER_REQUEST = 10; - /** - * Set flow control register. - */ - private static final int SIO_SET_FLOW_CTRL_REQUEST = 2; + private static final int MODEM_CONTROL_DTR_ENABLE = 0x0101; + private static final int MODEM_CONTROL_DTR_DISABLE = 0x0100; + private static final int MODEM_CONTROL_RTS_ENABLE = 0x0202; + private static final int MODEM_CONTROL_RTS_DISABLE = 0x0200; + private static final int MODEM_STATUS_CTS = 0x10; + private static final int MODEM_STATUS_DSR = 0x20; + private static final int MODEM_STATUS_RI = 0x40; + private static final int MODEM_STATUS_CD = 0x80; + private static final int RESET_ALL = 0; + private static final int RESET_PURGE_RX = 1; + private static final int RESET_PURGE_TX = 2; - private static final int SIO_SET_DTR_HIGH = 0x0101; - private static final int SIO_SET_DTR_LOW = 0x0100; - private static final int SIO_SET_RTS_HIGH = 0x0202; - private static final int SIO_SET_RTS_LOW = 0x0200; - - /** - * Set baud rate. - */ - private static final int SIO_SET_BAUD_RATE_REQUEST = 3; - - /** - * Set the data characteristics of the port. - */ - private static final int SIO_SET_DATA_REQUEST = 4; - - private static final int SIO_RESET_SIO = 0; - private static final int SIO_RESET_PURGE_RX = 1; // RX @ FTDI device = write @ usb-serial-for-android library - private static final int SIO_RESET_PURGE_TX = 2; - - /** - * Get modem status. - */ - private static final int SIO_GET_MODEM_STATUS_REQUEST = 5; - - private static final int SIO_MODEM_STATUS_CTS = 0x10; - private static final int SIO_MODEM_STATUS_DSR = 0x20; - private static final int SIO_MODEM_STATUS_RI = 0x40; - private static final int SIO_MODEM_STATUS_RLSD = 0x80; - - /** - * Set the latency timer. - */ - private static final int SIO_SET_LATENCY_TIMER_REQUEST = 9; - - /** - * Get the latency timer. - */ - private static final int SIO_GET_LATENCY_TIMER_REQUEST = 10; - - private static final int FTDI_DEVICE_OUT_REQTYPE = - UsbConstants.USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_OUT; - - private static final int FTDI_DEVICE_IN_REQTYPE = - UsbConstants.USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_IN; - - /** - * Length of the modem status header, transmitted with every read. - */ - private static final int MODEM_STATUS_HEADER_LENGTH = 2; - - private final String TAG = FtdiSerialDriver.class.getSimpleName(); - - private DeviceType mType; - - private int mIndex = 0; - - private boolean mDtrState = false; - private boolean mRtsState = false; + private boolean baudRateWithPort = false; + private boolean dtr = false; + private boolean rts = false; public FtdiSerialPort(UsbDevice device, int portNumber) { super(device, portNumber); @@ -220,95 +109,38 @@ public class FtdiSerialDriver implements UsbSerialDriver { return FtdiSerialDriver.this; } - /** - * Filter FTDI status bytes from buffer - * @param buffer The source buffer (which contains status bytes) - * buffer The destination buffer to write the status bytes into (can be src) - * @param totalBytesRead Number of bytes read to src - * @return The number of payload bytes - */ - @Override - protected int readFilter(byte[] buffer, int totalBytesRead) throws IOException { - if (totalBytesRead < MODEM_STATUS_HEADER_LENGTH) { - throw new IOException("Expected at least " + MODEM_STATUS_HEADER_LENGTH + " bytes"); - } - int maxPacketSize = mReadEndpoint.getMaxPacketSize(); - final int packetsCount = (totalBytesRead + maxPacketSize -1 )/ maxPacketSize; - for (int packetIdx = 0; packetIdx < packetsCount; ++packetIdx) { - final int count = (packetIdx == (packetsCount - 1)) - ? totalBytesRead - packetIdx * maxPacketSize - MODEM_STATUS_HEADER_LENGTH - : maxPacketSize - MODEM_STATUS_HEADER_LENGTH; - if (count > 0) { - System.arraycopy(buffer, packetIdx * maxPacketSize + MODEM_STATUS_HEADER_LENGTH, - buffer, packetIdx * (maxPacketSize - MODEM_STATUS_HEADER_LENGTH), - count); - } - } - return totalBytesRead - (packetsCount * 2); - } - - private void reset() throws IOException { - // TODO(mikey): autodetect. - mType = DeviceType.TYPE_R; - if(mDevice.getInterfaceCount() > 1) { - mIndex = mPortNumber + 1; - if (mDevice.getInterfaceCount() == 2) - mType = DeviceType.TYPE_2232H; - if (mDevice.getInterfaceCount() == 4) - mType = DeviceType.TYPE_4232H; - } - - int result = mConnection.controlTransfer(FTDI_DEVICE_OUT_REQTYPE, SIO_RESET_REQUEST, - SIO_RESET_SIO, mIndex, null, 0, USB_WRITE_TIMEOUT_MILLIS); - if (result != 0) { - throw new IOException("Reset failed: result=" + result); - } - mDtrState = false; - mRtsState = false; - } - - public void setLatencyTimer(int latencyTime) throws IOException { - int result = mConnection.controlTransfer(FTDI_DEVICE_OUT_REQTYPE, SIO_SET_LATENCY_TIMER_REQUEST, - latencyTime, mIndex, null, 0, USB_WRITE_TIMEOUT_MILLIS); - if (result != 0) { - throw new IOException("Set latency timer failed: result=" + result); - } - } - - public int getLatencyTimer() throws IOException { - byte[] data = new byte[1]; - int result = mConnection.controlTransfer(FTDI_DEVICE_IN_REQTYPE, SIO_GET_LATENCY_TIMER_REQUEST, - 0, mIndex, data, data.length, USB_WRITE_TIMEOUT_MILLIS); - if (result != 1) { - throw new IOException("Get latency timer failed: result=" + result); - } - return data[0]; - } - - private int getModemStatus() throws IOException { - byte[] data = new byte[2]; - int result = mConnection.controlTransfer(FTDI_DEVICE_IN_REQTYPE, SIO_GET_MODEM_STATUS_REQUEST, - 0, mIndex, data, data.length, USB_WRITE_TIMEOUT_MILLIS); - if (result != 2) { - throw new IOException("Get modem statusfailed: result=" + result); - } - return data[0]; - } @Override protected void openInt(UsbDeviceConnection connection) throws IOException { - if (connection.claimInterface(mDevice.getInterface(mPortNumber), true)) { - Log.d(TAG, "claimInterface " + mPortNumber + " SUCCESS"); - } else { - throw new IOException("Error claiming interface " + mPortNumber); + if (!connection.claimInterface(mDevice.getInterface(mPortNumber), true)) { + throw new IOException("Could not claim interface " + mPortNumber); } if (mDevice.getInterface(mPortNumber).getEndpointCount() < 2) { - throw new IOException("Insufficient number of endpoints (" + - mDevice.getInterface(mPortNumber).getEndpointCount() + ")"); + throw new IOException("Not enough endpoints"); } mReadEndpoint = mDevice.getInterface(mPortNumber).getEndpoint(0); mWriteEndpoint = mDevice.getInterface(mPortNumber).getEndpoint(1); - reset(); + + int result = mConnection.controlTransfer(REQTYPE_HOST_TO_DEVICE, RESET_REQUEST, + RESET_ALL, mPortNumber+1, null, 0, USB_WRITE_TIMEOUT_MILLIS); + if (result != 0) { + throw new IOException("Reset failed: result=" + result); + } + result = mConnection.controlTransfer(REQTYPE_HOST_TO_DEVICE, MODEM_CONTROL_REQUEST, + (dtr ? MODEM_CONTROL_DTR_ENABLE : MODEM_CONTROL_DTR_DISABLE) | + (rts ? MODEM_CONTROL_RTS_ENABLE : MODEM_CONTROL_RTS_DISABLE), + mPortNumber+1, null, 0, USB_WRITE_TIMEOUT_MILLIS); + if (result != 0) { + throw new IOException("Init RTS,DTR failed: result=" + result); + } + + // mDevice.getVersion() would require API 23 + byte[] rawDescriptors = connection.getRawDescriptors(); + if(rawDescriptors == null || rawDescriptors.length < 14) { + throw new IOException("Could not get device descriptors"); + } + int deviceType = rawDescriptors[13]; + baudRateWithPort = deviceType == 7 || deviceType == 8 || deviceType == 9; // ...H devices } @Override @@ -318,18 +150,69 @@ public class FtdiSerialDriver implements UsbSerialDriver { } catch(Exception ignored) {} } - private int setBaudRate(int baudRate) throws IOException { - long[] vals = convertBaudrate(baudRate); - long actualBaudrate = vals[0]; - long index = vals[1]; - long value = vals[2]; - int result = mConnection.controlTransfer(FTDI_DEVICE_OUT_REQTYPE, - SIO_SET_BAUD_RATE_REQUEST, (int) value, (int) index, - null, 0, USB_WRITE_TIMEOUT_MILLIS); + @Override + protected int readFilter(byte[] buffer, int totalBytesRead) throws IOException { + final int maxPacketSize = mReadEndpoint.getMaxPacketSize(); + int destPos = 0; + for(int srcPos = 0; srcPos < totalBytesRead; srcPos += maxPacketSize) { + int length = Math.min(srcPos + maxPacketSize, totalBytesRead) - (srcPos + READ_HEADER_LENGTH); + if (length < 0) + throw new IOException("Expected at least " + READ_HEADER_LENGTH + " bytes"); + System.arraycopy(buffer, srcPos + READ_HEADER_LENGTH, buffer, destPos, length); + destPos += length; + } + return destPos; + } + + private void setBaudrate(int baudRate) throws IOException { + int divisor, subdivisor, effectiveBaudRate; + if (baudRate > 3500000) { + throw new IOException("Baud rate to high"); + } else if(baudRate >= 2500000) { + divisor = 0; + subdivisor = 0; + effectiveBaudRate = 3000000; + } else if(baudRate >= 1750000) { + divisor = 1; + subdivisor = 0; + effectiveBaudRate = 2000000; + } else { + divisor = (24000000 << 1) / baudRate; + divisor = (divisor + 1) >> 1; // round + subdivisor = divisor & 0x07; + divisor >>= 3; + if (divisor > 0x3fff) // exceeds bit 13 at 183 baud + throw new IOException("Baud rate to low"); + effectiveBaudRate = (24000000 << 1) / ((divisor << 3) + subdivisor); + effectiveBaudRate = (effectiveBaudRate +1) >> 1; + } + double baudRateError = Math.abs(1.0 - (effectiveBaudRate / (double)baudRate)); + if(baudRateError >= 0.031) // can happen only > 1.5Mbaud + throw new IOException(String.format("baud rate deviation %.1f%% is higher than allowed 3%%", baudRateError*100)); + int value = divisor; + int index = 0; + switch(subdivisor) { + case 0: break; // 16,15,14 = 000 - sub-integer divisor = 0 + case 4: value |= 0x4000; break; // 16,15,14 = 001 - sub-integer divisor = 0.5 + case 2: value |= 0x8000; break; // 16,15,14 = 010 - sub-integer divisor = 0.25 + case 1: value |= 0xc000; break; // 16,15,14 = 011 - sub-integer divisor = 0.125 + case 3: value |= 0x0000; index |= 1; break; // 16,15,14 = 100 - sub-integer divisor = 0.375 + case 5: value |= 0x4000; index |= 1; break; // 16,15,14 = 101 - sub-integer divisor = 0.625 + case 6: value |= 0x8000; index |= 1; break; // 16,15,14 = 110 - sub-integer divisor = 0.75 + case 7: value |= 0xc000; index |= 1; break; // 16,15,14 = 111 - sub-integer divisor = 0.875 + } + if(baudRateWithPort) { + index <<= 8; + index |= mPortNumber+1; + } + Log.d(TAG, String.format("baud rate=%d, effective=%d, error=%.1f%%, value=0x%04x, index=0x%04x, divisor=%d, subdivisor=%d", + baudRate, effectiveBaudRate, baudRateError*100, value, index, divisor, subdivisor)); + + int result = mConnection.controlTransfer(REQTYPE_HOST_TO_DEVICE, SET_BAUD_RATE_REQUEST, + value, index, null, 0, USB_WRITE_TIMEOUT_MILLIS); if (result != 0) { throw new IOException("Setting baudrate failed: result=" + result); } - return (int) actualBaudrate; } @Override @@ -337,7 +220,7 @@ public class FtdiSerialDriver implements UsbSerialDriver { if(baudRate <= 0) { throw new IllegalArgumentException("Invalid baud rate: " + baudRate); } - setBaudRate(baudRate); + setBaudrate(baudRate); int config = 0; switch (dataBits) { @@ -354,19 +237,18 @@ public class FtdiSerialDriver implements UsbSerialDriver { switch (parity) { case PARITY_NONE: - config |= (0x00 << 8); break; case PARITY_ODD: - config |= (0x01 << 8); + config |= 0x100; break; case PARITY_EVEN: - config |= (0x02 << 8); + config |= 0x200; break; case PARITY_MARK: - config |= (0x03 << 8); + config |= 0x300; break; case PARITY_SPACE: - config |= (0x04 << 8); + config |= 0x400; break; default: throw new IllegalArgumentException("Invalid parity: " + parity); @@ -374,170 +256,93 @@ public class FtdiSerialDriver implements UsbSerialDriver { switch (stopBits) { case STOPBITS_1: - config |= (0x00 << 11); break; case STOPBITS_1_5: throw new UnsupportedOperationException("Unsupported stop bits: 1.5"); case STOPBITS_2: - config |= (0x02 << 11); + config |= 0x1000; break; default: throw new IllegalArgumentException("Invalid stop bits: " + stopBits); } - int result = mConnection.controlTransfer(FTDI_DEVICE_OUT_REQTYPE, - SIO_SET_DATA_REQUEST, config, mIndex, - null, 0, USB_WRITE_TIMEOUT_MILLIS); + int result = mConnection.controlTransfer(REQTYPE_HOST_TO_DEVICE, SET_DATA_REQUEST, + config, mPortNumber+1,null, 0, USB_WRITE_TIMEOUT_MILLIS); if (result != 0) { throw new IOException("Setting parameters failed: result=" + result); } } - private long[] convertBaudrate(int baudrate) { - // TODO(mikey): Braindead transcription of libfti method. Clean up, - // using more idiomatic Java where possible. - int divisor = 24000000 / baudrate; - int bestDivisor = 0; - int bestBaud = 0; - int bestBaudDiff = 0; - int fracCode[] = { - 0, 3, 2, 4, 1, 5, 6, 7 - }; - - for (int i = 0; i < 2; i++) { - int tryDivisor = divisor + i; - int baudEstimate; - int baudDiff; - - if (tryDivisor <= 8) { - // Round up to minimum supported divisor - tryDivisor = 8; - } else if (mType != DeviceType.TYPE_AM && tryDivisor < 12) { - // BM doesn't support divisors 9 through 11 inclusive - tryDivisor = 12; - } else if (divisor < 16) { - // AM doesn't support divisors 9 through 15 inclusive - tryDivisor = 16; - } else { - if (mType == DeviceType.TYPE_AM) { - // TODO - } else { - if (tryDivisor > 0x1FFFF) { - // Round down to maximum supported divisor value (for - // BM) - tryDivisor = 0x1FFFF; - } - } - } - - // Get estimated baud rate (to nearest integer) - baudEstimate = (24000000 + (tryDivisor / 2)) / tryDivisor; - - // Get absolute difference from requested baud rate - if (baudEstimate < baudrate) { - baudDiff = baudrate - baudEstimate; - } else { - baudDiff = baudEstimate - baudrate; - } - - if (i == 0 || baudDiff < bestBaudDiff) { - // Closest to requested baud rate so far - bestDivisor = tryDivisor; - bestBaud = baudEstimate; - bestBaudDiff = baudDiff; - if (baudDiff == 0) { - // Spot on! No point trying - break; - } - } + private int getStatus() throws IOException { + byte[] data = new byte[2]; + int result = mConnection.controlTransfer(REQTYPE_DEVICE_TO_HOST, GET_MODEM_STATUS_REQUEST, + 0, mPortNumber+1, data, data.length, USB_WRITE_TIMEOUT_MILLIS); + if (result != 2) { + throw new IOException("Get modem status failed: result=" + result); } - - // Encode the best divisor value - long encodedDivisor = (bestDivisor >> 3) | (fracCode[bestDivisor & 7] << 14); - // Deal with special cases for encoded value - if (encodedDivisor == 1) { - encodedDivisor = 0; // 3000000 baud - } else if (encodedDivisor == 0x4001) { - encodedDivisor = 1; // 2000000 baud (BM only) - } - - // Split into "value" and "index" values - long value = encodedDivisor & 0xFFFF; - long index; - if (mType == DeviceType.TYPE_2232C || mType == DeviceType.TYPE_2232H - || mType == DeviceType.TYPE_4232H) { - index = (encodedDivisor >> 8) & 0xff00; - index |= mIndex; - } else { - index = (encodedDivisor >> 16) & 0xffff; - } - - // Return the nearest baud rate - return new long[] { - bestBaud, index, value - }; + return data[0]; } @Override public boolean getCD() throws IOException { - return (getModemStatus() & SIO_MODEM_STATUS_RLSD) != 0; + return (getStatus() & MODEM_STATUS_CD) != 0; } @Override public boolean getCTS() throws IOException { - return (getModemStatus() & SIO_MODEM_STATUS_CTS) != 0; + return (getStatus() & MODEM_STATUS_CTS) != 0; } @Override public boolean getDSR() throws IOException { - return (getModemStatus() & SIO_MODEM_STATUS_DSR) != 0; + return (getStatus() & MODEM_STATUS_DSR) != 0; } @Override public boolean getDTR() throws IOException { - return mDtrState; + return dtr; } @Override public void setDTR(boolean value) throws IOException { - int result = mConnection.controlTransfer(FTDI_DEVICE_OUT_REQTYPE, SIO_MODEM_CTRL_REQUEST, - value ? SIO_SET_DTR_HIGH : SIO_SET_DTR_LOW, mIndex, null, 0, USB_WRITE_TIMEOUT_MILLIS); + int result = mConnection.controlTransfer(REQTYPE_HOST_TO_DEVICE, MODEM_CONTROL_REQUEST, + value ? MODEM_CONTROL_DTR_ENABLE : MODEM_CONTROL_DTR_DISABLE, mPortNumber+1, null, 0, USB_WRITE_TIMEOUT_MILLIS); if (result != 0) { throw new IOException("Set DTR failed: result=" + result); } - mDtrState = value; + dtr = value; } @Override public boolean getRI() throws IOException { - return (getModemStatus() & SIO_MODEM_STATUS_RI) != 0; + return (getStatus() & MODEM_STATUS_RI) != 0; } @Override public boolean getRTS() throws IOException { - return mRtsState; + return rts; } @Override public void setRTS(boolean value) throws IOException { - int result = mConnection.controlTransfer(FTDI_DEVICE_OUT_REQTYPE, SIO_MODEM_CTRL_REQUEST, - value ? SIO_SET_RTS_HIGH : SIO_SET_RTS_LOW, mIndex, null, 0, USB_WRITE_TIMEOUT_MILLIS); + int result = mConnection.controlTransfer(REQTYPE_HOST_TO_DEVICE, MODEM_CONTROL_REQUEST, + value ? MODEM_CONTROL_RTS_ENABLE : MODEM_CONTROL_RTS_DISABLE, mPortNumber+1, null, 0, USB_WRITE_TIMEOUT_MILLIS); if (result != 0) { throw new IOException("Set DTR failed: result=" + result); } - mRtsState = value; + rts = value; } @Override public EnumSet getControlLines() throws IOException { - int status = getModemStatus(); + int status = getStatus(); EnumSet set = EnumSet.noneOf(ControlLine.class); - if(mRtsState) set.add(ControlLine.RTS); - if((status & SIO_MODEM_STATUS_CTS) != 0) set.add(ControlLine.CTS); - if(mDtrState) set.add(ControlLine.DTR); - if((status & SIO_MODEM_STATUS_DSR) != 0) set.add(ControlLine.DSR); - if((status & SIO_MODEM_STATUS_RLSD) != 0) set.add(ControlLine.CD); - if((status & SIO_MODEM_STATUS_RI) != 0) set.add(ControlLine.RI); + if(rts) set.add(ControlLine.RTS); + if((status & MODEM_STATUS_CTS) != 0) set.add(ControlLine.CTS); + if(dtr) set.add(ControlLine.DTR); + if((status & MODEM_STATUS_DSR) != 0) set.add(ControlLine.DSR); + if((status & MODEM_STATUS_CD) != 0) set.add(ControlLine.CD); + if((status & MODEM_STATUS_RI) != 0) set.add(ControlLine.RI); return set; } @@ -549,22 +354,41 @@ public class FtdiSerialDriver implements UsbSerialDriver { @Override public boolean purgeHwBuffers(boolean purgeWriteBuffers, boolean purgeReadBuffers) throws IOException { if (purgeWriteBuffers) { - int result = mConnection.controlTransfer(FTDI_DEVICE_OUT_REQTYPE, SIO_RESET_REQUEST, - SIO_RESET_PURGE_RX, mIndex, null, 0, USB_WRITE_TIMEOUT_MILLIS); + int result = mConnection.controlTransfer(REQTYPE_HOST_TO_DEVICE, RESET_REQUEST, + RESET_PURGE_RX, mPortNumber+1, null, 0, USB_WRITE_TIMEOUT_MILLIS); if (result != 0) { throw new IOException("purge write buffer failed: result=" + result); } } if (purgeReadBuffers) { - int result = mConnection.controlTransfer(FTDI_DEVICE_OUT_REQTYPE, SIO_RESET_REQUEST, - SIO_RESET_PURGE_TX, mIndex, null, 0, USB_WRITE_TIMEOUT_MILLIS); + int result = mConnection.controlTransfer(REQTYPE_HOST_TO_DEVICE, RESET_REQUEST, + RESET_PURGE_TX, mPortNumber+1, null, 0, USB_WRITE_TIMEOUT_MILLIS); if (result != 0) { throw new IOException("purge read buffer failed: result=" + result); } } return true; } + + public void setLatencyTimer(int latencyTime) throws IOException { + int result = mConnection.controlTransfer(REQTYPE_HOST_TO_DEVICE, SET_LATENCY_TIMER_REQUEST, + latencyTime, mPortNumber+1, null, 0, USB_WRITE_TIMEOUT_MILLIS); + if (result != 0) { + throw new IOException("Set latency timer failed: result=" + result); + } + } + + public int getLatencyTimer() throws IOException { + byte[] data = new byte[1]; + int result = mConnection.controlTransfer(REQTYPE_DEVICE_TO_HOST, GET_LATENCY_TIMER_REQUEST, + 0, mPortNumber+1, data, data.length, USB_WRITE_TIMEOUT_MILLIS); + if (result != 1) { + throw new IOException("Get latency timer failed: result=" + result); + } + return data[0]; + } + } public static Map getSupportedDevices() { @@ -575,7 +399,6 @@ public class FtdiSerialDriver implements UsbSerialDriver { UsbId.FTDI_FT232H, UsbId.FTDI_FT2232H, UsbId.FTDI_FT4232H, - UsbId.FTDI_FT231X, }); return supportedDevices; } diff --git a/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/UsbId.java b/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/UsbId.java index 35a501c..d34bbe8 100644 --- a/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/UsbId.java +++ b/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/UsbId.java @@ -36,7 +36,6 @@ public final class UsbId { public static final int FTDI_FT2232H = 0x6010; public static final int FTDI_FT4232H = 0x6011; public static final int FTDI_FT232H = 0x6014; - public static final int FTDI_FT231X = 0x6015; public static final int VENDOR_ATMEL = 0x03EB; public static final int ATMEL_LUFA_CDC_DEMO_APP = 0x2044; From 2d13b90f59eec45adadaeed1aa593fe9a0d7540b Mon Sep 17 00:00:00 2001 From: kai-morich Date: Mon, 27 Jul 2020 17:35:14 +0200 Subject: [PATCH 2/4] move from LGPL to MIT license (#244) moving away from LGPL possible, as the FTDI driver is rewritten and not based any more on LGPL code from libftdi. --- LICENSE.txt | 470 +----------------- README.md | 9 - .../usbserial/driver/CdcAcmSerialDriver.java | 15 - .../usbserial/driver/Ch34xSerialDriver.java | 15 - .../usbserial/driver/CommonUsbSerialPort.java | 15 - .../usbserial/driver/Cp21xxSerialDriver.java | 15 - .../usbserial/driver/FtdiSerialDriver.java | 15 - .../android/usbserial/driver/ProbeTable.java | 15 - .../driver/ProlificSerialDriver.java | 26 +- .../hoho/android/usbserial/driver/UsbId.java | 15 - .../usbserial/driver/UsbSerialDriver.java | 15 - .../usbserial/driver/UsbSerialPort.java | 15 - .../usbserial/driver/UsbSerialProber.java | 15 - .../util/SerialInputOutputManager.java | 15 - 14 files changed, 22 insertions(+), 648 deletions(-) diff --git a/LICENSE.txt b/LICENSE.txt index 178db14..98e65da 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -1,456 +1,22 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 +MIT License - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. +Copyright (c) 2011-2013 Google Inc. +Copyright (c) 2013 Mike Wakerly -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - Preamble +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. - - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. - - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. - - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. - - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. - - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. - - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. - - NO WARRANTY - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md index ac84f5c..9b9dbb0 100644 --- a/README.md +++ b/README.md @@ -149,15 +149,6 @@ and devices implementing the CDC/ACM protocol like * BBC micro:bit using ARM mbed DAPLink firmware * ... -## Author, License, and Copyright - -usb-serial-for-android is written and maintained by *mike wakerly* and *kai morich* - -This library is licensed under *LGPL Version 2.1*. Please see LICENSE.txt for the -complete license. - -Copyright 2011-2012, Google Inc. All Rights Reserved. - ## Help & Discussion For common problems, see the diff --git a/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/CdcAcmSerialDriver.java b/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/CdcAcmSerialDriver.java index f646905..ef9adbe 100644 --- a/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/CdcAcmSerialDriver.java +++ b/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/CdcAcmSerialDriver.java @@ -1,21 +1,6 @@ /* Copyright 2011-2013 Google Inc. * Copyright 2013 mike wakerly * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, - * USA. - * * Project home page: https://github.com/mik3y/usb-serial-for-android */ diff --git a/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/Ch34xSerialDriver.java b/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/Ch34xSerialDriver.java index d6acb7b..7555bd9 100644 --- a/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/Ch34xSerialDriver.java +++ b/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/Ch34xSerialDriver.java @@ -1,19 +1,4 @@ /* Copyright 2014 Andreas Butti - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, - * USA. * * Project home page: https://github.com/mik3y/usb-serial-for-android */ diff --git a/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/CommonUsbSerialPort.java b/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/CommonUsbSerialPort.java index 40d8c5c..47e19f6 100644 --- a/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/CommonUsbSerialPort.java +++ b/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/CommonUsbSerialPort.java @@ -1,21 +1,6 @@ /* Copyright 2011-2013 Google Inc. * Copyright 2013 mike wakerly * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, - * USA. - * * Project home page: https://github.com/mik3y/usb-serial-for-android */ diff --git a/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/Cp21xxSerialDriver.java b/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/Cp21xxSerialDriver.java index 2d2d956..bab24eb 100644 --- a/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/Cp21xxSerialDriver.java +++ b/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/Cp21xxSerialDriver.java @@ -1,21 +1,6 @@ /* Copyright 2011-2013 Google Inc. * Copyright 2013 mike wakerly * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, - * USA. - * * Project home page: https://github.com/mik3y/usb-serial-for-android */ diff --git a/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/FtdiSerialDriver.java b/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/FtdiSerialDriver.java index 62331da..81fe9bd 100644 --- a/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/FtdiSerialDriver.java +++ b/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/FtdiSerialDriver.java @@ -2,21 +2,6 @@ * Copyright 2013 mike wakerly * Copyright 2020 kai morich * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, - * USA. - * * Project home page: https://github.com/mik3y/usb-serial-for-android */ diff --git a/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/ProbeTable.java b/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/ProbeTable.java index 4837366..bc2f310 100644 --- a/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/ProbeTable.java +++ b/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/ProbeTable.java @@ -1,21 +1,6 @@ /* Copyright 2011-2013 Google Inc. * Copyright 2013 mike wakerly * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, - * USA. - * * Project home page: https://github.com/mik3y/usb-serial-for-android */ diff --git a/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/ProlificSerialDriver.java b/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/ProlificSerialDriver.java index 9229b52..ec16f4c 100644 --- a/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/ProlificSerialDriver.java +++ b/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/ProlificSerialDriver.java @@ -1,30 +1,12 @@ -/* This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. +/* + * Ported to usb-serial-for-android by Felix Hädicke * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, - * USA. + * Based on the pyprolific driver written by Emmanuel Blot + * See https://github.com/eblot/pyftdi * * Project home page: https://github.com/mik3y/usb-serial-for-android */ -/* - * Ported to usb-serial-for-android - * by Felix Hädicke - * - * Based on the pyprolific driver written - * by Emmanuel Blot - * See https://github.com/eblot/pyftdi - */ - package com.hoho.android.usbserial.driver; import android.hardware.usb.UsbConstants; diff --git a/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/UsbId.java b/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/UsbId.java index d34bbe8..9e289d7 100644 --- a/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/UsbId.java +++ b/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/UsbId.java @@ -1,21 +1,6 @@ /* Copyright 2011-2013 Google Inc. * Copyright 2013 mike wakerly * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, - * USA. - * * Project home page: https://github.com/mik3y/usb-serial-for-android */ diff --git a/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/UsbSerialDriver.java b/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/UsbSerialDriver.java index 9130d97..bb1f0ff 100644 --- a/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/UsbSerialDriver.java +++ b/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/UsbSerialDriver.java @@ -1,21 +1,6 @@ /* Copyright 2011-2013 Google Inc. * Copyright 2013 mike wakerly * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, - * USA. - * * Project home page: https://github.com/mik3y/usb-serial-for-android */ diff --git a/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/UsbSerialPort.java b/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/UsbSerialPort.java index 0a71d8a..75aa304 100644 --- a/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/UsbSerialPort.java +++ b/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/UsbSerialPort.java @@ -1,21 +1,6 @@ /* Copyright 2011-2013 Google Inc. * Copyright 2013 mike wakerly * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, - * USA. - * * Project home page: https://github.com/mik3y/usb-serial-for-android */ diff --git a/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/UsbSerialProber.java b/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/UsbSerialProber.java index 72d3534..854d019 100644 --- a/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/UsbSerialProber.java +++ b/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/UsbSerialProber.java @@ -1,21 +1,6 @@ /* Copyright 2011-2013 Google Inc. * Copyright 2013 mike wakerly * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, - * USA. - * * Project home page: https://github.com/mik3y/usb-serial-for-android */ diff --git a/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/util/SerialInputOutputManager.java b/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/util/SerialInputOutputManager.java index e60a1e9..c004629 100644 --- a/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/util/SerialInputOutputManager.java +++ b/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/util/SerialInputOutputManager.java @@ -1,21 +1,6 @@ /* Copyright 2011-2013 Google Inc. * Copyright 2013 mike wakerly * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, - * USA. - * * Project home page: https://github.com/mik3y/usb-serial-for-android */ From 954295456c15a11ec0d2caf55f2844e97fb94f48 Mon Sep 17 00:00:00 2001 From: kai-morich Date: Thu, 30 Jul 2020 17:50:39 +0200 Subject: [PATCH 3/4] rebase new FTDI baudrate test --- .../hoho/android/usbserial/DeviceTest.java | 42 +++++++++---------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/usbSerialForAndroid/src/androidTest/java/com/hoho/android/usbserial/DeviceTest.java b/usbSerialForAndroid/src/androidTest/java/com/hoho/android/usbserial/DeviceTest.java index ab07212..1fe1917 100644 --- a/usbSerialForAndroid/src/androidTest/java/com/hoho/android/usbserial/DeviceTest.java +++ b/usbSerialForAndroid/src/androidTest/java/com/hoho/android/usbserial/DeviceTest.java @@ -383,40 +383,40 @@ public class DeviceTest { assertThat("42000/8N1", data2, equalTo(buf2)); } } - if (usbSerialDriver instanceof FtdiSerialDriver) { + if (usb.serialDriver instanceof FtdiSerialDriver) { try { - usbParameters(183, 8, 1, UsbSerialPort.PARITY_NONE); + usb.setParameters(183, 8, 1, UsbSerialPort.PARITY_NONE); fail("baud rate to low expected"); } catch (IOException ignored) { } - usbParameters(184, 8, 1, UsbSerialPort.PARITY_NONE); - usbParameters( 960000, 8, 1, UsbSerialPort.PARITY_NONE); - usbParameters(1000000, 8, 1, UsbSerialPort.PARITY_NONE); - usbParameters(1043478, 8, 1, UsbSerialPort.PARITY_NONE); - usbParameters(1090909, 8, 1, UsbSerialPort.PARITY_NONE); - usbParameters(1142857, 8, 1, UsbSerialPort.PARITY_NONE); - usbParameters(1200000, 8, 1, UsbSerialPort.PARITY_NONE); - usbParameters(1263157, 8, 1, UsbSerialPort.PARITY_NONE); - usbParameters(1333333, 8, 1, UsbSerialPort.PARITY_NONE); - usbParameters(1411764, 8, 1, UsbSerialPort.PARITY_NONE); - usbParameters(1500000, 8, 1, UsbSerialPort.PARITY_NONE); + usb.setParameters(184, 8, 1, UsbSerialPort.PARITY_NONE); + usb.setParameters( 960000, 8, 1, UsbSerialPort.PARITY_NONE); + usb.setParameters(1000000, 8, 1, UsbSerialPort.PARITY_NONE); + usb.setParameters(1043478, 8, 1, UsbSerialPort.PARITY_NONE); + usb.setParameters(1090909, 8, 1, UsbSerialPort.PARITY_NONE); + usb.setParameters(1142857, 8, 1, UsbSerialPort.PARITY_NONE); + usb.setParameters(1200000, 8, 1, UsbSerialPort.PARITY_NONE); + usb.setParameters(1263157, 8, 1, UsbSerialPort.PARITY_NONE); + usb.setParameters(1333333, 8, 1, UsbSerialPort.PARITY_NONE); + usb.setParameters(1411764, 8, 1, UsbSerialPort.PARITY_NONE); + usb.setParameters(1500000, 8, 1, UsbSerialPort.PARITY_NONE); try { - usbParameters((int)(2000000/1.04), 8, 1, UsbSerialPort.PARITY_NONE); + usb.setParameters((int)(2000000/1.04), 8, 1, UsbSerialPort.PARITY_NONE); fail("baud rate error expected"); } catch (IOException ignored) { } - usbParameters((int)(2000000/1.03), 8, 1, UsbSerialPort.PARITY_NONE); - usbParameters(2000000, 8, 1, UsbSerialPort.PARITY_NONE); - usbParameters((int)(2000000*1.03), 8, 1, UsbSerialPort.PARITY_NONE); + usb.setParameters((int)(2000000/1.03), 8, 1, UsbSerialPort.PARITY_NONE); + usb.setParameters(2000000, 8, 1, UsbSerialPort.PARITY_NONE); + usb.setParameters((int)(2000000*1.03), 8, 1, UsbSerialPort.PARITY_NONE); try { - usbParameters((int)(2000000*1.04), 8, 1, UsbSerialPort.PARITY_NONE); + usb.setParameters((int)(2000000*1.04), 8, 1, UsbSerialPort.PARITY_NONE); fail("baud rate error expected"); } catch (IOException ignored) { } - usbParameters(2000000, 8, 1, UsbSerialPort.PARITY_NONE); - usbParameters(3000000, 8, 1, UsbSerialPort.PARITY_NONE); + usb.setParameters(2000000, 8, 1, UsbSerialPort.PARITY_NONE); + usb.setParameters(3000000, 8, 1, UsbSerialPort.PARITY_NONE); try { - usbParameters(4000000, 8, 1, UsbSerialPort.PARITY_NONE); + usb.setParameters(4000000, 8, 1, UsbSerialPort.PARITY_NONE); fail("baud rate to high expected"); } catch (IOException ignored) { } From a664082f23e680bbf847ec6bfef67296139f289c Mon Sep 17 00:00:00 2001 From: kai-morich Date: Fri, 31 Jul 2020 21:02:59 +0200 Subject: [PATCH 4/4] throw UnsupportedOperationException instead of returning false --- usbSerialForAndroid/build.gradle | 4 + .../hoho/android/usbserial/CrossoverTest.java | 4 + .../hoho/android/usbserial/DeviceTest.java | 108 ++++++++++-------- .../android/usbserial/util/UsbWrapper.java | 10 ++ .../usbserial/driver/CdcAcmSerialDriver.java | 20 ---- .../usbserial/driver/CommonUsbSerialPort.java | 20 ++-- .../usbserial/driver/Cp21xxSerialDriver.java | 4 +- .../usbserial/driver/FtdiSerialDriver.java | 3 +- .../driver/ProlificSerialDriver.java | 4 +- .../usbserial/driver/UsbSerialPort.java | 25 ++-- 10 files changed, 109 insertions(+), 93 deletions(-) diff --git a/usbSerialForAndroid/build.gradle b/usbSerialForAndroid/build.gradle index 2d23369..12e5fc0 100644 --- a/usbSerialForAndroid/build.gradle +++ b/usbSerialForAndroid/build.gradle @@ -15,6 +15,10 @@ android { 'rfc2217_server_nonstandard_baudrates': 'true', // true false false ] } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } } dependencies { diff --git a/usbSerialForAndroid/src/androidTest/java/com/hoho/android/usbserial/CrossoverTest.java b/usbSerialForAndroid/src/androidTest/java/com/hoho/android/usbserial/CrossoverTest.java index fbba67a..fed2551 100644 --- a/usbSerialForAndroid/src/androidTest/java/com/hoho/android/usbserial/CrossoverTest.java +++ b/usbSerialForAndroid/src/androidTest/java/com/hoho/android/usbserial/CrossoverTest.java @@ -32,6 +32,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertThat; import static org.junit.Assert.fail; +import static org.junit.Assume.assumeTrue; @RunWith(AndroidJUnit4.class) public class CrossoverTest { @@ -51,6 +52,9 @@ public class CrossoverTest { @Before public void setUp() throws Exception { + assumeTrue("ignore test for device specific coverage report", + InstrumentationRegistry.getArguments().getString("test_device_driver") == null); + context = InstrumentationRegistry.getContext(); usbManager = (UsbManager) context.getSystemService(Context.USB_SERVICE); List availableDrivers = UsbSerialProber.getDefaultProber().findAllDrivers(usbManager); diff --git a/usbSerialForAndroid/src/androidTest/java/com/hoho/android/usbserial/DeviceTest.java b/usbSerialForAndroid/src/androidTest/java/com/hoho/android/usbserial/DeviceTest.java index 1fe1917..5be6bf3 100644 --- a/usbSerialForAndroid/src/androidTest/java/com/hoho/android/usbserial/DeviceTest.java +++ b/usbSerialForAndroid/src/androidTest/java/com/hoho/android/usbserial/DeviceTest.java @@ -960,7 +960,13 @@ public class DeviceTest { usb.write(buf); Thread.sleep(50); // ~ 12 bytes - boolean purged = usb.serialPort.purgeHwBuffers(true, false); + boolean purged; + try { + usb.serialPort.purgeHwBuffers(true, false); + purged = true; + } catch (UnsupportedOperationException ex) { + purged = false; + } usb.write("bcd".getBytes()); Thread.sleep(50); while(data.length()==0 || data.charAt(data.length()-1)!='d') @@ -984,7 +990,8 @@ public class DeviceTest { telnet.setParameters(19200, 8, 1, UsbSerialPort.PARITY_NONE); telnet.write("x".getBytes()); Thread.sleep(10); // ~ 20 bytes - purged = usb.serialPort.purgeHwBuffers(false, true); + if(purged) + usb.serialPort.purgeHwBuffers(false, true); Log.d(TAG, "purged = " + purged); telnet.write("y".getBytes()); Thread.sleep(10); // ~ 20 bytes @@ -1299,6 +1306,9 @@ public class DeviceTest { inputLinesSupported = true; inputLinesConnected = true; } + Boolean inputLineFalse = inputLinesSupported ? Boolean.FALSE : null; + Boolean inputLineTrue = inputLinesConnected ? Boolean.TRUE : inputLineFalse; + EnumSet supportedControlLines = EnumSet.of(UsbSerialPort.ControlLine.RTS, UsbSerialPort.ControlLine.DTR); if(inputLinesSupported) { supportedControlLines.add(UsbSerialPort.ControlLine.CTS); @@ -1331,12 +1341,12 @@ public class DeviceTest { ? EnumSet.of(UsbSerialPort.ControlLine.RI) : EnumSet.noneOf(UsbSerialPort.ControlLine.class), usb.serialPort.getControlLines()); - assertFalse(usb.serialPort.getRTS()); - assertFalse(usb.serialPort.getCTS()); - assertFalse(usb.serialPort.getDTR()); - assertFalse(usb.serialPort.getDSR()); - assertFalse(usb.serialPort.getCD()); - assertEquals(usb.serialPort.getRI(), inputLinesConnected); + assertThat(usb.getControlLine(usb.serialPort::getRTS), equalTo(Boolean.FALSE)); + assertThat(usb.getControlLine(usb.serialPort::getCTS), equalTo(inputLineFalse)); + assertThat(usb.getControlLine(usb.serialPort::getDTR), equalTo(Boolean.FALSE)); + assertThat(usb.getControlLine(usb.serialPort::getDSR), equalTo(inputLineFalse)); + assertThat(usb.getControlLine(usb.serialPort::getCD), equalTo(inputLineFalse)); + assertThat(usb.getControlLine(usb.serialPort::getRI), equalTo(inputLineTrue)); telnet.write(data); if(usb.serialDriver instanceof CdcAcmSerialDriver) // arduino: control line feedback as serial_state notification is not implemented. @@ -1354,12 +1364,12 @@ public class DeviceTest { ? EnumSet.of(UsbSerialPort.ControlLine.RTS, UsbSerialPort.ControlLine.CTS) : EnumSet.of(UsbSerialPort.ControlLine.RTS), usb.serialPort.getControlLines()); - assertTrue(usb.serialPort.getRTS()); - assertEquals(usb.serialPort.getCTS(), inputLinesConnected); - assertFalse(usb.serialPort.getDTR()); - assertFalse(usb.serialPort.getDSR()); - assertFalse(usb.serialPort.getCD()); - assertFalse(usb.serialPort.getRI()); + assertThat(usb.getControlLine(usb.serialPort::getRTS), equalTo(Boolean.TRUE)); + assertThat(usb.getControlLine(usb.serialPort::getCTS), equalTo(inputLineTrue)); + assertThat(usb.getControlLine(usb.serialPort::getDTR), equalTo(Boolean.FALSE)); + assertThat(usb.getControlLine(usb.serialPort::getDSR), equalTo(inputLineFalse)); + assertThat(usb.getControlLine(usb.serialPort::getCD), equalTo(inputLineFalse)); + assertThat(usb.getControlLine(usb.serialPort::getRI), equalTo(inputLineFalse)); telnet.write(data); assertThat(Arrays.toString(data), usb.read(4), equalTo(data)); usb.write(data); @@ -1372,12 +1382,12 @@ public class DeviceTest { ? EnumSet.of(UsbSerialPort.ControlLine.RTS, UsbSerialPort.ControlLine.DTR, UsbSerialPort.ControlLine.CD) : EnumSet.of(UsbSerialPort.ControlLine.RTS, UsbSerialPort.ControlLine.DTR), usb.serialPort.getControlLines()); - assertTrue(usb.serialPort.getRTS()); - assertFalse(usb.serialPort.getCTS()); - assertTrue(usb.serialPort.getDTR()); - assertFalse(usb.serialPort.getDSR()); - assertEquals(usb.serialPort.getCD(), inputLinesConnected); - assertFalse(usb.serialPort.getRI()); + assertThat(usb.getControlLine(usb.serialPort::getRTS), equalTo(Boolean.TRUE)); + assertThat(usb.getControlLine(usb.serialPort::getCTS), equalTo(inputLineFalse)); + assertThat(usb.getControlLine(usb.serialPort::getDTR), equalTo(Boolean.TRUE)); + assertThat(usb.getControlLine(usb.serialPort::getDSR), equalTo(inputLineFalse)); + assertThat(usb.getControlLine(usb.serialPort::getCD), equalTo(inputLineTrue)); + assertThat(usb.getControlLine(usb.serialPort::getRI), equalTo(inputLineFalse)); telnet.write(data); assertThat(Arrays.toString(data), usb.read(4), equalTo(data)); usb.write(data); @@ -1390,12 +1400,12 @@ public class DeviceTest { ? EnumSet.of(UsbSerialPort.ControlLine.DTR, UsbSerialPort.ControlLine.DSR) : EnumSet.of(UsbSerialPort.ControlLine.DTR), usb.serialPort.getControlLines()); - assertFalse(usb.serialPort.getRTS()); - assertFalse(usb.serialPort.getCTS()); - assertTrue(usb.serialPort.getDTR()); - assertEquals(usb.serialPort.getDSR(), inputLinesConnected); - assertFalse(usb.serialPort.getCD()); - assertFalse(usb.serialPort.getRI()); + assertThat(usb.getControlLine(usb.serialPort::getRTS), equalTo(Boolean.FALSE)); + assertThat(usb.getControlLine(usb.serialPort::getCTS), equalTo(inputLineFalse)); + assertThat(usb.getControlLine(usb.serialPort::getDTR), equalTo(Boolean.TRUE)); + assertThat(usb.getControlLine(usb.serialPort::getDSR), equalTo(inputLineTrue)); + assertThat(usb.getControlLine(usb.serialPort::getCD), equalTo(inputLineFalse)); + assertThat(usb.getControlLine(usb.serialPort::getRI), equalTo(inputLineFalse)); telnet.write(data); assertThat(Arrays.toString(data), usb.read(4), equalTo(data)); usb.write(data); @@ -1412,12 +1422,12 @@ public class DeviceTest { if(outputRetained) retainedControlLines.add(UsbSerialPort.ControlLine.DTR); if(inputRetained) retainedControlLines.add(UsbSerialPort.ControlLine.DSR); assertEquals(retainedControlLines, usb.serialPort.getControlLines()); - assertFalse(usb.serialPort.getRTS()); - assertFalse(usb.serialPort.getCTS()); - assertEquals(usb.serialPort.getDTR(), outputRetained); - assertEquals(usb.serialPort.getDSR(), inputRetained); - assertFalse(usb.serialPort.getCD()); - assertFalse(usb.serialPort.getRI()); + assertThat(usb.getControlLine(usb.serialPort::getRTS), equalTo(Boolean.FALSE)); + assertThat(usb.getControlLine(usb.serialPort::getCTS), equalTo(inputLineFalse)); + assertThat(usb.getControlLine(usb.serialPort::getDTR), equalTo(outputRetained)); + assertThat(usb.getControlLine(usb.serialPort::getDSR), equalTo(inputRetained ? inputLineTrue : inputLineFalse)); + assertThat(usb.getControlLine(usb.serialPort::getCD), equalTo(inputLineFalse)); + assertThat(usb.getControlLine(usb.serialPort::getRI), equalTo(inputLineFalse)); usb.close(EnumSet.of(UsbWrapper.OpenCloseFlags.NO_CONTROL_LINE_INIT)); usb.open(EnumSet.of(UsbWrapper.OpenCloseFlags.NO_CONTROL_LINE_INIT, UsbWrapper.OpenCloseFlags.NO_IOMANAGER_THREAD)); @@ -1436,28 +1446,35 @@ public class DeviceTest { // get... error try { usb.serialPort.getRI(); - if (!inputLinesSupported) - ; - else if (usb.serialDriver instanceof ProlificSerialDriver) + if (usb.serialDriver instanceof ProlificSerialDriver) ; // todo: currently not possible to detect, as bulkTransfer in background thread does not distinguish timeout and error else fail("error expected"); } catch (IOException ignored) { + } catch (UnsupportedOperationException ignored) { } } @Test public void deviceConnection() throws Exception { - byte buf[] = new byte[256]; + byte[] buf = new byte[256]; usb.open(EnumSet.of(UsbWrapper.OpenCloseFlags.NO_IOMANAGER_THREAD)); usb.setParameters(115200, 8, 1, UsbSerialPort.PARITY_NONE); usb.write("x".getBytes()); usb.serialPort.read(buf, 1000); usb.serialPort.setRTS(true); - usb.serialPort.getRI(); - boolean purged = usb.serialPort.purgeHwBuffers(true, true); - + try { + usb.serialPort.getRI(); + } catch (UnsupportedOperationException ignored) { + } + boolean purged; + try { + usb.serialPort.purgeHwBuffers(true, true); + purged = true; + } catch (UnsupportedOperationException ex) { + purged = false; + } usb.deviceConnection.close(); try { usb.setParameters(115200, 8, 1, UsbSerialPort.PARITY_NONE); @@ -1481,13 +1498,12 @@ public class DeviceTest { fail("setRts error expected"); } catch (IOException ignored) { } - if(usb.serialPort.getSupportedControlLines().contains(UsbSerialPort.ControlLine.RI) ) { - try { - usb.serialPort.getRI(); - if(!(usb.serialDriver instanceof ProlificSerialDriver)) - fail("getRI error expected"); - } catch (IOException ignored) { - } + try { + usb.serialPort.getRI(); + if(!(usb.serialDriver instanceof ProlificSerialDriver)) + fail("getRI error expected"); + } catch (IOException ignored) { + } catch (UnsupportedOperationException ignored) { } if(purged) { try { diff --git a/usbSerialForAndroid/src/androidTest/java/com/hoho/android/usbserial/util/UsbWrapper.java b/usbSerialForAndroid/src/androidTest/java/com/hoho/android/usbserial/util/UsbWrapper.java index cb19bc8..dc7d01f 100644 --- a/usbSerialForAndroid/src/androidTest/java/com/hoho/android/usbserial/util/UsbWrapper.java +++ b/usbSerialForAndroid/src/androidTest/java/com/hoho/android/usbserial/util/UsbWrapper.java @@ -20,6 +20,7 @@ import java.nio.ByteBuffer; import java.util.Deque; import java.util.EnumSet; import java.util.LinkedList; +import java.util.concurrent.Callable; import java.util.concurrent.Executors; import static org.junit.Assert.assertEquals; @@ -223,6 +224,15 @@ public class UsbWrapper implements SerialInputOutputManager.Listener { Thread.sleep(1); } + /* return TRUE/FALSE/null instead of true/false/ */ + public Boolean getControlLine(Callable callable) throws Exception { + try { + return (Boolean)callable.call(); + } catch (UnsupportedOperationException t) { + return null; + } + } + @Override public void onNewData(byte[] data) { long now = System.currentTimeMillis(); diff --git a/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/CdcAcmSerialDriver.java b/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/CdcAcmSerialDriver.java index ef9adbe..fc75d68 100644 --- a/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/CdcAcmSerialDriver.java +++ b/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/CdcAcmSerialDriver.java @@ -239,21 +239,6 @@ public class CdcAcmSerialDriver implements UsbSerialDriver { sendAcmControlMessage(SET_LINE_CODING, 0, msg); } - @Override - public boolean getCD() throws IOException { - return false; // TODO - } - - @Override - public boolean getCTS() throws IOException { - return false; // TODO - } - - @Override - public boolean getDSR() throws IOException { - return false; // TODO - } - @Override public boolean getDTR() throws IOException { return mDtr; @@ -265,11 +250,6 @@ public class CdcAcmSerialDriver implements UsbSerialDriver { setDtrRts(); } - @Override - public boolean getRI() throws IOException { - return false; // TODO - } - @Override public boolean getRTS() throws IOException { return mRts; diff --git a/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/CommonUsbSerialPort.java b/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/CommonUsbSerialPort.java index 47e19f6..f8c17ca 100644 --- a/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/CommonUsbSerialPort.java +++ b/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/CommonUsbSerialPort.java @@ -212,28 +212,28 @@ public abstract class CommonUsbSerialPort implements UsbSerialPort { public abstract void setParameters(int baudRate, int dataBits, int stopBits, int parity) throws IOException; @Override - public abstract boolean getCD() throws IOException; + public boolean getCD() throws IOException { throw new UnsupportedOperationException(); } @Override - public abstract boolean getCTS() throws IOException; + public boolean getCTS() throws IOException { throw new UnsupportedOperationException(); } @Override - public abstract boolean getDSR() throws IOException; + public boolean getDSR() throws IOException { throw new UnsupportedOperationException(); } @Override - public abstract boolean getDTR() throws IOException; + public boolean getDTR() throws IOException { throw new UnsupportedOperationException(); } @Override - public abstract void setDTR(boolean value) throws IOException; + public void setDTR(boolean value) throws IOException { throw new UnsupportedOperationException(); } @Override - public abstract boolean getRI() throws IOException; + public boolean getRI() throws IOException { throw new UnsupportedOperationException(); } @Override - public abstract boolean getRTS() throws IOException; + public boolean getRTS() throws IOException { throw new UnsupportedOperationException(); } @Override - public abstract void setRTS(boolean value) throws IOException; + public void setRTS(boolean value) throws IOException { throw new UnsupportedOperationException(); } @Override public abstract EnumSet getControlLines() throws IOException; @@ -242,8 +242,8 @@ public abstract class CommonUsbSerialPort implements UsbSerialPort { public abstract EnumSet getSupportedControlLines() throws IOException; @Override - public boolean purgeHwBuffers(boolean purgeWriteBuffers, boolean purgeReadBuffers) throws IOException { - return false; + public void purgeHwBuffers(boolean purgeWriteBuffers, boolean purgeReadBuffers) throws IOException { + throw new UnsupportedOperationException(); } } diff --git a/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/Cp21xxSerialDriver.java b/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/Cp21xxSerialDriver.java index bab24eb..f7c1d6b 100644 --- a/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/Cp21xxSerialDriver.java +++ b/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/Cp21xxSerialDriver.java @@ -305,15 +305,13 @@ public class Cp21xxSerialDriver implements UsbSerialDriver { @Override // note: only working on some devices, on other devices ignored w/o error - public boolean purgeHwBuffers(boolean purgeWriteBuffers, boolean purgeReadBuffers) throws IOException { + public void purgeHwBuffers(boolean purgeWriteBuffers, boolean purgeReadBuffers) throws IOException { int value = (purgeReadBuffers ? FLUSH_READ_CODE : 0) | (purgeWriteBuffers ? FLUSH_WRITE_CODE : 0); if (value != 0) { setConfigSingle(SILABSER_FLUSH_REQUEST_CODE, value); } - - return true; } } diff --git a/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/FtdiSerialDriver.java b/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/FtdiSerialDriver.java index 81fe9bd..9c5c3f8 100644 --- a/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/FtdiSerialDriver.java +++ b/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/FtdiSerialDriver.java @@ -337,7 +337,7 @@ public class FtdiSerialDriver implements UsbSerialDriver { } @Override - public boolean purgeHwBuffers(boolean purgeWriteBuffers, boolean purgeReadBuffers) throws IOException { + public void purgeHwBuffers(boolean purgeWriteBuffers, boolean purgeReadBuffers) throws IOException { if (purgeWriteBuffers) { int result = mConnection.controlTransfer(REQTYPE_HOST_TO_DEVICE, RESET_REQUEST, RESET_PURGE_RX, mPortNumber+1, null, 0, USB_WRITE_TIMEOUT_MILLIS); @@ -353,7 +353,6 @@ public class FtdiSerialDriver implements UsbSerialDriver { throw new IOException("purge read buffer failed: result=" + result); } } - return true; } public void setLatencyTimer(int latencyTime) throws IOException { diff --git a/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/ProlificSerialDriver.java b/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/ProlificSerialDriver.java index ec16f4c..0d28dba 100644 --- a/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/ProlificSerialDriver.java +++ b/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/ProlificSerialDriver.java @@ -464,7 +464,7 @@ public class ProlificSerialDriver implements UsbSerialDriver { } @Override - public boolean purgeHwBuffers(boolean purgeWriteBuffers, boolean purgeReadBuffers) throws IOException { + public void purgeHwBuffers(boolean purgeWriteBuffers, boolean purgeReadBuffers) throws IOException { if (purgeWriteBuffers) { vendorOut(FLUSH_RX_REQUEST, 0, null); } @@ -472,8 +472,6 @@ public class ProlificSerialDriver implements UsbSerialDriver { if (purgeReadBuffers) { vendorOut(FLUSH_TX_REQUEST, 0, null); } - - return true; } } diff --git a/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/UsbSerialPort.java b/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/UsbSerialPort.java index 75aa304..9869984 100644 --- a/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/UsbSerialPort.java +++ b/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/UsbSerialPort.java @@ -152,32 +152,36 @@ public interface UsbSerialPort extends Closeable { /** * Gets the CD (Carrier Detect) bit from the underlying UART. * - * @return the current state, or {@code false} if not supported. + * @return the current state * @throws IOException if an error occurred during reading + * @throws UnsupportedOperationException if not supported */ public boolean getCD() throws IOException; /** * Gets the CTS (Clear To Send) bit from the underlying UART. * - * @return the current state, or {@code false} if not supported. + * @return the current state * @throws IOException if an error occurred during reading + * @throws UnsupportedOperationException if not supported */ public boolean getCTS() throws IOException; /** * Gets the DSR (Data Set Ready) bit from the underlying UART. * - * @return the current state, or {@code false} if not supported. + * @return the current state * @throws IOException if an error occurred during reading + * @throws UnsupportedOperationException if not supported */ public boolean getDSR() throws IOException; /** * Gets the DTR (Data Terminal Ready) bit from the underlying UART. * - * @return the current state, or {@code false} if not supported. + * @return the current state * @throws IOException if an error occurred during reading + * @throws UnsupportedOperationException if not supported */ public boolean getDTR() throws IOException; @@ -186,22 +190,25 @@ public interface UsbSerialPort extends Closeable { * * @param value the value to set * @throws IOException if an error occurred during writing + * @throws UnsupportedOperationException if not supported */ public void setDTR(boolean value) throws IOException; /** * Gets the RI (Ring Indicator) bit from the underlying UART. * - * @return the current state, or {@code false} if not supported. + * @return the current state * @throws IOException if an error occurred during reading + * @throws UnsupportedOperationException if not supported */ public boolean getRI() throws IOException; /** * Gets the RTS (Request To Send) bit from the underlying UART. * - * @return the current state, or {@code false} if not supported. + * @return the current state * @throws IOException if an error occurred during reading + * @throws UnsupportedOperationException if not supported */ public boolean getRTS() throws IOException; @@ -210,6 +217,7 @@ public interface UsbSerialPort extends Closeable { * * @param value the value to set * @throws IOException if an error occurred during writing + * @throws UnsupportedOperationException if not supported */ public void setRTS(boolean value) throws IOException; @@ -235,11 +243,10 @@ public interface UsbSerialPort extends Closeable { * * @param purgeWriteBuffers {@code true} to discard non-transmitted output data * @param purgeReadBuffers {@code true} to discard non-read input data - * @return {@code true} if the operation was successful, or - * {@code false} if the operation is not supported by the driver or device * @throws IOException if an error occurred during flush + * @throws UnsupportedOperationException if not supported */ - public boolean purgeHwBuffers(boolean purgeWriteBuffers, boolean purgeReadBuffers) throws IOException; + public void purgeHwBuffers(boolean purgeWriteBuffers, boolean purgeReadBuffers) throws IOException; /** * Returns the current state of the connection.