/*++

  Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
                                                                                   

  SPDX-License-Identifier: BSD-2-Clause-Patent

                                                                                   


**/

#ifndef __BASE_USBDEVICEMODE_LIB_H__
#define __BASE_USBDEVICEMODE_LIB_H__

#pragma pack(1)
typedef struct {
    UINT8  bLength;
    UINT8  bDescriptorType;
    UINT8  bMaxBurst;
    UINT8  bmAttributes;
    UINT16 wBytesPerInterval;
} endpointCompanionDescriptor;
#pragma pack()

#pragma pack(1)
typedef struct {
    UINT8  bLength;
    UINT8  bDescriptorType;
    UINT8  bEndpointAddress;
    UINT8  bmAttributes;
    UINT16 wMaxPacketSize;
    UINT8  bInterval;
} endpointDescriptor;
#pragma pack()

typedef struct {
    endpointDescriptor          *pEpDesc;
    endpointCompanionDescriptor *pEpCompDesc;
} USB_DEV_EP_INFO;    //usbdEpInfo;

typedef struct {
    VOID        *pBuf;
    UINT32    dataLen;
} USBD_IO_INFO;

typedef struct {
    USBD_IO_INFO     ioInfo;
    USB_DEV_EP_INFO  epInfo;
} USBD_IO_REQ;

UINTN
EFIAPI
usbdInitDCI (
  VOID
  );

BOOLEAN
EFIAPI
fbInit (
  OUT  VOID  *pParams
  );

BOOLEAN
EFIAPI
fbDeinit (
  VOID
  );

BOOLEAN
EFIAPI
fbStart (
  VOID
  );

BOOLEAN
EFIAPI
fbStop (
  VOID
  );

BOOLEAN
EFIAPI
usbdSetMmioBar (
  UINT32 mmioBar
  );

BOOLEAN
EFIAPI
udciDeinit (
  VOID    *pUdciHndl,
  UINT32  flags
  );

BOOLEAN
EFIAPI
udciIsr (
  VOID    *pUdciHndl
  );

BOOLEAN
EFIAPI
udciConnect (
  VOID    *pUdciHndl
  );

BOOLEAN
EFIAPI
udciDisconnect (
  VOID    *pUdciHndl
  );

BOOLEAN
EFIAPI
udciSetAddress (
  VOID    *pUdciHndl,
  UINT8   address
  );

BOOLEAN
EFIAPI
udciInitEp (
  VOID            *pUdciHndl,
  USB_DEV_EP_INFO *pEpInfo
  );

BOOLEAN
EFIAPI
udciEnableEp (
  VOID            *pUdciHndl,
  USB_DEV_EP_INFO *pEpInfo
  );

BOOLEAN
EFIAPI
udciDisableEp (
  VOID            *pUdciHndl,
  USB_DEV_EP_INFO *pEpInfo
  );

BOOLEAN
EFIAPI
udciStallEp (
  VOID            *pUdciHndl,
  USB_DEV_EP_INFO *pEpInfo
  );

BOOLEAN
EFIAPI
udciClearStallEp (
  VOID            *pUdciHndl,
  USB_DEV_EP_INFO *pEpInfo
  );


BOOLEAN
EFIAPI
udciEp0TxStatus (
  VOID            *pUdciHndl
  );


BOOLEAN
EFIAPI
udciEpTxData (
  VOID        *pUdciHndl,
  USBD_IO_REQ *pIoReq
  );

BOOLEAN
EFIAPI
udciEpRxData (
  VOID        *pUdciHndl,
  USBD_IO_REQ *pIoReq
  );

BOOLEAN
EFIAPI
udciRegisterCallbacks (
  VOID            *pUdciHndl
  );

#endif
