mirror of https://github.com/rusefi/dfu_java.git
making things reusable by Android
This commit is contained in:
parent
3395172a36
commit
49600d0303
|
@ -17,4 +17,6 @@ Zadig is a Windows application that installs generic USB drivers, such as WinUSB
|
||||||
|
|
||||||
Uses precompiled https://github.com/j123b567/java-intelhex-parser
|
Uses precompiled https://github.com/j123b567/java-intelhex-parser
|
||||||
|
|
||||||
This implementation would not happen without http://dfu-util.sourceforge.net/dfuse.html and https://github.com/kairyu/flop
|
This implementation would not happen without http://dfu-util.sourceforge.net/dfuse.html and https://github.com/kairyu/flop
|
||||||
|
|
||||||
|
https://github.com/UmbrelaSmart/android-stm32-dfu-programmer is also nice
|
|
@ -0,0 +1,81 @@
|
||||||
|
1 configuration(s)
|
||||||
|
Config: Configuration Descriptor:
|
||||||
|
bLength 9
|
||||||
|
bDescriptorType 2
|
||||||
|
wTotalLength 54
|
||||||
|
bNumInterfaces 1
|
||||||
|
bConfigurationValue 1
|
||||||
|
iConfiguration 0
|
||||||
|
bmAttributes 0xc0
|
||||||
|
Self Powered
|
||||||
|
bMaxPower 100mA
|
||||||
|
extralen 0
|
||||||
|
extra:
|
||||||
|
|
||||||
|
Interface:
|
||||||
|
numAltsetting 4
|
||||||
|
Interface Descriptor:
|
||||||
|
bLength 9
|
||||||
|
bDescriptorType 4
|
||||||
|
bInterfaceNumber 0
|
||||||
|
bAlternateSetting 0
|
||||||
|
bNumEndpoints 0
|
||||||
|
bInterfaceClass 254 Application
|
||||||
|
bInterfaceSubClass 1
|
||||||
|
bInterfaceProtocol 2
|
||||||
|
iInterface 4
|
||||||
|
extralen 0
|
||||||
|
extra:
|
||||||
|
|
||||||
|
Interface Descriptor:
|
||||||
|
bLength 9
|
||||||
|
bDescriptorType 4
|
||||||
|
bInterfaceNumber 0
|
||||||
|
bAlternateSetting 1
|
||||||
|
bNumEndpoints 0
|
||||||
|
bInterfaceClass 254 Application
|
||||||
|
bInterfaceSubClass 1
|
||||||
|
bInterfaceProtocol 2
|
||||||
|
iInterface 5
|
||||||
|
extralen 0
|
||||||
|
extra:
|
||||||
|
|
||||||
|
Interface Descriptor:
|
||||||
|
bLength 9
|
||||||
|
bDescriptorType 4
|
||||||
|
bInterfaceNumber 0
|
||||||
|
bAlternateSetting 2
|
||||||
|
bNumEndpoints 0
|
||||||
|
bInterfaceClass 254 Application
|
||||||
|
bInterfaceSubClass 1
|
||||||
|
bInterfaceProtocol 2
|
||||||
|
iInterface 6
|
||||||
|
extralen 0
|
||||||
|
extra:
|
||||||
|
|
||||||
|
Interface Descriptor:
|
||||||
|
bLength 9
|
||||||
|
bDescriptorType 4
|
||||||
|
bInterfaceNumber 0
|
||||||
|
bAlternateSetting 3
|
||||||
|
bNumEndpoints 0
|
||||||
|
bInterfaceClass 254 Application
|
||||||
|
bInterfaceSubClass 1
|
||||||
|
bInterfaceProtocol 2
|
||||||
|
iInterface 7
|
||||||
|
extralen 9
|
||||||
|
extra:
|
||||||
|
09 21 0b ff 00 00 08 1a 01
|
||||||
|
1 interface(s)
|
||||||
|
Interface #0 setting #0:
|
||||||
|
Setting 0: 0 4 class fe, subclass 1, protocol: 2
|
||||||
|
Descriptor @Internal Flash /0x08000000/04*016Kg,01*064Kg,07*128Kg
|
||||||
|
Interface #0 setting #1:
|
||||||
|
Setting 1: 0 5 class fe, subclass 1, protocol: 2
|
||||||
|
Descriptor @Option Bytes /0x1FFFC000/01*016 e
|
||||||
|
Interface #0 setting #2:
|
||||||
|
Setting 2: 0 6 class fe, subclass 1, protocol: 2
|
||||||
|
Descriptor @OTP Memory /0x1FFF7800/01*512 e,01*016 e
|
||||||
|
Interface #0 setting #3:
|
||||||
|
Setting 3: 0 7 class fe, subclass 1, protocol: 2
|
||||||
|
Descriptor @Device Feature/0xFFFF0000/01*004 e
|
|
@ -9,7 +9,7 @@ import java.nio.ByteBuffer;
|
||||||
public class DfuLogic {
|
public class DfuLogic {
|
||||||
public static final short ST_VENDOR = 0x0483;
|
public static final short ST_VENDOR = 0x0483;
|
||||||
public static final int ST_DFU_PRODUCT = 0xdf11;
|
public static final int ST_DFU_PRODUCT = 0xdf11;
|
||||||
public static final byte USB_CLASS_APP_SPECIFIC = (byte) 0xfe;
|
public static final int USB_CLASS_APP_SPECIFIC = 0xfe;
|
||||||
public static final byte DFU_SUBCLASS = 0x01;
|
public static final byte DFU_SUBCLASS = 0x01;
|
||||||
public static final byte USB_DT_DFU = 0x21;
|
public static final byte USB_DT_DFU = 0x21;
|
||||||
|
|
||||||
|
|
|
@ -16,6 +16,8 @@ public class DfuDeviceLocator {
|
||||||
|
|
||||||
private static final Log log = LogUtil.getLog(DfuDeviceLocator.class);
|
private static final Log log = LogUtil.getLog(DfuDeviceLocator.class);
|
||||||
|
|
||||||
|
private static StringBuilder usbInfo = new StringBuilder();
|
||||||
|
|
||||||
public static Context openContext() {
|
public static Context openContext() {
|
||||||
Context context = new Context();
|
Context context = new Context();
|
||||||
int result = LibUsb.init(context);
|
int result = LibUsb.init(context);
|
||||||
|
@ -64,7 +66,8 @@ public class DfuDeviceLocator {
|
||||||
|
|
||||||
public static USBDfuConnection findDfuInterface(Device device, DeviceDescriptor deviceDescriptor) {
|
public static USBDfuConnection findDfuInterface(Device device, DeviceDescriptor deviceDescriptor) {
|
||||||
byte numConfigurations = deviceDescriptor.bNumConfigurations();
|
byte numConfigurations = deviceDescriptor.bNumConfigurations();
|
||||||
log.info(numConfigurations + " configuration(s)");
|
|
||||||
|
appendInfo(numConfigurations + " configuration(s)");
|
||||||
|
|
||||||
DeviceHandle deviceHandle = open(device);
|
DeviceHandle deviceHandle = open(device);
|
||||||
int transferSize = 0;
|
int transferSize = 0;
|
||||||
|
@ -77,11 +80,10 @@ public class DfuDeviceLocator {
|
||||||
throw new LibUsbException("getConfigDescriptor", result);
|
throw new LibUsbException("getConfigDescriptor", result);
|
||||||
}
|
}
|
||||||
|
|
||||||
System.out.println("Config " + config);
|
appendInfo("Config: " + config);
|
||||||
System.out.println("Config Done");
|
|
||||||
|
|
||||||
byte numInterfaces = config.bNumInterfaces();
|
byte numInterfaces = config.bNumInterfaces();
|
||||||
log.info(numInterfaces + " interface(s)");
|
appendInfo(numInterfaces + " interface(s)");
|
||||||
|
|
||||||
for (int interfaceIndex = 0; interfaceIndex < numInterfaces; interfaceIndex++) {
|
for (int interfaceIndex = 0; interfaceIndex < numInterfaces; interfaceIndex++) {
|
||||||
Interface iface = config.iface()[interfaceIndex];
|
Interface iface = config.iface()[interfaceIndex];
|
||||||
|
@ -107,6 +109,26 @@ public class DfuDeviceLocator {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (int interfaceIndex = 0; interfaceIndex < numInterfaces; interfaceIndex++) {
|
||||||
|
Interface iface = config.iface()[interfaceIndex];
|
||||||
|
|
||||||
|
for (int s = 0; s < iface.numAltsetting(); s++) {
|
||||||
|
InterfaceDescriptor setting = iface.altsetting()[s];
|
||||||
|
appendInfo("Interface #" + interfaceIndex + " setting #" + s + ":");
|
||||||
|
|
||||||
|
byte interfaceNumber = setting.bInterfaceNumber();
|
||||||
|
appendInfo(String.format("Setting %d: %x %x class %x, subclass %x, protocol: %x", s,
|
||||||
|
interfaceNumber,
|
||||||
|
setting.iInterface(),
|
||||||
|
setting.bInterfaceClass(),
|
||||||
|
setting.bInterfaceSubClass(),
|
||||||
|
setting.bInterfaceProtocol()
|
||||||
|
));
|
||||||
|
String stringDescriptor = LibUsb.getStringDescriptor(deviceHandle, setting.iInterface());
|
||||||
|
appendInfo("Descriptor " + stringDescriptor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for (int interfaceIndex = 0; interfaceIndex < numInterfaces; interfaceIndex++) {
|
for (int interfaceIndex = 0; interfaceIndex < numInterfaces; interfaceIndex++) {
|
||||||
Interface iface = config.iface()[interfaceIndex];
|
Interface iface = config.iface()[interfaceIndex];
|
||||||
|
|
||||||
|
@ -115,14 +137,8 @@ public class DfuDeviceLocator {
|
||||||
|
|
||||||
log.info("Settings " + setting);
|
log.info("Settings " + setting);
|
||||||
byte interfaceNumber = setting.bInterfaceNumber();
|
byte interfaceNumber = setting.bInterfaceNumber();
|
||||||
log.info(String.format("Setting %d: %x %x class %x, subclass %x, protocol: %x", s,
|
|
||||||
interfaceNumber,
|
|
||||||
setting.iInterface(),
|
|
||||||
setting.bInterfaceClass(), setting.bInterfaceSubClass(),
|
|
||||||
setting.bInterfaceProtocol()
|
|
||||||
));
|
|
||||||
|
|
||||||
if (setting.bInterfaceClass() == DfuLogic.USB_CLASS_APP_SPECIFIC &&
|
if (setting.bInterfaceClass() == (byte) DfuLogic.USB_CLASS_APP_SPECIFIC &&
|
||||||
setting.bInterfaceSubClass() == DfuLogic.DFU_SUBCLASS) {
|
setting.bInterfaceSubClass() == DfuLogic.DFU_SUBCLASS) {
|
||||||
log.debug(String.format("Found DFU interface: %d", interfaceNumber));
|
log.debug(String.format("Found DFU interface: %d", interfaceNumber));
|
||||||
|
|
||||||
|
@ -162,6 +178,9 @@ public class DfuDeviceLocator {
|
||||||
if (state != DfuCommandGetStatus.State.DFU_IDLE)
|
if (state != DfuCommandGetStatus.State.DFU_IDLE)
|
||||||
throw new IllegalStateException("Not idle");
|
throw new IllegalStateException("Not idle");
|
||||||
|
|
||||||
|
|
||||||
|
System.out.printf("info:\n" + usbInfo);
|
||||||
|
|
||||||
return session;
|
return session;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -170,6 +189,11 @@ public class DfuDeviceLocator {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void appendInfo(String message) {
|
||||||
|
log.info(message);
|
||||||
|
usbInfo.append(message).append("\n");
|
||||||
|
}
|
||||||
|
|
||||||
private static DeviceHandle open(Device device) {
|
private static DeviceHandle open(Device device) {
|
||||||
DeviceHandle deviceHandle = new DeviceHandle();
|
DeviceHandle deviceHandle = new DeviceHandle();
|
||||||
int result = LibUsb.open(device, deviceHandle);
|
int result = LibUsb.open(device, deviceHandle);
|
||||||
|
|
Loading…
Reference in New Issue