📄 hal.h
字号:
unsigned char OperationCode; /* 2AH */
unsigned char VendorSpecific;
union{
struct
{
unsigned char LBA_3;
unsigned char LBA_2;
unsigned char LBA_1;
unsigned char LBA_0;
} LBA_W8 ;
unsigned int LBA_W32;
}LBA;
unsigned char Reserved2;
unsigned short XferLength;
unsigned char Control;
} WRITE_RBC, *PWRITE_RBC;
/* VERIFY Command */
typedef struct _VERIFY_RBC {
unsigned char OperationCode; /* 2FH */
unsigned char Reserved0;
unsigned char LBA_3; /* Big Endian */
unsigned char LBA_2;
unsigned char LBA_1;
unsigned char LBA_0;
unsigned char Reserved1;
unsigned char VerifyLength_1; /* Big Endian */
unsigned char VerifyLength_0;
unsigned char Control;
} VERIFY_RBC, *PVERIFY_RBC;
/*
// INQUIRY Command
*/
typedef struct _INQUIRY_SPC {
unsigned char OperationCode; /* 12H */
unsigned EnableVPD:1 ;
unsigned CmdSupportData:1 ;
unsigned Reserved0:6 ;
unsigned char PageCode;
unsigned char Reserved1;
unsigned char AllocationLen;
unsigned char Control;
} INQUIRY_SPC, *PINQUIRY_SPC;
typedef struct _STD_INQUIRYDATA {
unsigned DeviceType : 5;
unsigned Reserved0 : 3;
unsigned Reserved1 : 7;
unsigned RemovableMedia : 1;
unsigned char Reserved2;
unsigned Reserved3 : 5;
unsigned NormACA : 1;
unsigned Obsolete0 : 1;
unsigned AERC : 1;
unsigned char Reserved4[3];
unsigned SoftReset : 1;
unsigned CommandQueue : 1;
unsigned Reserved5 : 1;
unsigned LinkedCommands : 1;
unsigned Synchronous : 1;
unsigned Wide16Bit : 1;
unsigned Wide32Bit : 1;
unsigned RelativeAddressing : 1;
unsigned char VendorId[8];
unsigned char ProductId[16];
unsigned char ProductRevisionLevel[4];
unsigned char VendorSpecific[20];
unsigned InfoUnitSupport : 1;
unsigned QuickArbitSupport : 1;
unsigned Clocking : 2;
unsigned Reserved6 : 4;
unsigned char Reserved7 ;
unsigned short VersionDescriptor[8] ;
unsigned char Reserved8[22];
} STD_INQUIRYDATA, *PSTD_INQUIRYDATA;
typedef struct _SERIALNUMBER_PAGE {
unsigned DeviceType : 5;
unsigned DeviceTypeQualifier : 3;
unsigned char PageCode ;
unsigned char Reserved0 ;
unsigned char PageLength ;
unsigned char SerialNumber[24] ;
}VPD_SERIAL_PAGE,* PVPD_SERIAL_PAGE;
#define ASCII_ID_STRING 32
typedef struct _ID_DESCRIPTOR {
unsigned CodeSet : 4;
unsigned Reserved0 : 4;
unsigned IDType : 4;
unsigned Association : 2;
unsigned Reserved1 : 2;
unsigned char Reserved2;
unsigned char IDLength ;
unsigned char AsciiID[ASCII_ID_STRING];
} ASCII_ID_DESCRIPTOR,* PASCII_ID_DESCRIPTOR;
typedef struct _DEVICE_ID_PAGE
{
unsigned DeviceType : 5;
unsigned DeviceTypeQualifier : 3;
unsigned PageCode ;
unsigned Reserved0 ;
unsigned PageLength ;
ASCII_ID_DESCRIPTOR AsciiIdDescriptor[1];
} VPD_DEVICE_ID_PAGE, * PVPD_DEVICE_ID_PAGE;
/* Mode Select */
typedef struct _MODE_SELECT_SPC {
unsigned char OperationCode; /* 15H */
unsigned SavePage : 1 ;
unsigned Reseved0 : 3 ;
unsigned PageFormat : 1 ;
unsigned Reserved1 : 3 ;
unsigned char Reserved2[2];
unsigned char ParameterLen;
unsigned char Control;
} MODE_SELECT_SPC, * PMODE_SELECT_SPC;
typedef struct _MBR_BLOCK {
unsigned char Res[454];
unsigned int StartSector;
unsigned int TotalSector;
unsigned char Res1[50];
} MBR_BLOCK,* PMBR_BLOCK;
typedef struct _BPB_BLOCK {
unsigned char BS_jmpBoo[3];
unsigned char BS_OEMName[8];
unsigned short BPB_BytesPerSec;
unsigned char BPB_SecPerClus;
unsigned char BPB_RsvdSecCn[2];
unsigned char BPB_NumFATs;
unsigned short BPB_RootEntCnt;
INT16 BPB_TotSec16;
INT8 BPB_Media;
INT16 BPB_FATSz16;
INT16 BPB_SecPerTrk;
INT16 BPB_NumHeads;
unsigned long BPB_HiddSec;
unsigned long BPB_TotSec32;
INT8 BS_DrvNum;
INT8 BS_Reserved1;
INT8 BS_BootSig;
INT8 BS_VolID[4];
INT8 BS_VolLab[11];
INT8 BS_FilSysType[8];
INT8 ExecutableCode[448];
INT8 Marker[2];
} BPB_BLOCK,* PBPB_BLOCK;
typedef struct _SYS_INFO_BLOCK{
unsigned long StartSector;
unsigned long TotalSector;
//INT8 BS_jmpBoo[3];
//INT8 BS_OEMName[8];
INT16 BPB_BytesPerSec;
INT8 BPB_SecPerClus;
//INT8 BPB_RsvdSecCn[2];
INT8 BPB_NumFATs;
INT16 BPB_RootEntCnt;
INT16 BPB_TotSec16;
INT8 BPB_Media;
INT16 BPB_FATSz16;
INT16 BPB_SecPerTrk;
INT16 BPB_NumHeads;
unsigned long BPB_HiddSec;
unsigned long BPB_TotSec32;
INT8 BS_DrvNum;
//INT8 BS_Reserved1;
INT8 BS_BootSig;
INT8 BS_VolID[4];
INT8 BS_VolLab[11];
INT8 BS_FilSysType[8];
//INT8 ExecutableCode[448];
//INT8 Marker[2];
///////////////////////////////
unsigned long FatStartSector;
unsigned long RootStartSector;
//unsigned long DataStartSector;
unsigned long FirstDataSector;
//unsigned long FirstSectorofCluster;
} SYS_INFO_BLOCK,* PSYS_INFO_BLOCK;
typedef struct _FILE_INFO{
unsigned char bFileOpen;
unsigned int StartCluster;
unsigned long LengthInByte;
unsigned int ClusterPointer;
unsigned long SectorPointer;
unsigned int OffsetofSector;
unsigned char SectorofCluster;
unsigned long pointer;
unsigned int FatSectorPointer;
} FILE_INFO, * PFILE_INFO;
typedef struct _DIR_INFO{
unsigned char name[8];
unsigned char extension[3];
unsigned char attribute;
unsigned char Reserved[10];
unsigned int lastUpdateDate;
unsigned int lastUpdateTime;
unsigned int startCluster;
unsigned long length;
} DIR_INFO,* PDIR_INFO;
/*
// Mode Sense
*/
typedef struct _MODE_SENSE_SPC {
INT8 OperationCode; /* 1AH */
unsigned Reseved0 : 3 ;
unsigned DisableBlockDescriptor : 1 ;
unsigned Reserved0 : 4 ;
unsigned PageCode:6 ;
unsigned PageControl : 2 ;
INT8 Reserved1;
INT8 ParameterLen;
INT8 Control;
} MODE_SENSE_SPC, * PMODE_SENSE_SPC;
typedef struct _MODE_PARAMETER_HEAD {
INT8 DataLen;
INT8 MediumType;
INT8 DeviceParameter;
INT8 BlockDescriptorLen;
} MODE_PARAMETER_HEAD, * PMODE_PARAMETER_HEAD;
/*
// Define Device Capabilities page.
*/
typedef struct _MODE_RBC_DEVICE_PARAMETERS_PAGE {
unsigned PageCode : 6;
unsigned Reserved : 1;
unsigned PageSavable : 1;
INT8 PageLength;
unsigned WriteCacheDisable : 1;
unsigned Reserved1 : 7;
INT8 LogicalBlockSize[2];
INT8 NumberOfLogicalBlocks[5];
INT8 PowerPerformance;
unsigned Lockable : 1;
unsigned Formattable : 1;
unsigned Writable : 1;
unsigned Readable : 1;
unsigned Reserved2 : 4;
INT8 Reserved3;
}MODE_RBC_DEVICE_PARAMETERS_PAGE, *PMODE_RBC_DEVICE_PARAMETERS_PAGE;
/*
// prevent/allow medium removal
*/
typedef struct _MEDIA_REMOVAL_SPC {
INT8 OperationCode; /* 1EH */
INT8 Reserved0[3];
INT8 Prevent;
//INT8 Reserved1:6 ;
//INT8 Control;
} MEDIA_REMOVAL_SPC, *PMEDIA_REMOVAL_SPC;
/*
// Request Sense
*/
typedef struct _REQUEST_SENSE_SPC {
INT8 OperationCode; /* 03H */
INT8 Reserved[3];
INT8 AllocationLen;
INT8 Control;
} REQUEST_SENSE_SPC, *PREQUEST_SENSE_SPC;
typedef struct _REQUEST_SENSE_DATA {
unsigned ResponseCode : 7;
unsigned Valid : 1;
INT8 SegmentNum;
unsigned SenseKey : 4;
unsigned Reserved0 : 1;
unsigned WrongLenIndicator : 1;
unsigned EndofMedium : 1;
unsigned FileMark : 1;
INT8 Info_0;
INT8 Info_1;
INT8 Info_2;
INT8 Info_3;
INT8 AdditionalSenseLen;
INT8 CommandSpecInfo_0;
INT8 CommandSpecInfo_1;
INT8 CommandSpecInfo_2;
INT8 CommandSpecInfo_3;
INT8 ASC;
INT8 ASCQ;
INT8 FieldReplacableUnitCode;
unsigned SenseKeySpec_0 : 7;
unsigned SenseKeySpecValid : 1;
INT8 SenseKeySpec_1;
INT8 SenseKeySpec_2;
} REQUEST_SENSE_DATA, *PREQUEST_SENSE_DATA;
/*
// Test Unit Ready
*/
typedef struct _TEST_UNIT_SPC {
INT8 OperationCode; /* 00H */
INT8 Reserved[4];
INT8 Control;
} TEST_UNIT_SPC, *PTEST_UNIT_SPC;
/*
// Write Buffer
*/
typedef struct _WRITE_BUFFER_SPC {
INT8 OperationCode; /* 3BH */
unsigned Mode:4 ;
unsigned Reserved0:4 ;
INT8 BufferID;
INT8 BufferOff_2;
INT8 BufferOff_1;
INT8 BufferOff_0;
INT8 ParameterLen_2;
INT8 ParameterLen_1;
INT8 ParameterLen_0;
INT8 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;
#define CBW_SIGNATURE 0x43425355
#define CSW_SIGNATURE 0x53425355
typedef struct _COMMAND_BLOCK_WRAPPER{
unsigned int dCBW_Signature;
unsigned int dCBW_Tag;
unsigned int dCBW_DataXferLen;
unsigned char bCBW_Flag;
unsigned char bCBW_LUN;
unsigned char bCBW_CDBLen;
CDB_RBC cdbRBC;
//////////////////////////////////////
} CBW, *PCBW;
typedef struct _COMMAND_STATUS_WRAPPER{
unsigned int dCSW_Signature;
unsigned int dCSW_Tag;
unsigned int dCSW_DataResidue;
unsigned char bCSW_Status;
} CSW, *PCSW;
typedef union _TPBULK_STRUC {
CBW TPBulk_CommandBlock;
CSW TPBulk_CommandStatus;
}TPBLK_STRUC, * PTPBLK_STRUC;
#define ATTR_READ_ONLY 0x01
#define ATTR_HIDDEN 0x02
#define ATTR_SYSTEM 0x04
#define ATTR_VOLUME_ID 0x08
#define ATTR_DIRECTORY 0x10
#define ATTR_ARCHIVE 0x20
struct _BPB
{
BYTE NumFATs;
BYTE SecPerClus;
WORD BytsPerSec;
WORD RsvdSecCnt;
WORD RootEntCnt;
unsigned int TotSec;
unsigned int FATSz;
};
struct _FatGet
{
INT32 DirSectorNum;
int DirIndex;
char filename[13];
};
struct _DIR
{
BYTE Name[11];
BYTE Attr;
BYTE NTRes;
BYTE CrtTimeTenth;
WORD CrtTime;
WORD CrtDate;
WORD LstAccDate;
WORD FstClusHI;
WORD WrtTime;
WORD WrtDate;
WORD FstClusLO;
INT32 FileSize;
};
struct _STAT
{
BYTE Attr;
BYTE CrtTimeTenth;
WORD CrtTime;
WORD CrtDate;
WORD LstAccDate;
WORD WrtTime;
WORD WrtDate;
INT32 FileSize;
};
struct _FILE
{
int valid; // 1 valid, 0 free.
INT32 DirSectorNum;
int DirIndex;
INT32 StartSectorNum;
INT32 CurrentSectorNum;
INT32 SectorOffset;
struct _DIR dir;
unsigned long offset;
};
typedef struct
{
unsigned Day:5;
unsigned Month:4;
unsigned Year:7;
} _FatDate;
typedef struct
{
unsigned Second_2s : 5;
unsigned Minutes : 6;
unsigned Hours : 5;
}_FatTime;
int epBulkRcv(unsigned char *pBuffer,unsigned int len);
int epBulkSend(unsigned char *pBuffer,unsigned int len,unsigned int lba);
unsigned char RBC_Write(unsigned long lba,unsigned char len,unsigned char *pBuffer,unsigned char timewait);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -