mirror of
				https://github.com/mik3y/usb-serial-for-android
				synced 2025-10-31 02:17:23 +00:00 
			
		
		
		
	Update device support; change interface to abstract base class.
Adds support for Teensyduino and a few more Arduino CDC devices.
This commit is contained in:
		
							parent
							
								
									28054ab154
								
							
						
					
					
						commit
						c5e9955b01
					
				| @ -2,6 +2,11 @@ | |||||||
| <resources> | <resources> | ||||||
|     <!-- 0x0403 / 0x6001: FTDI FT232R UART --> |     <!-- 0x0403 / 0x6001: FTDI FT232R UART --> | ||||||
|     <usb-device vendor-id="1027" product-id="24577" /> |     <usb-device vendor-id="1027" product-id="24577" /> | ||||||
|     <!-- 0x2341 / 0x0001: Arduino Uno --> | 
 | ||||||
|     <usb-device vendor-id="9025" product-id="1" /> |     <!-- 0x2341 / Arduino --> | ||||||
|  |     <usb-device vendor-id="9025" /> | ||||||
|  | 
 | ||||||
|  |     <!-- 0x16C0 / 0x0483: Teensyduino  --> | ||||||
|  |     <usb-device vendor-id="5824" product-id="1155" /> | ||||||
|  | 
 | ||||||
| </resources> | </resources> | ||||||
|  | |||||||
| @ -2,6 +2,8 @@ package com.hoho.android.usbserial.driver; | |||||||
| 
 | 
 | ||||||
| import java.io.IOException; | import java.io.IOException; | ||||||
| import java.util.Arrays; | import java.util.Arrays; | ||||||
|  | import java.util.LinkedHashMap; | ||||||
|  | import java.util.Map; | ||||||
| 
 | 
 | ||||||
