diff --git a/usbSerialExamples/src/main/java/com/hoho/android/usbserial/examples/TerminalFragment.java b/usbSerialExamples/src/main/java/com/hoho/android/usbserial/examples/TerminalFragment.java index 2f4cfb3..b286a94 100644 --- a/usbSerialExamples/src/main/java/com/hoho/android/usbserial/examples/TerminalFragment.java +++ b/usbSerialExamples/src/main/java/com/hoho/android/usbserial/examples/TerminalFragment.java @@ -227,7 +227,11 @@ public class TerminalFragment extends Fragment implements SerialInputOutputManag try { usbSerialPort.open(usbConnection); - usbSerialPort.setParameters(baudRate, 8, 1, UsbSerialPort.PARITY_NONE); + try{ + usbSerialPort.setParameters(baudRate, 8, 1, UsbSerialPort.PARITY_NONE); + }catch (UnsupportedOperationException e){ + status("unsupport setparameters"); + } if(withIoManager) { usbIoManager = new SerialInputOutputManager(usbSerialPort, this); usbIoManager.start(); @@ -351,7 +355,7 @@ public class TerminalFragment extends Fragment implements SerialInputOutputManag cdBtn.setChecked(controlLines.contains(UsbSerialPort.ControlLine.CD)); riBtn.setChecked(controlLines.contains(UsbSerialPort.ControlLine.RI)); mainLooper.postDelayed(runnable, refreshInterval); - } catch (IOException e) { + } catch (Exception e) { status("getControlLines() failed: " + e.getMessage() + " -> stopped control line refresh"); } } @@ -368,8 +372,15 @@ public class TerminalFragment extends Fragment implements SerialInputOutputManag if (!controlLines.contains(UsbSerialPort.ControlLine.CD)) cdBtn.setVisibility(View.INVISIBLE); if (!controlLines.contains(UsbSerialPort.ControlLine.RI)) riBtn.setVisibility(View.INVISIBLE); run(); - } catch (IOException e) { + } catch (Exception e) { Toast.makeText(getActivity(), "getSupportedControlLines() failed: " + e.getMessage(), Toast.LENGTH_SHORT).show(); + rtsBtn.setVisibility(View.INVISIBLE); + ctsBtn.setVisibility(View.INVISIBLE); + dtrBtn.setVisibility(View.INVISIBLE); + dsrBtn.setVisibility(View.INVISIBLE); + cdBtn.setVisibility(View.INVISIBLE); + cdBtn.setVisibility(View.INVISIBLE); + riBtn.setVisibility(View.INVISIBLE); } } diff --git a/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/GsmModemSerialDriver.java b/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/GsmModemSerialDriver.java new file mode 100644 index 0000000..1afd678 --- /dev/null +++ b/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/GsmModemSerialDriver.java @@ -0,0 +1,111 @@ +package com.hoho.android.usbserial.driver; + +import android.hardware.usb.UsbConstants; +import android.hardware.usb.UsbDevice; +import android.hardware.usb.UsbEndpoint; +import android.hardware.usb.UsbInterface; +import android.util.Log; + +import java.io.IOException; +import java.util.Collections; +import java.util.EnumSet; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +public class GsmModemSerialDriver implements UsbSerialDriver{ + + private final String TAG = GsmModemSerialDriver.class.getSimpleName(); + + private final UsbDevice mDevice; + private final UsbSerialPort mPort; + + @Override + public UsbDevice getDevice() { + return mDevice; + } + + @Override + public List getPorts() { + return Collections.singletonList(mPort); + } + + public GsmModemSerialDriver(UsbDevice mDevice) { + this.mDevice = mDevice; + mPort = new GsmModemSerialPort(mDevice, 0); + } + + public class GsmModemSerialPort extends CommonUsbSerialPort { + + private UsbInterface mDataInterface; + + public GsmModemSerialPort(UsbDevice device, int portNumber) { + super(device, portNumber); + } + + @Override + protected void openInt() throws IOException { + Log.d(TAG, "claiming interfaces, count=" + mDevice.getInterfaceCount()); + mDataInterface = mDevice.getInterface(0); + if (!mConnection.claimInterface(mDataInterface, true)) { + throw new IOException("Could not claim shared control/data interface"); + } + Log.d(TAG, "endpoint count=" + mDataInterface.getEndpointCount()); + for (int i = 0; i < mDataInterface.getEndpointCount(); ++i) { + UsbEndpoint ep = mDataInterface.getEndpoint(i); + if ((ep.getDirection() == UsbConstants.USB_DIR_IN) && (ep.getType() == UsbConstants.USB_ENDPOINT_XFER_BULK)) { + mReadEndpoint = ep; + } else if ((ep.getDirection() == UsbConstants.USB_DIR_OUT) && (ep.getType() == UsbConstants.USB_ENDPOINT_XFER_BULK)) { + mWriteEndpoint = ep; + } + } + initGsmModem(); + } + + @Override + protected void closeInt() { + try { + mConnection.releaseInterface(mDataInterface); + } catch(Exception ignored) {} + + } + + private int initGsmModem() throws IOException { + int len = mConnection.controlTransfer( + 0x21, 0x22, 0x01, 0, null, 0, 5000); + if(len < 0) { + throw new IOException("init failed"); + } + return len; + } + + @Override + public UsbSerialDriver getDriver() { + return GsmModemSerialDriver.this; + } + + @Override + public void setParameters(int baudRate, int dataBits, int stopBits, int parity) throws IOException { + throw new UnsupportedOperationException(); + } + + @Override + public EnumSet getControlLines() throws IOException { + throw new UnsupportedOperationException(); + } + + @Override + public EnumSet getSupportedControlLines() throws IOException { + throw new UnsupportedOperationException(); + } + } + + public static Map getSupportedDevices() { + final Map supportedDevices = new LinkedHashMap<>(); + supportedDevices.put(UsbId.VENDOR_UNISOC, new int[]{ + UsbId.FIBOCOM_L610, + UsbId.FIBOCOM_L612, + }); + 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 bed2ffe..b63c9ce 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 @@ -41,6 +41,10 @@ public final class UsbId { public static final int QINHENG_CH340 = 0x7523; public static final int QINHENG_CH341A = 0x5523; + public static final int VENDOR_UNISOC = 0x1782; + public static final int FIBOCOM_L610 = 0x4D10; + public static final int FIBOCOM_L612 = 0x4D12; + private UsbId() { throw new IllegalAccessError("Non-instantiable class"); 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 fd94a18..ce02458 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 @@ -37,6 +37,7 @@ public class UsbSerialProber { probeTable.addDriver(FtdiSerialDriver.class); probeTable.addDriver(ProlificSerialDriver.class); probeTable.addDriver(Ch34xSerialDriver.class); + probeTable.addDriver(GsmModemSerialDriver.class); return probeTable; }