From d81708bc261ad60851f96967277f793f99d329d2 Mon Sep 17 00:00:00 2001 From: Jan Seeger Date: Sun, 7 Sep 2014 22:53:40 +0200 Subject: [PATCH] impl capacity response parser. get the capacity response's size for further use. --- .../usbstorage/bbb/BulkBlockDevice.java | 41 ++++++++++++------- .../scsi/answer/ReadCapacityResponse.java | 18 ++++++++ 2 files changed, 45 insertions(+), 14 deletions(-) diff --git a/lib/src/main/java/net/alphadev/usbstorage/bbb/BulkBlockDevice.java b/lib/src/main/java/net/alphadev/usbstorage/bbb/BulkBlockDevice.java index a4d2ae1..e4d1a1f 100644 --- a/lib/src/main/java/net/alphadev/usbstorage/bbb/BulkBlockDevice.java +++ b/lib/src/main/java/net/alphadev/usbstorage/bbb/BulkBlockDevice.java @@ -1,10 +1,12 @@ package net.alphadev.usbstorage.bbb; import net.alphadev.usbstorage.api.BulkDevice; +import net.alphadev.usbstorage.scsi.answer.ReadCapacityResponse; import net.alphadev.usbstorage.scsi.answer.ReadFormatCapacitiesEntry; import net.alphadev.usbstorage.scsi.answer.ReadFormatCapacitiesHeader; import net.alphadev.usbstorage.scsi.answer.StandardInquiryAnswer; import net.alphadev.usbstorage.scsi.command.Inquiry; +import net.alphadev.usbstorage.scsi.command.ReadCapacity; import net.alphadev.usbstorage.scsi.command.ReadFormatCapacities; import net.alphadev.usbstorage.scsi.command.ScsiCommand; import net.alphadev.usbstorage.scsi.command.TestUnitReady; @@ -30,16 +32,13 @@ public BulkBlockDevice(BulkDevice usbBlockDevice) throws IOException { setupInquiryPhase(); setupCapacityPhase(); - testReady(); + testUnitReady(); } - private void testReady() throws IOException { + private void testUnitReady() throws IOException { send_mass_storage_command(new TestUnitReady()); - CommandStatusWrapper csw = retrieve_mass_storage_answer(); - if (CommandStatusWrapper.Status.COMMAND_PASSED != csw.getStatus()) { - throw new IllegalStateException("device signaled error state!"); - } + checkDeviceStatus(); } private void setupCapacityPhase() throws IOException { @@ -47,10 +46,7 @@ private void setupCapacityPhase() throws IOException { send_mass_storage_command(new ReadFormatCapacities()); byte[] answer = mAbstractBulkDevice.retrieve_data_packet(ReadFormatCapacitiesHeader.LENGTH); ReadFormatCapacitiesHeader capacity = new ReadFormatCapacitiesHeader(answer); - CommandStatusWrapper csw = retrieve_mass_storage_answer(); - if (CommandStatusWrapper.Status.COMMAND_PASSED != csw.getStatus()) { - throw new IllegalStateException("device signaled error state!"); - } + checkDeviceStatus(); for (int i = 0; i < capacity.getCapacityEntryCount(); i++) { byte[] capacityData = mAbstractBulkDevice.retrieve_data_packet(ReadFormatCapacitiesEntry.LENGTH); @@ -68,6 +64,26 @@ private void setupCapacityPhase() throws IOException { } catch (IllegalArgumentException ex) { // do nothing as the read format capacities command is optional. } + + try { + send_mass_storage_command(new ReadCapacity()); + byte[] answer = mAbstractBulkDevice.retrieve_data_packet(ReadCapacityResponse.LENGTH); + ReadCapacityResponse capacity = new ReadCapacityResponse(answer); + + checkDeviceStatus(); + + mDeviceBoundaries = capacity.getNumberOfBlocks(); + mBlockSize = capacity.getBlockSize(); + } catch (IllegalArgumentException e) { + // whaaat! + } + } + + private void checkDeviceStatus() { + CommandStatusWrapper csw = retrieve_mass_storage_answer(); + if (CommandStatusWrapper.Status.COMMAND_PASSED != csw.getStatus()) { + throw new IllegalStateException("device signaled error state!"); + } } private void setupInquiryPhase() throws IOException { @@ -76,10 +92,7 @@ private void setupInquiryPhase() throws IOException { byte[] answer = mAbstractBulkDevice.retrieve_data_packet(StandardInquiryAnswer.LENGTH); new StandardInquiryAnswer(answer); - CommandStatusWrapper csw = retrieve_mass_storage_answer(); - if (CommandStatusWrapper.Status.COMMAND_PASSED != csw.getStatus()) { - throw new IllegalStateException("device signaled error state!"); - } + checkDeviceStatus(); } private CommandStatusWrapper retrieve_mass_storage_answer() { diff --git a/lib/src/main/java/net/alphadev/usbstorage/scsi/answer/ReadCapacityResponse.java b/lib/src/main/java/net/alphadev/usbstorage/scsi/answer/ReadCapacityResponse.java index 604abf6..46603ba 100644 --- a/lib/src/main/java/net/alphadev/usbstorage/scsi/answer/ReadCapacityResponse.java +++ b/lib/src/main/java/net/alphadev/usbstorage/scsi/answer/ReadCapacityResponse.java @@ -1,8 +1,26 @@ package net.alphadev.usbstorage.scsi.answer; +import static net.alphadev.usbstorage.util.BitStitching.convertToInt; + /** * @author Jan Seeger */ public class ReadCapacityResponse { public static final int LENGTH = 8; + + private int mBlockSize; + private int mNumberOfBlocks; + + public ReadCapacityResponse(byte[] answer) { + mNumberOfBlocks = convertToInt(answer, 0); + mBlockSize = convertToInt(answer, 4); + } + + public int getBlockSize() { + return mBlockSize; + } + + public int getNumberOfBlocks() { + return mNumberOfBlocks; + } }