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

📄 scsi.h

📁 Sunplus 8202S source code.
💻 H
字号:
////////////////////////////////////////////////////////////////////////////////
// SUNPLUS---WORLDPLUS
////////////////////////////////////////////////////////////////////////////////
// File:		scsi.h
// Purpose:	    SPHE8200 firmware to master SL811 Embedded Host. 
//              Contains SL811-related control firmware.This file
//              describes the scsi data structure!  
//              
// H/W Target:  SL811HST + SPHE8200 DVD SYSTEM
// IMPORTANT :  
//              the hardware could sustain USB host and USB slave. 
//
// Creator:     Liweihua and Zhaoyanhua 2003-9-20
////////////////////////////////////////////////////////////////////////////////
#ifndef   SCSI_H
#define   SCSI_H

#include "config.h"
#include "global.h"
#include "macro.h"
#include "regmap.h"
#include "emuio.h"
#include "Types.h"

//*****************************************************************************************
// Constant and data structue  Defines
//*****************************************************************************************
//----define the max sector number when send scci read/write command-----------
//liweihua 2004-5-28 15:47
#define SCSIREAD_MAX_SECTOR     0x10
#define SCSIWRITE_MAX_SECTOR    0x10

//----define the CBW constant----------------
#define CBWSignature        0x43425355
#define CBWOut              0x00
#define CBWIn               0x80
#define CBWSix              0x06
#define CBWTen              0x0A
#define CBWTwel             0x0C
#define CBWLen              0x1F

//----define the CSW constant----------------
#define CSWSignature    0x53425355
#define CSWLen          0x0D

//---- define SCSI-2 Commands ----------------
#define SCSICMD_TEST_UNIT_READY                 0x00
#define SCSICMD_REZERO_UNIT                     0x01
#define SCSICMD_REQUEST_SENSE                   0x03
#define SCSICMD_FORMAT_UNIT                     0x04
#define SCSICMD_READ_BLOCK_LIMITS               0x05

#define SCSICMD_REASSIGN_BLOCKS                 0x07
#define SCSICMD_READ_06                         0x08

#define SCSICMD_WRITE_06                        0x0a
#define SCSICMD_SEEK_06                         0x0b

#define SCSICMD_READ_REVERSE                    0x0f
#define SCSICMD_WRITE_FILEMARKS                 0x10
#define SCSICMD_SPACE                           0x11
#define SCSICMD_INQUIRY                         0x12
#define SCSICMD_VERIF06                         0x13
#define SCSICMD_RECOVER_BUFFERED_DATA           0x14
#define SCSICMD_MODE_SELECT_06                  0x15
#define SCSICMD_RESERVE                         0x16
#define SCSICMD_RELEASE                         0x17
#define SCSICMD_COPY                            0x18
#define SCSICMD_ERASE                           0x19
#define SCSICMD_MODE_SENSE_06                   0x1a
#define SCSICMD_START_STOP_UNIT                 0x1b
#define SCSICMD_RECEIVE_DIAGNOSTIC_RESULTS      0x1c
#define SCSICMD_SEND_DIAGNOSTIC                 0x1d
#define SCSICMD_PREVENT_ALLOW_MEDIUM_REMOVAL    0x1e

#define SCSICMD_READ_FORMAT_CAPACITIES          0x23
#define SCSICMD_SET_WINDOW                      0x24
#define SCSICMD_READ_CAPACITY                   0x25

