]> localhost Git - scsi2sd-util.git/commitdiff
In-progress - cleanup code to support multiple devices
authorMichael McMaster <michael@codesrc.com>
Sun, 31 Jan 2021 09:52:15 +0000 (19:52 +1000)
committerMichael McMaster <michael@codesrc.com>
Sun, 31 Jan 2021 09:52:15 +0000 (19:52 +1000)
scsi2sd.io/src/main/java/com/codesrc/scsi2sd/io/StorageDevice.java [new file with mode: 0644]
scsi2sd.io/src/main/java/com/codesrc/scsi2sd/io/StorageDeviceType.java [new file with mode: 0644]
scsi2sd.io/src/main/java/com/codesrc/scsi2sd/io/UsbDevice.java
scsi2sd.io/src/main/java/com/codesrc/scsi2sd/io/V3FirmwareUsbDevice.java
scsi2sd.io/src/main/java/com/codesrc/scsi2sd/io/V6FirmwareUsbDevice.java
scsi2sd.ui/src/main/java/com/codesrc/scsi2sd/presentation/MainController.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 (file)
index 0000000..02655c2
--- /dev/null
@@ -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 (file)
index 0000000..34d77d6
--- /dev/null
@@ -0,0 +1,6 @@
+package com.codesrc.scsi2sd.io;
+
+public enum StorageDeviceType {
+    SD,
+    NOR_FLASH
+}
index 662b75622dde2f0285e63026a59df5295606666a..5590f11d05c8871d5f3809af306af921f8298b6d 100644 (file)
@@ -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<StorageDevice> 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();
index 99c8b3925ccdd0d35f584d268ea85eb521b64fa0..faad4e4ea1ca69d88342c11d194990a1fe8b6646 100644 (file)
@@ -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<StorageDevice> storageDeviceList;
+    private long legacySdCapacity;
 
     private byte[] boardConfigSector;
     private Map<Integer, byte[]> 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<StorageDevice>();
         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<StorageDevice> 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,
index 33e474fe3c61f268dd33f51776aea1d1d8ef0bb2..62fb84e638551fa91f6672538326af7561d2d4bc 100644 (file)
@@ -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<StorageDevice> 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<StorageDevice> 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");
     }
index efb1505f1f026c5d82564be680d5e5b90a9cf0e1..949426370b8335722b0cab60278198e057300051 100644 (file)
@@ -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) {