📄 usb.h
字号:
/*******************************Copyright (c)***************************************
U盘操作说明
************************************************************************************/
#ifndef _USB_H_
#define _USB_H_
/*---------------------------------------------------------------------------------*/
#define SL811H_ADDR XBYTE[0x8000]
#define SL811H_DATA XBYTE[0x8001]
#define ISO_BIT 0x10
#define MAX_EP 0x05
#define TIMEOUT_RETRY 0x06
#define TPBulk_CBW TPBulk_Block.TPBulk_CommandBlock
#define CBW_wXferLen TPBulk_CBW.dCBW_DataXferLen
#define RBC_CDB TPBulk_CBW.cdbRBC
#define RBC_LUN TPBulk_CBW.bCBW_LUN
#define TPBulk_CSW TPBulk_Block.TPBulk_CommandStatus
/*---------------------------------------------------------------------------------*/
typedef struct _USB_FLAGS
{
UBYTE UDiskOK :1;
UBYTE SLAVE_ONLINE :1;
UBYTE bData1 :1;
UBYTE bIsFat32 :1;
UBYTE bFatChanged :1;
}USBFLAGS;
typedef struct
{
UHWORD wVID, wPID;
UBYTE bClass;
UBYTE bNumOfEPs;
UBYTE iMfg;
UBYTE iPdt;
UBYTE bId1;
UBYTE bId2;
UBYTE bEPAddr[MAX_EP];
UBYTE bAttr[MAX_EP];
UHWORD wPayLoad[MAX_EP];
UHWORD bInterval[MAX_EP];
UBYTE bData1[MAX_EP];
}pUSBDEV;
typedef struct
{
UBYTE bmRequest;
UBYTE bRequest;
UHWORD wValue;
UHWORD wIndex;
UHWORD wLength;
}SetupPKG;
typedef struct
{
UBYTE usbaddr;
UBYTE endpoint;
UBYTE pid;
UBYTE wPayload;
UHWORD wLen;
UBYTE *buffer;
SetupPKG setup;
UBYTE epbulkin;
UBYTE epbulkout;
}USBPKG;
typedef struct
{ UBYTE bLength;
UBYTE bDescriptorType;
UHWORD bcdUSB;
UBYTE bDeviceClass;
UBYTE bDeviceSubClass;
UBYTE bDeviceProtocol;
UBYTE bMaxPacketSize0;
UHWORD idVendor;
UHWORD idProduct;
UHWORD bcdDevice;
UBYTE iManufacturer;
UBYTE iProduct;
UBYTE iSerialNumber;
UBYTE bNumConfigurations;
}*pDevDesc;
typedef struct
{
UBYTE bLength;
UBYTE bType;
UHWORD wLength;
UBYTE bNumIntf;
UBYTE bCV;
UBYTE bIndex;
UBYTE bAttr;
UBYTE bMaxPower;
}*pCfgDesc;
typedef struct
{ UBYTE bLength;
UBYTE bType;
UBYTE iNum;
UBYTE iAltString;
UBYTE bEndPoints;
UBYTE iClass;
UBYTE iSub;
UBYTE iProto;
UBYTE iIndex;
}*pIntfDesc;
typedef struct
{ UBYTE bLength;
UBYTE bType;
UBYTE bEPAdd;
UBYTE bAttr;
UHWORD wPayLoad;
UBYTE bInterval;
}*pEPDesc;
/*---------------------------------------------------------------------------------*/
#define EP0_Buf 0x80
#define EP1_Buf 0xc0
#define EP0Control 0x00
#define EP0Address 0x01
#define EP0XferLen 0x02
#define EP0Status 0x03
#define EP0Counter 0x04
#define EP1Control 0x08
#define EP1Address 0x09
#define EP1XferLen 0x0a
#define EP1Status 0x0b
#define EP1Counter 0x0c
#define CtrlReg 0x05
#define IntEna 0x06
#define IntStatus 0x0d
#define cDATASet 0x0e
#define cSOFcnt 0x0f
#define IntMask 0x57
#define HostMask 0x47
#define ReadMask 0xd7
#define USB_A_DONE 0x01
#define USB_B_DONE 0x02
#define BABBLE_DETECT 0x04
#define INT_RESERVE 0x08
#define SOF_TIMER 0x10
#define INSERT_REMOVE 0x20
#define USB_RESET 0x40
#define USB_DPLUS 0x80
#define INT_CLEAR 0xFF
#define EP0_ACK 0x01
#define EP0_ERROR 0x02
#define EP0_TIMEOUT 0x04
#define EP0_SEQUENCE 0x08
#define EP0_SETUP 0x10
#define EP0_OVERFLOW 0x20
#define EP0_NAK 0x40
#define EP0_STALL 0x80
#define GET_STATUS 0x00
#define CLEAR_FEATURE 0x01
#define SET_FEATURE 0x03
#define SET_ADDRESS 0x05
#define GET_DESCRIPTOR 0x06
#define SET_DESCRIPTOR 0x07
#define GET_CONFIG 0x08
#define SET_CONFIG 0x09
#define GET_INTERFACE 0x0a
#define SET_INTERFACE 0x0b
#define SYNCH_FRAME 0x0c
#define DEVICE 0x01
#define CONFIGURATION 0x02
#define STRING 0x03
#define INTERFACE 0x04
#define ENDPOINT 0x05
#define STDCLASS 0x00
#define DATA0_WR 0x07
#define sDATA0_WR 0x07
#define DATA0_RD 0x03
#define sDATA0_RD 0x03
#define PID_SETUP 0xD0
#define PID_IN 0x90
#define PID_OUT 0x10
#define CBW_SIGNATURE 0x55534243
#define CSW_SIGNATURE 0x55534253
#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
#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
/*---------------------------------------------------------------------------------*/
typedef struct _READ_10
{
UBYTE OperationCode;
UBYTE Lun5to7;
UBYTE LBA_3;
UBYTE LBA_2;
UBYTE LBA_1;
UBYTE LBA_0;
UBYTE Reserved2;
UBYTE XferLen_1;
UBYTE XferLen_0;
UBYTE Reserved3[3];
}READ_10, *PREAD_10;
typedef struct _WRITE_10
{
UBYTE OperationCode;
UBYTE Lun5to7;
UBYTE LBA_3;
UBYTE LBA_2;
UBYTE LBA_1;
UBYTE LBA_0;
UBYTE Reserved2;
UBYTE XferLen_1;
UBYTE XferLen_0;
UBYTE Reserved3[3];
} WRITE_10, *PWRITE_10;
typedef struct _FORMAT_RBC
{
UBYTE OperationCode;
UBYTE VendorSpecific;
UBYTE Increment : 1;
UBYTE PercentorTime : 1;
UBYTE Progress : 1;
UBYTE Immediate : 1;
UBYTE VendorSpecific1 : 4;
UBYTE Reserved2[2];
UBYTE Control;
}FORMAT_RBC, *PFORMAT_RBC;
typedef struct _READ_RBC
{
UBYTE OperationCode;
UBYTE VendorSpecific;
union
{
struct
{
UBYTE LBA_3;
UBYTE LBA_2;
UBYTE LBA_1;
UBYTE LBA_0;
}LBA_W8 ;
UWORD LBA_W32;
}LBA;
UBYTE Reserved;
UHWORD XferLength;
UBYTE Control;
}READ_RBC, *PREAD_RBC;
typedef struct _READ_CAPACITY_DATA
{
UBYTE LBA_3;
UBYTE LBA_2;
UBYTE LBA_1;
UBYTE LBA_0;
UBYTE BlockLen_3;
UBYTE BlockLen_2;
UBYTE BlockLen_1;
UBYTE BlockLen_0;
} READ_CAPACITY_DATA, *PREAD_CAPACITY_DATA;
typedef struct _READ_LONG_CMD
{
UBYTE OperationCode;
UBYTE LogicalUnitNum :3;
UBYTE RES_1 :5;
UBYTE RES_2;
UBYTE RES_3;
UBYTE RES_4;
UBYTE RES_5;
UBYTE RES_6;
UHWORD AllocationLen;
UBYTE RES_7;
UBYTE RES_8;
UBYTE RES_9;
}READ_LONG_CMD, *PREAD_LONG_CMD;
typedef struct _READ_LONG
{
UBYTE RES_1;
UBYTE RES_2;
UBYTE RES_3;
UBYTE CAP_LIST_LEN;
UBYTE LBA_3;
UBYTE LBA_2;
UBYTE LBA_1;
UBYTE LBA_0;
UBYTE Descripter;
UBYTE BlockLen_2;
UBYTE BlockLen_1;
UBYTE BlockLen_0;
}READ_LONG, *PREAD_LONG;
typedef struct _READ_CAPACITY_RBC
{
UBYTE OperationCode;
UBYTE Lun5to7;
UBYTE Reserved[6];
UBYTE PMI;
}READ_CAPACITY_RBC, *PREAD_CAPACITY_RBC;
typedef struct _READ_CAPACITY_RSP
{
UWORD LastLBA;
UWORD BlockSize;
} READ_CAPACITY_RSP, *PREAD_CAPACITY_RSP;
typedef struct _WRITE_RBC
{
UBYTE OperationCode;
UBYTE VendorSpecific;
union
{
struct
{
UBYTE LBA_3;
UBYTE LBA_2;
UBYTE LBA_1;
UBYTE LBA_0;
}LBA_W8 ;
UWORD LBA_W32;
}LBA;
UBYTE Reserved2;
UHWORD XferLength;
UBYTE Control;
}WRITE_RBC, *PWRITE_RBC;
typedef struct _INQUIRY_SPC
{
UBYTE OperationCode;
UBYTE Lun5to7;
UBYTE PageCode;
UBYTE Reserved;
UBYTE AllocationLen;
UBYTE Control;
}INQUIRY_SPC, *PINQUIRY_SPC;
typedef struct _MBR_BLOCK
{
UBYTE Res[454];
UWORD StartSector;
UWORD TotalSector;
UBYTE Res1[50];
}MBR_BLOCK,* PMBR_BLOCK;
typedef struct _BPB_BLOCK
{
UBYTE BS_jmpBoo[3];
UBYTE BS_OEMName[8];
UHWORD BPB_BytesPerSec;
UBYTE BPB_SecPerClus;
UHWORD BPB_RsvdSecCn;
UBYTE BPB_NumFATs;
UHWORD BPB_RootEntCnt;
UHWORD BPB_TotSec16;
UBYTE BPB_Media;
UHWORD BPB_FATSz16;
UHWORD BPB_SecPerTrk;
UHWORD BPB_NumHeads;
UWORD BPB_HiddSec;
UWORD BPB_TotSec32;
union
{
struct
{
UBYTE BS_DrvNum;
UBYTE BS_Reserved1;
UBYTE BS_BootSig;
UBYTE BS_VolID[4];
UBYTE BS_VolLab[11];
UBYTE BS_FilSysType[8];
}fat16;
struct
{
UWORD BPB_FATSz32;
UHWORD BPB_ExtFlags;
UHWORD BPB_FSVer;
UWORD BPB_RootClus;
UHWORD BPB_FSInfo;
UHWORD BPB_BkBootSec;
UBYTE res[12];
UBYTE BS_DrvNum;
UBYTE res1;
UBYTE BS_BootSig;
UBYTE BS_VoilD[4];
UBYTE BS_VoilLab[11];
UBYTE BS_FilSysType[8];
}fat32;
}fat16_32;
UBYTE ExecutableCode[410];
UBYTE Marker[2];
}BPB_BLOCK,* PBPB_BLOCK;
typedef struct _SYS_INFO_BLOCK
{
UHWORD BPB_BytesPerSec;
UBYTE BPB_SecPerClus;
UHWORD BPB_RootEntCnt;
UWORD FATSz;
UWORD FatStartSector;
UWORD RootStartSector;
UWORD RootClusterNum;
UWORD FSI_Free_Count;
UWORD FSI_Nxt_Free;
UWORD FirstDataSector;
}SYS_INFO_BLOCK,* PSYS_INFO_BLOCK;
typedef struct _FILE_INFO
{
UBYTE bFileOpen;
UWORD StartCluster;
UWORD LengthInByte;
UWORD ClusterPointer;
UWORD SectorPointer;
UHWORD OffsetofSector;
UBYTE SectorofCluster;
UWORD pointer;
UWORD FatSectorPointer;
UBYTE FileName[11];
}FILE_INFO, * PFILE_INFO;
#define MAXDIRDEPTH 10
typedef struct _DIR_INFO
{
UWORD Link[MAXDIRDEPTH];
UWORD StartSector;
UWORD StartCluster;
UWORD ParentStartCluster;
UBYTE DepthIndex;
UBYTE bRootDir;
}DIR_INFO,* PDIR_INFO;
typedef struct
{
UBYTE DIR_Name[11];
UBYTE DIR_Attr;
UBYTE DIR_NTRes;
UBYTE DIR_CrtTimeTenth;
UHWORD DIR_CrtTime;
UHWORD DIR_CrtDate;
UHWORD DIR_LstAccDate;
UHWORD DIR_FstClusHI;
UHWORD DIR_WrtTime;
UHWORD DIR_WrtDate;
UHWORD DIR_FstClusLO;
UWORD DIR_FileSize;
}DIR_STRUC, * PDIR_STRUC;
typedef struct _FSINFO_BLOCK
{
UBYTE res1[488];
UWORD FSI_Free_Count;
UWORD FSI_Nxt_Free;
}FSINFO_BLOCK, *PFSINFO_BLOCK;
typedef struct _MEDIA_REMOVAL_SPC
{
UBYTE OperationCode;
UBYTE Lun5to7;
UBYTE Reserved[2];
UBYTE Prevent;
}MEDIA_REMOVAL_SPC, *PMEDIA_REMOVAL_SPC;
typedef struct _REQUEST_SENSE_SPC
{
UBYTE OperationCode;
UBYTE Lun5to7;
UBYTE Reserved[2];
UBYTE AllocationLen;
UBYTE Control;
}REQUEST_SENSE_SPC, *PREQUEST_SENSE_SPC;
typedef struct _TEST_UNIT_SPC
{
UBYTE OperationCode;
UBYTE Lun5to7;
UBYTE Reserved[3];
UBYTE Control;
}TEST_UNIT_SPC, *PTEST_UNIT_SPC;
typedef union _CDB_RBC
{
FORMAT_RBC RbcCdb_Format;
READ_RBC RbcCdb_Read;
READ_CAPACITY_RBC RbcCdb_ReadCapacity;
WRITE_RBC RbcCdb_Write;
INQUIRY_SPC SpcCdb_Inquiry;
MEDIA_REMOVAL_SPC SpcCdb_Remove;
REQUEST_SENSE_SPC SpcCdb_RequestSense;
TEST_UNIT_SPC SpcCdb_TestUnit;
READ_10 CmdRead10;
WRITE_10 CmdWrite10;
READ_LONG_CMD SpcCdb_ReadLong;
}CDB_RBC, *PCDB_RBC;
typedef struct _COMMAND_BLOCK_WRAPPER
{
UWORD dCBW_Signature;
UWORD dCBW_Tag;
UWORD dCBW_DataXferLen;
UBYTE bCBW_Flag;
UBYTE bCBW_LUN;
UBYTE bCBW_CDBLen;
CDB_RBC cdbRBC;
}CBW, *PCBW;
typedef struct _COMMAND_STATUS_WRAPPER
{
UWORD dCSW_Signature;
UWORD dCSW_Tag;
UWORD dCSW_DataResidue;
UBYTE bCSW_Status;
}CSW, *PCSW;
typedef union _TPBULK_STRUC
{
CBW TPBulk_CommandBlock;
CSW TPBulk_CommandStatus;
}TPBLK_STRUC;
/*---------------------------------------------------------------------------------*/
extern UBYTE xdata DBUF[];
extern UBYTE xdata CurFatSector[];
extern UBYTE xdata opLun;
extern UWORD xdata FreeClusterNum;
extern UWORD xdata FreeSecNum;
extern UWORD xdata StartSec2Write;
extern UBYTE xdata *BufStartAddress;
extern UWORD xdata OldClusterPointer;
extern USBFLAGS bdata DiskFlags;
extern DIR_INFO xdata ThisDir;
extern FILE_INFO xdata ThisFile;
extern SYS_INFO_BLOCK xdata DeviceInfo;
/*---------------------------------------------------------------------------------*/
UBYTE SL811Read(UBYTE a);
void SL811Write(UBYTE a, UBYTE d);
void SL811BufRead(UBYTE addr, UBYTE *s, UBYTE c);
void SL811BufWrite(UBYTE addr, UBYTE *s, UBYTE c);
UHWORD WordSwap(UHWORD input);
void DelayMs(UBYTE nFactor);
UWORD SwapINT32(UWORD dData);
UHWORD SwapINT16(UHWORD dData);
UWORD MakeWord(UBYTE d3,UBYTE d2,UBYTE d1,UBYTE d0);
UBYTE SL811_GetRev(void);
void USBReset(void);
UBYTE usbXfer(void);
UBYTE ep0Xfer(void);
UBYTE epBulkSend(UBYTE *pBuffer,UHWORD len);
UBYTE epBulkRcv(UBYTE *pBuffer,UHWORD len);
UBYTE SetAddress(UBYTE addr);
UBYTE Set_Configuration(void);
UBYTE GetDesc(void);
UBYTE EnumUsbDev(UBYTE usbaddr);
void SL811Init(void);
void CheckUsbDevice(void);
UBYTE EnumMassDev(void);
UBYTE TPBulk_GetMaxLUN(void);
UBYTE SPC_Inquiry(void);
UBYTE SPC_READLONG(void);
UBYTE SPC_RequestSense(void);
UBYTE SPC_TestUnit(void);
UBYTE SPC_LockMedia(void);
UBYTE RBC_ReadCapacity(void);
UBYTE RBC_Read(UWORD lba,UBYTE len,UBYTE *pBuffer);
UBYTE RBC_Write(UWORD lba,UBYTE len,UBYTE *pBuffer);
UBYTE EnumMassDev(void);
UWORD FirstSectorofCluster(UWORD n);
UWORD ThisFatSecNum(UWORD clusterNum);
UHWORD ThisFatEntOffset(UWORD clusterNum);
UWORD GetNextClusterNum(UWORD clusterNum);
UWORD CreateClusterLink(UWORD currentCluster);
UBYTE DeleteClusterLink(UWORD clusterNum);
void UpdateFat(UWORD sectorNum);
UBYTE SeekSectorToRead(UWORD * pClusterNum,UHWORD *pSector,UWORD *pSectorToRead);
/*---------------------------------------------------------------------------------*/
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -