revert previous usbRequest.cancel() removal

Combine usbRequest.cancel() and releaseInterface to interrupt read() and terminate SerialInputOutputManager.
UsbRequest.cancel() immediately interrupts read() on newer Android versions.
With releaseInterface() only, some hickup are observed on fast reconnect.
Keep releaseInterface() as only this interrupts read() on older Androids.
This commit is contained in:
kai-morich 2019-11-02 11:24:58 +01:00
parent 9ea936b14a
commit 6869eff88a
5 changed files with 42 additions and 2 deletions

View File

@ -50,6 +50,7 @@ public class CdcAcmSerialDriver implements UsbSerialDriver {
private final UsbDevice mDevice;
private final UsbSerialPort mPort;
private UsbRequest mUsbRequest;
public CdcAcmSerialDriver(UsbDevice device) {
mDevice = device;
@ -253,9 +254,15 @@ public class CdcAcmSerialDriver implements UsbSerialDriver {
if (mConnection == null) {
throw new IOException("Already closed");
}
synchronized (this) {
if (mUsbRequest != null)
mUsbRequest.cancel();
}
try {
mConnection.releaseInterface(mControlInterface);
mConnection.releaseInterface(mDataInterface);
} catch(Exception ignored) {}
try {
mConnection.close();
} finally {
mConnection = null;
@ -273,7 +280,11 @@ public class CdcAcmSerialDriver implements UsbSerialDriver {
if (!request.queue(buf, dest.length)) {
throw new IOException("Error queueing request.");
}
mUsbRequest = request;
final UsbRequest response = mConnection.requestWait();
synchronized (this) {
mUsbRequest = null;
}
if (response == null) {
throw new IOException("Null response");
}
@ -286,6 +297,7 @@ public class CdcAcmSerialDriver implements UsbSerialDriver {
return 0;
}
} finally {
mUsbRequest = null;
request.close();
}
}

View File

@ -85,6 +85,7 @@ public class Ch34xSerialDriver implements UsbSerialDriver {
private UsbEndpoint mReadEndpoint;
private UsbEndpoint mWriteEndpoint;
private UsbRequest mUsbRequest;
public Ch340SerialPort(UsbDevice device, int portNumber) {
super(device, portNumber);
@ -143,9 +144,15 @@ public class Ch34xSerialDriver implements UsbSerialDriver {
if (mConnection == null) {
throw new IOException("Already closed");
}
synchronized (this) {
if (mUsbRequest != null)
mUsbRequest.cancel();
}
try {
for (int i = 0; i < mDevice.getInterfaceCount(); i++)
mConnection.releaseInterface(mDevice.getInterface(i));
} catch(Exception ignored) {}
try {
mConnection.close();
} finally {
mConnection = null;
@ -164,7 +171,11 @@ public class Ch34xSerialDriver implements UsbSerialDriver {
if (!request.queue(buf, dest.length)) {
throw new IOException("Error queueing request.");
}
mUsbRequest = request;
final UsbRequest response = mConnection.requestWait();
synchronized (this) {
mUsbRequest = null;
}
if (response == null) {
throw new IOException("Null response");
}
@ -177,6 +188,7 @@ public class Ch34xSerialDriver implements UsbSerialDriver {
return 0;
}
} finally {
mUsbRequest = null;
request.close();
}
}

View File

@ -108,6 +108,7 @@ public class Cp21xxSerialDriver implements UsbSerialDriver {
private UsbEndpoint mReadEndpoint;
private UsbEndpoint mWriteEndpoint;
private UsbRequest mUsbRequest;
// second port of Cp2105 has limited baudRate, dataBits, stopBits, parity
// unsupported baudrate returns error at controlTransfer(), other parameters are silently ignored
@ -176,12 +177,18 @@ public class Cp21xxSerialDriver implements UsbSerialDriver {
if (mConnection == null) {
throw new IOException("Already closed");
}
synchronized (this) {
if(mUsbRequest != null) {
mUsbRequest.cancel();
}
}
try {
setConfigSingle(SILABSER_IFC_ENABLE_REQUEST_CODE, UART_DISABLE);
} catch (Exception ignored)
{}
} catch (Exception ignored) {}
try {
mConnection.releaseInterface(mDevice.getInterface(mPortNumber));
} catch(Exception ignored) {}
try {
mConnection.close();
} finally {
mConnection = null;
@ -199,7 +206,11 @@ public class Cp21xxSerialDriver implements UsbSerialDriver {
if (!request.queue(buf, dest.length)) {
throw new IOException("Error queueing request.");
}
mUsbRequest = request;
final UsbRequest response = mConnection.requestWait();
synchronized (this) {
mUsbRequest = null;
}
if (response == null) {
throw new IOException("Null response");
}
@ -212,6 +223,7 @@ public class Cp21xxSerialDriver implements UsbSerialDriver {
return 0;
}
} finally {
mUsbRequest = null;
request.close();
}
}

View File

@ -269,6 +269,8 @@ public class FtdiSerialDriver implements UsbSerialDriver {
}
try {
mConnection.releaseInterface(mDevice.getInterface(mPortNumber));
} catch(Exception ignored) {}
try {
mConnection.close();
} finally {
mConnection = null;

View File

@ -362,6 +362,8 @@ public class ProlificSerialDriver implements UsbSerialDriver {
} finally {
try {
mConnection.releaseInterface(mDevice.getInterface(0));
} catch(Exception ignored) {}
try {
mConnection.close();
} finally {
mConnection = null;