mirror of
				https://github.com/mik3y/usb-serial-for-android
				synced 2025-10-31 02:17:23 +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