📄 xllp_udc.h
字号:
************************************************************************************
* DATA TYPES
************************************************************************************
*/
// USB Device Descriptor structure
typedef struct XLLP_UDC_USB_DEVICE_DESCRIPTOR_S
{
XLLP_UINT8_T bLength;
XLLP_UINT8_T bDescriptorType;
XLLP_UINT16_T bcdUSB;
XLLP_UINT8_T bDeviceClass;
XLLP_UINT8_T bDeviceSubClass;
XLLP_UINT8_T bDeviceProtocol;
XLLP_UINT8_T bMaxPacketSize0;
XLLP_UINT16_T idVendor;
XLLP_UINT16_T idProduct;
XLLP_UINT16_T bcdDevice;
XLLP_UINT8_T iManufacturer;
XLLP_UINT8_T iProduct;
XLLP_UINT8_T iSerialNumber;
XLLP_UINT8_T bNumConfigurations;
} XLLP_UDC_USB_DEVICE_DESCRIPTOR_T, P_XLLP_UDC_USB_DEVICE_DESCRIPTOR_T;
// USB Setup transaction structure
typedef struct XLLP_UDC_USB_SETUP_DATA_S
{
XLLP_UINT8_T bmRequestType;
XLLP_UINT8_T bRequest;
XLLP_UINT16_T wValue;
XLLP_UINT16_T wIndex;
XLLP_UINT16_T wLength;
} XLLP_UDC_USB_SETUP_DATA_T, *P_XLLP_UDC_USB_SETUP_DATA_T;
// UDC Control Transfer structure
typedef struct XLLP_UDC_USB_CTRL_XFER_S
{
XLLP_UINT32_T statusEp0;
P_XLLP_UINT32_T pTxBuffEp0;
P_XLLP_UINT32_T pRxBuffEp0;
XLLP_UINT32_T outDataEp0[64];
XLLP_UINT16_T descIndexEp0;
XLLP_UINT16_T descTypeEp0;
XLLP_UINT32_T dataLengthEp0;
} XLLP_UDC_USB_CTRL_XFER_T, *P_XLLP_UDC_USB_CTRL_XFER_T;
// UDC Vendor Request structure
typedef struct XLLP_UDC_VENDOR_REQ_DATA_S
{
XLLP_UINT8_T recipient;
XLLP_UINT8_T vendorReqType;
XLLP_UINT16_T vendorReqEndpointNum;
XLLP_UINT32_T vendorReqXferLength;
XLLP_BOOL_T vendorReqComplete;
} XLLP_UDC_VENDOR_REQ_DATA_T, *P_XLLP_UDC_VENDOR_REQ_DATA_T;
// UDC Interrupt statistics structure
typedef struct XLLP_UDC_INT_STATISTICS_S
{
XLLP_UINT32_T ResetIntCount;
XLLP_UINT32_T SuspendIntCount;
XLLP_UINT32_T ResumeIntCount;
XLLP_UINT32_T SOFIntCount;
XLLP_UINT32_T ConfigIntCount;
XLLP_UINT32_T EpIntCount[XLLP_UDC_MAX_EP_NUM];
P_XLLP_UINT32_T pRegDbg;
XLLP_UINT32_T totalCapturedCnt;
} XLLP_UDC_INT_STATISTICS_T, *P_XLLP_UDC_INT_STATISTICS_T;
// UDC Endpoints transfers structure
typedef struct XLLP_UDC_XFER_S
{
// XsDmaDescriptorElementsT * firstDescVtP;
P_XLLP_UINT32_T pDataEp;
XLLP_UINT32_T dmaChannel;
XLLP_UINT32_T xferLength;
XLLP_UINT32_T xferDataCounter;
XLLP_UINT32_T maxPacketSize;
XLLP_BOOL_T TxXferComplete;
XLLP_BOOL_T RxXferComplete;
XLLP_BOOL_T RxBlockXferComplete;
XLLP_BOOL_T enableLoopback;
} XLLP_UDC_XFER_T, *P_XLLP_UDC_XFER_T;
// UDC Registers
typedef struct XLLP_UDC_REGISTERS_S {
XLLP_VUINT32_T UDCCR; // UDC Control Register
XLLP_VUINT32_T UDCICR0; // UDC Interrrupt Control Register 0
XLLP_VUINT32_T UDCICR1; // UDC Interrrupt Control Register 1
XLLP_VUINT32_T UDCISR0; // UDC Interrrupt Status Register 0
XLLP_VUINT32_T UDCISR1; // UDC Interrrupt Status Register 1
XLLP_VUINT32_T UDCFNR; // UDC Frame Number Register
XLLP_VUINT32_T RESERVED0[58]; // Reserved 0x40600018-0x406000FF
XLLP_VUINT32_T UDCCSR[24]; // UDC Control/Status registers 0, A-X
XLLP_VUINT32_T RESERVED1[40]; // Reserved 0x4060015F-0x406001FF
XLLP_VUINT32_T UDCBCR[24]; // UDC Byte Count Registers 0, A-X
XLLP_VUINT32_T RESERVED2[40]; // Reserved 0x4060025F-0x406002FF
XLLP_VUINT32_T UDCDR[24]; // UDC Data Registers 0, A-X
XLLP_VUINT32_T RESERVED3[40]; // Reserved 0x4060035F-0x406003FF,
XLLP_VUINT32_T UDCCRZ[24]; // Reserved 0x40600400-0x40600403,
// 23 UDC Configuration Registers A-X
} XLLP_UDC_REGISTERS_T, *P_XLLP_UDC_REGISTERS_T;
// Note:
// Reserved 0x4060045F-0x406FFFFF
// UDC Endpoint Configuration Structure
typedef struct XLLP_UDC_EP_CONFIG_TABLE_S {
XLLP_UDC_EP_T udcEndpointNum; // UDC Endpoint Number: (0-23)
XLLP_UINT8_T usbConfigNum; // Usb Configuration Number: (1-3)
XLLP_UINT8_T usbInterfaceNum; // Usb Interface Number: (1-7)
XLLP_UINT8_T usbIntAltSettingsNum; // Usb Interface Alternate Settings Number: (1-7)
XLLP_UDC_USB_EP_T usbEndpointNum; // Usb Endpoint Number: (1-15)
XLLP_UDC_EP_TYPE_T usbEndpointType; // Usb Endpoint type: Bulk, Iso, Interrupt
XLLP_UDC_EP_DIR_T usbEndpointDirection; // Usb Endpoint direction: IN, OUT
XLLP_UINT16_T maxPacketSize; // Max. Packet Size: (1-1023)
XLLP_UDC_EP_DOUBLE_BUFF_T doubleBuffEnabled; // Double Buffering Enabled if set to one
XLLP_UDC_EP_ENABLED_T endpointEnabled; // Endpoint Enabled if set to one
XLLP_UINT32_T endpointConfigValue; // Endpoint Configuration Register Value
} XLLP_UDC_EP_CONFIG_TABLE_T, *P_XLLP_UDC_EP_CONFIG_TABLE_T;
typedef struct XLLP_UDC_USB_BIND_ENDPOINTS_S {
XLLP_UDC_EP_T udcEndpointNum; // UDC Endpoint Number: (0-23)
XLLP_UDC_USB_EP_T usbEndpointNum; // Usb Endpoint Number: (1-15)
} XLLP_UDC_USB_BIND_ENDPOINTS_T;
// UDC Handle Structure
typedef struct XLLP_UDC_S {
P_XLLP_UDC_REGISTERS_T pRegsBase; // Pointer to UDC's registers
P_XLLP_UDC_EP_CONFIG_TABLE_T pConfigTable; // Pointer to the Endpoints Config. table
XLLP_UDC_USB_BIND_ENDPOINTS_T listOfActiveEndpoints[XLLP_UDC_USB_MAX_EP_NUM];
// Used to keep track of endpoints in the active configuration
XLLP_UDC_INT_STATISTICS_T interruptStat; // Used to keep track ot the interrupts statistics
XLLP_UDC_XFER_T EpXferTable[XLLP_UDC_MAX_EP_NUM]; // Used to support the transfers
XLLP_UDC_USB_CTRL_XFER_T controlXfer; // Used to process control transfers
XLLP_UDC_VENDOR_REQ_DATA_T vendorReq; // Used to process vendor requests
XLLP_BOOL_T enableDma; // Selects DMA to service FIFOs if set
XLLP_BOOL_T setupComplete; // Used to track the complition of the setup
XLLP_BOOL_T enumerateComplete; // Used to track the complition of the enumerate command
XLLP_BOOL_T cableAttached; // Used to monitor the cable attachment and disconnect
XLLP_UINT8_T usbConfigNumActive; // Active Usb Configuration Number: (1-3)
XLLP_UINT8_T usbInterfaceNumActive; // Active Usb Interface Number: (1-7)
XLLP_UINT8_T usbIntAltSettingsNumActive; // Active Usb Interface Alternate Settings Number: (1-7)
} XLLP_UDC_T, *P_XLLP_UDC_T;
/*
************************************************************************************
* FUNCTION PROTOTYPES
************************************************************************************
*/
void XllpUdcComputeConfigRegisterValueSingle (
XLLP_UDC_EP_T udcEndpointNum,
XLLP_UINT8_T usbConfigNum,
XLLP_UINT8_T usbInterfaceNum,
XLLP_UINT8_T usbIntAltSettingsNum,
XLLP_UDC_USB_EP_T usbEndpointNum,
XLLP_UDC_EP_TYPE_T usbEndpointType,
XLLP_UDC_EP_DIR_T usbEndpointDirection,
XLLP_UINT16_T maxPacketSize,
XLLP_UDC_EP_DOUBLE_BUFF_T doubleBuffEnabled,
XLLP_UDC_EP_ENABLED_T endpointEnabled,
P_XLLP_UINT32_T pEndpointConfigRegValue);
void XllpUdcComputeConfigRegisterValue (P_XLLP_UDC_EP_CONFIG_TABLE_T pEndpointsConfigTable,
P_XLLP_UINT32_T pEndpointConfigRegValue);
XLLP_STATUS_T XllpUdcConfigureEndpoints (P_XLLP_UDC_T pUdcHandle);
void XllpUdcEnableInterrupt (P_XLLP_UDC_T pUdcHandle,
XLLP_UDC_INTERRUPTS_T udcEndpointNum,
XLLP_UDC_EP_INTERRUPT_TYPE_T interruptType);
void XllpUdcDisableInterrupt (P_XLLP_UDC_T pUdcHandle,
XLLP_UDC_INTERRUPTS_T udcEndpointNum,
XLLP_UDC_EP_INTERRUPT_TYPE_T interruptType);
void XllpUdcClearInterrupt (P_XLLP_UDC_T pUdcHandle,
XLLP_UDC_INTERRUPTS_T udcEndpointNum,
XLLP_UDC_EP_INTERRUPT_TYPE_T interruptType);
void XllpUdcGetStatusInterrupt (P_XLLP_UDC_T pUdcHandle,
XLLP_UDC_INTERRUPTS_T udcEndpointNum,
XLLP_UDC_EP_INTERRUPT_TYPE_T interruptType,
P_XLLP_UINT32_T intStatus);
void XllpUdcBuildListOfActiveEndpoints (P_XLLP_UDC_T pUdcHandle,
XLLP_UINT32_T configuration,
XLLP_UINT32_T interface,
XLLP_UINT32_T settings,
P_XLLP_UINT32_T pNumActiveEndpoints);
void XllpUdcControlProcessIdle (P_XLLP_UDC_T pUdcHandle,
P_XLLP_UINT32_T pControlXferStatus);
void XllpUdcControlProcessOutData (P_XLLP_UDC_T pUdcHandle,
P_XLLP_UINT32_T pControlXferStatus);
void XllpUdcControlProcessInData (P_XLLP_UDC_T pUdcHandle,
P_XLLP_UINT32_T pControlXferStatus);
void XllpUdcControlProcessEndXfer (P_XLLP_UDC_T pUdcHandle,
P_XLLP_UINT32_T pControlXferStatus);
void XllpUdcEp0InterruptHandler (P_XLLP_UDC_T pUdcHandle);
void XllpUdcBusDevSoftConnect (XLLP_BOOL_T connect);
void XllpUdcForceEndpointStall (P_XLLP_UDC_T pUdcHandle,
XLLP_UDC_EP_T udcEndpointNum);
void XllpUdcFlashEndpointFifo (P_XLLP_UDC_T pUdcHandle,
XLLP_UDC_EP_T udcEndpointNum);
void XllpUdcFillFifo (P_XLLP_UDC_T pUdcHandle,
XLLP_UDC_EP_T udcEndpointNum,
XLLP_BOOL_T enableZLP);
void XllpUdcUnloadFifo (P_XLLP_UDC_T pUdcHandle,
XLLP_UDC_EP_T udcEndpointNum);
void XllpUdcConfigInterruptHandler (P_XLLP_UDC_T pUdcHandle);
XLLP_STATUS_T XllpUdcHWSetup (P_XLLP_UDC_T pUdcHandle);
XLLP_STATUS_T XllpUdcHWShutdown (P_XLLP_UDC_T pUdcHandle);
void XllpUdcSWInit (P_XLLP_UDC_T pUdcHandle, P_XLLP_UDC_REGISTERS_T pRegs);
#endif /* _xllp_udc_h */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -