mirror of
https://github.com/mik3y/usb-serial-for-android
synced 2025-06-07 16:06:10 +00:00
Merge pull request #189 from kai-morich/cdc-endpoints
support USB devices with other non CDC related endpoints, e.g. when u…
This commit is contained in:
commit
deabc510c1
@ -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