From f8fb491da45db71862efda2d89500a505c0d4743 Mon Sep 17 00:00:00 2001 From: Michael McMaster Date: Sun, 31 Jan 2021 19:52:15 +1000 Subject: [PATCH] In-progress - cleanup code to support multiple devices --- .../com/codesrc/scsi2sd/io/StorageDevice.java | 26 +++++++++ .../codesrc/scsi2sd/io/StorageDeviceType.java | 6 ++ .../com/codesrc/scsi2sd/io/UsbDevice.java | 6 +- .../scsi2sd/io/V3FirmwareUsbDevice.java | 58 ++++++++++--------- .../scsi2sd/io/V6FirmwareUsbDevice.java | 17 ++++-- .../scsi2sd/presentation/MainController.java | 3 +- 6 files changed, 79 insertions(+), 37 deletions(-) create mode 100644 scsi2sd.io/src/main/java/com/codesrc/scsi2sd/io/StorageDevice.java create mode 100644 scsi2sd.io/src/main/java/com/codesrc/scsi2sd/io/StorageDeviceType.java diff --git a/scsi2sd.io/src/main/java/com/codesrc/scsi2sd/io/StorageDevice.java b/scsi2sd.io/src/main/java/com/codesrc/scsi2sd/io/StorageDevice.java new file mode 100644 index 0000000..02655c2 --- /dev/null +++ b/scsi2sd.io/src/main/java/com/codesrc/scsi2sd/io/StorageDevice.java @@ -0,0 +1,26 @@ +package com.codesrc.scsi2sd.io; + +public class StorageDevice { + private int _deviceId; + private StorageDeviceType _storageDeviceType; + private long _capacity; + + private boolean _supportsImageCommands; + + StorageDevice( + int deviceId, + StorageDeviceType storageDeviceType, + long capacity, + boolean supportsImageCommands) { + + this._deviceId = deviceId; + this._storageDeviceType = storageDeviceType; + this._capacity = capacity; + this._supportsImageCommands = supportsImageCommands; + } + + public int get_deviceId() { return this._deviceId; } + public long get_capacity() { return this._capacity; } + public StorageDeviceType get_storageDeviceType() { return this._storageDeviceType; } + public boolean is_supportsImageCommands() { return this._supportsImageCommands; } +} diff --git a/scsi2sd.io/src/main/java/com/codesrc/scsi2sd/io/StorageDeviceType.java b/scsi2sd.io/src/main/java/com/codesrc/scsi2sd/io/StorageDeviceType.java new file mode 100644 index 0000000..34d77d6 --- /dev/null +++ b/scsi2sd.io/src/main/java/com/codesrc/scsi2sd/io/StorageDeviceType.java @@ -0,0 +1,6 @@ +package com.codesrc.scsi2sd.io; + +public enum StorageDeviceType { + SD, + NOR_FLASH +} diff --git a/scsi2sd.io/src/main/java/com/codesrc/scsi2sd/io/UsbDevice.java b/scsi2sd.io/src/main/java/com/codesrc/scsi2sd/io/UsbDevice.java index 662b756..5590f11 100644 --- a/scsi2sd.io/src/main/java/com/codesrc/scsi2sd/io/UsbDevice.java +++ b/scsi2sd.io/src/main/java/com/codesrc/scsi2sd/io/UsbDevice.java @@ -19,6 +19,7 @@ package com.codesrc.scsi2sd.io; import java.io.File; import java.io.IOException; +import java.util.List; /** * Created by michael on 27/08/18. @@ -28,7 +29,8 @@ public interface UsbDevice { int getFirmwareVersion(); String getFirmwareDescription(); - int getSdCapacity(); + + List getStorageDevices(); int getMaxDisks(); byte[] readBoardConfig(); @@ -39,7 +41,7 @@ public interface UsbDevice { void saveDiskConfig(int index, byte[] data); void saveCommit(); - void writeImage(File file, int sectorStart) throws IOException; + void writeImage(int deviceId, File file, int sectorStart) throws IOException; boolean supportsTerminator(); boolean supportsSynchronous(); diff --git a/scsi2sd.io/src/main/java/com/codesrc/scsi2sd/io/V3FirmwareUsbDevice.java b/scsi2sd.io/src/main/java/com/codesrc/scsi2sd/io/V3FirmwareUsbDevice.java index 99c8b39..faad4e4 100644 --- a/scsi2sd.io/src/main/java/com/codesrc/scsi2sd/io/V3FirmwareUsbDevice.java +++ b/scsi2sd.io/src/main/java/com/codesrc/scsi2sd/io/V3FirmwareUsbDevice.java @@ -22,9 +22,7 @@ import org.hid4java.HidServices; import org.slf4j.LoggerFactory; import java.io.*; -import java.util.Arrays; -import java.util.HashMap; -import java.util.Map; +import java.util.*; public class V3FirmwareUsbDevice implements UsbDevice { private static org.slf4j.Logger LOGGER = LoggerFactory.getLogger(V3FirmwareUsbDevice.class.getPackageName()); @@ -53,7 +51,9 @@ public class V3FirmwareUsbDevice implements UsbDevice { private HidPacketProtocolDevice protocolDevice; private int firmwareVersion; - private int sDCapacity; + + private List storageDeviceList; + private long legacySdCapacity; private byte[] boardConfigSector; private Map diskConfigSector = new HashMap<>(); @@ -78,11 +78,17 @@ public class V3FirmwareUsbDevice implements UsbDevice { throw new RuntimeException("Failed to open USB device."); } } + this.readDebugData(); + this.storageDeviceList = new LinkedList(); if (firmwareVersion >= 0x0485) { this.readDeviceList(); } + else + { + this.storageDeviceList.add(new StorageDevice(0, StorageDeviceType.SD, this.legacySdCapacity, false)); + } } @Override @@ -113,6 +119,11 @@ public class V3FirmwareUsbDevice implements UsbDevice { return "Unknown"; } + @Override + public List getStorageDevices() { + return Collections.unmodifiableList(this.storageDeviceList); + } + @Override public int getFirmwareVersion() { return this.firmwareVersion; @@ -133,11 +144,6 @@ public class V3FirmwareUsbDevice implements UsbDevice { return out.toString(); } - @Override - public int getSdCapacity() { - return this.sDCapacity; - } - @Override public boolean supportsTerminator() { switch (this.configHidDevice.getReleaseNumber()) { @@ -168,7 +174,7 @@ public class V3FirmwareUsbDevice implements UsbDevice { this.debugHidDevice.read(data, 5000); this.firmwareVersion = (HidPacketProtocol.uint8ToInt(data[62]) << 8) | HidPacketProtocol.uint8ToInt(data[63]); - this.sDCapacity = + this.legacySdCapacity = (HidPacketProtocol.uint8ToInt(data[58]) << 24) | (HidPacketProtocol.uint8ToInt(data[59]) << 16) | (HidPacketProtocol.uint8ToInt(data[60]) << 8) | @@ -187,30 +193,26 @@ public class V3FirmwareUsbDevice implements UsbDevice { for (int i = 1; i + 4 < response.length; i += 5) { int devType = HidPacketProtocol.uint8ToInt(response[i]); - String devTypeStr = "Unknown"; + StorageDeviceType devTypeEnum = StorageDeviceType.SD; switch (devType) { - case 0: devTypeStr = "SD"; break; - case 1: devTypeStr = "SPIFLASH"; break; + case 0: devTypeEnum = StorageDeviceType.SD; break; + case 1: devTypeEnum = StorageDeviceType.NOR_FLASH; break; } int capacity = (HidPacketProtocol.uint8ToInt(response[i + 1]) << 24) | (HidPacketProtocol.uint8ToInt(response[i + 2]) << 16) | (HidPacketProtocol.uint8ToInt(response[i + 3]) << 8) | (HidPacketProtocol.uint8ToInt(response[i + 4])); - System.out.print("Found storage device type " + devTypeStr + " with capacity: "); - System.out.println(capacity * 512L); - } - /* - System.out.println("Reading a sector"); - byte[] readCmd = {(byte)Commands.DEV_READ.ordinal(), (byte)1, (byte)0, (byte)0, (byte)0, (byte)1}; - byte[] readResponse = protocolDevice.sendHIDPacket(readCmd, 512); - for (var i = 0; i < readResponse.length; ++i) { - System.out.println(HidPacketProtocol.uint8ToInt(readResponse[i])); - } - - System.out.println("FLASH test complete"); - */ + this.storageDeviceList.add( + new StorageDevice( + this.storageDeviceList.size(), + devTypeEnum, + capacity * 512L, + devTypeEnum == StorageDeviceType.NOR_FLASH + ) + ); + } } @@ -274,7 +276,7 @@ public class V3FirmwareUsbDevice implements UsbDevice { } @Override - public void writeImage(File file, int sectorStart) throws IOException + public void writeImage(int deviceId, File file, int sectorStart) throws IOException { // Only supported on the flash device // Erase the flash device @@ -282,7 +284,7 @@ public class V3FirmwareUsbDevice implements UsbDevice { var sectors = ((int) file.length() + 511) / 512; byte[] eraseCmd = { (byte)Commands.DEV_ERASE.ordinal(), - (byte)1, // Hardcoded flash device for now + HidPacketProtocol.intToUint8(deviceId), (byte)0, (byte)0, (byte)0, diff --git a/scsi2sd.io/src/main/java/com/codesrc/scsi2sd/io/V6FirmwareUsbDevice.java b/scsi2sd.io/src/main/java/com/codesrc/scsi2sd/io/V6FirmwareUsbDevice.java index 33e474f..62fb84e 100644 --- a/scsi2sd.io/src/main/java/com/codesrc/scsi2sd/io/V6FirmwareUsbDevice.java +++ b/scsi2sd.io/src/main/java/com/codesrc/scsi2sd/io/V6FirmwareUsbDevice.java @@ -24,6 +24,7 @@ import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.List; public class V6FirmwareUsbDevice implements UsbDevice { @@ -36,6 +37,8 @@ public class V6FirmwareUsbDevice implements UsbDevice { private HidPacketProtocolDevice protocolDevice; private int firmwareVersion; + + private List storageDeviceList; private int sDCapacity; private byte[] configSector0; @@ -52,6 +55,8 @@ public class V6FirmwareUsbDevice implements UsbDevice { } } this.readDebugData(); + + this.storageDeviceList.add(new StorageDevice(0, StorageDeviceType.SD, this.sDCapacity, false)); } @Override @@ -59,6 +64,11 @@ public class V6FirmwareUsbDevice implements UsbDevice { return "3.5\" SCSI2SD V6"; } + @Override + public List getStorageDevices() { + return Collections.unmodifiableList(this.storageDeviceList); + } + @Override public int getFirmwareVersion() { return this.firmwareVersion; @@ -79,11 +89,6 @@ public class V6FirmwareUsbDevice implements UsbDevice { return out.toString(); } - @Override - public int getSdCapacity() { - return this.sDCapacity; - } - @Override public boolean supportsTerminator() { return true; @@ -169,7 +174,7 @@ public class V6FirmwareUsbDevice implements UsbDevice { } @Override - public void writeImage(File file, int sectorStart) throws IOException + public void writeImage(int deviceId, File file, int sectorStart) throws IOException { throw new UnsupportedOperationException("Not implemented yet"); } diff --git a/scsi2sd.ui/src/main/java/com/codesrc/scsi2sd/presentation/MainController.java b/scsi2sd.ui/src/main/java/com/codesrc/scsi2sd/presentation/MainController.java index efb1505..9494263 100644 --- a/scsi2sd.ui/src/main/java/com/codesrc/scsi2sd/presentation/MainController.java +++ b/scsi2sd.ui/src/main/java/com/codesrc/scsi2sd/presentation/MainController.java @@ -169,7 +169,8 @@ public class MainController implements FXController, DocumentObserver { this.menuOpenDevice.setDisable(false); this.loadConfigFromDevice(device); this.menuSaveDevice.setDisable(false); - this.menuWriteImage.setDisable(false); + this.menuWriteImage.setDisable( + device.getStorageDevices().stream().anyMatch(sd -> sd.is_supportsImageCommands()) ? false : true); } private void loadConfigFromDevice(UsbDevice device) { -- 2.38.5