#define SCSICMD_READ_10                         0x28
#define SCSICMD_READ_GENERATION                 0x29
#define SCSICMD_WRITE_10                        0x2a
#define SCSICMD_SEEK_10                         0x2b
#define SCSICMD_ERASE_10                        0x2c
#define SCSICMD_READ_UPDATED_BLOCK              0x2d
#define SCSICMD_WRITE_AND_VERIFY_10             0x2e
#define SCSICMD_VERIFY_10                       0x2f
#define SCSICMD_SEARCH_DATA_HIGH_10             0x30
#define SCSICMD_SEARCH_DATA_EQUAL_10            0x31
#define SCSICMD_SEARCH_DATA_LOW_10              0x32
#define SCSICMD_SET_LIMITS                      0x33
#define SCSICMD_PREFETCH                        0x34
#define SCSICMD_SYNCHRONIZE_CACHE               0x35
#define SCSICMD_LOCK_UNLOCK_CACHE               0x36
#define SCSICMD_READ_DEFECT_DATA_10             0x37
#define SCSICMD_MEDIUM_SCAN                     0x38
#define SCSICMD_COMPARE                         0x39
#define SCSICMD_COPAND_VERIFY                   0x3a
#define SCSICMD_WRITE_BUFFER                    0x3b
#define SCSICMD_READ_BUFFER                     0x3c
#define SCSICMD_UPDATE_BLOCK                    0x3d
#define SCSICMD_READ_LONG                       0x3e
#define SCSICMD_WRITE_LONG                      0x3f
#define SCSICMD_CHANGE_DEFINITION               0x40
#define SCSICMD_WRITE_SAME                      0x41
#define SCSICMD_READ_SUBCHANNEL                 0x42
#define SCSICMD_READ_TOC                        0x43
#define SCSICMD_READ_HEADER                     0x44
#define SCSICMD_PLAY_AUDIO_10                   0x45

#define SCSICMD_PLAY_AUDIO_MSF                  0x47
#define SCSICMD_PLAY_AUDIO_TRACK_INDEX          0x48
#define SCSICMD_PLAY_TRACK_RELATIVE             0x49

#define SCSICMD_PAUSE_RESUME                    0x4b
#define SCSICMD_LOG_SELECT                      0x4c
#define SCSICMD_LOG_SENSE                       0x4d
     
#define SCSICMD_MODE_SELECT_10                  0x55        
   
#define SCSICMD_MODE_SENSE_10                   0x5a        
   
#define SCSICMD_READ_12                         0xa8
#define SCSICMD_WRITE_12                        0xaa
//*****************************************************************************************
// data struct Type Definition
//*****************************************************************************************
//Standard CBW package
typedef struct
{
    UINT32 dCBWSignature;           //identify CBW
    UINT32 dCBWTag;                 //a command block tag ,echo with dCSWTag
	UINT32 dCBWDataTransferLength;  //expect to transfer data length 
	UINT8   bmCBWFlags;             //direction
	UINT8   bCBWLUN;                //the device logical unit number
	UINT8   bCBWCBLength;           //the valid length of CBWCB 
	UINT8   CBWCB[16];              //the command block
}sCBW,*pCBW;

//Standard CSW package
//define CSW status constant
#define CSWStatePhaseErr        0x02
#define CSWStateCommandFailed   0x01
#define CSWStateCommandGood     0x00
typedef struct
{ 
    UINT32 dCSWSignature;                  //identify CSW
    UINT32 dCSWTag;                            //echo dCBWTag
    UINT32 dCSWDataResidue;              //the remainder data length 
    UINT8   bCSWStatus;                       //indicate the success or failure of the command
}sCSW,*pCSW;

//---- SCSI-2 Commands ----------------
//6-byte Command
typedef struct 
{
    UINT8    operationCode;
    UINT8    serviceAction; 
    UINT16  logicalBlockAddress;
    UINT8    dataLength;
    UINT8    controlByte;
} SCSICMD_06BYTE, *PSCSICMD_06BYTE;

//10-byte Command
typedef struct 
{
    UINT8   operationCode;
    UINT8   serviceAction;
    UINT32 logicalBlockAddress;
    UINT8   reserved;
    UINT8   dataLength;
    UINT8   controlByte;
} SCSICMD_10BYTE, *PSCSICMD_10BYTE;

//12-byte Command
typedef struct 
{
    UINT8   operationCode;
    UINT8   serviceAction;
    UINT32 logicalBlockAddress;
    UINT32 dataLength;
    UINT8   reserved;
    UINT8   controlByte;
} SCSICMD_12BYTE, *PSCSICMD_12BYTE;

//16-byte Command
typedef struct 
{
    UINT8   operationCode;
    UINT8   serviceAction;
    UINT32 logicalBlockAddress;
    UINT32 addtionalCdbData;
    UINT32 dataLength;
    UINT8   reserved;
    UINT8   controlByte;
} SCSICMD_16BYTE, *PSCSICMD_16BYTE;

//----the returned data after  SCSI-2 Commands  ----------------
//Test UINT Ready
#define SCSIDATA_TEST_SIZE                      0x00
#define SCSICMD_TEST_CBWTag                     0x10300120
//INQUIRY
#define SCSIDATA_INQUIRY_SIZE                       0x24
#define SCSICMD_INQUIRY_CBWTag                      0x00000120
typedef struct 
{
      UINT8  peripheralDeviceType;//the bit0--bit5 represent the peripheral device type
      UINT8  RMB;                             //bit7 represent RBM
      UINT8  Version;                       //bit6-bit7 show ISOversion, bit3--bit5 show ECMA version,bit0--bit2 show ANSI version
      UINT8  responseDataFormat; //bit0--bit3 show response data format 
      UINT8  additionalLength; //0x1f                              
      UINT8  reserved0[3];
      UINT8  vendorInformation[8];
      UINT8  productIdentification[16];
      UINT8  productRevisionLevel[4];
} SCSIDATA_INQUIRY, *PSCSIDATA_INQUIRY;

//Read10
#define SCSICMD_READ10_CBWTag                     0x22000120
typedef struct
{
     UINT8  Read10OpCode;
     UINT8  Read10LUNDPRelAdr;//bit5--bit7:LUN,bit4:DP0,bit3:FUA,bit1--bit2:Reserved,bit0:RelAddr
     UINT32 Read10LBA;
     UINT8   Read10Reserved;
     UINT16  Read10BlockNum;
     UINT8   Read10Control;
}Read10Comm,*PRead10Comm;
//Write 10
#define  SCSICMD_WRITE10_CBWTag    0x22030120
//MODE SENSE 06
//MODE SELECT 06
//Mode Parameter Header
#define SCSIDATA_MODE_PARAMETER_HEADER_SIZE     0x08
#define SCSICMD_MODE_CBWTag                     0x00303120
typedef struct 
{
    UINT16  DataLength;
    UINT8    mediumTypeCode;
    UINT8    WPDPOFUA;//bit7 show WP,bit4 show DPOFUA,bit0--bir3 and bit5---bit6 is reserved
    UINT8    reserved[4];
} SCSIDATA_MODE_PARAMETER_HEADER, *PSCSIDATA_MODE_PARAMETER_HEADER;

//READ CAPACITY
#define SCSIDATA_READ_CAPACITY_SIZE                     0x08
#define SCSICMD_READ_CAPACITY_CBWTag                    0x40303120
typedef struct 
{
    UINT32  lastLogicalBlockAddress;
    UINT32  blockLengthInBytes;
} SCSIDATA_READ_CAPACITY, *PSCSIDATA_READ_CAPACITY;

//READ FORMAT CAPACITY
#define SCSIDATA_READ_FORMAT_CAPACITY_LIST_HEADER_SIZE          0x04
//SCSICMD_READ_FORMAT_CAPACITIES
#define SCSIDATA_READ_FORMAT_CAPACITIES_SIZE                    0xfc
#define SCSIDATA_FORMAT_CAPACITIES_SIZE                         12
#define SCSICMD_READ_FORMAT_CAPACITIES_CBWTag                   0x02000120
typedef struct
{
    UINT8    reserved0;
    UINT8    reserved1;
    UINT8    reserved2;
    UINT8    capacityListLength;
} SCSIDATA_READ_CAPACITY_LIST_HEADER, *PSCSIDATA_READ_CAPACITY_LIST_HEADER;


#define SCSIDATA_READ_FORMAT_MAXIMUM_SIZE                       0x08
typedef struct 
{
    UINT32    numberOfBlocks;
    UINT8      descCode;             //bit0-bit1 represent the desciptor code 
    UINT8      blockLength[3];    
} SCSIDATA_READ_FORMAT_MAXIMUM, *PSCSIDATA_READ_FORMAT_MAXIMUM;

//Request Sense
#define SCSIDATA_REQUESTSENSE_SIZE                              0x12
#define SCSICMD_REQUESTSENSE_CBWTag                             0x02030120
typedef struct
{
    UINT8    VErrCode;//bit7---valid;bit0--6:Error Code
    UINT8    Reserved;
    UINT8    SenseKey;//bit0--bit3:Sense Key
    UINT32   Information;
    UINT8    AdditionalSenseLen;
    UINT8    Reserved1[4];
    UINT8    ASC;//Additional Sense Code(Mandatory)
    UINT8    ASCQ;//Additional Sense Code Qualifier(Mandatory)
    UINT8    Reserver2[4];
}SCSIDATA_REQUEST_SENSE,*pSCSIDATA_REQUEST_SENSE;

