📄 scsicmd.h
字号:
/****************************************************************
* Viaon Technology (Suzhou) Co.,Ltd
*
* Copyright 2007, Viaon Technology (Suzhou) Co.,Ltd,Suzhou,China
* All rights reserved.
*
*
* Filename: scsicmd.h
*
* Programmer: Greg
*
* Created: 1/2/2008
*
* Description: public functions
*
*
* Change History (most recent first): 2008.1.2
****************************************************************/
#ifndef __SCSICMD_H__
#define __SCSICMD_H__
typedef union {
struct
{
BYTE Type;
BYTE Index;
} Descriptor;
struct
{
BYTE tx0; // MSB for 8051 Keil C
BYTE tx1;
BYTE endp;
BYTE c0; // LSB for 8051 Keil C
} chars;
struct
{
BYTE c3; // MSB for 8051 Keil C
BYTE c2;
BYTE c1;
BYTE c0; // LSB for 8051 Keil C
} chars0;
struct
{
WORD i1; // MSW for 8051 keil C
WORD i0; // LSW for 8051 Keil C
} ints;
DWORD u0;
} FLEXI_INT32;
/*
// RBC commands
*/
#define RBC_CMD_FORMAT 0x04
#define RBC_CMD_READ10 0x28
#define RBC_CMD_READCAPACITY 0x25
#define RBC_CMD_STARTSTOPUNIT 0x1B
#define RBC_CMD_SYNCCACHE 0x35
#define RBC_CMD_VERIFY10 0x2F
#define RBC_CMD_WRITE10 0x2A
/*
// SPC-2 commands
*/
#define SPC_CMD_INQUIRY 0x12
#define SPC_CMD_MODESELECT6 0x15
#define SPC_CMD_MODESENSE6 0x1A
#define SPC_CMD_PERSISTANTRESERVIN 0x5E
#define SPC_CMD_PERSISTANTRESERVOUT 0x5F
#define SPC_CMD_PRVENTALLOWMEDIUMREMOVAL 0x1E
#define SPC_CMD_RELEASE6 0x17
#define SPC_CMD_REQUESTSENSE 0x03
#define SPC_CMD_RESERVE6 0x16
#define SPC_CMD_TESTUNITREADY 0x00
#define SPC_CMD_WRITEBUFFER 0x3B
#define SPC_CMD_READLONG 0x23
/*
// ATAPI Command Descriptor Block - 13 Bytes
*/
typedef struct _READ_10 {
BYTE OperationCode;
BYTE Reserved1;
BYTE LBA_3;
BYTE LBA_2;
BYTE LBA_1;
BYTE LBA_0;
BYTE Reserved2;
BYTE XferLen_1;
BYTE XferLen_0;
BYTE Reserved3[3];
} READ_10, *pREAD_10;
typedef struct _WRITE_10 {
BYTE OperationCode;
BYTE Reserved1;
BYTE LBA_3;
BYTE LBA_2;
BYTE LBA_1;
BYTE LBA_0;
BYTE Reserved2;
BYTE XferLen_1;
BYTE XferLen_0;
BYTE Reserved3[3];
} WRITE_10, *pWRITE_10;
typedef struct _MODE_SENSE_10 {
BYTE OperationCode;
BYTE Reserved1;
BYTE PageCode : 6;
BYTE Pc : 2;
BYTE Reserved2[4];
BYTE ParameterListLengthMsb;
BYTE ParameterListLengthLsb;
BYTE Reserved3[3];
} MODE_SENSE_10, *pMODE_SENSE_10;
typedef struct _MODE_SELECT_10 {
BYTE OperationCode;
BYTE Reserved1 : 4;
BYTE PFBit : 1;
BYTE Reserved2 : 3;
BYTE Reserved3[5];
BYTE ParameterListLengthMsb;
BYTE ParameterListLengthLsb;
BYTE Reserved4[3];
} MODE_SELECT_10, *pMODE_SELECT_10;
/*
////////////////////////////////////////////////////////////////////////////////////
// Command Descriptor Block - max = 16 Bytes
// _RBC : Reduced Block Command
// _SPC : SPC-2 SCSI primary Command - 2
////////////////////////////////////////////////////////////////////////////////////
*/
/*
// Generic
*/
typedef struct _GENERIC_CDB {
BYTE OperationCode;
BYTE Reserved[15];
} GENERIC_CDB,*pGENERIC_CDB;
typedef struct _GENERIC_RBC {
BYTE OperationCode;
BYTE Reserved[8];
BYTE Control;
} GENERIC_RBC,*pGENERIC_RBC;
/*
// format unit
*/
typedef struct _FORMAT_RBC {
BYTE OperationCode; // 04H
BYTE VendorSpecific;
BYTE Increment : 1;
BYTE PercentorTime : 1;
BYTE Progress : 1;
BYTE Immediate : 1;
BYTE VendorSpecific1 : 4;
BYTE Reserved2[2];
BYTE Control;
} FORMAT_RBC, *pFORMAT_RBC;
/*
// Read Command
*/
typedef struct _READ_RBC {
BYTE OperationCode; // 10H
BYTE VendorSpecific;
union{
struct
{
BYTE LBA_3;
BYTE LBA_2;
BYTE LBA_1;
BYTE LBA_0;
} LBA_W8 ;
DWORD LBA_W32;
}LBA;
BYTE Reserved;
//UINT8 XferLength_1;
//UINT8 XferLength_0;
WORD XferLength;
BYTE Control;
//UINT8 Reserved1[3];
} READ_RBC, *pREAD_RBC;
/*
// Read Capacity Data - returned in Big Endian format
*/
typedef struct _READ_CAPACITY_DATA {
BYTE LBA_3;
BYTE LBA_2;
BYTE LBA_1;
BYTE LBA_0;
BYTE BlockLen_3;
BYTE BlockLen_2;
BYTE BlockLen_1;
BYTE BlockLen_0;
} READ_CAPACITY_DATA, *pREAD_CAPACITY_DATA;
//////////////////////////////////////////////////
typedef struct _READ_LONG_CMD{
BYTE OperationCode;
BYTE LogicalUnitNum :3;
BYTE RES_1 :5;
BYTE RES_2;
BYTE RES_3;
BYTE RES_4;
BYTE RES_5;
BYTE RES_6;
WORD AllocationLen;
BYTE RES_7;
BYTE RES_8;
BYTE RES_9;
}READ_LONG_CMD, *pREAD_LONG_CMD;
typedef struct _READ_LONG {
BYTE RES_1;
BYTE RES_2;
BYTE RES_3;
BYTE CAP_LIST_LEN;
BYTE LBA_3;
BYTE LBA_2;
BYTE LBA_1;
BYTE LBA_0;
BYTE Descripter;
BYTE BlockLen_2;
BYTE BlockLen_1;
BYTE BlockLen_0;
} READ_LONG, *pREAD_LONG;
/*
// Read Capacity command
*/
typedef struct _READ_CAPACITY_RBC {
BYTE OperationCode; /* 10H */
union
{
FLEXI_INT32 l0[2];
DWORD l[2];
READ_CAPACITY_DATA CapData; /* Reserved area, here is used as temp*/
} tmpVar;
BYTE Control;
} READ_CAPACITY_RBC, *pREAD_CAPACITY_RBC;
typedef struct _READ_CAPACITY_RSP {
DWORD LastLBA;
DWORD BlockSize;
} READ_CAPACITY_RSP, *pREAD_CAPACITY_RSP;
/*
// START_STOP_UNIT
*/
typedef struct _START_STOP_RBC {
BYTE OperationCode; /*1BH*/
BYTE Immediate: 1;
BYTE Reserved1 : 7;
BYTE Reserved2[2];
union _START_STOP_FLAGS
{
struct
{
BYTE Start : 1;
BYTE LoadEject : 1;
BYTE Reserved3 : 2;
BYTE PowerConditions: 4;
} bits0;
struct
{
BYTE MediumState : 2;
BYTE Reserved3 : 2;
BYTE PowerConditions: 4;
} bits1;
} Flags;
BYTE Control;
} START_STOP_RBC, *pSTART_STOP_RBC;
/*
// Synchronize Cache
*/
typedef struct _SYNCHRONIZE_CACHE_RBC {
BYTE OperationCode; // 0x35
BYTE Reserved[8];
BYTE Control;
} SYNCHRONIZE_CACHE_RBC, *pSYNCHRONIZE_CACHE_RBC;
/*
// Write Command
*/
typedef struct _WRITE_RBC {
BYTE OperationCode; // 2AH
//UINT8 Reserved0 : 3;
//UINT8 FUA : 1;
//UINT8 Reserved1 : 4;
BYTE VendorSpecific;
union{
struct
{
BYTE LBA_3;
BYTE LBA_2;
BYTE LBA_1;
BYTE LBA_0;
} LBA_W8 ;
DWORD LBA_W32;
} LBA;
BYTE Reserved2;
WORD XferLength;
BYTE Control;
} WRITE_RBC, *pWRITE_RBC;
/*
// VERIFY Command
*/
typedef struct _VERIFY_RBC {
BYTE OperationCode; // 2FH
BYTE Reserved0;
BYTE LBA_3; // Big Endian
BYTE LBA_2;
BYTE LBA_1;
BYTE LBA_0;
BYTE Reserved1;
BYTE VerifyLength_1; // Big Endian
BYTE VerifyLength_0;
BYTE Control;
} VERIFY_RBC, *pVERIFY_RBC;
/*
//***********************************************************************************
// SPC-2 of SCSI-3 commands
//***********************************************************************************
*/
/*
// INQUIRY Command
*/
typedef struct _INQUIRY_SPC {
BYTE OperationCode; // 12H
BYTE EnableVPD:1 ;
BYTE CmdSupportData:1 ;
BYTE Reserved0:6 ;
BYTE PageCode;
BYTE Reserved1;
BYTE AllocationLen;
BYTE Control;
} INQUIRY_SPC, *pINQUIRY_SPC;
/*
typedef struct _STD_INQUIRYDATA {
UINT8 DeviceType : 5;
UINT8 Reserved0 : 3;
UINT8 Reserved1 : 7;
UINT8 RemovableMedia : 1;
UINT8 Reserved2;
UINT8 Reserved3 : 5;
UINT8 NormACA : 1;
UINT8 Obsolete0 : 1;
UINT8 AERC : 1;
UINT8 Reserved4[3];
UINT8 SoftReset : 1;
UINT8 CommandQueue : 1;
UINT8 Reserved5 : 1;
UINT8 LinkedCommands : 1;
UINT8 Synchronous : 1;
UINT8 Wide16Bit : 1;
UINT8 Wide32Bit : 1;
UINT8 RelativeAddressing : 1;
UINT8 VendorId[8];
UINT8 ProductId[16];
UINT8 ProductRevisionLevel[4];
// Above is 36 bytes
// can be tranmitted by Bulk
UINT8 VendorSpecific[20];
UINT8 InfoUnitSupport : 1;
UINT8 QuickArbitSupport : 1;
UINT8 Clocking : 2;
UINT8 Reserved6 : 4;
UINT8 Reserved7 ;
UINT16 VersionDescriptor[8] ;
UINT8 Reserved8[22];
} STD_INQUIRYDATA, *pSTD_INQUIRYDATA;
*/
/*
typedef struct _SERIALNUMBER_PAGE {
UINT8 DeviceType : 5;
UINT8 DeviceTypeQualifier : 3;
UINT8 PageCode ;
UINT8 Reserved0 ;
UINT8 PageLength ;
UINT8 SerialNumber[24] ;
}VPD_SERIAL_PAGE,*pVPD_SERIAL_PAGE;
*/
/*
#define ASCII_ID_STRING 32
typedef struct _ID_DESCRIPTOR {
UINT8 CodeSet : 4;
UINT8 Reserved0 : 4;
UINT8 IDType : 4;
UINT8 Association : 2;
UINT8 Reserved1 : 2;
UINT8 Reserved2;
UINT8 IDLength ;
UINT8 AsciiID[ASCII_ID_STRING];
} ASCII_ID_DESCRIPTOR,*pASCII_ID_DESCRIPTOR;
*/
/*
typedef struct _DEVICE_ID_PAGE
{
UINT8 DeviceType : 5;
UINT8 DeviceTypeQualifier : 3;
UINT8 PageCode ;
UINT8 Reserved0 ;
UINT8 PageLength ;
ASCII_ID_DESCRIPTOR AsciiIdDescriptor[1];
} VPD_DEVICE_ID_PAGE, *pVPD_DEVICE_ID_PAGE;
*/
/*
// Mode Select
*/
typedef struct _MODE_SELECT_SPC {
BYTE OperationCode; // 15H
BYTE SavePage : 1 ;
BYTE Reseved0 : 3 ;
BYTE PageFormat : 1 ;
BYTE Reserved1 : 3 ;
BYTE Reserved2[2];
BYTE ParameterLen;
BYTE Control;
} MODE_SELECT_SPC, *pMODE_SELECT_SPC;
/*
// Mode Sense
*/
typedef struct _MODE_SENSE_SPC {
BYTE OperationCode; // 1AH
BYTE Reseved0 : 3 ;
BYTE DisableBlockDescriptor : 1 ;
BYTE Reserved0 : 4 ;
BYTE PageCode:6 ;
BYTE PageControl : 2 ;
BYTE Reserved1;
BYTE ParameterLen;
BYTE Control;
} MODE_SENSE_SPC, *pMODE_SENSE_SPC;
/*
typedef struct _MODE_PARAMETER_HEAD {
UINT8 DataLen;
UINT8 MediumType;
UINT8 DeviceParameter;
UINT8 BlockDescriptorLen;
} MODE_PARAMETER_HEAD, *pMODE_PARAMETER_HEAD;
*/
/*
// Define Device Capabilities page.
*/
/*
typedef struct _MODE_RBC_DEVICE_PARAMETERS_PAGE {
UINT8 PageCode : 6;
UINT8 Reserved : 1;
UINT8 PageSavable : 1;
UINT8 PageLength;
UINT8 WriteCacheDisable : 1;
UINT8 Reserved1 : 7;
UINT8 LogicalBlockSize[2];
UINT8 NumberOfLogicalBlocks[5];
UINT8 PowerPerformance;
UINT8 Lockable : 1;
UINT8 Formattable : 1;
UINT8 Writable : 1;
UINT8 Readable : 1;
UINT8 Reserved2 : 4;
UINT8 Reserved3;
}MODE_RBC_DEVICE_PARAMETERS_PAGE, *pMODE_RBC_DEVICE_PARAMETERS_PAGE;
*/
/*
// prevent/allow medium removal
*/
typedef struct _MEDIA_REMOVAL_SPC {
BYTE OperationCode; // 1EH
BYTE Reserved0[3];
BYTE Prevent;
//UINT8 Reserved1:6 ;
//UINT8 Control;
} MEDIA_REMOVAL_SPC, *pMEDIA_REMOVAL_SPC;
/*
// Request Sense
*/
typedef struct _REQUEST_SENSE_SPC {
BYTE OperationCode; // 03H
BYTE Reserved[3];
BYTE AllocationLen;
BYTE Control;
} REQUEST_SENSE_SPC, *pREQUEST_SENSE_SPC;
/*
typedef struct _REQUEST_SENSE_DATA {
UINT8 ResponseCode : 7;
UINT8 Valid : 1;
UINT8 SegmentNum;
UINT8 SenseKey : 4;
UINT8 Reserved0 : 1;
UINT8 WrongLenIndicator : 1;
UINT8 EndofMedium : 1;
UINT8 FileMark : 1;
UINT8 Info_0;
UINT8 Info_1;
UINT8 Info_2;
UINT8 Info_3;
UINT8 AdditionalSenseLen;
UINT8 CommandSpecInfo_0;
UINT8 CommandSpecInfo_1;
UINT8 CommandSpecInfo_2;
UINT8 CommandSpecInfo_3;
UINT8 ASC;
UINT8 ASCQ;
UINT8 FieldReplacableUnitCode;
UINT8 SenseKeySpec_0 : 7;
UINT8 SenseKeySpecValid : 1;
UINT8 SenseKeySpec_1;
UINT8 SenseKeySpec_2;
} REQUEST_SENSE_DATA, *pREQUEST_SENSE_DATA;
*/
/*
// Test Unit Ready
*/
typedef struct _TEST_UNIT_SPC {
BYTE OperationCode; // 00H
BYTE Reserved[4];
BYTE Control;
} TEST_UNIT_SPC, *pTEST_UNIT_SPC;
/*
// Write Buffer
*/
typedef struct _WRITE_BUFFER_SPC {
BYTE OperationCode;
BYTE Mod:4 ;
BYTE Reserved0:4 ;
BYTE BufferID;
BYTE BufferOff_2;
BYTE BufferOff_1;
BYTE BufferOff_0;
BYTE ParameterLen_2;
BYTE ParameterLen_1;
BYTE ParameterLen_0;
BYTE Control;
} WRITE_BUFFER_SPC, *pWRITE_BUFFER_SPC;
typedef union _CDB_RBC {
GENERIC_CDB Cdb_Generic;
// RBC commands
GENERIC_RBC RbcCdb_Generic;
FORMAT_RBC RbcCdb_Format;
READ_RBC RbcCdb_Read;
READ_CAPACITY_RBC RbcCdb_ReadCapacity;
START_STOP_RBC RbcCdb_OnOffUnit;
SYNCHRONIZE_CACHE_RBC RbcCdb_SyncCache;
VERIFY_RBC RbcCdb_Verify;
WRITE_RBC RbcCdb_Write;
// SPC-2 commands
INQUIRY_SPC SpcCdb_Inquiry;
MODE_SELECT_SPC SpcCdb_ModeSelect;
MODE_SENSE_SPC SpcCdb_ModeSense;
MEDIA_REMOVAL_SPC SpcCdb_Remove;
REQUEST_SENSE_SPC SpcCdb_RequestSense;
TEST_UNIT_SPC SpcCdb_TestUnit;
WRITE_BUFFER_SPC SpcCdb_WriteBuffer;
// ATAPI Commands
READ_10 CmdRead10;
WRITE_10 CmdWrite10;
MODE_SELECT_10 CmdModeSel10;
MODE_SENSE_10 CmdModeSen10;
//////////////////////////////////////
READ_LONG_CMD SpcCdb_ReadLong;
} CDB_RBC, *pCDB_RBC;
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -