Replace magic numbers with constants - thanks Jokker

This commit is contained in:
Eric Helgeson 2022-04-19 20:24:42 -05:00
parent 845954edeb
commit f7799fb225
4 changed files with 187 additions and 55 deletions

View File

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

84
src/scsi_cmds.h Normal file
View File

@ -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
src/scsi_sense.h Normal file
View File

@ -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
src/scsi_status.h Normal file
View File

@ -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