
Added initial support Xilinx Embedded Software. Signed-off-by: Jagannadha Sutradharudu Teki <jaganna@xilinx.com>
512 lines
18 KiB
C
Executable file
512 lines
18 KiB
C
Executable file
/******************************************************************************
|
|
*
|
|
* Copyright (C) 2010 - 2014 Xilinx, Inc. All rights reserved.
|
|
*
|
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
* of this software and associated documentation files (the "Software"), to deal
|
|
* in the Software without restriction, including without limitation the rights
|
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
* copies of the Software, and to permit persons to whom the Software is
|
|
* furnished to do so, subject to the following conditions:
|
|
*
|
|
* The above copyright notice and this permission notice shall be included in
|
|
* all copies or substantial portions of the Software.
|
|
*
|
|
* Use of the Software is limited solely to applications:
|
|
* (a) running on a Xilinx device, or
|
|
* (b) that interact with a Xilinx device through a bus or interconnect.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
* XILINX CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
|
|
* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
* SOFTWARE.
|
|
*
|
|
* Except as contained in this notice, the name of the Xilinx shall not be used
|
|
* in advertising or otherwise to promote the sale, use or other dealings in
|
|
* this Software without prior written authorization from Xilinx.
|
|
*
|
|
******************************************************************************/
|
|
/*****************************************************************************/
|
|
/**
|
|
*
|
|
* @file xusbps_endpoint.h
|
|
*
|
|
* This is an internal file containung the definitions for endpoints. It is
|
|
* included by the xusbps_endpoint.c which is implementing the endpoint
|
|
* functions and by xusbps_intr.c.
|
|
*
|
|
* <pre>
|
|
* MODIFICATION HISTORY:
|
|
*
|
|
* Ver Who Date Changes
|
|
* ----- ---- -------- --------------------------------------------------------
|
|
* 1.00a wgr 10/10/10 First release
|
|
* </pre>
|
|
*
|
|
******************************************************************************/
|
|
#ifndef XUSBPS_ENDPOINT_H
|
|
#define XUSBPS_ENDPOINT_H
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/***************************** Include Files *********************************/
|
|
|
|
#include "xil_cache.h"
|
|
#include "xusbps.h"
|
|
#include "xil_types.h"
|
|
|
|
/**************************** Type Definitions *******************************/
|
|
|
|
/************************** Constant Definitions *****************************/
|
|
|
|
|
|
/**
|
|
* Endpoint Device Transfer Descriptor
|
|
*
|
|
* The dTD describes to the device controller the location and quantity of data
|
|
* to be sent/received for given transfer. The driver does not attempt to
|
|
* modify any field in an active dTD except the Next Link Pointer.
|
|
*/
|
|
#define XUSBPS_dTDNLP 0x00 /**< Pointer to the next descriptor */
|
|
#define XUSBPS_dTDTOKEN 0x04 /**< Descriptor Token */
|
|
#define XUSBPS_dTDBPTR0 0x08 /**< Buffer Pointer 0 */
|
|
#define XUSBPS_dTDBPTR1 0x0C /**< Buffer Pointer 1 */
|
|
#define XUSBPS_dTDBPTR2 0x10 /**< Buffer Pointer 2 */
|
|
#define XUSBPS_dTDBPTR3 0x14 /**< Buffer Pointer 3 */
|
|
#define XUSBPS_dTDBPTR4 0x18 /**< Buffer Pointer 4 */
|
|
#define XUSBPS_dTDBPTR(n) (XUSBPS_dTDBPTR0 + (n) * 0x04)
|
|
#define XUSBPS_dTDRSRVD 0x1C /**< Reserved field */
|
|
|
|
/* We use the reserved field in the dTD to store user data. */
|
|
#define XUSBPS_dTDUSERDATA XUSBPS_dTDRSRVD /**< Reserved field */
|
|
|
|
|
|
/** @name dTD Next Link Pointer (dTDNLP) bit positions.
|
|
* @{
|
|
*/
|
|
#define XUSBPS_dTDNLP_T_MASK 0x00000001
|
|
/**< USB dTD Next Link Pointer Terminate Bit */
|
|
#define XUSBPS_dTDNLP_ADDR_MASK 0xFFFFFFE0
|
|
/**< USB dTD Next Link Pointer Address [31:5] */
|
|
/* @} */
|
|
|
|
|
|
/** @name dTD Token (dTDTOKEN) bit positions.
|
|
* @{
|
|
*/
|
|
#define XUSBPS_dTDTOKEN_XERR_MASK 0x00000008 /**< dTD Transaction Error */
|
|
#define XUSBPS_dTDTOKEN_BUFERR_MASK 0x00000020 /**< dTD Data Buffer Error */
|
|
#define XUSBPS_dTDTOKEN_HALT_MASK 0x00000040 /**< dTD Halted Flag */
|
|
#define XUSBPS_dTDTOKEN_ACTIVE_MASK 0x00000080 /**< dTD Active Bit */
|
|
#define XUSBPS_dTDTOKEN_MULTO_MASK 0x00000C00 /**< Multiplier Override Field [1:0] */
|
|
#define XUSBPS_dTDTOKEN_IOC_MASK 0x00008000 /**< Interrupt on Complete Bit */
|
|
#define XUSBPS_dTDTOKEN_LEN_MASK 0x7FFF0000 /**< Transfer Length Field */
|
|
/* @} */
|
|
|
|
|
|
/***************** Macros (Inline Functions) Definitions *********************/
|
|
|
|
/*****************************************************************************/
|
|
/**
|
|
*
|
|
* IMPORTANT NOTE:
|
|
* ===============
|
|
*
|
|
* Many of the following macros modify Device Queue Head (dQH) data structures
|
|
* and Device Transfer Descriptor (dTD) data structures. Those structures can
|
|
* potentially reside in CACHED memory. Therefore, it's the callers
|
|
* responsibility to ensure cache coherency by using provided
|
|
*
|
|
* XUsbPs_dQHInvalidateCache()
|
|
* XUsbPs_dQHFlushCache()
|
|
* XUsbPs_dTDInvalidateCache()
|
|
* XUsbPs_dTDFlushCache()
|
|
*
|
|
* function calls.
|
|
*
|
|
******************************************************************************/
|
|
#define XUsbPs_dTDInvalidateCache(dTDPtr) \
|
|
Xil_DCacheInvalidateRange((unsigned int)dTDPtr, sizeof(XUsbPs_dTD))
|
|
|
|
#define XUsbPs_dTDFlushCache(dTDPtr) \
|
|
Xil_DCacheFlushRange((unsigned int)dTDPtr, sizeof(XUsbPs_dTD))
|
|
|
|
#define XUsbPs_dQHInvalidateCache(dQHPtr) \
|
|
Xil_DCacheInvalidateRange((unsigned int)dQHPtr, sizeof(XUsbPs_dQH))
|
|
|
|
#define XUsbPs_dQHFlushCache(dQHPtr) \
|
|
Xil_DCacheFlushRange((unsigned int)dQHPtr, sizeof(XUsbPs_dQH))
|
|
|
|
/*****************************************************************************/
|
|
/**
|
|
*
|
|
* This macro sets the Transfer Length for the given Transfer Descriptor.
|
|
*
|
|
* @param dTDPtr is pointer to the dTD element.
|
|
* @param Len is the length to be set. Range: 0..16384
|
|
*
|
|
* @note C-style signature:
|
|
* void XUsbPs_dTDSetTransferLen(u32 dTDPtr, u32 Len)
|
|
*
|
|
******************************************************************************/
|
|
#define XUsbPs_dTDSetTransferLen(dTDPtr, Len) \
|
|
XUsbPs_WritedTD(dTDPtr, XUSBPS_dTDTOKEN, \
|
|
(XUsbPs_ReaddTD(dTDPtr, XUSBPS_dTDTOKEN) & \
|
|
~XUSBPS_dTDTOKEN_LEN_MASK) | ((Len) << 16))
|
|
|
|
|
|
/*****************************************************************************/
|
|
/**
|
|
*
|
|
* This macro gets the Next Link pointer of the given Transfer Descriptor.
|
|
*
|
|
* @param dTDPtr is pointer to the dTD element.
|
|
*
|
|
* @return TransferLength field of the descriptor.
|
|
*
|
|
* @note C-style signature:
|
|
* u32 XUsbPs_dTDGetTransferLen(u32 dTDPtr)
|
|
*
|
|
******************************************************************************/
|
|
#define XUsbPs_dTDGetNLP(dTDPtr) \
|
|
(XUsbPs_dTD *) ((XUsbPs_ReaddTD(dTDPtr, XUSBPS_dTDNLP)\
|
|
& XUSBPS_dTDNLP_ADDR_MASK))
|
|
|
|
|
|
/*****************************************************************************/
|
|
/**
|
|
*
|
|
* This macro sets the Next Link pointer of the given Transfer Descriptor.
|
|
*
|
|
* @param dTDPtr is a pointer to the dTD element.
|
|
* @param NLP is the Next Link Pointer
|
|
*
|
|
* @note C-style signature:
|
|
* void XUsbPs_dTDSetTransferLen(u32 dTDPtr, u32 Len)
|
|
*
|
|
******************************************************************************/
|
|
#define XUsbPs_dTDSetNLP(dTDPtr, NLP) \
|
|
XUsbPs_WritedTD(dTDPtr, XUSBPS_dTDNLP, \
|
|
(XUsbPs_ReaddTD(dTDPtr, XUSBPS_dTDNLP) & \
|
|
~XUSBPS_dTDNLP_ADDR_MASK) | \
|
|
((NLP) & XUSBPS_dTDNLP_ADDR_MASK))
|
|
|
|
|
|
/*****************************************************************************/
|
|
/**
|
|
*
|
|
* This macro gets the Transfer Length for the given Transfer Descriptor.
|
|
*
|
|
* @param dTDPtr is a pointer to the dTD element.
|
|
*
|
|
* @return TransferLength field of the descriptor.
|
|
*
|
|
* @note C-style signature:
|
|
* u32 XUsbPs_dTDGetTransferLen(u32 dTDPtr)
|
|
*
|
|
******************************************************************************/
|
|
#define XUsbPs_dTDGetTransferLen(dTDPtr) \
|
|
(u32) ((XUsbPs_ReaddTD(dTDPtr, XUSBPS_dTDTOKEN) \
|
|
& XUSBPS_dTDTOKEN_LEN_MASK) >> 16)
|
|
|
|
|
|
/*****************************************************************************/
|
|
/**
|
|
*
|
|
* This macro sets the Interrupt On Complete (IOC) bit for the given Transfer
|
|
* Descriptor.
|
|
*
|
|
* @param dTDPtr is a pointer to the dTD element.
|
|
*
|
|
* @note C-style signature:
|
|
* void XUsbPs_dTDSetIOC(u32 dTDPtr)
|
|
*
|
|
******************************************************************************/
|
|
#define XUsbPs_dTDSetIOC(dTDPtr) \
|
|
XUsbPs_WritedTD(dTDPtr, XUSBPS_dTDTOKEN, \
|
|
XUsbPs_ReaddTD(dTDPtr, XUSBPS_dTDTOKEN) | \
|
|
XUSBPS_dTDTOKEN_IOC_MASK)
|
|
|
|
|
|
/*****************************************************************************/
|
|
/**
|
|
*
|
|
* This macro sets the Terminate bit for the given Transfer Descriptor.
|
|
*
|
|
* @param dTDPtr is a pointer to the dTD element.
|
|
*
|
|
* @note C-style signature:
|
|
* void XUsbPs_dTDSetTerminate(u32 dTDPtr)
|
|
*
|
|
******************************************************************************/
|
|
#define XUsbPs_dTDSetTerminate(dTDPtr) \
|
|
XUsbPs_WritedTD(dTDPtr, XUSBPS_dTDNLP, \
|
|
XUsbPs_ReaddTD(dTDPtr, XUSBPS_dTDNLP) | \
|
|
XUSBPS_dTDNLP_T_MASK)
|
|
|
|
|
|
/*****************************************************************************/
|
|
/**
|
|
*
|
|
* This macro clears the Terminate bit for the given Transfer Descriptor.
|
|
*
|
|
* @param dTDPtr is a pointer to the dTD element.
|
|
*
|
|
* @note C-style signature:
|
|
* void XUsbPs_dTDClrTerminate(u32 dTDPtr)
|
|
*
|
|
******************************************************************************/
|
|
#define XUsbPs_dTDClrTerminate(dTDPtr) \
|
|
XUsbPs_WritedTD(dTDPtr, XUSBPS_dTDNLP, \
|
|
XUsbPs_ReaddTD(dTDPtr, XUSBPS_dTDNLP) & \
|
|
~XUSBPS_dTDNLP_T_MASK)
|
|
|
|
|
|
/*****************************************************************************/
|
|
/**
|
|
*
|
|
* This macro checks if the given descriptor is active.
|
|
*
|
|
* @param dTDPtr is a pointer to the dTD element.
|
|
*
|
|
* @return
|
|
* - TRUE: The buffer is active.
|
|
* - FALSE: The buffer is not active.
|
|
*
|
|
* @note C-style signature:
|
|
* int XUsbPs_dTDIsActive(u32 dTDPtr)
|
|
*
|
|
******************************************************************************/
|
|
#define XUsbPs_dTDIsActive(dTDPtr) \
|
|
((XUsbPs_ReaddTD(dTDPtr, XUSBPS_dTDTOKEN) & \
|
|
XUSBPS_dTDTOKEN_ACTIVE_MASK) ? TRUE : FALSE)
|
|
|
|
|
|
/*****************************************************************************/
|
|
/**
|
|
*
|
|
* This macro sets the Active bit for the given Transfer Descriptor.
|
|
*
|
|
* @param dTDPtr is a pointer to the dTD element.
|
|
*
|
|
* @note C-style signature:
|
|
* void XUsbPs_dTDSetActive(u32 dTDPtr)
|
|
*
|
|
******************************************************************************/
|
|
#define XUsbPs_dTDSetActive(dTDPtr) \
|
|
XUsbPs_WritedTD(dTDPtr, XUSBPS_dTDTOKEN, \
|
|
XUsbPs_ReaddTD(dTDPtr, XUSBPS_dTDTOKEN) | \
|
|
XUSBPS_dTDTOKEN_ACTIVE_MASK)
|
|
|
|
|
|
/*****************************************************************************/
|
|
/**
|
|
*
|
|
* This macro reads the content of a field in a Transfer Descriptor.
|
|
*
|
|
* @param dTDPtr is a pointer to the dTD element.
|
|
* @param Id is the field ID inside the dTD element to read.
|
|
*
|
|
* @note C-style signature:
|
|
* u32 XUsbPs_ReaddTD(u32 dTDPtr, u32 Id)
|
|
*
|
|
******************************************************************************/
|
|
#define XUsbPs_ReaddTD(dTDPtr, Id) (*(u32 *)((u32)(dTDPtr) + (u32)(Id)))
|
|
|
|
/*****************************************************************************/
|
|
/**
|
|
*
|
|
* This macro writes a value to a field in a Transfer Descriptor.
|
|
*
|
|
* @param dTDPtr is pointer to the dTD element.
|
|
* @param Id is the field ID inside the dTD element to read.
|
|
* @param Val is the value to write to the field.
|
|
*
|
|
* @note C-style signature:
|
|
* u32 XUsbPs_WritedTD(u32 dTDPtr, u32 Id, u32 Val)
|
|
*
|
|
******************************************************************************/
|
|
#define XUsbPs_WritedTD(dTDPtr, Id, Val) \
|
|
(*(u32 *) ((u32)(dTDPtr) + (u32)(Id)) = (u32)(Val))
|
|
|
|
|
|
/******************************************************************************/
|
|
/**
|
|
* Endpoint Device Queue Head
|
|
*
|
|
* Device queue heads are arranged in an array in a continuous area of memory
|
|
* pointed to by the ENDPOINTLISTADDR pointer. The device controller will index
|
|
* into this array based upon the endpoint number received from the USB bus.
|
|
* All information necessary to respond to transactions for all primed
|
|
* transfers is contained in this list so the Device Controller can readily
|
|
* respond to incoming requests without having to traverse a linked list.
|
|
*
|
|
* The device Endpoint Queue Head (dQH) is where all transfers are managed. The
|
|
* dQH is a 48-byte data structure, but must be aligned on a 64-byte boundary.
|
|
* During priming of an endpoint, the dTD (device transfer descriptor) is
|
|
* copied into the overlay area of the dQH, which starts at the nextTD pointer
|
|
* DWord and continues through the end of the buffer pointers DWords. After a
|
|
* transfer is complete, the dTD status DWord is updated in the dTD pointed to
|
|
* by the currentTD pointer. While a packet is in progress, the overlay area of
|
|
* the dQH is used as a staging area for the dTD so that the Device Controller
|
|
* can access needed information with little minimal latency.
|
|
*
|
|
* @note
|
|
* Software must ensure that no interface data structure reachable by the
|
|
* Device Controller spans a 4K-page boundary. The first element of the
|
|
* Endpoint Queue Head List must be aligned on a 4K boundary.
|
|
*/
|
|
#define XUSBPS_dQHCFG 0x00 /**< dQH Configuration */
|
|
#define XUSBPS_dQHCPTR 0x04 /**< dQH Current dTD Pointer */
|
|
#define XUSBPS_dQHdTDNLP 0x08 /**< dTD Next Link Ptr in dQH
|
|
overlay */
|
|
#define XUSBPS_dQHdTDTOKEN 0x0C /**< dTD Token in dQH overlay */
|
|
#define XUSBPS_dQHSUB0 0x28 /**< USB dQH Setup Buffer 0 */
|
|
#define XUSBPS_dQHSUB1 0x2C /**< USB dQH Setup Buffer 1 */
|
|
|
|
|
|
/** @name dQH Configuration (dQHCFG) bit positions.
|
|
* @{
|
|
*/
|
|
#define XUSBPS_dQHCFG_IOS_MASK 0x00008000
|
|
/**< USB dQH Interrupt on Setup Bit */
|
|
#define XUSBPS_dQHCFG_MPL_MASK 0x07FF0000
|
|
/**< USB dQH Maximum Packet Length
|
|
* Field [10:0] */
|
|
#define XUSBPS_dQHCFG_MPL_SHIFT 16
|
|
#define XUSBPS_dQHCFG_ZLT_MASK 0x20000000
|
|
/**< USB dQH Zero Length Termination
|
|
* Select Bit */
|
|
#define XUSBPS_dQHCFG_MULT_MASK 0xC0000000
|
|
/* USB dQH Number of Transactions Field
|
|
* [1:0] */
|
|
#define XUSBPS_dQHCFG_MULT_SHIFT 30
|
|
/* @} */
|
|
|
|
|
|
/*****************************************************************************/
|
|
/**
|
|
*
|
|
* This macro sets the Maximum Packet Length field of the give Queue Head.
|
|
*
|
|
* @param dQHPtr is a pointer to the dQH element.
|
|
* @param Len is the length to be set.
|
|
*
|
|
* @note C-style signature:
|
|
* void XUsbPs_dQHSetMaxPacketLen(u32 dQHPtr, u32 Len)
|
|
*
|
|
******************************************************************************/
|
|
#define XUsbPs_dQHSetMaxPacketLen(dQHPtr, Len) \
|
|
XUsbPs_WritedQH(dQHPtr, XUSBPS_dQHCFG, \
|
|
(XUsbPs_ReaddQH(dQHPtr, XUSBPS_dQHCFG) & \
|
|
~XUSBPS_dQHCFG_MPL_MASK) | ((Len) << 16))
|
|
|
|
/*****************************************************************************/
|
|
/**
|
|
*
|
|
* This macro sets the Interrupt On Setup (IOS) bit for an endpoint.
|
|
*
|
|
* @param dQHPtr is a pointer to the dQH element.
|
|
*
|
|
* @note C-style signature:
|
|
* void XUsbPs_dQHSetIOS(u32 dQHPtr)
|
|
*
|
|
******************************************************************************/
|
|
#define XUsbPs_dQHSetIOS(dQHPtr) \
|
|
XUsbPs_WritedQH(dQHPtr, XUSBPS_dQHCFG, \
|
|
XUsbPs_ReaddQH(dQHPtr, XUSBPS_dQHCFG) | \
|
|
XUSBPS_dQHCFG_IOS_MASK)
|
|
|
|
/*****************************************************************************/
|
|
/**
|
|
*
|
|
* This macro clears the Interrupt On Setup (IOS) bit for an endpoint.
|
|
*
|
|
* @param dQHPtr is a pointer to the dQH element.
|
|
*
|
|
* @note C-style signature:
|
|
* void XUsbPs_dQHClrIOS(u32 dQHPtr)
|
|
*
|
|
******************************************************************************/
|
|
#define XUsbPs_dQHClrIOS(dQHPtr) \
|
|
XUsbPs_WritedQH(dQHPtr, XUSBPS_dQHCFG, \
|
|
XUsbPs_ReaddQH(dQHPtr, XUSBPS_dQHCFG) & \
|
|
~XUSBPS_dQHCFG_IOS_MASK)
|
|
|
|
/*****************************************************************************/
|
|
/**
|
|
*
|
|
* This macro enables Zero Length Termination for the endpoint.
|
|
*
|
|
* @param dQHPtr is a pointer to the dQH element.
|
|
*
|
|
* @note C-style signature:
|
|
* void XUsbPs_dQHEnableZLT(u32 dQHPtr)
|
|
*
|
|
*
|
|
******************************************************************************/
|
|
#define XUsbPs_dQHEnableZLT(dQHPtr) \
|
|
XUsbPs_WritedQH(dQHPtr, XUSBPS_dQHCFG, \
|
|
XUsbPs_ReaddQH(dQHPtr, XUSBPS_dQHCFG) & \
|
|
~XUSBPS_dQHCFG_ZLT_MASK)
|
|
|
|
|
|
/*****************************************************************************/
|
|
/**
|
|
*
|
|
* This macro disables Zero Length Termination for the endpoint.
|
|
*
|
|
* @param dQHPtr is a pointer to the dQH element.
|
|
*
|
|
* @note C-style signature:
|
|
* void XUsbPs_dQHDisableZLT(u32 dQHPtr)
|
|
*
|
|
*
|
|
******************************************************************************/
|
|
#define XUsbPs_dQHDisableZLT(dQHPtr) \
|
|
XUsbPs_WritedQH(dQHPtr, XUSBPS_dQHCFG, \
|
|
XUsbPs_ReaddQH(dQHPtr, XUSBPS_dQHCFG) | \
|
|
XUSBPS_dQHCFG_ZLT_MASK)
|
|
|
|
/*****************************************************************************/
|
|
/**
|
|
*
|
|
* This macro reads the content of a field in a Queue Head.
|
|
*
|
|
* @param dQHPtr is a pointer to the dQH element.
|
|
* @param Id is the Field ID inside the dQH element to read.
|
|
*
|
|
* @note C-style signature:
|
|
* u32 XUsbPs_ReaddQH(u32 dQHPtr, u32 Id)
|
|
*
|
|
******************************************************************************/
|
|
#define XUsbPs_ReaddQH(dQHPtr, Id) (*(u32 *)((u32)(dQHPtr) + (u32) (Id)))
|
|
|
|
/*****************************************************************************/
|
|
/**
|
|
*
|
|
* This macro writes a value to a field in a Queue Head.
|
|
*
|
|
* @param dQHPtr is a pointer to the dQH element.
|
|
* @param Id is the Field ID inside the dQH element to read.
|
|
* @param Val is the Value to write to the field.
|
|
*
|
|
* @note C-style signature:
|
|
* u32 XUsbPs_WritedQH(u32 dQHPtr, u32 Id, u32 Val)
|
|
*
|
|
******************************************************************************/
|
|
#define XUsbPs_WritedQH(dQHPtr, Id, Val) \
|
|
(*(u32 *) ((u32)(dQHPtr) + (u32)(Id)) = (u32)(Val))
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* XUSBPS_ENDPOINT_H */
|