📄 genericusb.h
字号:
#define rom const
#define const_rom const
#define USB_MEM(name, location) static volatile name @ location
/*****************************************************************************/
typedef unsigned char byte; // 8-bit
typedef unsigned int word; // 16-bit
typedef unsigned long dword; // 32-bit
typedef union _BYTE
{
byte _byte;
} BYTE;
typedef union _WORD
{
word _word;
struct
{
byte byte0;
byte byte1;
} a;
struct
{
byte v[2];
} d;
} WORD;
#define LSB(a) ((a).d.v[0])
#define MSB(a) ((a).d.v[1])
typedef union _DWORD
{
dword _dword;
struct
{
byte byte0;
byte byte1;
byte byte2;
byte byte3;
} a;
struct
{
word word0;
word word1;
} b;
struct
{
byte v[4];
} e;
} DWORD;
#define LOWER_LSB(a) ((a).e.v[0])
#define LOWER_MSB(a) ((a).e.v[1])
#define UPPER_LSB(a) ((a).e.v[2])
#define UPPER_MSB(a) ((a).e.v[3])
typedef void(*pFunc)(void);
typedef union _POINTER
{
struct
{
byte bLow;
byte bHigh;
} a;
word _word;
byte* bRam;
word* wRam;
rom byte* bRom;
rom word* wRom;
} POINTER;
typedef enum _BOOL { FALSE = 0, TRUE } BOOL;
/*****************************************************************************/
typedef struct
{
unsigned EPSTALL :1;
unsigned EPINEN :1;
unsigned EPOUTEN :1;
unsigned EPCONDIS :1;
unsigned EPHSHK :1;
unsigned Reserved :3;
} UEP0Type;
static volatile near UEP0Type UEP0bits @ 0xF70;
/*****************************************************************************/
void USBCheckStdRequest(void);
void USBCtrlEPService(void);
void USBCtrlTrfTxService(void);
void USBCtrlTrfRxService(void);
void USBCtrlEPServiceComplete(void);
void USBPrepareForNextSetupTrf(void);
void USBCheckBusStatus(void);
void USBDriverService(void);
void USBRemoteWakeup(void);
void USBSoftDetach(void);
void ClearArray(byte* startAdr,byte count);
void USBModuleEnable(void);
void USBModuleDisable(void);
void USBSuspend(void);
void USBWakeFromSuspend(void);
void USBProtocolReset(void);
void USB_SOF_(void);
void USBStall(void);
void USBError(void);
void USBCtrlTrfSetup(void);
void USBCtrlTrfOut(void);
void USBCtrlTrfIn(void);
void USBStdGetDsc(void);
void USBStdSetCfg(void);
void USBStdGetStatus(void);
void USBStdFeatureReq(void);
void USBGenInitEP(void);
void USBGenWrite(byte *buffer, byte len);
byte USBGenRead(byte *buffer, byte len);
/*****************************************************************************/
#define GET_STATUS 0
#define CLR_FEATURE 1
#define SET_FEATURE 3
#define SET_ADR 5
#define GET_DSC 6
#define SET_DSC 7
#define GET_CFG 8
#define SET_CFG 9
#define GET_INTF 10
#define SET_INTF 11
#define SYNCH_FRAME 12
/* Standard Feature Selectors */
#define DEVICE_REMOTE_WAKEUP 0x01
#define ENDPOINT_HALT 0x00
/*****************************************************************************/
#define EP0_BUFF_SIZE 64
#define MAX_NUM_INT 1
#define MODE_PP _PPBM0
#define UCFG_VAL _PUEN|_TRINT|_FS|MODE_PP
#define USB_USE_GEN
#define MUID_NULL 0
#define MUID_USB9 1
#define USBGEN_INTF_ID 0x00
#define USBGEN_UEP UEP1
#define USBGEN_BD_OUT ep[1].out
#define USBGEN_BD_IN ep[1].in
#define USBGEN_EP_SIZE 64
#define MAX_EP_NUMBER 2
/*****************************************************************************/
#define WAIT_SETUP 0
#define CTRL_TRF_TX 1
#define CTRL_TRF_RX 2
#define SETUP_TOKEN 0b00001101
#define OUT_TOKEN 0b00000001
#define IN_TOKEN 0b00001001
/* bmRequestType Definitions */
#define HOST_TO_DEV 0
#define DEV_TO_HOST 1
#define STANDARD 0x00
#define CLASS 0x01
#define VENDOR 0x02
#define RCPT_DEV 0
#define RCPT_INTF 1
#define RCPT_EP 2
#define RCPT_OTH 3
/*****************************************************************************/
typedef union _CTRL_TRF_SETUP
{
struct
{
byte _byte[EP0_BUFF_SIZE];
} a;
/** Standard Device Requests *********************************************/
struct
{
byte bmRequestType;
byte bRequest;
word wValue;
word wIndex;
word wLength;
} b;
struct
{
unsigned :8;
unsigned :8;
WORD W_Value;
WORD W_Index;
WORD W_Length;
} c;
struct
{
unsigned Recipient:5; //Device,Interface,Endpoint,Other
unsigned RequestType:2; //Standard,Class,Vendor,Reserved
unsigned DataDir:1; //Host-to-device,Device-to-host
unsigned :8;
byte bFeature; //DEVICE_REMOTE_WAKEUP,ENDPOINT_HALT
unsigned :8;
unsigned :8;
unsigned :8;
unsigned :8;
unsigned :8;
} d;
struct
{
unsigned :8;
unsigned :8;
byte bDscIndex; //For Configuration and String DSC Only
byte bDscType; //Device,Configuration,String
word wLangID; //Language ID
unsigned :8;
unsigned :8;
} e;
struct
{
unsigned :8;
unsigned :8;
BYTE bDevADR; //Device Address 0-127
byte bDevADRH; //Must equal zero
unsigned :8;
unsigned :8;
unsigned :8;
unsigned :8;
} f;
struct
{
unsigned :8;
unsigned :8;
byte bCfgValue; //Configuration Value 0-255
byte bCfgRSD; //Must equal zero (Reserved)
unsigned :8;
unsigned :8;
unsigned :8;
unsigned :8;
} g;
struct
{
unsigned :8;
unsigned :8;
byte bAltID; //Alternate Setting Value 0-255
byte bAltID_H; //Must equal zero
byte bIntfID; //Interface Number Value 0-255
byte bIntfID_H; //Must equal zero
unsigned :8;
unsigned :8;
} h;
struct
{
unsigned :8;
unsigned :8;
unsigned :8;
unsigned :8;
byte bEPID; //Endpoint ID (Number & Direction)
byte bEPID_H; //Must equal zero
unsigned :8;
unsigned :8;
} i;
struct
{
unsigned :8;
unsigned :8;
unsigned :8;
unsigned :8;
unsigned EPNum:4; //Endpoint Number 0-15
unsigned :3;
unsigned EPDir:1; //Endpoint Direction: 0-OUT, 1-IN
unsigned :8;
unsigned :8;
unsigned :8;
} j;
} CTRL_TRF_SETUP;
/*****************************************************************************/
typedef union _CTRL_TRF_DATA
{
struct
{
byte _byte[EP0_BUFF_SIZE];
} a;
struct
{
byte _byte0;
byte _byte1;
byte _byte2;
byte _byte3;
byte _byte4;
byte _byte5;
byte _byte6;
byte _byte7;
} b;
struct
{
word _word0;
word _word1;
word _word2;
word _word3;
} c;
} CTRL_TRF_DATA;
/*****************************************************************************/
/* Descriptor Types */
#define DSC_DEV 0x01
#define DSC_CFG 0x02
#define DSC_STR 0x03
#define DSC_INTF 0x04
#define DSC_EP 0x05
#define _EP01_OUT 0x01
#define _EP01_IN 0x81
#define _EP02_OUT 0x02
#define _EP02_IN 0x82
#define _EP03_OUT 0x03
#define _EP03_IN 0x83
#define _EP04_OUT 0x04
#define _EP04_IN 0x84
#define _EP05_OUT 0x05
#define _EP05_IN 0x85
#define _EP06_OUT 0x06
#define _EP06_IN 0x86
#define _EP07_OUT 0x07
#define _EP07_IN 0x87
#define _EP08_OUT 0x08
#define _EP08_IN 0x88
#define _EP09_OUT 0x09
#define _EP09_IN 0x89
#define _EP10_OUT 0x0A
#define _EP10_IN 0x8A
#define _EP11_OUT 0x0B
#define _EP11_IN 0x8B
#define _EP12_OUT 0x0C
#define _EP12_IN 0x8C
#define _EP13_OUT 0x0D
#define _EP13_IN 0x8D
#define _EP14_OUT 0x0E
#define _EP14_IN 0x8E
#define _EP15_OUT 0x0F
#define _EP15_IN 0x8F
/* Configuration Attributes */
#define _DEFAULT 0x01<<7 //Default Value (Bit 7 is set)
#define _SELF 0x01<<6 //Self-powered (Supports if set)
#define _RWU 0x01<<5 //Remote Wakeup (Supports if set)
/* Endpoint Transfer Type */
#define _CTRL 0x00 //Control Transfer
#define _ISO 0x01 //Isochronous Transfer
#define _BULK 0x02 //Bulk Transfer
#define _INT 0x03 //Interrupt Transfer
/* Isochronous Endpoint Synchronization Type */
#define _NS 0x00<<2 //No Synchronization
#define _AS 0x01<<2 //Asynchronous
#define _AD 0x02<<2 //Adaptive
#define _SY 0x03<<2 //Synchronous
/* Isochronous Endpoint Usage Type */
#define _DE 0x00<<4 //Data endpoint
#define _FE 0x01<<4 //Feedback endpoint
#define _IE 0x02<<4 //Implicit feedback Data endpoint
/* USB Device Descriptor Structure */
typedef struct _USB_DEV_DSC
{
byte bLength; byte bDscType; word bcdUSB;
byte bDevCls; byte bDevSubCls; byte bDevProtocol;
byte bMaxPktSize0; word idVendor; word idProduct;
word bcdDevice; byte iMFR; byte iProduct;
byte iSerialNum; byte bNumCfg;
} USB_DEV_DSC;
/* USB Configuration Descriptor Structure */
typedef struct _USB_CFG_DSC
{
byte bLength; byte bDscType; word wTotalLength;
byte bNumIntf; byte bCfgValue; byte iCfg;
byte bmAttributes; byte bMaxPower;
} USB_CFG_DSC;
/* USB Interface Descriptor Structure */
typedef struct _USB_INTF_DSC
{
byte bLength; byte bDscType; byte bIntfNum;
byte bAltSetting; byte bNumEPs; byte bIntfCls;
byte bIntfSubCls; byte bIntfProtocol; byte iIntf;
} USB_INTF_DSC;
/* USB Endpoint Descriptor Structure */
typedef struct _USB_EP_DSC
{
byte bLength; byte bDscType; byte bEPAdr;
byte bmAttributes; word wMaxPktSize; byte bInterval;
} USB_EP_DSC;
/*****************************************************************************/
/* UCFG Initialization Parameters */
#define _PPBM0 0x00 // Pingpong Buffer Mode 0
#define _PPBM1 0x01 // Pingpong Buffer Mode 1
#define _PPBM2 0x02 // Pingpong Buffer Mode 2
#define _LS 0x00 // Use Low-Speed USB Mode
#define _FS 0x04 // Use Full-Speed USB Mode
#define _TRINT 0x00 // Use internal transceiver
#define _TREXT 0x08 // Use external transceiver
#define _PUEN 0x10 // Use internal pull-up resistor
#define _OEMON 0x40 // Use SIE output indicator
#define _UTEYE 0x80 // Use Eye-Pattern test
/* UEPn Initialization Parameters */
#define EP_CTRL 0x06 // Cfg Control pipe for this ep
#define EP_OUT 0x0C // Cfg OUT only pipe for this ep
#define EP_IN 0x0A // Cfg IN only pipe for this ep
#define EP_OUT_IN 0x0E // Cfg both OUT & IN pipes for this ep
#define HSHK_EN 0x10 // Enable handshake packet
// Handshake should be disable for isoch
/*****************************************************************************/
#define OUT 0
#define IN 1
#define PIC_EP_NUM_MASK 0b01111000
#define PIC_EP_DIR_MASK 0b00000100
// Vi
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -