Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
targets/TARGET_Silicon_Labs/inc/em_usbhal.h
- Committer:
- Kojto
- Date:
- 2017-07-27
- Revision:
- 72:53949e6131f6
File content as of revision 72:53949e6131f6:
/***************************************************************************//**
* @file em_usbhal.h
* @brief USB protocol stack library, low level USB peripheral access.
* @version 3.20.14
*******************************************************************************
* @section License
* <b>(C) Copyright 2014 Silicon Labs, http://www.silabs.com</b>
*******************************************************************************
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
******************************************************************************/
#ifndef __EM_USBHAL_H
#define __EM_USBHAL_H
#include "em_device.h"
#if defined( USB_PRESENT ) && ( USB_COUNT == 1 )
#include "em_usb.h"
#if defined( USB_DEVICE ) || defined( USB_HOST )
#ifdef __cplusplus
extern "C" {
#endif
/** @cond DO_NOT_INCLUDE_WITH_DOXYGEN */
#define USB_PID_DATA0 0
#define USB_PID_DATA2 1
#define USB_PID_DATA1 2
#define USB_PID_SETUP 3
#define HPRT_F_SPEED ( 1 << _USB_HPRT_PRTSPD_SHIFT )
#define HPRT_L_SPEED ( 2 << _USB_HPRT_PRTSPD_SHIFT )
#define HCFG_PHYCLK_48MHZ 1
#define HCFG_PHYCLK_6MHZ 2
#define DOEP0_XFERSIZE_PKTCNT_MASK ( _USB_DOEP0TSIZ_XFERSIZE_MASK | \
_USB_DOEP0TSIZ_PKTCNT_MASK )
#define DOEP_XFERSIZE_PKTCNT_MASK ( _USB_DOEP_TSIZ_XFERSIZE_MASK | \
_USB_DOEP_TSIZ_PKTCNT_MASK )
#define DIEP0_XFERSIZE_PKTCNT_MASK ( _USB_DIEP0TSIZ_XFERSIZE_MASK | \
_USB_DIEP0TSIZ_PKTCNT_MASK )
#define DIEP_XFERSIZE_PKTCNT_MASK ( _USB_DIEP_TSIZ_XFERSIZE_MASK | \
_USB_DIEP_TSIZ_PKTCNT_MASK | \
_USB_DIEP_TSIZ_MC_MASK )
#define DIEPCTL_EPTYPE_CONTROL (0 << _USB_DIEP_CTL_EPTYPE_SHIFT )
#define DIEPCTL_EPTYPE_ISOC (1 << _USB_DIEP_CTL_EPTYPE_SHIFT )
#define DIEPCTL_EPTYPE_BULK (2 << _USB_DIEP_CTL_EPTYPE_SHIFT )
#define DIEPCTL_EPTYPE_INTR (3 << _USB_DIEP_CTL_EPTYPE_SHIFT )
#define DOEPCTL_EPTYPE_CONTROL (0 << _USB_DOEP_CTL_EPTYPE_SHIFT )
#define DOEPCTL_EPTYPE_ISOC (1 << _USB_DOEP_CTL_EPTYPE_SHIFT )
#define DOEPCTL_EPTYPE_BULK (2 << _USB_DOEP_CTL_EPTYPE_SHIFT )
#define DOEPCTL_EPTYPE_INTR (3 << _USB_DOEP_CTL_EPTYPE_SHIFT )
#define HCCHAR_EPTYPE_CTRL (0 << _USB_HC_CHAR_EPTYPE_SHIFT )
#define HCCHAR_EPTYPE_ISOC (1 << _USB_HC_CHAR_EPTYPE_SHIFT )
#define HCCHAR_EPTYPE_BULK (2 << _USB_HC_CHAR_EPTYPE_SHIFT )
#define HCCHAR_EPTYPE_INTR (3 << _USB_HC_CHAR_EPTYPE_SHIFT )
#define GRXSTSP_PKTSTS_DEVICE_GOTNAK ( 1 << _USB_GRXSTSP_PKTSTS_SHIFT )
#define GRXSTSP_PKTSTS_DEVICE_DATAOUTRECEIVED ( 2 << _USB_GRXSTSP_PKTSTS_SHIFT )
#define GRXSTSP_PKTSTS_DEVICE_DATAOUTCOMPLETE ( 3 << _USB_GRXSTSP_PKTSTS_SHIFT )
#define GRXSTSP_PKTSTS_DEVICE_SETUPCOMPLETE ( 4 << _USB_GRXSTSP_PKTSTS_SHIFT )
#define GRXSTSP_PKTSTS_DEVICE_SETUPRECEIVED ( 6 << _USB_GRXSTSP_PKTSTS_SHIFT )
#define GRXSTSP_PKTSTS_HOST_DATAINRECEIVED ( 2 << _USB_GRXSTSP_PKTSTS_SHIFT )
#define GRXSTSP_PKTSTS_HOST_DATAINCOMPLETE ( 3 << _USB_GRXSTSP_PKTSTS_SHIFT )
#define GRXSTSP_PKTSTS_HOST_DATATOGGLEERROR ( 5 << _USB_GRXSTSP_PKTSTS_SHIFT )
#define GRXSTSP_PKTSTS_HOST_CHANNELHALTED ( 7 << _USB_GRXSTSP_PKTSTS_SHIFT )
#define DCTL_WO_BITMASK \
( _USB_DCTL_CGOUTNAK_MASK | _USB_DCTL_SGOUTNAK_MASK | \
_USB_DCTL_CGNPINNAK_MASK | _USB_DCTL_SGNPINNAK_MASK )
#define GUSBCFG_WO_BITMASK ( USB_GUSBCFG_CORRUPTTXPKT )
#define DEPCTL_WO_BITMASK \
( USB_DIEP_CTL_CNAK | USB_DIEP_CTL_SNAK | \
USB_DIEP_CTL_SETD0PIDEF | USB_DIEP_CTL_SETD1PIDOF )
#define HPRT_WC_MASK ( USB_HPRT_PRTCONNDET | USB_HPRT_PRTENA | \
USB_HPRT_PRTENCHNG | USB_HPRT_PRTOVRCURRCHNG )
typedef __IO uint32_t USB_FIFO_TypeDef[ 0x1000 / sizeof( uint32_t ) ];
typedef __IO uint32_t USB_DIEPTXF_TypeDef;
#define USB_DINEPS ((USB_DIEP_TypeDef *) &USB->DIEP0CTL )
#define USB_DOUTEPS ((USB_DOEP_TypeDef *) &USB->DOEP0CTL )
#define USB_FIFOS ((USB_FIFO_TypeDef *) &USB->FIFO0D )
#define USB_DIEPTXFS ((USB_DIEPTXF_TypeDef *) &USB->DIEPTXF1 )
void USBHAL_CoreReset( void );
#if defined( USB_DEVICE )
void USBDHAL_AbortAllTransfers( USB_Status_TypeDef reason );
USB_Status_TypeDef USBDHAL_CoreInit( const uint32_t totalRxFifoSize,
const uint32_t totalTxFifoSize );
void USBDHAL_Connect( void );
void USBDHAL_Disconnect( void );
void USBDHAL_AbortAllEps( void );
void USBDHAL_AbortEpIn( USBD_Ep_TypeDef *ep );
void USBDHAL_AbortEpOut( USBD_Ep_TypeDef *ep );
__STATIC_INLINE USB_Status_TypeDef USBDHAL_GetStallStatusEp(
USBD_Ep_TypeDef *ep, uint16_t *halt );
__STATIC_INLINE uint32_t USBDHAL_GetInEpInts( USBD_Ep_TypeDef *ep );
__STATIC_INLINE uint32_t USBDHAL_GetOutEpInts( USBD_Ep_TypeDef *ep );
__STATIC_INLINE void USBDHAL_SetEPDISNAK( USBD_Ep_TypeDef *ep );
#endif /* defined( USB_DEVICE ) */
#if defined( USB_HOST )
USB_Status_TypeDef USBHHAL_CoreInit( const uint32_t rxFifoSize,
const uint32_t nptxFifoSize,
const uint32_t ptxFifoSize );
void USBHHAL_HCHalt( int hcnum, uint32_t hcchar );
void USBHHAL_HCInit( int hcnum );
void USBHHAL_HCStart( int hcnum );
#endif /* defined( USB_HOST ) */
__STATIC_INLINE void USBHAL_DisableGlobalInt( void )
{
USB->GAHBCFG &= ~USB_GAHBCFG_GLBLINTRMSK;
}
__STATIC_INLINE void USBHAL_DisablePhyPins( void )
{
USB->ROUTE = _USB_ROUTE_RESETVALUE;
}
__STATIC_INLINE void USBHAL_DisableUsbInt( void )
{
USB->IEN = _USB_IEN_RESETVALUE;
}
__STATIC_INLINE void USBHAL_EnableGlobalInt( void )
{
USB->GAHBCFG |= USB_GAHBCFG_GLBLINTRMSK;
}
__STATIC_INLINE void USBHAL_FlushRxFifo( void )
{
USB->GRSTCTL = USB_GRSTCTL_RXFFLSH;
while ( USB->GRSTCTL & USB_GRSTCTL_RXFFLSH ) {}
}
__STATIC_INLINE void USBHAL_FlushTxFifo( uint8_t fifoNum )
{
USB->GRSTCTL = USB_GRSTCTL_TXFFLSH | ( fifoNum << _USB_GRSTCTL_TXFNUM_SHIFT );
while ( USB->GRSTCTL & USB_GRSTCTL_TXFFLSH ) {}
}
__STATIC_INLINE uint32_t USBHAL_GetCoreInts( void )
{
uint32_t retVal;
retVal = USB->GINTSTS;
retVal &= USB->GINTMSK;
return retVal;
}
__STATIC_INLINE bool USBHAL_VbusIsOn( void )
{
return ( USB->STATUS & USB_STATUS_VREGOS ) != 0;
}
#if defined( USB_DEVICE )
__STATIC_INLINE void USBDHAL_ActivateEp( USBD_Ep_TypeDef *ep, bool forceIdle )
{
#define DIEP_MPS_EPTYPE_TXFNUM_MASK ( _USB_DIEP_CTL_MPS_MASK | \
_USB_DIEP_CTL_EPTYPE_MASK | \
_USB_DIEP_CTL_TXFNUM_MASK )
#define DOEP_MPS_EPTYPE_MASK ( _USB_DOEP_CTL_MPS_MASK | \
_USB_DOEP_CTL_EPTYPE_MASK )
uint32_t daintmask, depctl;
if ( forceIdle )
ep->state = D_EP_IDLE;
if ( ep->in )
{
daintmask = ep->mask;
depctl = USB_DINEPS[ ep->num ].CTL & ~DEPCTL_WO_BITMASK;
if ( !( depctl & USB_DIEP_CTL_USBACTEP ) )
{
depctl = ( depctl &
~( DIEP_MPS_EPTYPE_TXFNUM_MASK |
USB_DIEP_CTL_STALL ) ) |
( ep->packetSize << _USB_DIEP_CTL_MPS_SHIFT ) |
( ep->type << _USB_DIEP_CTL_EPTYPE_SHIFT ) |
( ep->txFifoNum << _USB_DIEP_CTL_TXFNUM_SHIFT ) |
USB_DIEP_CTL_SETD0PIDEF |
USB_DIEP_CTL_USBACTEP |
USB_DIEP_CTL_SNAK;
}
else
{
depctl |= USB_DIEP_CTL_SETD0PIDEF;
}
USB_DINEPS[ ep->num ].CTL = depctl;
}
else
{
daintmask = ep->mask << _USB_DAINTMSK_OUTEPMSK0_SHIFT;
depctl = USB_DOUTEPS[ ep->num ].CTL & ~DEPCTL_WO_BITMASK;
if ( !( depctl & USB_DOEP_CTL_USBACTEP ) )
{
depctl = ( depctl &
~( DOEP_MPS_EPTYPE_MASK |
USB_DOEP_CTL_STALL ) ) |
( ep->packetSize << _USB_DOEP_CTL_MPS_SHIFT ) |
( ep->type << _USB_DOEP_CTL_EPTYPE_SHIFT ) |
USB_DOEP_CTL_SETD0PIDEF |
USB_DOEP_CTL_USBACTEP |
USB_DOEP_CTL_SNAK;
}
else
{
depctl |= USB_DOEP_CTL_SETD0PIDEF;
}
USB_DOUTEPS[ ep->num ].CTL = depctl;
}
/* Enable interrupt for this EP */
USB->DAINTMSK |= daintmask;
#undef DIEP_MPS_EPTYPE_TXFNUM_MASK
#undef DOEP_MPS_EPTYPE_MASK
}
__STATIC_INLINE void USBDHAL_ClearRemoteWakeup( void )
{
USB->DCTL &= ~( DCTL_WO_BITMASK | USB_DCTL_RMTWKUPSIG );
}
__STATIC_INLINE void USBDHAL_DeactivateEp( USBD_Ep_TypeDef *ep )
{
uint32_t daintmask;
if ( ep->in )
{
USB_DINEPS[ ep->num ].CTL = 0;
daintmask = ep->mask;
}
else
{
USB_DOUTEPS[ ep->num ].CTL = 0;
daintmask = ep->mask << _USB_DAINTMSK_OUTEPMSK0_SHIFT;
}
/* Disable interrupt for this EP */
USB->DAINTMSK &= ~daintmask;
}
__STATIC_INLINE void USBDHAL_EnableInts( USBD_Device_TypeDef *dev )
{
uint32_t mask;
/* Disable all interrupts. */
USB->GINTMSK = 0;
/* Clear pending interrupts */
USB->GINTSTS = 0xFFFFFFFF;
mask = USB_GINTMSK_USBSUSPMSK |
USB_GINTMSK_USBRSTMSK |
USB_GINTMSK_ENUMDONEMSK |
USB_GINTMSK_IEPINTMSK |
USB_GINTMSK_OEPINTMSK |
USB_GINTMSK_WKUPINTMSK;
if ( dev->callbacks->sofInt )
{
mask |= USB_GINTMSK_SOFMSK;
}
USB->GINTMSK = mask;
}
__STATIC_INLINE void USBDHAL_EnableUsbResetAndSuspendInt( void )
{
/* Disable all interrupts. */
USB->GINTMSK = 0;
USB->GINTMSK = USB_GINTMSK_USBRSTMSK | USB_GINTMSK_USBSUSPMSK;
}
__STATIC_INLINE void USBDHAL_Ep0Activate( uint32_t ep0mps )
{
USB->DCTL = ( USB->DCTL & ~DCTL_WO_BITMASK ) | USB_DCTL_CGNPINNAK;
USB->DOEP0CTL = ( USB->DOEP0CTL & ~DEPCTL_WO_BITMASK )
| USB_DOEP0CTL_CNAK | USB_DOEP0CTL_EPENA
| ep0mps;
}
__STATIC_INLINE bool USBDHAL_EpIsStalled( USBD_Ep_TypeDef *ep )
{
bool retVal = false;
uint16_t stallStatus;
if ( USBDHAL_GetStallStatusEp( ep, &stallStatus ) == USB_STATUS_OK )
{
retVal = stallStatus & 1 ? true : false;
}
return retVal;
}
__STATIC_INLINE uint32_t USBDHAL_GetAllInEpInts( void )
{
uint32_t retVal;
retVal = USB->DAINT;
retVal &= USB->DAINTMSK;
return retVal & 0xFFFF;
}
__STATIC_INLINE uint32_t USBDHAL_GetAllOutEpInts( void )
{
uint32_t retVal;
retVal = USB->DAINT;
retVal &= USB->DAINTMSK;
return retVal >> 16;
}
__STATIC_INLINE uint32_t USBDHAL_GetInEpInts( USBD_Ep_TypeDef *ep )
{
uint32_t retVal, msk;
msk = USB->DIEPMSK;
retVal = USB_DINEPS[ ep->num ].INT;
return retVal & msk;
}
__STATIC_INLINE uint32_t USBDHAL_GetOutEpInts( USBD_Ep_TypeDef *ep )
{
uint32_t retVal;
retVal = USB_DOUTEPS[ ep->num ].INT;
#if defined( USB_DOEP0INT_STUPPKTRCVD )
retVal &= USB->DOEPMSK | USB_DOEP0INT_STUPPKTRCVD;
#else
retVal &= USB->DOEPMSK;
#endif
return retVal;
}
__STATIC_INLINE USB_Status_TypeDef USBDHAL_GetStallStatusEp(
USBD_Ep_TypeDef *ep, uint16_t *halt )
{
uint32_t depctl, eptype;
USB_Status_TypeDef retVal = USB_STATUS_REQ_ERR;
if ( ep->in == true )
{
depctl = USB_DINEPS[ ep->num ].CTL;
eptype = depctl & _USB_DIEP_CTL_EPTYPE_MASK;
if (( eptype == DIEPCTL_EPTYPE_INTR ) || ( eptype == DIEPCTL_EPTYPE_BULK ))
{
*halt = depctl & USB_DIEP_CTL_STALL ? 1 : 0;
retVal = USB_STATUS_OK;
}
}
else
{
depctl = USB_DOUTEPS[ ep->num ].CTL;
eptype = depctl & _USB_DOEP_CTL_EPTYPE_MASK;
if (( eptype == DOEPCTL_EPTYPE_INTR ) || ( eptype == DOEPCTL_EPTYPE_BULK ))
{
*halt = depctl & USB_DOEP_CTL_STALL ? 1 : 0;
retVal = USB_STATUS_OK;
}
}
return retVal;
}
__STATIC_INLINE void USBDHAL_ReenableEp0Setup( USBD_Device_TypeDef *dev )
{
USB->DOEP0DMAADDR = (uint32_t)dev->setupPkt;
USB->DOEP0CTL = ( USB->DOEP0CTL & ~DEPCTL_WO_BITMASK )
| USB_DOEP0CTL_EPENA
| dev->ep0MpsCode;
}
__STATIC_INLINE void USBDHAL_SetAddr( uint8_t addr )
{
USB->DCFG = ( USB->DCFG &
~_USB_DCFG_DEVADDR_MASK ) |
(addr << _USB_DCFG_DEVADDR_SHIFT );
}
__STATIC_INLINE void USBDHAL_SetEp0InDmaPtr( uint8_t* addr )
{
USB->DIEP0DMAADDR = (uint32_t)addr;
}
__STATIC_INLINE void USBDHAL_SetEp0OutDmaPtr( uint8_t* addr )
{
USB->DOEP0DMAADDR = (uint32_t)addr;
}
__STATIC_INLINE void USBDHAL_SetEPDISNAK( USBD_Ep_TypeDef *ep )
{
if ( ep->in )
{
USB_DINEPS[ ep->num ].CTL = ( USB_DINEPS[ ep->num ].CTL &
~DEPCTL_WO_BITMASK ) |
USB_DIEP_CTL_SNAK |
USB_DIEP_CTL_EPDIS;
}
else
{
USB_DOUTEPS[ ep->num ].CTL = ( USB_DOUTEPS[ ep->num ].CTL &
~DEPCTL_WO_BITMASK ) |
USB_DOEP_CTL_EPENA;
USB_DOUTEPS[ ep->num ].CTL = ( USB_DOUTEPS[ ep->num ].CTL &
~DEPCTL_WO_BITMASK ) |
USB_DOEP_CTL_SNAK |
USB_DOEP_CTL_EPDIS;
}
}
__STATIC_INLINE void USBDHAL_SetRemoteWakeup( void )
{
USB->DCTL = ( USB->DCTL & ~DCTL_WO_BITMASK ) | USB_DCTL_RMTWKUPSIG;
}
__STATIC_INLINE USB_Status_TypeDef USBDHAL_StallEp( USBD_Ep_TypeDef *ep )
{
uint32_t depctl, eptype;
USB_Status_TypeDef retVal = USB_STATUS_REQ_ERR;
if ( ep->in == true )
{
depctl = USB_DINEPS[ ep->num ].CTL & ~DEPCTL_WO_BITMASK;
eptype = depctl & _USB_DIEP_CTL_EPTYPE_MASK;
if ( eptype != DIEPCTL_EPTYPE_ISOC )
{
if ( depctl & USB_DIEP_CTL_EPENA )
{
depctl |= USB_DIEP_CTL_EPDIS;
}
USB_DINEPS[ ep->num ].CTL = depctl | USB_DIEP_CTL_STALL;
retVal = USB_STATUS_OK;
}
}
else
{
depctl = USB_DOUTEPS[ ep->num ].CTL & ~DEPCTL_WO_BITMASK;
eptype = depctl & _USB_DOEP_CTL_EPTYPE_MASK;
if ( eptype != DIEPCTL_EPTYPE_ISOC )
{
USB_DOUTEPS[ ep->num ].CTL = depctl | USB_DOEP_CTL_STALL;
retVal = USB_STATUS_OK;
}
}
return retVal;
}
__STATIC_INLINE void USBDHAL_StartEp0In( uint32_t len, uint32_t ep0mps )
{
USB->DIEP0TSIZ = ( len << _USB_DIEP0TSIZ_XFERSIZE_SHIFT ) |
( 1 << _USB_DIEP0TSIZ_PKTCNT_SHIFT );
USB->DIEP0CTL = ( USB->DIEP0CTL & ~DEPCTL_WO_BITMASK )
| USB_DIEP0CTL_CNAK | USB_DIEP0CTL_EPENA
| ep0mps;
}
__STATIC_INLINE void USBDHAL_StartEp0Out( uint32_t len, uint32_t ep0mps )
{
USB->DOEP0TSIZ = ( len << _USB_DOEP0TSIZ_XFERSIZE_SHIFT ) |
( 1 << _USB_DOEP0TSIZ_PKTCNT_SHIFT );
USB->DOEP0CTL = ( USB->DOEP0CTL & ~DEPCTL_WO_BITMASK )
| USB_DOEP0CTL_CNAK | USB_DOEP0CTL_EPENA
| ep0mps;
}
__STATIC_INLINE void USBDHAL_StartEp0Setup( USBD_Device_TypeDef *dev )
{
dev->ep[ 0 ].in = false;
#if defined( USB_DOEP0INT_STUPPKTRCVD )
USB->DOEP0TSIZ = ( 8*3 << _USB_DOEP0TSIZ_XFERSIZE_SHIFT ) |
( 1 << _USB_DOEP0TSIZ_PKTCNT_SHIFT ) |
( 3 << _USB_DOEP0TSIZ_SUPCNT_SHIFT );
#else
USB->DOEP0TSIZ = 3 << _USB_DOEP0TSIZ_SUPCNT_SHIFT;
#endif
dev->setup = dev->setupPkt;
USB->DOEP0DMAADDR = (uint32_t)dev->setup;
#if defined( USB_DOEP0INT_STUPPKTRCVD )
USB->DOEP0CTL = ( USB->DOEP0CTL & ~DEPCTL_WO_BITMASK )
| USB_DOEP0CTL_EPENA
| dev->ep0MpsCode;
#else
USB->DOEP0CTL = ( USB->DOEP0CTL & ~DEPCTL_WO_BITMASK )
| USB_DOEP0CTL_CNAK | USB_DOEP0CTL_EPENA
| dev->ep0MpsCode;
#endif
}
__STATIC_INLINE void USBDHAL_StartEpIn( USBD_Ep_TypeDef *ep )
{
uint32_t pktcnt, xfersize;
if ( ep->remaining == 0 ) /* ZLP ? */
{
pktcnt = 1;
xfersize = 0;
}
else
{
pktcnt = ( ep->remaining - 1 + ep->packetSize ) / ep->packetSize;
xfersize = ep->remaining;
}
USB_DINEPS[ ep->num ].TSIZ =
( USB_DINEPS[ ep->num ].TSIZ &
~DIEP_XFERSIZE_PKTCNT_MASK ) |
( xfersize << _USB_DIEP_TSIZ_XFERSIZE_SHIFT ) |
( pktcnt << _USB_DIEP_TSIZ_PKTCNT_SHIFT );
USB_DINEPS[ ep->num ].DMAADDR = (uint32_t)ep->buf;
USB_DINEPS[ ep->num ].CTL =
( USB_DINEPS[ ep->num ].CTL & ~DEPCTL_WO_BITMASK ) |
USB_DIEP_CTL_CNAK |
USB_DIEP_CTL_EPENA;
}
__STATIC_INLINE void USBDHAL_StartEpOut( USBD_Ep_TypeDef *ep )
{
uint32_t pktcnt, xfersize;
if ( ep->remaining == 0 ) /* ZLP ? */
{
pktcnt = 1;
xfersize = ep->packetSize;
}
else
{
pktcnt = ( ep->remaining - 1 + ep->packetSize ) / ep->packetSize;
xfersize = pktcnt * ep->packetSize;
}
USB_DOUTEPS[ ep->num ].TSIZ =
( USB_DOUTEPS[ ep->num ].TSIZ &
~DOEP_XFERSIZE_PKTCNT_MASK ) |
( xfersize << _USB_DOEP_TSIZ_XFERSIZE_SHIFT ) |
( pktcnt << _USB_DOEP_TSIZ_PKTCNT_SHIFT );
ep->hwXferSize = xfersize;
USB_DOUTEPS[ ep->num ].DMAADDR = (uint32_t)ep->buf;
USB_DOUTEPS[ ep->num ].CTL =
( USB_DOUTEPS[ ep->num ].CTL &
~DEPCTL_WO_BITMASK ) |
USB_DOEP_CTL_CNAK |
USB_DOEP_CTL_EPENA;
}
__STATIC_INLINE USB_Status_TypeDef USBDHAL_UnStallEp( USBD_Ep_TypeDef *ep )
{
uint32_t depctl, eptype;
USB_Status_TypeDef retVal = USB_STATUS_REQ_ERR;
if ( ep->in == true )
{
depctl = USB_DINEPS[ ep->num ].CTL & ~DEPCTL_WO_BITMASK;
eptype = depctl & _USB_DIEP_CTL_EPTYPE_MASK;
if (( eptype == DIEPCTL_EPTYPE_INTR ) || ( eptype == DIEPCTL_EPTYPE_BULK ))
{
depctl |= USB_DIEP_CTL_SETD0PIDEF;
depctl &= ~USB_DIEP_CTL_STALL;
USB_DINEPS[ ep->num ].CTL = depctl;
retVal = USB_STATUS_OK;
}
}
else
{
depctl = USB_DOUTEPS[ ep->num ].CTL & ~DEPCTL_WO_BITMASK;
eptype = depctl & _USB_DOEP_CTL_EPTYPE_MASK;
if (( eptype == DIEPCTL_EPTYPE_INTR ) || ( eptype == DIEPCTL_EPTYPE_BULK ))
{
depctl |= USB_DOEP_CTL_SETD0PIDEF;
depctl &= ~USB_DOEP_CTL_STALL;
USB_DOUTEPS[ ep->num ].CTL = depctl;
retVal = USB_STATUS_OK;
}
}
return retVal;
}
#endif /* defined( USB_DEVICE ) */
#if defined( USB_HOST )
__STATIC_INLINE void USBHHAL_HCActivate( int hcnum, uint32_t hcchar, bool intep )
{
uint32_t oddframe;
if ( intep )
{
oddframe = USB->HFNUM & 1;
USB->HC[ hcnum ].CHAR =
( hcchar &
~( USB_HC_CHAR_CHDIS | _USB_HC_CHAR_ODDFRM_MASK ) ) |
/* Schedule INT transfers to start in next frame. */
( oddframe & 1 ? 0 : USB_HC_CHAR_ODDFRM ) |
USB_HC_CHAR_CHENA;
}
else
{
USB->HC[ hcnum ].CHAR = ( hcchar & ~USB_HC_CHAR_CHDIS ) |
USB_HC_CHAR_CHENA;
}
}
__STATIC_INLINE bool USBHHAL_InitializedAndPowered( void )
{
if ( ( USB->ROUTE & USB_ROUTE_PHYPEN ) &&
( USB->HPRT & USB_HPRT_PRTPWR ) )
return true;
return false;
}
__STATIC_INLINE void USBHHAL_EnableInts( void )
{
/* Disable all interrupts. */
USB->GINTMSK = 0;
/* Clear pending OTG interrupts */
USB->GOTGINT = 0xFFFFFFFF;
/* Clear pending interrupts */
USB->GINTSTS = 0xFFFFFFFF;
USB->GINTMSK = USB_GINTMSK_PRTINTMSK |
USB_GINTMSK_HCHINTMSK |
USB_GINTMSK_DISCONNINTMSK;
}
__STATIC_INLINE uint16_t USBHHAL_GetFrameNum( void )
{
return USB->HFNUM;
}
__STATIC_INLINE uint32_t USBHHAL_GetHcChar( uint8_t hcnum )
{
return USB->HC[ hcnum ].CHAR;
}
__STATIC_INLINE uint32_t USBHHAL_GetHcInts( uint8_t hcnum )
{
uint32_t retVal;
retVal = USB->HC[ hcnum ].INT;
return retVal;
}
__STATIC_INLINE uint32_t USBHHAL_GetHostChannelInts( void )
{
return USB->HAINT;
}
__STATIC_INLINE uint8_t USBHHAL_GetPortSpeed( void )
{
return ( USB->HPRT & _USB_HPRT_PRTSPD_MASK ) >> _USB_HPRT_PRTSPD_SHIFT;
}
__STATIC_INLINE void USBHHAL_PortReset( bool on )
{
if ( on )
{
DEBUG_USB_INT_LO_PUTCHAR( '+' );
USB->HPRT = ( USB->HPRT & ~HPRT_WC_MASK ) | USB_HPRT_PRTRST;
}
else
{
DEBUG_USB_INT_LO_PUTCHAR( '-' );
USB->HPRT &= ~( HPRT_WC_MASK | USB_HPRT_PRTRST );
}
}
__STATIC_INLINE void USBHHAL_PortResume( bool on )
{
if ( on )
{
USB->HPRT = ( USB->HPRT & ~( HPRT_WC_MASK | USB_HPRT_PRTSUSP ) ) |
USB_HPRT_PRTRES;
}
else
{
USB->HPRT &= ~( HPRT_WC_MASK | USB_HPRT_PRTSUSP | USB_HPRT_PRTRES );
}
}
__STATIC_INLINE void USBHHAL_PortSuspend( void )
{
USB->HPRT = ( USB->HPRT & ~HPRT_WC_MASK ) | USB_HPRT_PRTSUSP;
}
__STATIC_INLINE void USBHHAL_VbusOn( bool on )
{
if ( on )
{
USB->HPRT = ( USB->HPRT & ~HPRT_WC_MASK ) | USB_HPRT_PRTPWR;
DEBUG_USB_INT_LO_PUTCHAR( '/' );
}
else
{
USB->HPRT &= ~( HPRT_WC_MASK | USB_HPRT_PRTPWR );
DEBUG_USB_INT_LO_PUTCHAR( '\\' );
}
}
#endif /* defined( USB_HOST ) */
/** @endcond */
#ifdef __cplusplus
}
#endif
#endif /* defined( USB_DEVICE ) || defined( USB_HOST ) */
#endif /* defined( USB_PRESENT ) && ( USB_COUNT == 1 ) */
#endif /* __EM_USBHAL_H */