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.