| import android.hardware.usb.UsbConstants; | import android.hardware.usb.UsbConstants; | ||||||
| import android.hardware.usb.UsbDevice; | import android.hardware.usb.UsbDevice; | ||||||
| @ -15,11 +17,10 @@ import android.util.Log; | |||||||
|  * |  * | ||||||
|  * @author mike wakerly (opensource@hoho.com) |  * @author mike wakerly (opensource@hoho.com) | ||||||
|  */ |  */ | ||||||
| public class CdcAcmSerialDriver implements UsbSerialDriver { | public class CdcAcmSerialDriver extends UsbSerialDriver { | ||||||
|  | 
 | ||||||
|     private final String TAG = CdcAcmSerialDriver.class.getSimpleName(); |     private final String TAG = CdcAcmSerialDriver.class.getSimpleName(); | ||||||
| 
 | 
 | ||||||
|     private UsbDevice mDevice; |  | ||||||
|     private UsbDeviceConnection mConnection; |  | ||||||
|     private final byte[] mReadBuffer = new byte[4096]; |     private final byte[] mReadBuffer = new byte[4096]; | ||||||
| 
 | 
 | ||||||
|     private UsbInterface mControlInterface; |     private UsbInterface mControlInterface; | ||||||
| @ -29,13 +30,8 @@ public class CdcAcmSerialDriver implements UsbSerialDriver { | |||||||
|     private UsbEndpoint mReadEndpoint; |     private UsbEndpoint mReadEndpoint; | ||||||
|     private UsbEndpoint mWriteEndpoint; |     private UsbEndpoint mWriteEndpoint; | ||||||
| 
 | 
 | ||||||
|     /** |     public CdcAcmSerialDriver(UsbDevice device, UsbDeviceConnection connection) { | ||||||
|      * @param usbDevice |         super(device, connection); | ||||||
|      * @param connection |  | ||||||
|      */ |  | ||||||
|     public CdcAcmSerialDriver(UsbDevice usbDevice, UsbDeviceConnection connection) { |  | ||||||
|         mDevice = usbDevice; |  | ||||||
|         mConnection = connection; |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     @Override |     @Override | ||||||
| @ -151,13 +147,25 @@ public class CdcAcmSerialDriver implements UsbSerialDriver { | |||||||
|         return baudRate; |         return baudRate; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     @Override |     public static Map<Integer, int[]> getSupportedDevices() { | ||||||
|     public UsbDevice getDevice() { |         final Map<Integer, int[]> supportedDevices = new LinkedHashMap<Integer, int[]>(); | ||||||
|         return mDevice; |         supportedDevices.put(Integer.valueOf(UsbId.VENDOR_ARDUINO), | ||||||
|     } |                 new int[] { | ||||||
| 
 |                         UsbId.ARDUINO_UNO, | ||||||
|     public static boolean probe(UsbDevice usbDevice) { |                         UsbId.ARDUINO_UNO_R3, | ||||||
|         return usbDevice.getVendorId() == 0x2341; |                         UsbId.ARDUINO_MEGA_2560, | ||||||
|  |                         UsbId.ARDUINO_MEGA_2560_R3, | ||||||
|  |                         UsbId.ARDUINO_SERIAL_ADAPTER, | ||||||
|  |                         UsbId.ARDUINO_SERIAL_ADAPTER_R3, | ||||||
|  |                         UsbId.ARDUINO_MEGA_ADK, | ||||||
|  |                         UsbId.ARDUINO_MEGA_ADK_R3, | ||||||
|  |                         UsbId.ARDUINO_LEONARDO, | ||||||
|  |                 }); | ||||||
|  |         supportedDevices.put(Integer.valueOf(UsbId.VENDOR_VAN_OOIJEN_TECH), | ||||||
|  |                 new int[] { | ||||||
|  |                     UsbId.VAN_OOIJEN_TECH_TEENSYDUINO_SERIAL, | ||||||
|  |                 }); | ||||||
|  |         return supportedDevices; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| } | } | ||||||
|  | |||||||
| @ -20,6 +20,12 @@ | |||||||
| 
 | 
 | ||||||
| package com.hoho.android.usbserial.driver; | package com.hoho.android.usbserial.driver; | ||||||
| 
 | 
 | ||||||
|  | import java.io.IOException; | ||||||
|  | import java.nio.ByteBuffer; | ||||||
|  | import java.util.Arrays; | ||||||
|  | import java.util.LinkedHashMap; | ||||||
|  | import java.util.Map; | ||||||
|  | 
 | ||||||
| import android.hardware.usb.UsbConstants; | import android.hardware.usb.UsbConstants; | ||||||
| import android.hardware.usb.UsbDevice; | import android.hardware.usb.UsbDevice; | ||||||
| import android.hardware.usb.UsbDeviceConnection; | import android.hardware.usb.UsbDeviceConnection; | ||||||
| @ -29,10 +35,6 @@ import android.util.Log; | |||||||
| 
 | 
 | ||||||
| import com.hoho.android.usbserial.util.HexDump; | import com.hoho.android.usbserial.util.HexDump; | ||||||
| 
 | 
 | ||||||
| import java.io.IOException; |  | ||||||
| import java.nio.ByteBuffer; |  | ||||||
| import java.util.Arrays; |  | ||||||
| 
 |  | ||||||
| /** | /** | ||||||
|  * A {@link UsbSerialDriver} implementation for a variety of FTDI devices |  * A {@link UsbSerialDriver} implementation for a variety of FTDI devices | ||||||
|  * <p> |  * <p> | ||||||
| @ -86,7 +88,7 @@ import java.util.Arrays; | |||||||
|  * @see <a href="http://www.ftdichip.com/">FTDI Homepage</a> |  * @see <a href="http://www.ftdichip.com/">FTDI Homepage</a> | ||||||
|  * @see <a href="http://www.intra2net.com/en/developer/libftdi">libftdi</a> |  * @see <a href="http://www.intra2net.com/en/developer/libftdi">libftdi</a> | ||||||
|  */ |  */ | ||||||
| public class FtdiSerialDriver implements UsbSerialDriver { | public class FtdiSerialDriver extends UsbSerialDriver { | ||||||
| 
 | 
 | ||||||
|     private static final int DEFAULT_BAUD_RATE = 115200; |     private static final int DEFAULT_BAUD_RATE = 115200; | ||||||
| 
 | 
 | ||||||
| @ -152,8 +154,6 @@ public class FtdiSerialDriver implements UsbSerialDriver { | |||||||
| 
 | 
 | ||||||
|     private final String TAG = FtdiSerialDriver.class.getSimpleName(); |     private final String TAG = FtdiSerialDriver.class.getSimpleName(); | ||||||
| 
 | 
 | ||||||
|     private UsbDevice mDevice; |  | ||||||
|     private UsbDeviceConnection mConnection; |  | ||||||
|     private DeviceType mType; |     private DeviceType mType; | ||||||
| 
 | 
 | ||||||
|     private final byte[] mReadBuffer = new byte[4096]; |     private final byte[] mReadBuffer = new byte[4096]; | ||||||
| @ -185,11 +185,7 @@ public class FtdiSerialDriver implements UsbSerialDriver { | |||||||
|      *             with this driver |      *             with this driver | ||||||
|      */ |      */ | ||||||
|     public FtdiSerialDriver(UsbDevice usbDevice, UsbDeviceConnection usbConnection) { |     public FtdiSerialDriver(UsbDevice usbDevice, UsbDeviceConnection usbConnection) { | ||||||
|         if (!probe(usbDevice)) { |         super(usbDevice, usbConnection); | ||||||
|             throw new UsbSerialRuntimeException("Device type not supported."); |  | ||||||
|         } |  | ||||||
|         mConnection = usbConnection; |  | ||||||
|         mDevice = usbDevice; |  | ||||||
|         mType = null; |         mType = null; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| @ -404,14 +400,13 @@ public class FtdiSerialDriver implements UsbSerialDriver { | |||||||
|         }; |         }; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     public static boolean probe(UsbDevice usbDevice) { |     public static Map<Integer, int[]> getSupportedDevices() { | ||||||
|         // TODO(mikey): Support other devices. |         final Map<Integer, int[]> supportedDevices = new LinkedHashMap<Integer, int[]>(); | ||||||
|         return usbDevice.getVendorId() == 0x0403 && usbDevice.getProductId() == 0x6001; |         supportedDevices.put(Integer.valueOf(UsbId.VENDOR_FTDI), | ||||||
|     } |                 new int[] { | ||||||
| 
 |                     UsbId.FTDI_FT232R, | ||||||
|     @Override |                 }); | ||||||
|     public UsbDevice getDevice() { |         return supportedDevices; | ||||||
|         return mDevice; |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| } | } | ||||||
|  | |||||||
| @ -0,0 +1,53 @@ | |||||||
|  | /* Copyright 2012 Google Inc. | ||||||
|  |  * | ||||||
|  |  * This library is free software; you can redistribute it and/or | ||||||
|  |  * modify it under the terms of the GNU Lesser General Public | ||||||
|  |  * License as published by the Free Software Foundation; either | ||||||
|  |  * version 2.1 of the License, or (at your option) any later version. | ||||||
|  |  * | ||||||
|  |  * This library is distributed in the hope that it will be useful, | ||||||
|  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||||||
|  |  * Lesser General Public License for more details. | ||||||
|  |  * | ||||||
|  |  * You should have received a copy of the GNU Lesser General Public | ||||||
|  |  * License along with this library; if not, write to the Free Software | ||||||
|  |  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, | ||||||
|  |  * USA. | ||||||
|  |  * | ||||||
|  |  * Project home page: http://code.google.com/p/usb-serial-for-android/ | ||||||
|  |  */ | ||||||
|  | package com.hoho.android.usbserial.driver; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * Registry of USB vendor/product ID constants. | ||||||
|  |  * | ||||||
|  |  * Culled from various sources; see | ||||||
|  |  * <a href="http://www.linux-usb.org/usb.ids">usb.ids</a> for one listing. | ||||||
|  |  * | ||||||
|  |  * @author mike wakerly (opensource@hoho.com) | ||||||
|  |  */ | ||||||
|  | public final class UsbId { | ||||||
|  | 
 | ||||||
|  |     public static final int VENDOR_FTDI = 0x0403; | ||||||
|  |     public static final int FTDI_FT232R = 0x6001; | ||||||
|  | 
 | ||||||
|  |     public static final int VENDOR_ARDUINO = 0x2341; | ||||||
|  |     public static final int ARDUINO_UNO = 0x0001; | ||||||
|  |     public static final int ARDUINO_MEGA_2560 = 0x0010; | ||||||
|  |     public static final int ARDUINO_SERIAL_ADAPTER = 0x003b; | ||||||
|  |     public static final int ARDUINO_MEGA_ADK = 0x003f; | ||||||
|  |     public static final int ARDUINO_MEGA_2560_R3 = 0x0042; | ||||||
|  |     public static final int ARDUINO_UNO_R3 = 0x0043; | ||||||
|  |     public static final int ARDUINO_MEGA_ADK_R3 = 0x0044; | ||||||
|  |     public static final int ARDUINO_SERIAL_ADAPTER_R3 = 0x0044; | ||||||
|  |     public static final int ARDUINO_LEONARDO = 0x8036; | ||||||
|  | 
 | ||||||
|  |     public static final int VENDOR_VAN_OOIJEN_TECH = 0x16c0; | ||||||
|  |     public static final int VAN_OOIJEN_TECH_TEENSYDUINO_SERIAL = 0x0483; | ||||||
|  | 
 | ||||||
|  |     private UsbId() { | ||||||
|  |         throw new IllegalAccessError("Non-instantiable class."); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | } | ||||||
| @ -23,13 +23,22 @@ package com.hoho.android.usbserial.driver; | |||||||
| import java.io.IOException; | import java.io.IOException; | ||||||
| 
 | 
 | ||||||
| import android.hardware.usb.UsbDevice; | import android.hardware.usb.UsbDevice; | ||||||
|  | import android.hardware.usb.UsbDeviceConnection; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  * Driver interface for a supported USB serial device. |  * Driver interface for a supported USB serial device. | ||||||
|  * |  * | ||||||
|  * @author mike wakerly (opensource@hoho.com) |  * @author mike wakerly (opensource@hoho.com) | ||||||
|  */ |  */ | ||||||
| public interface UsbSerialDriver { | public abstract class UsbSerialDriver { | ||||||
|  | 
 | ||||||
|  |     protected final UsbDevice mDevice; | ||||||
|  |     protected final UsbDeviceConnection mConnection; | ||||||
|  | 
 | ||||||
|  |     public UsbSerialDriver(UsbDevice device, UsbDeviceConnection connection) { | ||||||
|  |         mDevice = device; | ||||||
|  |         mConnection = connection; | ||||||
|  |     } | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|      * Opens and initializes the device as a USB serial device. Upon success, |      * Opens and initializes the device as a USB serial device. Upon success, | ||||||
| @ -37,14 +46,14 @@ public interface UsbSerialDriver { | |||||||
|      * |      * | ||||||
|      * @throws IOException on error opening or initializing the device. |      * @throws IOException on error opening or initializing the device. | ||||||
|      */ |      */ | ||||||
|     public void open() throws IOException; |     public abstract void open() throws IOException; | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|      * Closes the serial device. |      * Closes the serial device. | ||||||
|      * |      * | ||||||
|      * @throws IOException on error closing the device. |      * @throws IOException on error closing the device. | ||||||
|      */ |      */ | ||||||
|     public void close() throws IOException; |     public abstract void close() throws IOException; | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|      * Reads as many bytes as possible into the destination buffer. |      * Reads as many bytes as possible into the destination buffer. | ||||||
| @ -54,7 +63,7 @@ public interface UsbSerialDriver { | |||||||
|      * @return the actual number of bytes read |      * @return the actual number of bytes read | ||||||
|      * @throws IOException if an error occurred during reading |      * @throws IOException if an error occurred during reading | ||||||
|      */ |      */ | ||||||
|     public int read(final byte[] dest, final int timeoutMillis) throws IOException; |     public abstract int read(final byte[] dest, final int timeoutMillis) throws IOException; | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|      * Writes as many bytes as possible from the source buffer. |      * Writes as many bytes as possible from the source buffer. | ||||||
| @ -64,7 +73,7 @@ public interface UsbSerialDriver { | |||||||
|      * @return the actual number of bytes written |      * @return the actual number of bytes written | ||||||
|      * @throws IOException if an error occurred during writing |      * @throws IOException if an error occurred during writing | ||||||
|      */ |      */ | ||||||
|     public int write(final byte[] src, final int timeoutMillis) throws IOException; |     public abstract int write(final byte[] src, final int timeoutMillis) throws IOException; | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|      * Sets the baud rate of the serial device. |      * Sets the baud rate of the serial device. | ||||||
| @ -73,13 +82,15 @@ public interface UsbSerialDriver { | |||||||
|      * @return the actual rate set |      * @return the actual rate set | ||||||
|      * @throws IOException on error setting the baud rate |      * @throws IOException on error setting the baud rate | ||||||
|      */ |      */ | ||||||
|     public int setBaudRate(final int baudRate) throws IOException; |     public abstract int setBaudRate(final int baudRate) throws IOException; | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|      * Returns the currently-bound USB device. |      * Returns the currently-bound USB device. | ||||||
|      * |      * | ||||||
|      * @return the device |      * @return the device | ||||||
|      */ |      */ | ||||||
|     public UsbDevice getDevice(); |     public final UsbDevice getDevice() { | ||||||
|  |         return mDevice; | ||||||
|  |     } | ||||||
| 
 | 
 | ||||||
| } | } | ||||||
|  | |||||||
| @ -20,6 +20,8 @@ | |||||||
| 
 | 
 | ||||||
| package com.hoho.android.usbserial.driver; | package com.hoho.android.usbserial.driver; | ||||||
| 
 | 
 | ||||||
|  | import java.util.Map; | ||||||
|  | 
 | ||||||
| import android.hardware.usb.UsbDevice; | import android.hardware.usb.UsbDevice; | ||||||
| import android.hardware.usb.UsbDeviceConnection; | import android.hardware.usb.UsbDeviceConnection; | ||||||
| import android.hardware.usb.UsbManager; | import android.hardware.usb.UsbManager; | ||||||
| @ -32,6 +34,8 @@ import android.hardware.usb.UsbManager; | |||||||
|  */ |  */ | ||||||
| public enum UsbSerialProber { | public enum UsbSerialProber { | ||||||
| 
 | 
 | ||||||
|  |     // TODO(mikey): Too much boilerplate. | ||||||
|  | 
 | ||||||
|     /** |     /** | ||||||
|      * Prober for {@link FtdiSerialDriver}. |      * Prober for {@link FtdiSerialDriver}. | ||||||
|      * |      * | ||||||
| @ -40,7 +44,7 @@ public enum UsbSerialProber { | |||||||
|     FTDI_SERIAL { |     FTDI_SERIAL { | ||||||
|         @Override |         @Override | ||||||
|         public UsbSerialDriver getDevice(final UsbManager manager, final UsbDevice usbDevice) { |         public UsbSerialDriver getDevice(final UsbManager manager, final UsbDevice usbDevice) { | ||||||
|             if (!FtdiSerialDriver.probe(usbDevice)) { |             if (!testIfSupported(usbDevice, FtdiSerialDriver.getSupportedDevices())) { | ||||||
|                 return null; |                 return null; | ||||||
|             } |             } | ||||||
|             final UsbDeviceConnection connection = manager.openDevice(usbDevice); |             final UsbDeviceConnection connection = manager.openDevice(usbDevice); | ||||||
| @ -54,8 +58,8 @@ public enum UsbSerialProber { | |||||||
|     CDC_ACM_SERIAL { |     CDC_ACM_SERIAL { | ||||||
|         @Override |         @Override | ||||||
|         public UsbSerialDriver getDevice(UsbManager manager, UsbDevice usbDevice) { |         public UsbSerialDriver getDevice(UsbManager manager, UsbDevice usbDevice) { | ||||||
|             if (!CdcAcmSerialDriver.probe(usbDevice)) { |             if (!testIfSupported(usbDevice, CdcAcmSerialDriver.getSupportedDevices())) { | ||||||
|                 return null; |                return null; | ||||||
|             } |             } | ||||||
|             final UsbDeviceConnection connection = manager.openDevice(usbDevice); |             final UsbDeviceConnection connection = manager.openDevice(usbDevice); | ||||||
|             if (connection == null) { |             if (connection == null) { | ||||||
| @ -116,4 +120,28 @@ public enum UsbSerialProber { | |||||||
|         return null; |         return null; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     /** | ||||||
|  |      * Returns {@code true} if the given device is found in the vendor/product map. | ||||||
|  |      * | ||||||
|  |      * @param usbDevice the device to test | ||||||
|  |      * @param supportedDevices map of vendor ids to product id(s) | ||||||
|  |      * @return {@code true} if supported | ||||||
|  |      */ | ||||||
|  |     private static boolean testIfSupported(final UsbDevice usbDevice, | ||||||
|  |             final Map<Integer, int[]> supportedDevices) { | ||||||
|  |         final int[] supportedProducts = supportedDevices.get( | ||||||
|  |                 Integer.valueOf(usbDevice.getVendorId())); | ||||||
|  |         if (supportedProducts == null) { | ||||||
|  |             return false; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         final int productId = usbDevice.getProductId(); | ||||||
|  |         for (int supportedProductId : supportedProducts) { | ||||||
|  |             if (productId == supportedProductId) { | ||||||
|  |                 return true; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         return false; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
| } | } | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user