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;