mirror of
				https://github.com/mik3y/usb-serial-for-android
				synced 2025-11-04 04:17:46 +00:00 
			
		
		
		
	support USB devices with other non CDC related endpoints, e.g. when using ARM mbed DAPLink firmware
This commit is contained in:
		
							parent
							
								
									b96f9ca7a2
								
							
						
					
					
						commit
						608c67499a
					
				@ -77,6 +77,8 @@ public class CdcAcmSerialDriver implements UsbSerialDriver {
 | 
				
			|||||||
        private UsbEndpoint mReadEndpoint;
 | 
					        private UsbEndpoint mReadEndpoint;
 | 
				
			||||||
        private UsbEndpoint mWriteEndpoint;
 | 
					        private UsbEndpoint mWriteEndpoint;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        private int mControlIndex;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        private boolean mRts = false;
 | 
					        private boolean mRts = false;
 | 
				
			||||||
        private boolean mDtr = false;
 | 
					        private boolean mDtr = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -139,6 +141,7 @@ public class CdcAcmSerialDriver implements UsbSerialDriver {
 | 
				
			|||||||
            // the following code is inspired by the cdc-acm driver
 | 
					            // the following code is inspired by the cdc-acm driver
 | 
				
			||||||
            // in the linux kernel
 | 
					            // in the linux kernel
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            mControlIndex = 0;
 | 
				
			||||||
            mControlInterface = mDevice.getInterface(0);
 | 
					            mControlInterface = mDevice.getInterface(0);
 | 
				
			||||||
            Log.d(TAG, "Control iface=" + mControlInterface);
 | 
					            Log.d(TAG, "Control iface=" + mControlInterface);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -196,34 +199,63 @@ public class CdcAcmSerialDriver implements UsbSerialDriver {
 | 
				
			|||||||
        private void openInterface() throws IOException {
 | 
					        private void openInterface() throws IOException {
 | 
				
			||||||
            Log.d(TAG, "claiming interfaces, count=" + mDevice.getInterfaceCount());
 | 
					            Log.d(TAG, "claiming interfaces, count=" + mDevice.getInterfaceCount());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            mControlInterface = mDevice.getInterface(0);
 | 
					            mControlInterface = null;
 | 
				
			||||||
 | 
					            mDataInterface = null;
 | 
				
			||||||
 | 
					            for (int i = 0; i < mDevice.getInterfaceCount(); i++) {
 | 
				
			||||||
 | 
					                UsbInterface usbInterface = mDevice.getInterface(i);
 | 
				
			||||||
 | 
					                if (usbInterface.getInterfaceClass() == UsbConstants.USB_CLASS_COMM) {
 | 
				
			||||||
 | 
					                    mControlIndex = i;
 | 
				
			||||||
 | 
					                    mControlInterface = usbInterface;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                if (usbInterface.getInterfaceClass() == UsbConstants.USB_CLASS_CDC_DATA) {
 | 
				
			||||||
 | 
					                    mDataInterface = usbInterface;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if(mControlInterface == null) {
 | 
				
			||||||
 | 
					                throw new IOException("no control interface.");
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
            Log.d(TAG, "Control iface=" + mControlInterface);
 | 
					            Log.d(TAG, "Control iface=" + mControlInterface);
 | 
				
			||||||
            // class should be USB_CLASS_COMM
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if (!mConnection.claimInterface(mControlInterface, true)) {
 | 
					            if (!mConnection.claimInterface(mControlInterface, true)) {
 | 
				
			||||||
                throw new IOException("Could not claim control interface.");
 | 
					                throw new IOException("Could not claim control interface.");
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            mControlEndpoint = mControlInterface.getEndpoint(0);
 | 
					            mControlEndpoint = mControlInterface.getEndpoint(0);
 | 
				
			||||||
            Log.d(TAG, "Control endpoint direction: " + mControlEndpoint.getDirection());
 | 
					            if (mControlEndpoint.getDirection() != UsbConstants.USB_DIR_IN || mControlEndpoint.getType() != UsbConstants.USB_ENDPOINT_XFER_INT) {
 | 
				
			||||||
 | 
					                throw new IOException("invalid control endpoint");
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            Log.d(TAG, "Claiming data interface.");
 | 
					            if(mDataInterface == null) {
 | 
				
			||||||
            mDataInterface = mDevice.getInterface(1);
 | 
					                throw new IOException("no data interface.");
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
            Log.d(TAG, "data iface=" + mDataInterface);
 | 
					            Log.d(TAG, "data iface=" + mDataInterface);
 | 
				
			||||||
            // class should be USB_CLASS_CDC_DATA
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if (!mConnection.claimInterface(mDataInterface, true)) {
 | 
					            if (!mConnection.claimInterface(mDataInterface, true)) {
 | 
				
			||||||
                throw new IOException("Could not claim data interface.");
 | 
					                throw new IOException("Could not claim data interface.");
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            mReadEndpoint = mDataInterface.getEndpoint(1);
 | 
					
 | 
				
			||||||
            Log.d(TAG, "Read endpoint direction: " + mReadEndpoint.getDirection());
 | 
					            mReadEndpoint = null;
 | 
				
			||||||
            mWriteEndpoint = mDataInterface.getEndpoint(0);
 | 
					            mWriteEndpoint = null;
 | 
				
			||||||
            Log.d(TAG, "Write endpoint direction: " + mWriteEndpoint.getDirection());
 | 
					            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;
 | 
				
			||||||
 | 
					                if (ep.getDirection() == UsbConstants.USB_DIR_OUT && ep.getType() == UsbConstants.USB_ENDPOINT_XFER_BULK)
 | 
				
			||||||
 | 
					                    mWriteEndpoint = ep;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            if (mReadEndpoint == null || mWriteEndpoint == null) {
 | 
				
			||||||
 | 
					                throw new IOException("Could not get read&write endpoints.");
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        private int sendAcmControlMessage(int request, int value, byte[] buf) {
 | 
					        private int sendAcmControlMessage(int request, int value, byte[] buf) throws IOException {
 | 
				
			||||||
            return mConnection.controlTransfer(
 | 
					            int len = mConnection.controlTransfer(
 | 
				
			||||||
                    USB_RT_ACM, request, value, 0, buf, buf != null ? buf.length : 0, 5000);
 | 
					                    USB_RT_ACM, request, value, mControlIndex, buf, buf != null ? buf.length : 0, 5000);
 | 
				
			||||||
 | 
					            if(len < 0) {
 | 
				
			||||||
 | 
					                throw new IOException("controlTransfer failed.");
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            return len;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        @Override
 | 
					        @Override
 | 
				
			||||||
@ -320,7 +352,7 @@ public class CdcAcmSerialDriver implements UsbSerialDriver {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        @Override
 | 
					        @Override
 | 
				
			||||||
        public void setParameters(int baudRate, int dataBits, int stopBits, int parity) {
 | 
					        public void setParameters(int baudRate, int dataBits, int stopBits, int parity) throws IOException {
 | 
				
			||||||
            byte stopBitsByte;
 | 
					            byte stopBitsByte;
 | 
				
			||||||
            switch (stopBits) {
 | 
					            switch (stopBits) {
 | 
				
			||||||
                case STOPBITS_1: stopBitsByte = 0; break;
 | 
					                case STOPBITS_1: stopBitsByte = 0; break;
 | 
				
			||||||
@ -392,7 +424,7 @@ public class CdcAcmSerialDriver implements UsbSerialDriver {
 | 
				
			|||||||
            setDtrRts();
 | 
					            setDtrRts();
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        private void setDtrRts() {
 | 
					        private void setDtrRts() throws IOException {
 | 
				
			||||||
            int value = (mRts ? 0x2 : 0) | (mDtr ? 0x1 : 0);
 | 
					            int value = (mRts ? 0x2 : 0) | (mDtr ? 0x1 : 0);
 | 
				
			||||||
            sendAcmControlMessage(SET_CONTROL_LINE_STATE, value, null);
 | 
					            sendAcmControlMessage(SET_CONTROL_LINE_STATE, value, null);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@ -426,6 +458,10 @@ public class CdcAcmSerialDriver implements UsbSerialDriver {
 | 
				
			|||||||
                new int[] {
 | 
					                new int[] {
 | 
				
			||||||
                    UsbId.LEAFLABS_MAPLE,
 | 
					                    UsbId.LEAFLABS_MAPLE,
 | 
				
			||||||
                });
 | 
					                });
 | 
				
			||||||
 | 
					        supportedDevices.put(Integer.valueOf(UsbId.VENDOR_ARM),
 | 
				
			||||||
 | 
					                new int[] {
 | 
				
			||||||
 | 
					                    UsbId.ARM_MBED,
 | 
				
			||||||
 | 
					                });
 | 
				
			||||||
        return supportedDevices;
 | 
					        return supportedDevices;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -68,6 +68,10 @@ public final class UsbId {
 | 
				
			|||||||
    public static final int VENDOR_QINHENG = 0x1a86;
 | 
					    public static final int VENDOR_QINHENG = 0x1a86;
 | 
				
			||||||
    public static final int QINHENG_HL340 = 0x7523;
 | 
					    public static final int QINHENG_HL340 = 0x7523;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // at www.linux-usb.org/usb.ids listed for NXP/LPC1768, but all processors supported by ARM mbed DAPLink firmware report these ids
 | 
				
			||||||
 | 
					    public static final int VENDOR_ARM = 0x0d28;
 | 
				
			||||||
 | 
					    public static final int ARM_MBED = 0x0204;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private UsbId() {
 | 
					    private UsbId() {
 | 
				
			||||||
        throw new IllegalAccessError("Non-instantiable class.");
 | 
					        throw new IllegalAccessError("Non-instantiable class.");
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user