⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 scsicmd.h

📁 威望公司MP3 + USB MCU 的参考软件
💻 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 + -