1
0
mirror of https://github.com/mik3y/usb-serial-for-android.git synced 2026-08-21 13:22:56 +00:00

CDC device test with CH343

This commit is contained in:
kai-morich
2026-07-10 16:47:21 +02:00
parent fa87b7dc4f
commit 76d6a3ad57
4 changed files with 49 additions and 32 deletions
+1 -1
View File
@@ -8,7 +8,7 @@ android {
// Used as fallback in usbSerialExample/build.gradle -> missingDimensionStrategy, but not for coverage report // Used as fallback in usbSerialExample/build.gradle -> missingDimensionStrategy, but not for coverage report
dimension 'device' dimension 'device'
} }
mcp2221 { ch343 {
dimension 'device' dimension 'device'
testInstrumentationRunnerArguments = ['test_device_driver': 'CdcAcm'] testInstrumentationRunnerArguments = ['test_device_driver': 'CdcAcm']
} }
@@ -33,6 +33,7 @@ import com.hoho.android.usbserial.driver.ProbeTable;
import com.hoho.android.usbserial.driver.ProlificSerialDriver; import com.hoho.android.usbserial.driver.ProlificSerialDriver;
import com.hoho.android.usbserial.driver.ProlificSerialPortWrapper; import com.hoho.android.usbserial.driver.ProlificSerialPortWrapper;
import com.hoho.android.usbserial.driver.SerialTimeoutException; import com.hoho.android.usbserial.driver.SerialTimeoutException;
import com.hoho.android.usbserial.driver.UsbId;
import com.hoho.android.usbserial.driver.UsbSerialDriver; import com.hoho.android.usbserial.driver.UsbSerialDriver;
import com.hoho.android.usbserial.driver.UsbSerialPort; import com.hoho.android.usbserial.driver.UsbSerialPort;
import com.hoho.android.usbserial.driver.UsbSerialProber; import com.hoho.android.usbserial.driver.UsbSerialProber;
@@ -540,7 +541,7 @@ public class DeviceTest {
doReadWrite(baudRate+"/8N1"); doReadWrite(baudRate+"/8N1");
} }
if(rfc2217_server_nonstandard_baudrates && !usb.isCp21xxRestrictedPort) { if(rfc2217_server_nonstandard_baudrates) {
usb.setParameters(42000, 8, 1, UsbSerialPort.PARITY_NONE); usb.setParameters(42000, 8, 1, UsbSerialPort.PARITY_NONE);
telnet.setParameters(42000, 8, 1, UsbSerialPort.PARITY_NONE); telnet.setParameters(42000, 8, 1, UsbSerialPort.PARITY_NONE);
@@ -551,16 +552,14 @@ public class DeviceTest {
data1 = telnet.read(); data1 = telnet.read();
telnet.write(buf2); telnet.write(buf2);
data2 = usb.read(); data2 = usb.read();
if (usb.serialDriver instanceof Cp21xxSerialDriver) { if (usb.serialDriver instanceof Cp21xxSerialDriver && (usb.serialDriver.getPorts().size()==1 || usb.isCp21xxRestrictedPort)) {
if (usb.serialDriver.getPorts().size() > 1) { // not supported on cp2102 and cp2105 second port
// supported on cp2105 first port assertNotEquals(data1, buf1);
assertThat("42000/8N1", data1, equalTo(buf1)); assertNotEquals(data2, buf2);
assertThat("42000/8N1", data2, equalTo(buf2)); } else if (usb.serialDriver instanceof CdcAcmSerialDriver && usb.isCdcAcmCh343) {
} else { // not supported on ch343
// not supported on cp2102 assertThat("42000/8N1", data1, equalTo(new byte[]{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}));
assertNotEquals(data1, buf1); assertThat("42000/8N1", data2, equalTo(new byte[]{}));
assertNotEquals(data2, buf2);
}
} else { } else {
assertThat("42000/8N1", data1, equalTo(buf1)); assertThat("42000/8N1", data1, equalTo(buf1));
assertThat("42000/8N1", data2, equalTo(buf2)); assertThat("42000/8N1", data2, equalTo(buf2));
@@ -624,8 +623,8 @@ public class DeviceTest {
Thread.sleep(10); Thread.sleep(10);
usb.write(new byte[]{(byte) 0xff}); usb.write(new byte[]{(byte) 0xff});
data = telnet.read(2); data = telnet.read(2);
if(usb.serialDriver instanceof CdcAcmSerialDriver) { if(usb.serialDriver instanceof CdcAcmSerialDriver && !usb.isCdcAcmCh343) {
// not supported by MCP2221, other CDC devices might support it // not supported by MCP2221 and CH9143
assertThat("19000/7N1", data, equalTo(new byte[]{(byte) 0x00, (byte) 0xff})); assertThat("19000/7N1", data, equalTo(new byte[]{(byte) 0x00, (byte) 0xff}));
return; return;
} else { } else {
@@ -703,8 +702,9 @@ public class DeviceTest {
usb.setParameters(19200, 7, 1, UsbSerialPort.PARITY_ODD); usb.setParameters(19200, 7, 1, UsbSerialPort.PARITY_ODD);
usb.write(_8n1); usb.write(_8n1);
data = telnet.read(4); data = telnet.read(4);
if (usb.serialDriver instanceof CdcAcmSerialDriver) {
// not supported by MCP2221, other CDC devices might support it if (usb.serialDriver instanceof CdcAcmSerialDriver && !usb.isCdcAcmCh343) {
// not supported by MCP2221 and CH9143
assertThat("19200/8N1", data, equalTo(_8n1)); assertThat("19200/8N1", data, equalTo(_8n1));
} else { } else {
assertThat("19200/7O1", data, equalTo(_7o1)); assertThat("19200/7O1", data, equalTo(_7o1));
@@ -752,7 +752,7 @@ public class DeviceTest {
data = usb.read(4); data = usb.read(4);
assertThat("19200/7S1", data, equalTo(_7s1)); assertThat("19200/7S1", data, equalTo(_7s1));
if (usb.serialDriver instanceof CdcAcmSerialDriver) { if (usb.serialDriver instanceof CdcAcmSerialDriver && !usb.isCdcAcmCh343) {
; // not supported by MCP2221, other CDC devices might support it ; // not supported by MCP2221, other CDC devices might support it
} else { } else {
usb.setParameters(19200, 7, 1, UsbSerialPort.PARITY_ODD); usb.setParameters(19200, 7, 1, UsbSerialPort.PARITY_ODD);
@@ -789,11 +789,13 @@ public class DeviceTest {
telnet.setParameters(19200, 6, 1, UsbSerialPort.PARITY_NONE); telnet.setParameters(19200, 6, 1, UsbSerialPort.PARITY_NONE);
usb.write(new byte[]{(byte)0x41, (byte)0xf1}); usb.write(new byte[]{(byte)0x41, (byte)0xf1});
data = telnet.read(2); data = telnet.read(2);
if (usb.serialDriver instanceof CdcAcmSerialDriver) { if (usb.serialDriver instanceof CdcAcmSerialDriver && !usb.isCdcAcmCh343) {
// MCP2221 slightly slower, looks like 2 stop bits. could be different for other CDC devices // CH9143 not supported
assertThat("19200/8N1", data, equalTo(new byte[]{1, 11})); // MCP2221 slightly slower, looks like 2 stop bits
} else //assertThat("19200/8N1", data, equalTo(new byte[]{1, 11}));
} else {
assertThat("19200/8N1", data, equalTo(new byte[]{1, 5})); assertThat("19200/8N1", data, equalTo(new byte[]{1, 5}));
}
// out 8N2: addddddd dooaddddddddoo // out 8N2: addddddd dooaddddddddoo
// 1000001 0 10011111 // 1000001 0 10011111
@@ -857,8 +859,6 @@ public class DeviceTest {
((CommonUsbSerialPort)usb.serialPort).setWriteBufferSize(-1); ((CommonUsbSerialPort)usb.serialPort).setWriteBufferSize(-1);
assertEquals(usb.serialPort.getWriteEndpoint().getMaxPacketSize(), assertEquals(usb.serialPort.getWriteEndpoint().getMaxPacketSize(),
CommonUsbSerialPortWrapper.getWriteBuffer(usb.serialPort).length); CommonUsbSerialPortWrapper.getWriteBuffer(usb.serialPort).length);
assertEquals(usb.serialPort.getWriteEndpoint().getMaxPacketSize(),
usb.serialPort.getReadEndpoint().getMaxPacketSize());
int baudRate = 300; int baudRate = 300;
if(usb.serialDriver instanceof Cp21xxSerialDriver && usb.serialPort.getPortNumber() > 0) if(usb.serialDriver instanceof Cp21xxSerialDriver && usb.serialPort.getPortNumber() > 0)
@@ -1061,10 +1061,9 @@ public class DeviceTest {
data = usb.read(len); data = usb.read(len);
if (usb.serialDriver instanceof Cp21xxSerialDriver && usb.serialDriver.getPorts().size() == 1) if (usb.serialDriver instanceof Cp21xxSerialDriver && usb.serialDriver.getPorts().size() == 1)
assertNotEquals(0, data.length); // can be shorter or full length assertNotEquals(0, data.length); // can be shorter or full length
else if (usb.serialDriver instanceof CdcAcmSerialDriver || else if (usb.serialDriver instanceof ProlificSerialDriver)
usb.serialDriver instanceof ProlificSerialDriver)
assertTrue("expected > 0 and < "+len+" byte, got " + data.length, data.length > 0 && data.length < len); assertTrue("expected > 0 and < "+len+" byte, got " + data.length, data.length > 0 && data.length < len);
else // ftdi, ch340, cp2105 else // ftdi, ch340, cp2105, CdcAcm ch343
assertEquals(0, data.length); assertEquals(0, data.length);
} catch (IOException ignored) { } catch (IOException ignored) {
} }
@@ -1107,10 +1106,9 @@ public class DeviceTest {
data = usb.read(len, len/2); data = usb.read(len, len/2);
if (usb.serialDriver instanceof Cp21xxSerialDriver && usb.serialDriver.getPorts().size() == 1) if (usb.serialDriver instanceof Cp21xxSerialDriver && usb.serialDriver.getPorts().size() == 1)
assertNotEquals(0, data.length); // can be shorter or full length assertNotEquals(0, data.length); // can be shorter or full length
else if (usb.serialDriver instanceof CdcAcmSerialDriver || else if (usb.serialDriver instanceof ProlificSerialDriver)
usb.serialDriver instanceof ProlificSerialDriver)
assertTrue("sporadic issue! expected > 0 and < "+len+" byte, got " + data.length, data.length > 0 && data.length < len); assertTrue("sporadic issue! expected > 0 and < "+len+" byte, got " + data.length, data.length > 0 && data.length < len);
else // ftdi, ch340, cp2105 else // ftdi, ch340, cp2105, CdcAcm ch343
assertEquals(0, data.length); assertEquals(0, data.length);
telnet.write("2ccc".getBytes()); telnet.write("2ccc".getBytes());
data = usb.read(4); data = usb.read(4);
@@ -2335,8 +2333,8 @@ public class DeviceTest {
@Test @Test
public void setBreak() throws Exception { public void setBreak() throws Exception {
usb.open(); usb.open();
if (usb.serialDriver instanceof CdcAcmSerialDriver) { if (usb.serialDriver instanceof CdcAcmSerialDriver && ! usb.isCdcAcmCh343) {
// not supported by MCP2221, other CDC devices might support it // not supported by MCP2221 and CH9143
try { try {
usb.serialPort.setBreak(true); usb.serialPort.setBreak(true);
fail("setBreak error expected"); fail("setBreak error expected");
@@ -2347,6 +2345,7 @@ public class DeviceTest {
telnet.setParameters(19200, 8, 1, UsbSerialPort.PARITY_NONE); telnet.setParameters(19200, 8, 1, UsbSerialPort.PARITY_NONE);
usb.setParameters(19200, 8, 1, UsbSerialPort.PARITY_NONE); usb.setParameters(19200, 8, 1, UsbSerialPort.PARITY_NONE);
doReadWrite(""); doReadWrite("");
usb.serialPort.setBreak(true);
Thread.sleep(100); Thread.sleep(100);
usb.serialPort.setBreak(false); usb.serialPort.setBreak(false);
// RFC2217 has SET_CONTROL + REQ_BREAK_STATE request, but this is not supported by pyserial // RFC2217 has SET_CONTROL + REQ_BREAK_STATE request, but this is not supported by pyserial
@@ -2499,6 +2498,13 @@ public class DeviceTest {
fail("read length too small expected"); fail("read length too small expected");
} catch(IllegalArgumentException ignored) {} } catch(IllegalArgumentException ignored) {}
try {
CommonUsbSerialPortWrapper.testConnection(usb.serialPort, true);
} catch(IOException ex) {
// CdcAcm: the standard USB request is not supported by CH9143, which also makes various other tests failing
assertTrue(usb.serialPort.getDevice().getVendorId() == UsbId.VENDOR_QINHENG && usb.serialPort.getDevice().getProductId() == 0x55D6);
}
// use driver that does not override base class // use driver that does not override base class
UsbSerialDriver wrongSerialDriver = new ChromeCcdSerialDriver(usb.serialDriver.getDevice()); UsbSerialDriver wrongSerialDriver = new ChromeCcdSerialDriver(usb.serialDriver.getDevice());
UsbSerialPort wrongSerialPort = wrongSerialDriver.getPorts().get(0); UsbSerialPort wrongSerialPort = wrongSerialDriver.getPorts().get(0);
@@ -4,6 +4,7 @@ import android.hardware.usb.UsbRequest;
import com.hoho.android.usbserial.util.UsbUtils; import com.hoho.android.usbserial.util.UsbUtils;
import java.io.IOException;
import java.util.LinkedList; import java.util.LinkedList;
public class CommonUsbSerialPortWrapper { public class CommonUsbSerialPortWrapper {
@@ -21,4 +22,10 @@ public class CommonUsbSerialPortWrapper {
CommonUsbSerialPort commonSerialPort = (CommonUsbSerialPort) serialPort; CommonUsbSerialPort commonSerialPort = (CommonUsbSerialPort) serialPort;
commonSerialPort.mUsbRequestSupplier = supplier; commonSerialPort.mUsbRequestSupplier = supplier;
} }
public static void testConnection(UsbSerialPort serialPort, boolean full) throws IOException {
CommonUsbSerialPort commonSerialPort = (CommonUsbSerialPort) serialPort;
commonSerialPort.testConnection(full);
}
} }
@@ -59,6 +59,8 @@ public class UsbWrapper implements SerialInputOutputManager.Listener {
// device properties // device properties
public boolean isCp21xxRestrictedPort; // second port of Cp2105 has limited dataBits, stopBits, parity public boolean isCp21xxRestrictedPort; // second port of Cp2105 has limited dataBits, stopBits, parity
public boolean isCdcAcmCh343;
public boolean outputLinesSupported; public boolean outputLinesSupported;
public boolean inputLinesSupported; public boolean inputLinesSupported;
public boolean inputLinesConnected; public boolean inputLinesConnected;
@@ -106,6 +108,8 @@ public class UsbWrapper implements SerialInputOutputManager.Listener {
// extract some device properties: // extract some device properties:
isCp21xxRestrictedPort = serialDriver instanceof Cp21xxSerialDriver && serialDriver.getPorts().size()==2 && serialPort.getPortNumber() == 1; isCp21xxRestrictedPort = serialDriver instanceof Cp21xxSerialDriver && serialDriver.getPorts().size()==2 && serialPort.getPortNumber() == 1;
isCdcAcmCh343 = serialDriver.getDevice().getVendorId() == UsbId.VENDOR_QINHENG && serialDriver.getDevice().getProductId() == 0x55D3;
// output lines are supported by all common drivers // output lines are supported by all common drivers
// input lines are supported by all common drivers except CDC // input lines are supported by all common drivers except CDC
if (serialDriver instanceof FtdiSerialDriver) { if (serialDriver instanceof FtdiSerialDriver) {
@@ -152,7 +156,7 @@ public class UsbWrapper implements SerialInputOutputManager.Listener {
if(serialDriver.getDevice().getProductId() == UsbId.FTDI_FT231X) if(serialDriver.getDevice().getProductId() == UsbId.FTDI_FT231X)
writeBufferSize = 512; writeBufferSize = 512;
} else if (serialDriver instanceof CdcAcmSerialDriver) { } else if (serialDriver instanceof CdcAcmSerialDriver) {
writePacketSize = 16; writeBufferSize = 32; // MCP2221 values, other devices might be different writePacketSize = 32; writeBufferSize = 64; // CH343 values, other devices might be different
} }
readBufferSize = writeBufferSize; readBufferSize = writeBufferSize;