Unit SCSI
From Ultibo.org
Return to Unit Reference
Description
Ultibo SCSI interface unit
The SCSI interface unit is device non specific in that it implements only the SCSI protocol.
Actual command transfer is performed by a device specific driver that implements the exact semantics of the device. eg USB Mass Storage devices use the SCSI protocol, the SCSI interface implements the protocol behaviour but the actual command transfer is handled by the USB storage driver.
Constants
SCSI specific constants
SCSI_*
SCSI_NAME_PREFIX = 'SCSI';
|
Name prefix for SCSI Devices |
SCSI_HOST_PREFIX = 'SCSIHost';
|
Name prefix for Host Devices |
SCSI device type constants
SCSI_TYPE_*
SCSI_TYPE_NONE = 0;
|
|
SCSI_TYPE_HDD = 1;
|
SCSI device state constants
SCSI_STATE_*
SCSI_STATE_EJECTED = 0;
|
|
SCSI_STATE_INSERTED = 1;
|
SCSI device flag constants
SCSI_FLAG_*
SCSI_FLAG_NONE = $00000000;
|
SCSI protocol message constants
SCSI_MESSAGE_*
SCSI_MESSAGE_COMPLETE = $00;
|
|
SCSI_MESSAGE_EXTENDED = $01;
|
|
SCSI_MESSAGE_SAVE_DP = $02;
|
|
SCSI_MESSAGE_RESTORE_DP = $03;
|
|
SCSI_MESSAGE_DISCONNECT = $04;
|
|
SCSI_MESSAGE_ID_ERROR = $05;
|
|
SCSI_MESSAGE_ABORT = $06;
|
|
SCSI_MESSAGE_REJECT = $07;
|
|
SCSI_MESSAGE_NOOP = $08;
|
|
SCSI_MESSAGE_PARITY = $09;
|
|
SCSI_MESSAGE_LCOMPLETE = $0a;
|
|
SCSI_MESSAGE_FCOMPLETE = $0b;
|
|
SCSI_MESSAGE_RESET = $0c;
|
|
SCSI_MESSAGE_ABORT_TAG = $0d;
|
|
SCSI_MESSAGE_CLEAR_QUEUE = $0e;
|
|
SCSI_MESSAGE_INIT_REC = $0f;
|
|
SCSI_MESSAGE_REL_REC = $10;
|
|
SCSI_MESSAGE_TERMINATE = $11;
|
|
SCSI_MESSAGE_SIMPLE_TAG = $20;
|
|
SCSI_MESSAGE_HEAD_TAG = $21;
|
|
SCSI_MESSAGE_ORDERED_TAG = $22;
|
|
SCSI_MESSAGE_IGN_RESIDUE = $23;
|
|
SCSI_MESSAGE_IDENTIFY = $80;
|
|
SCSI_MESSAGE_X_MODIFY_DP = $00;
|
|
SCSI_MESSAGE_X_SYNC_REQ = $01;
|
|
SCSI_MESSAGE_X_WIDE_REQ = $03;
|
|
SCSI_MESSAGE_X_PPR_REQ = $04;
|
SCSI protocol status constants
SCSI_STATUS_*
SCSI_STATUS_GOOD = $00;
|
|
SCSI_STATUS_CHECK_COND = $02;
|
|
SCSI_STATUS_COND_MET = $04;
|
|
SCSI_STATUS_BUSY = $08;
|
|
SCSI_STATUS_INT = $10;
|
|
SCSI_STATUS_INT_COND_MET = $14;
|
|
SCSI_STATUS_CONFLICT = $18;
|
|
SCSI_STATUS_TERMINATED = $20;
|
|
SCSI_STATUS_QUEUE_FULL = $28;
|
|
SCSI_STATUS_ILLEGAL = $ff;
|
|
SCSI_STATUS_SENSE = $80;
|
SCSI protocol sense key constants
SCSI_SENSE_*
SCSI_SENSE_NO_SENSE = $00;
|
|
SCSI_SENSE_RECOVERED_ERROR = $01;
|
|
SCSI_SENSE_NOT_READY = $02;
|
|
SCSI_SENSE_MEDIUM_ERROR = $03;
|
|
SCSI_SENSE_HARDWARE_ERROR = $04;
|
|
SCSI_SENSE_ILLEGAL_REQUEST = $05;
|
|
SCSI_SENSE_UNIT_ATTENTION = $06;
|
|
SCSI_SENSE_DATA_PROTECT = $07;
|
|
SCSI_SENSE_BLANK_CHECK = $08;
|
|
SCSI_SENSE_VENDOR_SPECIFIC = $09;
|
|
SCSI_SENSE_COPY_ABORTED = $0A;
|
|
SCSI_SENSE_ABORTED_COMMAND = $0B;
|
|
SCSI_SENSE_VOLUME_OVERFLOW = $0D;
|
|
SCSI_SENSE_MISCOMPARE = $0E;
|
SCSI protocol additional sense code constants
SCSI_ASC_*
SCSI_ASC_NO_SENSE = $00;
|
NO SENSE |
SCSI_ASC_RECOVERED_RETRIES = $17;
|
RECOVERED DATA WITH RETRIES |
SCSI_ASC_RECOVERED_ECC = $18;
|
RECOVERED DATA WITH ECC |
SCSI_ASC_NOT_READY_LUN = $04;
|
LOGICAL UNIT NOT READY |
SCSI_ASC_NOT_READY_NO_REF_POS = $06;
|
NO REFERENCE POSITION FOUND |
SCSI_ASC_NOT_READY_LUN_COMM = $08;
|
LOGICAL UNIT COMMUNICATION |
SCSI_ASC_NOT_READY_MEDIUM_NOT_PRESENT = $3A;
|
MEDIUM NOT PRESENT |
SCSI protocol additional sense code qualifier constants
SCSI_ASCQ_*
SCSI_ASCQ_NO_SENSE = $00;
|
NO SENSE |
SCSI_ASCQ_RECOVERED_RETRIES = $01;
|
RECOVERED DATA WITH RETRIES |
SCSI_ASCQ_RECOVERED_ECC = $00;
|
RECOVERED DATA WITH ECC |
SCSI_ASCQ_NOT_READY_LUN_BECOME_READY = $01;
|
LOGICAL DRIVE NOT READY - BECOMING READY |
SCSI_ASCQ_NOT_READY_LUN_INIT_REQUIRED = $02;
|
LOGICAL DRIVE NOT READY - INITIALIZATION REQUIRED |
SCSI_ASCQ_NOT_READY_LUN_FORMAT_PROGRESS = $04;
|
LOGICAL UNIT NOT READY - FORMAT IN PROGRESS |
SCSI_ASCQ_NOT_READY_LUN_DEVICE_BUSY = $FF;
|
LOGICAL DRIVE NOT READY - DEVICE IS BUSY |
SCSI_ASCQ_NOT_READY_LUN_COMM_FAILURE = $00;
|
LOGICAL UNIT COMMUNICATION FAILURE |
SCSI_ASCQ_NOT_READY_LUN_COMM_TIMEOUT = $01;
|
LOGICAL UNIT COMMUNICATION TIME-OUT |
SCSI_ASCQ_NOT_READY_LUN_COMM_OVERRUN = $80;
|
LOGICAL UNIT COMMUNICATION OVERRUN |
SCSI protocol command constants
SCSI_COMMAND_*
SCSI_COMMAND_CHANGE_DEF = $40;
|
Change Definition (Optional) |
SCSI_COMMAND_COMPARE = $39;
|
Compare (Optional) |
SCSI_COMMAND_COPY = $18;
|
Copy (Optional) |
SCSI_COMMAND_COP_VERIFY = $3A;
|
Copy and Verify (Optional) |
SCSI_COMMAND_INQUIRY = $12;
|
Inquiry (MANDATORY) |
SCSI_COMMAND_LOG_SELECT = $4C;
|
Log Select (Optional) |
SCSI_COMMAND_LOG_SENSE = $4D;
|
Log Sense (Optional) |
SCSI_COMMAND_MODE_SEL6 = $15;
|
Mode Select 6-byte (Device Specific) |
SCSI_COMMAND_MODE_SEL10 = $55;
|
Mode Select 10-byte (Device Specific) |
SCSI_COMMAND_MODE_SEN6 = $1A;
|
Mode Sense 6-byte (Device Specific) |
SCSI_COMMAND_MODE_SEN10 = $5A;
|
Mode Sense 10-byte (Device Specific) |
SCSI_COMMAND_READ_BUFF = $3C;
|
Read Buffer (Optional) |
SCSI_COMMAND_REQ_SENSE = $03;
|
Request Sense (MANDATORY) |
SCSI_COMMAND_SEND_DIAG = $1D;
|
Send Diagnostic (Optional) |
SCSI_COMMAND_TST_U_RDY = $00;
|
Test Unit Ready (MANDATORY) |
SCSI_COMMAND_WRITE_BUFF = $3B;
|
Write Buffer (Optional) |
Commands Unique to Direct Access Devices | |
SCSI_COMMAND_COMPARE = $39;
|
Compare (Optional) |
SCSI_COMMAND_FORMAT = $04;
|
Format Unit (MANDATORY) |
SCSI_COMMAND_LCK_UN_CAC = $36;
|
Lock Unlock Cache (Optional) |
SCSI_COMMAND_PREFETCH = $34;
|
Prefetch (Optional) |
SCSI_COMMAND_MED_REMOVL = $1E;
|
Prevent/Allow medium Removal (Optional) |
SCSI_COMMAND_READ6 = $08;
|
Read 6-byte (MANDATORY) |
SCSI_COMMAND_READ10 = $28;
|
Read 10-byte (MANDATORY) |
SCSI_COMMAND_READ12 = $A8;
|
Read 12-byte (Optional) |
SCSI_COMMAND_READ16 = $88;
|
Read 16-byte (Optional) |
SCSI_COMMAND_RD_CAPAC = $25;
|
Read Capacity (MANDATORY) |
SCSI_COMMAND_RD_CAPAC10 = SCSI_COMMAND_RD_CAPAC;
|
Read Capacity (10) |
SCSI_COMMAND_RD_DEFECT = $37;
|
Read Defect Data (Optional) |
SCSI_COMMAND_READ_LONG = $3E;
|
Read Long (Optional) |
SCSI_COMMAND_REASS_BLK = $07;
|
Reassign Blocks (Optional) |
SCSI_COMMAND_RCV_DIAG = $1C;
|
Receive Diagnostic Results (Optional) |
SCSI_COMMAND_RELEASE = $17;
|
Release Unit (MANDATORY) |
SCSI_COMMAND_REZERO = $01;
|
Rezero Unit (Optional) |
SCSI_COMMAND_SRCH_DAT_E = $31;
|
Search Data Equal (Optional) |
SCSI_COMMAND_SRCH_DAT_H = $30;
|
Search Data High (Optional) |
SCSI_COMMAND_SRCH_DAT_L = $32;
|
Search Data Low (Optional) |
SCSI_COMMAND_SEEK6 = $0B;
|
Seek 6-Byte (Optional) |
SCSI_COMMAND_SEEK10 = $2B;
|
Seek 10-Byte (Optional) |
SCSI_COMMAND_SEND_DIAG = $1D;
|
Send Diagnostics (MANDATORY) |
SCSI_COMMAND_SET_LIMIT = $33;
|
Set Limits (Optional) |
SCSI_COMMAND_START_STP = $1B;
|
Start/Stop Unit (Optional) |
SCSI_COMMAND_SYNC_CACHE = $35;
|
Synchronize Cache (Optional) |
SCSI_COMMAND_VERIFY = $2F;
|
Verify (Optional) |
SCSI_COMMAND_WRITE6 = $0A;
|
Write 6-Byte (MANDATORY) |
SCSI_COMMAND_WRITE10 = $2A;
|
Write 10-Byte (MANDATORY) |
SCSI_COMMAND_WRITE12 = $AA;
|
Write 12-Byte (Optional) |
SCSI_COMMAND_WRITE16 = $8A;
|
Write 16-Byte (Optional) |
SCSI_COMMAND_WRT_VERIFY = $2E;
|
Write and Verify (Optional) |
SCSI_COMMAND_WRITE_LONG = $3F;
|
Write Long (Optional) |
SCSI_COMMAND_WRITE_SAME = $41;
|
Write Same (Optional) |
SCSI_COMMAND_RD_FMT_CAP = $23;
|
Read Format Capacities |
SCSI_COMMAND_SVC_ACT_IN = $9E;
|
Service Action In |
SCSI command data constants
SCSI_COMMAND_MAX_*
SCSI_COMMAND_MAX_SIZE = 16;
|
SCSI service action constants
SCSI_SAI_*
SCSI_SAI_READ_CAPACITY_16 = $10;
|
Read Capacity (16) |
SCSI_SAI_GET_LBA_STATUS = $12;
|
Get LBA Status |
SCSI inquiry data constants
SCSI_INQUIRY_*
SCSI_INQUIRY_STANDARD = $00;
|
SCSI standard inquiry data constants
SCSI_STANDARD_INQUIRY_*
SCSI_STANDARD_INQUIRY_SIZE = 36;
|
SCSI inquiry peripheral device type constants
SCSI_DEVICE_TYPE_*
SCSI_DEVICE_TYPE_DISK = $00;
|
SBC-3 - Direct access block device (e.g., magnetic disk) |
SCSI_DEVICE_TYPE_TAPE = $01;
|
SSC-3 - Sequential-access device (e.g., magnetic tape) |
SCSI_DEVICE_TYPE_PRINTER = $02;
|
SSC - Printer device |
SCSI_DEVICE_TYPE_PROCESSOR = $03;
|
SPC-2 - Processor device |
SCSI_DEVICE_TYPE_WRITE_ONCE = $04;
|
SBC - Write-once device (e.g., some optical disks) |
SCSI_DEVICE_TYPE_CD_DVD = $05;
|
MMC-5 - CD/DVD device |
SCSI_DEVICE_TYPE_SCANNER = $06;
|
Scanner device (obsolete) |
SCSI_DEVICE_TYPE_OPTICAL = $07;
|
SBC - Optical memory device (e.g., some optical disks) |
SCSI_DEVICE_TYPE_CHANGER = $08;
|
SMC-3 - Medium changer device (e.g., jukeboxes) |
SCSI_DEVICE_TYPE_COMMS = $09;
|
Communications device (obsolete) |
SCSI_DEVICE_TYPE_ARRAY = $0C;
|
SCC-2 - Storage array controller device (e.g., RAID) |
SCSI_DEVICE_TYPE_ENCLOSURE = $0D;
|
SES - Enclosure services device |
SCSI_DEVICE_TYPE_RBC = $0E;
|
RBC - Simplified direct-access device (e.g., magnetic disk) |
SCSI_DEVICE_TYPE_CARD = $0F;
|
OCRW - Optical card reader/writer device |
SCSI_DEVICE_TYPE_BRIDGE = $10;
|
BCC - Bridge Controller Commands |
SCSI_DEVICE_TYPE_OBJECT = $11;
|
OSD - Object-based Storage Device |
SCSI_DEVICE_TYPE_AUTOMATION = $12;
|
ADC-2 - Automation/Drive Interface |
SCSI_DEVICE_TYPE_WELL_KNOWN = $1E;
|
Well known logical unit |
SCSI_DEVICE_TYPE_UNKNOWN = $1F;
|
Unknown or no device type |
SCSI inquiry removable media bit constants
SCSI_REMOVABLE_MEDIA_*
SCSI_REMOVABLE_MEDIA_BIT = $80;
|
SCSI request sense data constants
SCSI_REQUEST_SENSE_*
SCSI_REQUEST_SENSE_SIZE = 18;
|
SCSI read capacity data constants
SCSI_READ_CAPACITY_*
SCSI_READ_CAPACITY_SIZE = 8;
|
|
SCSI_READ_CAPACITY_16_SIZE = 32;
|
SCSI read 10 data constants
SCSI_READ_10_*
SCSI_READ_10_MAX_BLOCKS = $FFFF;
|
SCSI write 10 data constants
SCSI_WRITE_10_*
SCSI_WRITE_10_MAX_BLOCKS = $FFFF;
|
SCSI logging constants
SCSI_LOG_*
SCSI_LOG_LEVEL_DEBUG = LOG_LEVEL_DEBUG;
|
SCSI debugging messages |
SCSI_LOG_LEVEL_INFO = LOG_LEVEL_INFO;
|
SCSI informational messages, such as a device being attached or detached |
SCSI_LOG_LEVEL_ERROR = LOG_LEVEL_ERROR;
|
SCSI error messages |
SCSI_LOG_LEVEL_NONE = LOG_LEVEL_NONE;
|
No SCSI messages |
Type definitions
To be documented
Public variables
SCSI logging
SCSI_DEFAULT_LOG_LEVEL:LongWord = SCSI_LOG_LEVEL_DEBUG;
|
Minimum level for SCSI messages. Only messages with level greater than or equal to this will be printed. |
SCSI_LOG_ENABLED:Boolean;
|
Function declarations
Initialization functions
procedure SCSIInit;
Description: To be documented
Note | None documented |
---|
SCSI functions
function SCSIDeviceInquiry(SCSI:PSCSIDevice; var DeviceType,DeviceFlags:LongWord; var Vendor,Product,Revision:PChar):LongWord;
Description: To be documented
Note | None documented |
---|
function SCSIDeviceRequestSense(SCSI:PSCSIDevice; var SenseKey,ASC,ASCQ:Byte):LongWord;
Description: To be documented
Note | None documented |
---|
function SCSIDeviceReadCapacity(SCSI:PSCSIDevice; var BlockSize,BlockShift:LongWord; var BlockCount:Int64):LongWord;
Description: To be documented
Note | None documented |
---|
function SCSIDeviceTestUnitReady(SCSI:PSCSIDevice; var DeviceFlags:LongWord):LongWord;
Description: To be documented
Note | None documented |
---|
function SCSIDeviceRead10(SCSI:PSCSIDevice; Start:LongWord; Count:Word; Buffer:Pointer):LongWord;
Description: To be documented
Note | None documented |
---|
function SCSIDeviceWrite10(SCSI:PSCSIDevice; Start:LongWord; Count:Word; Buffer:Pointer):LongWord;
Description: To be documented
Note | None documented |
---|
function SCSIDeviceRead16(SCSI:PSCSIDevice; const Start,Count:Int64; Buffer:Pointer):LongWord;
Description: To be documented
Note | None documented |
---|
function SCSIDeviceWrite16(SCSI:PSCSIDevice; const Start,Count:Int64; Buffer:Pointer):LongWord;
Description: To be documented
Note | None documented |
---|
function SCSIDeviceTransport(SCSI:PSCSIDevice; Command:PSCSICommandBlock):LongWord;
Description: To be documented
Note | None documented |
---|
function SCSIDeviceCreate:PSCSIDevice;
Description: Create a new SCSI entry
Return | Pointer to new SCSI entry or nil if SCSI could not be created |
---|
function SCSIDeviceCreateEx(Size:LongWord):PSCSIDevice;
Description: Create a new SCSI entry
Size | Size in bytes to allocate for new SCSI (Including the SCSI entry) |
---|---|
Return | Pointer to new SCSI entry or nil if SCSI could not be created |
function SCSIDeviceDestroy(SCSI:PSCSIDevice):LongWord;
Description: Destroy an existing SCSI entry
Note | None documented |
---|
function SCSIDeviceRegister(SCSI:PSCSIDevice):LongWord;
Description: Register a new SCSI in the SCSI table
Note | None documented |
---|
function SCSIDeviceDeregister(SCSI:PSCSIDevice):LongWord;
Description: Deregister a SCSI from the SCSI table
Note | None documented |
---|
function SCSIDeviceFind(SCSIId:LongWord):PSCSIDevice;
Description: To be documented
Note | None documented |
---|
function SCSIDeviceFindByName(const Name:String):PSCSIDevice; inline;
Description: To be documented
Note | None documented |
---|
function SCSIDeviceFindByDescription(const Description:String):PSCSIDevice; inline;
Description: To be documented
Note | None documented |
---|
function SCSIDeviceEnumerate(Callback:TSCSIEnumerate; Data:Pointer):LongWord;
Description: To be documented
Note | None documented |
---|
function SCSIDeviceNotification(SCSI:PSCSIDevice; Callback:TSCSINotification; Data:Pointer; Notification,Flags:LongWord):LongWord;
Description: To be documented
Note | None documented |
---|
function SCSIHostCreate:PSCSIHost;
Description: Create a new Host entry
Return | Pointer to new Host entry or nil if host could not be created |
---|
function SCSIHostCreateEx(Size:LongWord):PSCSIHost;
Description: Create a new Host entry
Size | Size in bytes to allocate for new host (Including the host entry) |
---|---|
Return | Pointer to new Host entry or nil if host could not be created |
function SCSIHostDestroy(Host:PSCSIHost):LongWord;
Description: Destroy an existing Host entry
Note | None documented |
---|
function SCSIHostRegister(Host:PSCSIHost):LongWord;
Description: Register a new Host in the Host table
Note | None documented |
---|
function SCSIHostDeregister(Host:PSCSIHost):LongWord;
Description: Deregister a Host from the Host table
Note | None documented |
---|
function SCSIHostFind(HostId:LongWord):PSCSIHost;
Description: To be documented
Note | None documented |
---|
function SCSIHostEnumerate(Callback:TSCSIHostEnumerate; Data:Pointer):LongWord;
Description: To be documented
Note | None documented |
---|
SCSI helper functions
function SCSIGetCount:LongWord; inline;
Description: Get the current SCSI count
Note | None documented |
---|
function SCSIDeviceCheck(SCSI:PSCSIDevice):PSCSIDevice;
Description: Check if the supplied SCSI is in the SCSI table
Note | None documented |
---|
procedure SCSILog(Level:LongWord;SCSI:PSCSIDevice; const AText:String);
Description: To be documented
Note | None documented |
---|
procedure SCSILogInfo(SCSI:PSCSIDevice; const AText:String);
Description: To be documented
Note | None documented |
---|
procedure SCSILogError(SCSI:PSCSIDevice; const AText:String);
Description: To be documented
Note | None documented |
---|
procedure SCSILogDebug(SCSI:PSCSIDevice; const AText:String);
Description: To be documented
Note | None documented |
---|
function SCSIDeviceTypeToStorageType(DeviceType:Byte; Removable,Floppy:Boolean):LongWord;
Description: To be documented
Note | None documented |
---|
function SCSIHostGetCount:LongWord; inline;
Description: Get the current Host count
Note | None documented |
---|
function SCSIHostCheck(Host:PSCSIHost):PSCSIHost;
Description: Check if the supplied Host is in the host table
Note | None documented |
---|
SCSI storage functions
function SCSIStorageDeviceRead(Storage:PStorageDevice; const Start,Count:Int64; Buffer:Pointer):LongWord;
Description: To be documented
Note | None documented |
---|
function SCSIStorageDeviceWrite(Storage:PStorageDevice; const Start,Count:Int64; Buffer:Pointer):LongWord;
Description: To be documented
Note | None documented |
---|
function SCSIStorageDeviceControl(Storage:PStorageDevice; Request:Integer; Argument1,Argument2:LongWord):LongWord;
Description: To be documented
Note | None documented |
---|
Return to Unit Reference