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

📄 usb.h

📁 这个是录音琴的程序,用光电感应器来检测琴键的动作.并且将他记录下来,可以回放.
💻 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 + -