diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..61a9130 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 62e6831..5c0b931 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -1,5 +1,6 @@ + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index aecc280..b0051c8 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,5 +1,5 @@ - + \ No newline at end of file diff --git a/build.gradle b/build.gradle index dadeedf..d96ad7f 100644 --- a/build.gradle +++ b/build.gradle @@ -2,12 +2,18 @@ apply plugin: 'java' repositories { mavenCentral() + google() } dependencies { - implementation group: 'org.usb4java', name: 'usb4java', version: '1.3.0' implementation group: 'commons-logging', name: 'commons-logging', version: '1.2' implementation files('lib/IntelHexParser.jar') + // windows/linux/darwin + compile group: 'org.usb4java', name: 'usb4java', version: '1.3.0' + // todo: someone one day should move android into sub-project + compile group: 'com.google.android', name: 'android', version: '4.0.1.2' + + testImplementation group: 'junit', name: 'junit', version: '4.13' } diff --git a/src/main/java/com/rusefi/dfu/DfuLogic.java b/src/main/java/com/rusefi/dfu/DfuLogic.java index d585ce8..d8f7d30 100644 --- a/src/main/java/com/rusefi/dfu/DfuLogic.java +++ b/src/main/java/com/rusefi/dfu/DfuLogic.java @@ -7,6 +7,12 @@ import com.rusefi.dfu.usb4java.USBDfuConnection; import java.nio.ByteBuffer; public class DfuLogic { + public static final short ST_VENDOR = 0x0483; + public static final short ST_DFU_PRODUCT = (short) 0xdf11; + public static final byte USB_CLASS_APP_SPECIFIC = (byte) 0xfe; + public static final byte DFU_SUBCLASS = 0x01; + public static final byte USB_DT_DFU = 0x21; + static void uploadImage(USBDfuConnection device, HexImage image) { // todo: smarter erase handling! DfuSeCommandErasePage.execute(device, 0x08000000); diff --git a/src/main/java/com/rusefi/dfu/usb4java/LogUtil.java b/src/main/java/com/rusefi/dfu/LogUtil.java similarity index 90% rename from src/main/java/com/rusefi/dfu/usb4java/LogUtil.java rename to src/main/java/com/rusefi/dfu/LogUtil.java index 6cfbf41..68db239 100644 --- a/src/main/java/com/rusefi/dfu/usb4java/LogUtil.java +++ b/src/main/java/com/rusefi/dfu/LogUtil.java @@ -1,4 +1,4 @@ -package com.rusefi.dfu.usb4java; +package com.rusefi.dfu; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; diff --git a/src/main/java/com/rusefi/dfu/android/AndroidDfuConnection.java b/src/main/java/com/rusefi/dfu/android/AndroidDfuConnection.java new file mode 100644 index 0000000..bb29b26 --- /dev/null +++ b/src/main/java/com/rusefi/dfu/android/AndroidDfuConnection.java @@ -0,0 +1,39 @@ +package com.rusefi.dfu.android; + +import android.hardware.usb.UsbDeviceConnection; +import com.rusefi.dfu.DfuCommmand; +import com.rusefi.dfu.DfuConnection; +import com.rusefi.dfu.FlashRange; + +import java.nio.ByteBuffer; + +public class AndroidDfuConnection implements DfuConnection { + private final UsbDeviceConnection usbDeviceConnection; + private final FlashRange flashRange; + + public AndroidDfuConnection(UsbDeviceConnection usbDeviceConnection, FlashRange flashRange) { + this.usbDeviceConnection = usbDeviceConnection; + this.flashRange = flashRange; + } + + @Override + public FlashRange getFlashRange() { + return flashRange; + } + + @Override + public int getTransferSize() { + return 0; + } + + @Override + public int receiveData(DfuCommmand command, short wValue, ByteBuffer data) { + //return usbDeviceConnection.controlTransfer(); + return 0; + } + + @Override + public int sendData(DfuCommmand command, short wValue, ByteBuffer data) { + return 0; + } +} diff --git a/src/main/java/com/rusefi/dfu/android/DfuDeviceLocator.java b/src/main/java/com/rusefi/dfu/android/DfuDeviceLocator.java new file mode 100644 index 0000000..eb4db43 --- /dev/null +++ b/src/main/java/com/rusefi/dfu/android/DfuDeviceLocator.java @@ -0,0 +1,48 @@ +package com.rusefi.dfu.android; + +import android.hardware.usb.*; +import com.rusefi.dfu.DfuLogic; +import com.rusefi.dfu.LogUtil; +import org.apache.commons.logging.Log; + +public class DfuDeviceLocator { + private static final Log log = LogUtil.getLog(DfuDeviceLocator.class); + + private static UsbDevice findDevice(UsbManager usbManager) { + for (final UsbDevice usbDevice : usbManager.getDeviceList().values()) { + if (usbDevice.getVendorId() == DfuLogic.ST_VENDOR && usbDevice.getProductId() == DfuLogic.ST_DFU_PRODUCT) { + return usbDevice; + } + } + return null; + } + + + public short xxx(UsbManager usbManager) { + UsbDevice dfuDevice = findDevice(usbManager); + + for (int interfaceIndex = 0; interfaceIndex < dfuDevice.getInterfaceCount(); interfaceIndex++) { + UsbInterface usbInterface = dfuDevice.getInterface(interfaceIndex); + + + } + + for (int interfaceIndex = 0; interfaceIndex < dfuDevice.getInterfaceCount(); interfaceIndex++) { + UsbInterface usbInterface = dfuDevice.getInterface(interfaceIndex); + if (usbInterface.getInterfaceClass() == DfuLogic.USB_CLASS_APP_SPECIFIC && + usbInterface.getInterfaceSubclass() == DfuLogic.DFU_SUBCLASS) { + log.debug(String.format("Found DFU interface: " + usbInterface)); + + + UsbDeviceConnection connection = usbManager.openDevice(dfuDevice); + + + } + + + } + + return 0; + } + +} diff --git a/src/main/java/com/rusefi/dfu/commands/DfuSeCommandErasePage.java b/src/main/java/com/rusefi/dfu/commands/DfuSeCommandErasePage.java index 4b8bad3..f4c176c 100644 --- a/src/main/java/com/rusefi/dfu/commands/DfuSeCommandErasePage.java +++ b/src/main/java/com/rusefi/dfu/commands/DfuSeCommandErasePage.java @@ -3,7 +3,7 @@ package com.rusefi.dfu.commands; import com.rusefi.dfu.DfuCommmand; import com.rusefi.dfu.DfuConnection; import com.rusefi.dfu.DfuSeCommand; -import com.rusefi.dfu.usb4java.LogUtil; +import com.rusefi.dfu.LogUtil; import com.rusefi.dfu.usb4java.USBDfuConnection; import org.apache.commons.logging.Log; diff --git a/src/main/java/com/rusefi/dfu/commands/DfuSeCommandSetAddress.java b/src/main/java/com/rusefi/dfu/commands/DfuSeCommandSetAddress.java index 94a3d85..93c1174 100644 --- a/src/main/java/com/rusefi/dfu/commands/DfuSeCommandSetAddress.java +++ b/src/main/java/com/rusefi/dfu/commands/DfuSeCommandSetAddress.java @@ -2,7 +2,7 @@ package com.rusefi.dfu.commands; import com.rusefi.dfu.DfuCommmand; import com.rusefi.dfu.DfuSeCommand; -import com.rusefi.dfu.usb4java.LogUtil; +import com.rusefi.dfu.LogUtil; import com.rusefi.dfu.usb4java.USBDfuConnection; import org.apache.commons.logging.Log; diff --git a/src/main/java/com/rusefi/dfu/usb4java/DfuDeviceLocator.java b/src/main/java/com/rusefi/dfu/usb4java/DfuDeviceLocator.java index 09ccad4..2282bb1 100644 --- a/src/main/java/com/rusefi/dfu/usb4java/DfuDeviceLocator.java +++ b/src/main/java/com/rusefi/dfu/usb4java/DfuDeviceLocator.java @@ -1,7 +1,9 @@ package com.rusefi.dfu.usb4java; +import com.rusefi.dfu.DfuLogic; import com.rusefi.dfu.DfuSeFlashDescriptor; import com.rusefi.dfu.FlashRange; +import com.rusefi.dfu.LogUtil; import com.rusefi.dfu.commands.DfuCommandAbort; import com.rusefi.dfu.commands.DfuCommandClearStatus; import com.rusefi.dfu.commands.DfuCommandGetStatus; @@ -11,12 +13,6 @@ import org.usb4java.*; import java.nio.ByteBuffer; public class DfuDeviceLocator { - private static final short ST_VENDOR = 0x0483; - private static final short ST_DFU_PRODUCT = (short) 0xdf11; - - private static final byte USB_CLASS_APP_SPECIFIC = (byte) 0xfe; - private static final byte DFU_SUBCLASS = 0x01; - private static final byte USB_DT_DFU = 0x21; private static final Log log = LogUtil.getLog(DfuDeviceLocator.class); @@ -30,7 +26,7 @@ public class DfuDeviceLocator { } public static USBDfuConnection findDevice() { - return findDevice(openContext(), ST_VENDOR, ST_DFU_PRODUCT); + return findDevice(openContext(), DfuLogic.ST_VENDOR, DfuLogic.ST_DFU_PRODUCT); } private static USBDfuConnection findDevice(Context context, short vendorId, short productId) { @@ -99,7 +95,7 @@ public class DfuDeviceLocator { if (extra.limit() > 2) { int len = extra.get(); byte type = extra.get(); - if (type == USB_DT_DFU) { + if (type == DfuLogic.USB_DT_DFU) { System.out.println(len + " " + type); extra.get(); // bmAttributes extra.get(); // wDetachTimeOut @@ -126,8 +122,8 @@ public class DfuDeviceLocator { setting.bInterfaceProtocol() )); - if (setting.bInterfaceClass() == USB_CLASS_APP_SPECIFIC && - setting.bInterfaceSubClass() == DFU_SUBCLASS) { + if (setting.bInterfaceClass() == DfuLogic.USB_CLASS_APP_SPECIFIC && + setting.bInterfaceSubClass() == DfuLogic.DFU_SUBCLASS) { log.debug(String.format("Found DFU interface: %d", interfaceNumber)); String stringDescriptor = LibUsb.getStringDescriptor(deviceHandle, setting.iInterface()); diff --git a/src/test/java/com/rusefi/dfu/Sandbox.java b/src/test/java/com/rusefi/dfu/Sandbox.java index 251e714..fa01bd8 100644 --- a/src/test/java/com/rusefi/dfu/Sandbox.java +++ b/src/test/java/com/rusefi/dfu/Sandbox.java @@ -1,7 +1,6 @@ package com.rusefi.dfu; import com.rusefi.dfu.usb4java.DfuDeviceLocator; -import com.rusefi.dfu.usb4java.LogUtil; import com.rusefi.dfu.usb4java.USBDfuConnection; import cz.jaybee.intelhex.IntelHexException; import org.apache.commons.logging.Log;