Bladeren bron

Replace magic numbers with constants - thanks Jokker

Eric Helgeson 3 jaren geleden
bovenliggende
commit
f7799fb225
4 gewijzigde bestanden met toevoegingen van 187 en 55 verwijderingen
  1. 58 55
      src/BlueSCSI.cpp
  2. 84 0
      src/scsi_cmds.h
  3. 31 0
      src/scsi_sense.h
  4. 14 0
      src/scsi_status.h

+ 58 - 55
src/BlueSCSI.cpp

@@ -38,6 +38,9 @@
 #include <Arduino.h> // For Platform.IO
 #include <SdFat.h>
 #include <setjmp.h>
+#include "scsi_cmds.h"
+#include "scsi_sense.h"
+#include "scsi_status.h"
 
 #ifdef USE_STM32_DMA
 #warning "warning USE_STM32_DMA"
@@ -1102,7 +1105,7 @@ void verifyDataPhaseSD(uint32_t adds, uint32_t len)
 byte onInquiryCommand(byte len)
 {
   writeDataPhase(len < 36 ? len : 36, SCSI_INFO_BUF);
-  return 0x00;
+  return SCSI_STATUS_GOOD;
 }
 
 /*
@@ -1132,9 +1135,9 @@ void onRequestSenseCommand(byte len)
 byte onReadCapacityCommand(byte pmi)
 {
   if(!m_img) {
-    m_senseKey = 2; // Not ready
-    m_addition_sense = 0x0403; // Logical Unit Not Ready, Manual Intervention Required
-    return 0x02; // Image file absent
+    m_senseKey = SCSI_SENSE_NOT_READY;
+    m_addition_sense = SCSI_ASC_LUN_NOT_READY_MANUAL_INTERVENTION_REQUIRED;
+    return SCSI_STATUS_CHECK_CONDITION;
   }
   
   uint32_t bl = m_img->m_blocksize;
@@ -1144,7 +1147,7 @@ byte onReadCapacityCommand(byte pmi)
     bl >> 24, bl >> 16, bl >> 8, bl    
   };
   writeDataPhase(8, buf);
-  return 0x00;
+  return SCSI_STATUS_GOOD;
 }
 
 /*
@@ -1154,18 +1157,18 @@ byte checkBlockCommand(uint32_t adds, uint32_t len)
 {
   // Check that image file is present
   if(!m_img) {
-    m_senseKey = 2; // Not ready
-    m_addition_sense = 0x0403; // Logical Unit Not Ready, Manual Intervention Required
-    return 0x02;
+    m_senseKey = SCSI_SENSE_NOT_READY;
+    m_addition_sense = SCSI_ASC_LUN_NOT_READY_MANUAL_INTERVENTION_REQUIRED;
+    return SCSI_STATUS_CHECK_CONDITION;
   }
   // Check block range is valid
   uint32_t bc = m_img->m_fileSize / m_img->m_blocksize;
   if (adds >= bc || (adds + len) > bc) {
-    m_senseKey = 5; // Illegal request
-    m_addition_sense = 0x2100; // Logical block address out of range
-    return 0x02;
+    m_senseKey = SCSI_SENSE_ILLEGAL_REQUEST;
+    m_addition_sense = SCSI_ASC_LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE;
+    return SCSI_STATUS_CHECK_CONDITION;
   }
-  return 0x00;
+  return SCSI_STATUS_GOOD;
 }
 
 /*
@@ -1184,7 +1187,7 @@ byte onReadCommand(uint32_t adds, uint32_t len)
   LED_ON();
   writeDataPhaseSD(adds, len);
   LED_OFF();
-  return 0x00; //sts
+  return SCSI_STATUS_GOOD;
 }
 
 /*
@@ -1203,7 +1206,7 @@ byte onWriteCommand(uint32_t adds, uint32_t len)
   LED_ON();
   readDataPhaseSD(adds, len);
   LED_OFF();
-  return 0; //sts
+  return SCSI_STATUS_GOOD;
 }
 
 /*
@@ -1226,7 +1229,7 @@ byte onVerifyCommand(byte flags, uint32_t adds, uint32_t len)
     verifyDataPhaseSD(adds, len);
     LED_OFF();
   }
-  return 0x00;
+  return SCSI_STATUS_GOOD;
 }
 
 /*
@@ -1235,9 +1238,9 @@ byte onVerifyCommand(byte flags, uint32_t adds, uint32_t len)
 byte onModeSenseCommand(byte scsi_cmd, byte dbd, byte cmd2, uint32_t len)
 {
   if(!m_img) {
-    m_senseKey = 2; // Not ready
-    m_addition_sense = 0x0403; // Logical Unit Not Ready, Manual Intervention Required
-    return 0x02; // No image file
+    m_senseKey = SCSI_SENSE_NOT_READY;
+    m_addition_sense = SCSI_ASC_LUN_NOT_READY_MANUAL_INTERVENTION_REQUIRED;
+    return SCSI_STATUS_CHECK_CONDITION;
   }
 
   uint32_t bl =  m_img->m_blocksize;
@@ -1311,12 +1314,12 @@ byte onModeSenseCommand(byte scsi_cmd, byte dbd, byte cmd2, uint32_t len)
     break; // Don't want 0x3F falling through to error condition
 
   default:
-    m_senseKey = 5; // Illegal request
-    m_addition_sense = 0x2400; // Invalid field in CDB
-    return 0x02;
+    m_senseKey = SCSI_SENSE_ILLEGAL_REQUEST;
+    m_addition_sense = SCSI_ASC_INVALID_FIELD_IN_CDB;
+    return SCSI_STATUS_CHECK_CONDITION;
     break;
   }
-  if(scsi_cmd == 0x5A) // MODE SENSE 10
+  if(scsi_cmd == SCSI_MODE_SENSE10)
   {
     m_buf[1] = a - 2;
     m_buf[7] = 0x08;
@@ -1327,15 +1330,15 @@ byte onModeSenseCommand(byte scsi_cmd, byte dbd, byte cmd2, uint32_t len)
     m_buf[3] = 0x08;
   }
   writeDataPhase(len < a ? len : a, m_buf);
-  return 0x00;
+  return SCSI_STATUS_GOOD;
 }
     
 byte onModeSelectCommand(byte scsi_cmd, byte flags, uint32_t len)
 {
   if (len > MAX_BLOCKSIZE) {
-    m_senseKey = 5; // Illegal request
-    m_addition_sense = 0x2400; // Invalid field in CDB
-    return 0x02;
+    m_senseKey = SCSI_SENSE_ILLEGAL_REQUEST;
+    m_addition_sense = SCSI_ASC_INVALID_FIELD_IN_CDB;
+    return SCSI_STATUS_CHECK_CONDITION;
   }
   readDataPhase(len, m_buf);
   //Apple HD SC Setup sends:
@@ -1346,7 +1349,7 @@ byte onModeSelectCommand(byte scsi_cmd, byte flags, uint32_t len)
     LOGHEX(m_buf[i]);LOG(" ");
   }
   LOGN("");
-  return 0x00;
+  return SCSI_STATUS_GOOD;
 }
     
 /*
@@ -1511,89 +1514,89 @@ void loop()
 
   LOGN("");
   switch(cmd[0]) {
-  case 0x00:
-    LOGN("[Test Unit]");
+  case SCSI_TEST_UNIT_READY: // TODO: Implement me!
+    LOGN("[Test Unit Ready]");
     break;
-  case 0x01:
+  case SCSI_REZERO_UNIT: // TODO: Implement me!
     LOGN("[Rezero Unit]");
     break;
-  case 0x03:
+  case SCSI_REQUEST_SENSE:
     LOGN("[RequestSense]");
     onRequestSenseCommand(cmd[4]);
     break;
-  case 0x04:
-    LOGN("[FormatUnit]");
+  case SCSI_FORMAT_UNIT4: // TODO: Implement me!
+    LOGN("[FormatUnit4]");
     break;
-  case 0x06:
-    LOGN("[FormatUnit]");
+  case SCSI_FORMAT_UNIT6: // TODO: Implement me!
+    LOGN("[FormatUnit6]");
     break;
-  case 0x07:
+  case SCSI_REASSIGN_BLOCKS: // TODO: Implement me!
     LOGN("[ReassignBlocks]");
     break;
-  case 0x08:
+  case SCSI_READ6:
     LOGN("[Read6]");
     m_sts |= onReadCommand((((uint32_t)cmd[1] & 0x1F) << 16) | ((uint32_t)cmd[2] << 8) | cmd[3], (cmd[4] == 0) ? 0x100 : cmd[4]);
     break;
-  case 0x0A:
+  case SCSI_WRITE6:
     LOGN("[Write6]");
     m_sts |= onWriteCommand((((uint32_t)cmd[1] & 0x1F) << 16) | ((uint32_t)cmd[2] << 8) | cmd[3], (cmd[4] == 0) ? 0x100 : cmd[4]);
     break;
-  case 0x0B:
+  case SCSI_SEEK6: // TODO: Implement me!
     LOGN("[Seek6]");
     break;
-  case 0x12:
+  case SCSI_INQUIRY:
     LOGN("[Inquiry]");
     m_sts |= onInquiryCommand(cmd[4]);
     break;
-  case 0x15:
+  case SCSI_MODE_SELECT6:
     LOGN("[ModeSelect6]");
     m_sts |= onModeSelectCommand(cmd[0], cmd[1], cmd[4]);
     break;
-  case 0x1A:
+  case SCSI_MODE_SENSE6:
     LOGN("[ModeSense6]");
     m_sts |= onModeSenseCommand(cmd[0], cmd[1]&0x80, cmd[2], cmd[4]);
     break;
-  case 0x1B:
+  case SCSI_START_STOP_UNIT: // TODO: Implement me!
     LOGN("[StartStopUnit]");
     break;
-  case 0x1E:
+  case SCSI_PREVENT_ALLOW_REMOVAL: // TODO: Implement me!
     LOGN("[PreAllowMed.Removal]");
     break;
-  case 0x25:
+  case SCSI_READ_CAPACITY:
     LOGN("[ReadCapacity]");
     m_sts |= onReadCapacityCommand(cmd[8]);
     break;
-  case 0x28:
+  case SCSI_READ10:
     LOGN("[Read10]");
     m_sts |= onReadCommand(((uint32_t)cmd[2] << 24) | ((uint32_t)cmd[3] << 16) | ((uint32_t)cmd[4] << 8) | cmd[5], ((uint32_t)cmd[7] << 8) | cmd[8]);
     break;
-  case 0x2A:
+  case SCSI_WRITE10:
     LOGN("[Write10]");
     m_sts |= onWriteCommand(((uint32_t)cmd[2] << 24) | ((uint32_t)cmd[3] << 16) | ((uint32_t)cmd[4] << 8) | cmd[5], ((uint32_t)cmd[7] << 8) | cmd[8]);
     break;
-  case 0x2B:
+  case SCSI_SEEK10: // TODO: Implement me!
     LOGN("[Seek10]");
     break;
-  case 0x2F:
+  case SCSI_VERIFY10:
     LOGN("[Verify10]");
     m_sts |= onVerifyCommand(cmd[1], ((uint32_t)cmd[2] << 24) | ((uint32_t)cmd[3] << 16) | ((uint32_t)cmd[4] << 8) | cmd[5], ((uint32_t)cmd[7] << 8) | cmd[8]);
     break;
-  case 0x35:
+  case SCSI_SYNCHRONIZE_CACHE: // TODO: Implement me!
     LOGN("[SynchronizeCache10]");
     break;
-  case 0x55:
+  case SCSI_MODE_SELECT10:
     LOGN("[ModeSelect10");
     m_sts |= onModeSelectCommand(cmd[0], cmd[1], ((uint32_t)cmd[7] << 8) | cmd[8]);
     break;
-  case 0x5A:
+  case SCSI_MODE_SENSE10:
     LOGN("[ModeSense10]");
     m_sts |= onModeSenseCommand(cmd[0], cmd[1] & 0x80, cmd[2], ((uint32_t)cmd[7] << 8) | cmd[8]);
     break;
   default:
     LOGN("[*Unknown]");
-    m_sts |= 0x02;
-    m_senseKey = 5;  // Illegal request
-    m_addition_sense = 0x2000; // Invalid Command Operation Code
+    m_sts |= SCSI_STATUS_CHECK_CONDITION;
+    m_senseKey = SCSI_SENSE_ILLEGAL_REQUEST;
+    m_addition_sense = SCSI_ASC_INVALID_OPERATION_CODE;
     break;
   }
 

+ 84 - 0
src/scsi_cmds.h

@@ -0,0 +1,84 @@
+#ifndef __SCSI_CMDS_H__
+#define __SCSI_CMDS_H__
+
+// defines for SCSI commands
+#define SCSI_TEST_UNIT_READY        0
+#define SCSI_REZERO_UNIT            0x1
+#define SCSI_REQUEST_SENSE          0x3
+#define SCSI_FORMAT_UNIT4           0x4
+#define SCSI_FORMAT_UNIT6           0x6
+#define SCSI_REASSIGN_BLOCKS        0x7
+#define SCSI_READ6                  0x8
+#define SCSI_WRITE6                 0xA
+#define SCSI_SEEK6                  0xB
+#define SCSI_INQUIRY                0x12
+#define SCSI_MODE_SELECT6           0x15
+#define SCSI_RESERVE                0x16
+#define SCSI_RELEASE                0x17
+#define SCSI_COPY                   0x18
+#define SCSI_MODE_SENSE6            0x1A
+#define SCSI_START_STOP_UNIT        0x1B
+#define SCSI_RECV_DIAG_RESULTS      0x1C
+#define SCSI_SEND_DIAG              0x1D
+#define SCSI_PREVENT_ALLOW_REMOVAL  0x1E
+#define SCSI_READ_CAPACITY          0x25
+#define SCSI_READ10                 0x28
+#define SCSI_WRITE10                0x2A
+#define SCSI_SEEK10                 0x2B
+#define SCSI_WRITE_AND_VERIFY       0x2E
+#define SCSI_VERIFY10               0x2F
+#define SCSI_SEARCH_DATA_HIGH       0x30
+#define SCSI_SEARCH_DATA_EQUAL      0x31
+#define SCSI_SEARCH_DATA_LOW        0x32
+#define SCSI_SET_LIMITS             0x33
+#define SCSI_PREFETCH               0x34
+#define SCSI_SYNCHRONIZE_CACHE      0x35
+#define SCSI_LOCK_UNLOCK_CACHE      0x36
+#define SCSI_READ_DEFECT_DATA       0x37
+#define SCSI_COMPARE                0x39
+#define SCSI_COPY_AND_VERIFY        0x3A
+#define SCSI_WRITE_BUFFER           0x3B
+#define SCSI_READ_BUFFER            0x3C
+#define SCSI_READ_LONG              0x3E
+#define SCSI_WRITE_LONG             0x3F
+#define SCSI_CHANGE_DEFINITION      0x40
+#define SCSI_WRITE_SAME             0x41
+#define SCSI_LOG_SELECT             0x4C
+#define SCSI_LOG_SENSE              0x4D
+#define SCSI_MODE_SELECT10          0x55
+#define SCSI_MODE_SENSE10           0x5A
+#define SCSI_READ12                 0xA8
+#define SCSI_VERIFY12               0xAF
+
+
+#define SCSI_TOC_LENGTH 20 // length for default CDROM TOC
+
+// SCSI CDROM commands
+#define SCSI_AUDIO_SCAN1            0xBA
+#define SCSI_AUDIO_SCAN2            0xCD
+#define SCSI_PAUSE_RESUME           0x4B
+#define SCSI_PLAY_AUDIO10           0x45
+#define SCSI_PLAY_AUDIO12           0xA5
+#define SCSI_PLAY_AUDIO_MSF         0x47
+#define SCSI_PLAY_AUDIO_TRACK_IDX   0x48
+#define SCSI_PLAY_TRACK_RELATIVE10  0x49
+#define SCSI_PLAY_TRACK_RELATIVE12  0xA9
+#define SCSI_READ_CD                0xBE
+#define SCSI_READ_CD_DD             0xD8
+#define SCSI_READ_CD_MSF            0xB9
+#define SCSI_READ_CDDA_MSF          0xD9
+#define SCSI_READ_CDXA              0xDB
+#define SCSI_READ_ALL_SUBCODE       0xDF
+#define SCSI_READ_HEADER            0x44
+#define SCSI_READ_SUBCHANNEL        0x42
+#define SCSI_READ_TOC               0x43
+#define SCSI_READ_DISC_INFORMATION  0x51
+#define SCSI_READ_DVD_STRUCTURE     0xAD
+#define SCSI_SET_CDROM_SPEED1       0xBB
+#define SCSI_SET_CDROM_SPEED2       0xDA
+#define SCSI_STOP_PLAY_SCAN         0x4E
+#define SCSI_READ_CDP               0xE4
+#define SCSI_READ_DRIVE_STATUS      0xE0
+#define SCSI_WRITE_CDP              0xE3
+
+#endif // __SCSI_CMDS_H__

+ 31 - 0
src/scsi_sense.h

@@ -0,0 +1,31 @@
+#ifndef __SCSI_SENSE_H__
+#define __SCSI_SENSE_H__
+
+#define SCSI_SENSE_NO_SENSE         0
+#define SCSI_SENSE_RECOVERED_ERROR  0x1
+#define SCSI_SENSE_NOT_READY        0x2
+#define SCSI_SENSE_MEDUIM_ERROR     0x3
+#define SCSI_SENSE_HARDWARE_ERROR   0x4
+#define SCSI_SENSE_ILLEGAL_REQUEST  0x5
+#define SCSI_SENSE_UNIT_ATTENTION   0x6
+#define SCSI_SENSE_DATA_PROTECT     0x7
+#define SCSI_SENSE_BLANK_CHECK      0x8
+#define SCSI_SENSE_VENDOR_SPECIFIC  0x9
+#define SCSI_SENSE_COPY_ABORTED     0xa
+#define SCSI_SENSE_ABORTED_COMMAND  0xb
+#define SCSI_SENSE_EQUAL            0xc
+#define SCSI_SENSE_VOLUME_OVERFLOW  0xd
+#define SCSI_SENSE_MISCOMPARE       0xe
+#define SCSI_SENSE_RESERVED         0xf
+
+
+#define SCSI_ASC_INVALID_OPERATION_CODE                         0x2000
+#define SCSI_ASC_LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE             0x2100
+#define SCSI_ASC_INVALID_FIELD_IN_CDB                           0x2400
+#define SCSI_ASC_LOGICAL_UNIT_NOT_SUPPORTED                     0x2500
+#define SCSI_ASC_INVALID_FIELD_PARAMETER_LIST                   0x2600
+#define SCSI_ASC_WRITE_PROTECTED                                0x2700
+#define SCSI_ASC_CANNOT_READ_MEDIUM_UNKNOWN_FORMAT              0x3001
+#define SCSI_ASC_CANNOT_READ_MEDIUM_INCOMPATIBLE_FORMAT         0x3002
+#define SCSI_ASC_LUN_NOT_READY_MANUAL_INTERVENTION_REQUIRED     0x0403
+#endif

+ 14 - 0
src/scsi_status.h

@@ -0,0 +1,14 @@
+#ifndef __SCSI_STATUS_H__
+#define __SCSI_STATUS_H__
+
+#define SCSI_STATUS_GOOD                            0
+#define SCSI_STATUS_CHECK_CONDITION                 0x2
+#define SCSI_STATUS_CONDITION_MET                   0x4
+#define SCSI_STATUS_BUSY                            0x8
+#define SCSI_STATUS_INTERMEDIATE                    0x16
+#define SCSI_STATUS_INTERMEDIATE_CONDITION_MET      0x20
+#define SCSI_STATUS_RESERVATION_CONFLICT            0x24
+#define SCSI_STATUS_COMMAND_TERMINATED              0x34
+#define SCSI_STATUS_QUEUE_FULL                      0x40
+
+#endif