//system state
typedef struct
{
    UINT8 MainState;	// main state
    UINT8 SubState;	// upper nibble: sub-state; lower nibble: extension state
}STATE;

#if defined(FAT_Write_File_System)||defined(FILE_MODE_WRITE)  //added by wangwei,2004-11-15 13:23(get total capacity of storage).
extern UINT32 uiTotalCapacity;
#endif

//*****************************************************************************************
//micro function  define
//*****************************************************************************************
#define ChangeSysMainState(x) Sys.MainState = (x); Sys.SubState = 0x00
#define ChangeSysSubState(x)   Sys.SubState = x
enum USBSys_MAIN_STATE
{
    USBSys_Init_MainState=0x01,                 //execute SCSI command :test uint ready,inquiry,read capacity
    USBSys_GetFatInfo_MainState=0x02,     //get boot record,fat table,dir information
    USBSys_GetFileData_MainState=0x03,   //get the file data in the mass storage
    USBSys_ModifyFatInfo_MainState=0x04 //realize format,del,built new file and dir and so on
};

enum USBSys_Init_SubSTATE
{
    USB_Test_SubState=0x10,
    USB_Inquiry_SubState  =0x11, 
    USB_ReadFormatCapacities_SubState=0x12,
    USB_RequestSense_SubState=0x13,
    USB_Readcapcity_SubState=0x14
 };

enum  USBSys_GetFatInfo_SubSTATE
{
    USB_GetMBR_SubState=0x20,
    USB_BootRecord_SubState  =0x21, 
    USB_GetFatTable_SubState=0x22,
    USB_GetDir_SubState=0x23
 };

enum USBSys_GetFileData_SubSTATE
{
    USB_Directory_SubState=0x30,
    USB_FindFile_SubState=0x31,
    USB_RecieveFile_SubState  =0x32
 };
#define	USB_PRINTF printf  
/*request sense error code*/
#define   SCSI_NO_ERR               510    //sense key=0
#define   SCSI_RECOVERED_ERR        511    //sense key=1
#define   SCSI_NOT_READY_ERR        512    //sense key=2
#define   SCSI_NO_REF_POS_ERR       513
#define   SCSI_COMMUN_FAIL_ERR      514
#define   SCSI_MED_NOT_PRE_ERR      515
#define   SCSI_UNKNOWN_ERR          519
#define   SCSI_MEDIUM_ERR           520    //sense key=3
#define   SCSI_HARDWARE_ERR         521    //sense key=4
#define   SCSI_ILLEGAL_REQ_ERR      522    //sense key=5
#define   SCSI_UINT_ATTEN_ERR       523   //sense key=6
#define   SCSI_DATA_PROT_ERR        524   //sense key=7
#define   SCSI_ABORT_COMM_ERR       525   //sense key=0XBh
#define   SCSI_VOL_OVERF_ERR        526  ////sense key=0XDh

typedef 	INT32	(*FUNCTION_RECERR_FUNCTION)();
//*****************************************************************************************
// function  section
//*****************************************************************************************
UINT8 CSWInXfer(UINT8 usbaddr,UINT32 Tag);
UINT8 SCSICMD_Inquiry(UINT8 usbaddr);
UINT8 SCSICMD_TestUnitReady(UINT8 ,UINT8);
UINT8 SCSICMD_ReadCapcity(UINT8 usbaddr);
UINT8 SCSICMD_ReadFormatCapcity(UINT8 usbaddr);
INT32 SCSICMD_RequestSense(UINT8 usbaddr);
UINT32  UsbTestReady();
int SCSICMD_ReadSector(UINT32 ,UINT32 ,BYTE *);
//#ifdef SPHE8202_USB_WRITE//WRITE_USB
#if defined(SPHE8202_FAT_WRITE_API)||defined(SPHE8202_USB_WRITE)//lijd 2005-1-5 18:17
int SCSICMD_WriteSector(UINT32 lba,UINT32 nSec,BYTE *buf);
 int  SCSICMD_ModeSense(UINT8 usbaddr);
#endif //#define   SPHE8202_USB_Write//WRITE_USB
#endif //#define   SCSI_H

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -