max4146x_comp

Dependencies:   MAX14690

Committer:
sdivarci
Date:
Sun Oct 25 20:10:02 2020 +0000
Revision:
0:0061165683ee
sdivarci

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sdivarci 0:0061165683ee 1 /***************************************************************************//**
sdivarci 0:0061165683ee 2 * @file em_usbhal.h
sdivarci 0:0061165683ee 3 * @brief USB protocol stack library, low level USB peripheral access.
sdivarci 0:0061165683ee 4 * @version 3.20.14
sdivarci 0:0061165683ee 5 *******************************************************************************
sdivarci 0:0061165683ee 6 * @section License
sdivarci 0:0061165683ee 7 * <b>(C) Copyright 2014 Silicon Labs, http://www.silabs.com</b>
sdivarci 0:0061165683ee 8 *******************************************************************************
sdivarci 0:0061165683ee 9 *
sdivarci 0:0061165683ee 10 * Licensed under the Apache License, Version 2.0 (the "License");
sdivarci 0:0061165683ee 11 * you may not use this file except in compliance with the License.
sdivarci 0:0061165683ee 12 * You may obtain a copy of the License at
sdivarci 0:0061165683ee 13 *
sdivarci 0:0061165683ee 14 * http://www.apache.org/licenses/LICENSE-2.0
sdivarci 0:0061165683ee 15 *
sdivarci 0:0061165683ee 16 * Unless required by applicable law or agreed to in writing, software
sdivarci 0:0061165683ee 17 * distributed under the License is distributed on an "AS IS" BASIS,
sdivarci 0:0061165683ee 18 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
sdivarci 0:0061165683ee 19 * See the License for the specific language governing permissions and
sdivarci 0:0061165683ee 20 * limitations under the License.
sdivarci 0:0061165683ee 21 *
sdivarci 0:0061165683ee 22 ******************************************************************************/
sdivarci 0:0061165683ee 23
sdivarci 0:0061165683ee 24 #ifndef __EM_USBHAL_H
sdivarci 0:0061165683ee 25 #define __EM_USBHAL_H
sdivarci 0:0061165683ee 26
sdivarci 0:0061165683ee 27 #include "em_device.h"
sdivarci 0:0061165683ee 28 #if defined( USB_PRESENT ) && ( USB_COUNT == 1 )
sdivarci 0:0061165683ee 29 #include "em_usb.h"
sdivarci 0:0061165683ee 30 #if defined( USB_DEVICE ) || defined( USB_HOST )
sdivarci 0:0061165683ee 31
sdivarci 0:0061165683ee 32 #ifdef __cplusplus
sdivarci 0:0061165683ee 33 extern "C" {
sdivarci 0:0061165683ee 34 #endif
sdivarci 0:0061165683ee 35
sdivarci 0:0061165683ee 36 /** @cond DO_NOT_INCLUDE_WITH_DOXYGEN */
sdivarci 0:0061165683ee 37
sdivarci 0:0061165683ee 38 #define USB_PID_DATA0 0
sdivarci 0:0061165683ee 39 #define USB_PID_DATA2 1
sdivarci 0:0061165683ee 40 #define USB_PID_DATA1 2
sdivarci 0:0061165683ee 41 #define USB_PID_SETUP 3
sdivarci 0:0061165683ee 42
sdivarci 0:0061165683ee 43 #define HPRT_F_SPEED ( 1 << _USB_HPRT_PRTSPD_SHIFT )
sdivarci 0:0061165683ee 44 #define HPRT_L_SPEED ( 2 << _USB_HPRT_PRTSPD_SHIFT )
sdivarci 0:0061165683ee 45 #define HCFG_PHYCLK_48MHZ 1
sdivarci 0:0061165683ee 46 #define HCFG_PHYCLK_6MHZ 2
sdivarci 0:0061165683ee 47
sdivarci 0:0061165683ee 48 #define DOEP0_XFERSIZE_PKTCNT_MASK ( _USB_DOEP0TSIZ_XFERSIZE_MASK | \
sdivarci 0:0061165683ee 49 _USB_DOEP0TSIZ_PKTCNT_MASK )
sdivarci 0:0061165683ee 50 #define DOEP_XFERSIZE_PKTCNT_MASK ( _USB_DOEP_TSIZ_XFERSIZE_MASK | \
sdivarci 0:0061165683ee 51 _USB_DOEP_TSIZ_PKTCNT_MASK )
sdivarci 0:0061165683ee 52
sdivarci 0:0061165683ee 53 #define DIEP0_XFERSIZE_PKTCNT_MASK ( _USB_DIEP0TSIZ_XFERSIZE_MASK | \
sdivarci 0:0061165683ee 54 _USB_DIEP0TSIZ_PKTCNT_MASK )
sdivarci 0:0061165683ee 55 #define DIEP_XFERSIZE_PKTCNT_MASK ( _USB_DIEP_TSIZ_XFERSIZE_MASK | \
sdivarci 0:0061165683ee 56 _USB_DIEP_TSIZ_PKTCNT_MASK | \
sdivarci 0:0061165683ee 57 _USB_DIEP_TSIZ_MC_MASK )
sdivarci 0:0061165683ee 58
sdivarci 0:0061165683ee 59 #define DIEPCTL_EPTYPE_CONTROL (0 << _USB_DIEP_CTL_EPTYPE_SHIFT )
sdivarci 0:0061165683ee 60 #define DIEPCTL_EPTYPE_ISOC (1 << _USB_DIEP_CTL_EPTYPE_SHIFT )
sdivarci 0:0061165683ee 61 #define DIEPCTL_EPTYPE_BULK (2 << _USB_DIEP_CTL_EPTYPE_SHIFT )
sdivarci 0:0061165683ee 62 #define DIEPCTL_EPTYPE_INTR (3 << _USB_DIEP_CTL_EPTYPE_SHIFT )
sdivarci 0:0061165683ee 63
sdivarci 0:0061165683ee 64 #define DOEPCTL_EPTYPE_CONTROL (0 << _USB_DOEP_CTL_EPTYPE_SHIFT )
sdivarci 0:0061165683ee 65 #define DOEPCTL_EPTYPE_ISOC (1 << _USB_DOEP_CTL_EPTYPE_SHIFT )
sdivarci 0:0061165683ee 66 #define DOEPCTL_EPTYPE_BULK (2 << _USB_DOEP_CTL_EPTYPE_SHIFT )
sdivarci 0:0061165683ee 67 #define DOEPCTL_EPTYPE_INTR (3 << _USB_DOEP_CTL_EPTYPE_SHIFT )
sdivarci 0:0061165683ee 68
sdivarci 0:0061165683ee 69 #define HCCHAR_EPTYPE_CTRL (0 << _USB_HC_CHAR_EPTYPE_SHIFT )
sdivarci 0:0061165683ee 70 #define HCCHAR_EPTYPE_ISOC (1 << _USB_HC_CHAR_EPTYPE_SHIFT )
sdivarci 0:0061165683ee 71 #define HCCHAR_EPTYPE_BULK (2 << _USB_HC_CHAR_EPTYPE_SHIFT )
sdivarci 0:0061165683ee 72 #define HCCHAR_EPTYPE_INTR (3 << _USB_HC_CHAR_EPTYPE_SHIFT )
sdivarci 0:0061165683ee 73
sdivarci 0:0061165683ee 74 #define GRXSTSP_PKTSTS_DEVICE_GOTNAK ( 1 << _USB_GRXSTSP_PKTSTS_SHIFT )
sdivarci 0:0061165683ee 75 #define GRXSTSP_PKTSTS_DEVICE_DATAOUTRECEIVED ( 2 << _USB_GRXSTSP_PKTSTS_SHIFT )
sdivarci 0:0061165683ee 76 #define GRXSTSP_PKTSTS_DEVICE_DATAOUTCOMPLETE ( 3 << _USB_GRXSTSP_PKTSTS_SHIFT )
sdivarci 0:0061165683ee 77 #define GRXSTSP_PKTSTS_DEVICE_SETUPCOMPLETE ( 4 << _USB_GRXSTSP_PKTSTS_SHIFT )
sdivarci 0:0061165683ee 78 #define GRXSTSP_PKTSTS_DEVICE_SETUPRECEIVED ( 6 << _USB_GRXSTSP_PKTSTS_SHIFT )
sdivarci 0:0061165683ee 79
sdivarci 0:0061165683ee 80 #define GRXSTSP_PKTSTS_HOST_DATAINRECEIVED ( 2 << _USB_GRXSTSP_PKTSTS_SHIFT )
sdivarci 0:0061165683ee 81 #define GRXSTSP_PKTSTS_HOST_DATAINCOMPLETE ( 3 << _USB_GRXSTSP_PKTSTS_SHIFT )
sdivarci 0:0061165683ee 82 #define GRXSTSP_PKTSTS_HOST_DATATOGGLEERROR ( 5 << _USB_GRXSTSP_PKTSTS_SHIFT )
sdivarci 0:0061165683ee 83 #define GRXSTSP_PKTSTS_HOST_CHANNELHALTED ( 7 << _USB_GRXSTSP_PKTSTS_SHIFT )
sdivarci 0:0061165683ee 84
sdivarci 0:0061165683ee 85 #define DCTL_WO_BITMASK \
sdivarci 0:0061165683ee 86 ( _USB_DCTL_CGOUTNAK_MASK | _USB_DCTL_SGOUTNAK_MASK | \
sdivarci 0:0061165683ee 87 _USB_DCTL_CGNPINNAK_MASK | _USB_DCTL_SGNPINNAK_MASK )
sdivarci 0:0061165683ee 88 #define GUSBCFG_WO_BITMASK ( USB_GUSBCFG_CORRUPTTXPKT )
sdivarci 0:0061165683ee 89 #define DEPCTL_WO_BITMASK \
sdivarci 0:0061165683ee 90 ( USB_DIEP_CTL_CNAK | USB_DIEP_CTL_SNAK | \
sdivarci 0:0061165683ee 91 USB_DIEP_CTL_SETD0PIDEF | USB_DIEP_CTL_SETD1PIDOF )
sdivarci 0:0061165683ee 92
sdivarci 0:0061165683ee 93 #define HPRT_WC_MASK ( USB_HPRT_PRTCONNDET | USB_HPRT_PRTENA | \
sdivarci 0:0061165683ee 94 USB_HPRT_PRTENCHNG | USB_HPRT_PRTOVRCURRCHNG )
sdivarci 0:0061165683ee 95
sdivarci 0:0061165683ee 96 typedef __IO uint32_t USB_FIFO_TypeDef[ 0x1000 / sizeof( uint32_t ) ];
sdivarci 0:0061165683ee 97 typedef __IO uint32_t USB_DIEPTXF_TypeDef;
sdivarci 0:0061165683ee 98
sdivarci 0:0061165683ee 99 #define USB_DINEPS ((USB_DIEP_TypeDef *) &USB->DIEP0CTL )
sdivarci 0:0061165683ee 100 #define USB_DOUTEPS ((USB_DOEP_TypeDef *) &USB->DOEP0CTL )
sdivarci 0:0061165683ee 101 #define USB_FIFOS ((USB_FIFO_TypeDef *) &USB->FIFO0D )
sdivarci 0:0061165683ee 102 #define USB_DIEPTXFS ((USB_DIEPTXF_TypeDef *) &USB->DIEPTXF1 )
sdivarci 0:0061165683ee 103
sdivarci 0:0061165683ee 104 void USBHAL_CoreReset( void );
sdivarci 0:0061165683ee 105
sdivarci 0:0061165683ee 106 #if defined( USB_DEVICE )
sdivarci 0:0061165683ee 107 void USBDHAL_AbortAllTransfers( USB_Status_TypeDef reason );
sdivarci 0:0061165683ee 108 USB_Status_TypeDef USBDHAL_CoreInit( const uint32_t totalRxFifoSize,
sdivarci 0:0061165683ee 109 const uint32_t totalTxFifoSize );
sdivarci 0:0061165683ee 110 void USBDHAL_Connect( void );
sdivarci 0:0061165683ee 111 void USBDHAL_Disconnect( void );
sdivarci 0:0061165683ee 112 void USBDHAL_AbortAllEps( void );
sdivarci 0:0061165683ee 113 void USBDHAL_AbortEpIn( USBD_Ep_TypeDef *ep );
sdivarci 0:0061165683ee 114 void USBDHAL_AbortEpOut( USBD_Ep_TypeDef *ep );
sdivarci 0:0061165683ee 115
sdivarci 0:0061165683ee 116 __STATIC_INLINE USB_Status_TypeDef USBDHAL_GetStallStatusEp(
sdivarci 0:0061165683ee 117 USBD_Ep_TypeDef *ep, uint16_t *halt );
sdivarci 0:0061165683ee 118 __STATIC_INLINE uint32_t USBDHAL_GetInEpInts( USBD_Ep_TypeDef *ep );
sdivarci 0:0061165683ee 119 __STATIC_INLINE uint32_t USBDHAL_GetOutEpInts( USBD_Ep_TypeDef *ep );
sdivarci 0:0061165683ee 120 __STATIC_INLINE void USBDHAL_SetEPDISNAK( USBD_Ep_TypeDef *ep );
sdivarci 0:0061165683ee 121 #endif /* defined( USB_DEVICE ) */
sdivarci 0:0061165683ee 122
sdivarci 0:0061165683ee 123 #if defined( USB_HOST )
sdivarci 0:0061165683ee 124 USB_Status_TypeDef USBHHAL_CoreInit( const uint32_t rxFifoSize,
sdivarci 0:0061165683ee 125 const uint32_t nptxFifoSize,
sdivarci 0:0061165683ee 126 const uint32_t ptxFifoSize );
sdivarci 0:0061165683ee 127 void USBHHAL_HCHalt( int hcnum, uint32_t hcchar );
sdivarci 0:0061165683ee 128 void USBHHAL_HCInit( int hcnum );
sdivarci 0:0061165683ee 129 void USBHHAL_HCStart( int hcnum );
sdivarci 0:0061165683ee 130 #endif /* defined( USB_HOST ) */
sdivarci 0:0061165683ee 131
sdivarci 0:0061165683ee 132 __STATIC_INLINE void USBHAL_DisableGlobalInt( void )
sdivarci 0:0061165683ee 133 {
sdivarci 0:0061165683ee 134 USB->GAHBCFG &= ~USB_GAHBCFG_GLBLINTRMSK;
sdivarci 0:0061165683ee 135 }
sdivarci 0:0061165683ee 136
sdivarci 0:0061165683ee 137 __STATIC_INLINE void USBHAL_DisablePhyPins( void )
sdivarci 0:0061165683ee 138 {
sdivarci 0:0061165683ee 139 USB->ROUTE = _USB_ROUTE_RESETVALUE;
sdivarci 0:0061165683ee 140 }
sdivarci 0:0061165683ee 141
sdivarci 0:0061165683ee 142 __STATIC_INLINE void USBHAL_DisableUsbInt( void )
sdivarci 0:0061165683ee 143 {
sdivarci 0:0061165683ee 144 USB->IEN = _USB_IEN_RESETVALUE;
sdivarci 0:0061165683ee 145 }
sdivarci 0:0061165683ee 146
sdivarci 0:0061165683ee 147 __STATIC_INLINE void USBHAL_EnableGlobalInt( void )
sdivarci 0:0061165683ee 148 {
sdivarci 0:0061165683ee 149 USB->GAHBCFG |= USB_GAHBCFG_GLBLINTRMSK;
sdivarci 0:0061165683ee 150 }
sdivarci 0:0061165683ee 151
sdivarci 0:0061165683ee 152 __STATIC_INLINE void USBHAL_FlushRxFifo( void )
sdivarci 0:0061165683ee 153 {
sdivarci 0:0061165683ee 154 USB->GRSTCTL = USB_GRSTCTL_RXFFLSH;
sdivarci 0:0061165683ee 155 while ( USB->GRSTCTL & USB_GRSTCTL_RXFFLSH ) {}
sdivarci 0:0061165683ee 156 }
sdivarci 0:0061165683ee 157
sdivarci 0:0061165683ee 158 __STATIC_INLINE void USBHAL_FlushTxFifo( uint8_t fifoNum )
sdivarci 0:0061165683ee 159 {
sdivarci 0:0061165683ee 160 USB->GRSTCTL = USB_GRSTCTL_TXFFLSH | ( fifoNum << _USB_GRSTCTL_TXFNUM_SHIFT );
sdivarci 0:0061165683ee 161 while ( USB->GRSTCTL & USB_GRSTCTL_TXFFLSH ) {}
sdivarci 0:0061165683ee 162 }
sdivarci 0:0061165683ee 163
sdivarci 0:0061165683ee 164 __STATIC_INLINE uint32_t USBHAL_GetCoreInts( void )
sdivarci 0:0061165683ee 165 {
sdivarci 0:0061165683ee 166 uint32_t retVal;
sdivarci 0:0061165683ee 167
sdivarci 0:0061165683ee 168 retVal = USB->GINTSTS;
sdivarci 0:0061165683ee 169 retVal &= USB->GINTMSK;
sdivarci 0:0061165683ee 170
sdivarci 0:0061165683ee 171 return retVal;
sdivarci 0:0061165683ee 172 }
sdivarci 0:0061165683ee 173
sdivarci 0:0061165683ee 174 __STATIC_INLINE bool USBHAL_VbusIsOn( void )
sdivarci 0:0061165683ee 175 {
sdivarci 0:0061165683ee 176 return ( USB->STATUS & USB_STATUS_VREGOS ) != 0;
sdivarci 0:0061165683ee 177 }
sdivarci 0:0061165683ee 178
sdivarci 0:0061165683ee 179 #if defined( USB_DEVICE )
sdivarci 0:0061165683ee 180 __STATIC_INLINE void USBDHAL_ActivateEp( USBD_Ep_TypeDef *ep, bool forceIdle )
sdivarci 0:0061165683ee 181 {
sdivarci 0:0061165683ee 182 #define DIEP_MPS_EPTYPE_TXFNUM_MASK ( _USB_DIEP_CTL_MPS_MASK | \
sdivarci 0:0061165683ee 183 _USB_DIEP_CTL_EPTYPE_MASK | \
sdivarci 0:0061165683ee 184 _USB_DIEP_CTL_TXFNUM_MASK )
sdivarci 0:0061165683ee 185 #define DOEP_MPS_EPTYPE_MASK ( _USB_DOEP_CTL_MPS_MASK | \
sdivarci 0:0061165683ee 186 _USB_DOEP_CTL_EPTYPE_MASK )
sdivarci 0:0061165683ee 187 uint32_t daintmask, depctl;
sdivarci 0:0061165683ee 188
sdivarci 0:0061165683ee 189 if ( forceIdle )
sdivarci 0:0061165683ee 190 ep->state = D_EP_IDLE;
sdivarci 0:0061165683ee 191
sdivarci 0:0061165683ee 192 if ( ep->in )
sdivarci 0:0061165683ee 193 {
sdivarci 0:0061165683ee 194 daintmask = ep->mask;
sdivarci 0:0061165683ee 195 depctl = USB_DINEPS[ ep->num ].CTL & ~DEPCTL_WO_BITMASK;
sdivarci 0:0061165683ee 196
sdivarci 0:0061165683ee 197 if ( !( depctl & USB_DIEP_CTL_USBACTEP ) )
sdivarci 0:0061165683ee 198 {
sdivarci 0:0061165683ee 199 depctl = ( depctl &
sdivarci 0:0061165683ee 200 ~( DIEP_MPS_EPTYPE_TXFNUM_MASK |
sdivarci 0:0061165683ee 201 USB_DIEP_CTL_STALL ) ) |
sdivarci 0:0061165683ee 202 ( ep->packetSize << _USB_DIEP_CTL_MPS_SHIFT ) |
sdivarci 0:0061165683ee 203 ( ep->type << _USB_DIEP_CTL_EPTYPE_SHIFT ) |
sdivarci 0:0061165683ee 204 ( ep->txFifoNum << _USB_DIEP_CTL_TXFNUM_SHIFT ) |
sdivarci 0:0061165683ee 205 USB_DIEP_CTL_SETD0PIDEF |
sdivarci 0:0061165683ee 206 USB_DIEP_CTL_USBACTEP |
sdivarci 0:0061165683ee 207 USB_DIEP_CTL_SNAK;
sdivarci 0:0061165683ee 208 }
sdivarci 0:0061165683ee 209 else
sdivarci 0:0061165683ee 210 {
sdivarci 0:0061165683ee 211 depctl |= USB_DIEP_CTL_SETD0PIDEF;
sdivarci 0:0061165683ee 212 }
sdivarci 0:0061165683ee 213 USB_DINEPS[ ep->num ].CTL = depctl;
sdivarci 0:0061165683ee 214 }
sdivarci 0:0061165683ee 215 else
sdivarci 0:0061165683ee 216 {
sdivarci 0:0061165683ee 217 daintmask = ep->mask << _USB_DAINTMSK_OUTEPMSK0_SHIFT;
sdivarci 0:0061165683ee 218 depctl = USB_DOUTEPS[ ep->num ].CTL & ~DEPCTL_WO_BITMASK;
sdivarci 0:0061165683ee 219
sdivarci 0:0061165683ee 220 if ( !( depctl & USB_DOEP_CTL_USBACTEP ) )
sdivarci 0:0061165683ee 221 {
sdivarci 0:0061165683ee 222 depctl = ( depctl &
sdivarci 0:0061165683ee 223 ~( DOEP_MPS_EPTYPE_MASK |
sdivarci 0:0061165683ee 224 USB_DOEP_CTL_STALL ) ) |
sdivarci 0:0061165683ee 225 ( ep->packetSize << _USB_DOEP_CTL_MPS_SHIFT ) |
sdivarci 0:0061165683ee 226 ( ep->type << _USB_DOEP_CTL_EPTYPE_SHIFT ) |
sdivarci 0:0061165683ee 227 USB_DOEP_CTL_SETD0PIDEF |
sdivarci 0:0061165683ee 228 USB_DOEP_CTL_USBACTEP |
sdivarci 0:0061165683ee 229 USB_DOEP_CTL_SNAK;
sdivarci 0:0061165683ee 230 }
sdivarci 0:0061165683ee 231 else
sdivarci 0:0061165683ee 232 {
sdivarci 0:0061165683ee 233 depctl |= USB_DOEP_CTL_SETD0PIDEF;
sdivarci 0:0061165683ee 234 }
sdivarci 0:0061165683ee 235 USB_DOUTEPS[ ep->num ].CTL = depctl;
sdivarci 0:0061165683ee 236 }
sdivarci 0:0061165683ee 237
sdivarci 0:0061165683ee 238 /* Enable interrupt for this EP */
sdivarci 0:0061165683ee 239 USB->DAINTMSK |= daintmask;
sdivarci 0:0061165683ee 240
sdivarci 0:0061165683ee 241 #undef DIEP_MPS_EPTYPE_TXFNUM_MASK
sdivarci 0:0061165683ee 242 #undef DOEP_MPS_EPTYPE_MASK
sdivarci 0:0061165683ee 243 }
sdivarci 0:0061165683ee 244
sdivarci 0:0061165683ee 245 __STATIC_INLINE void USBDHAL_ClearRemoteWakeup( void )
sdivarci 0:0061165683ee 246 {
sdivarci 0:0061165683ee 247 USB->DCTL &= ~( DCTL_WO_BITMASK | USB_DCTL_RMTWKUPSIG );
sdivarci 0:0061165683ee 248 }
sdivarci 0:0061165683ee 249
sdivarci 0:0061165683ee 250 __STATIC_INLINE void USBDHAL_DeactivateEp( USBD_Ep_TypeDef *ep )
sdivarci 0:0061165683ee 251 {
sdivarci 0:0061165683ee 252 uint32_t daintmask;
sdivarci 0:0061165683ee 253
sdivarci 0:0061165683ee 254 if ( ep->in )
sdivarci 0:0061165683ee 255 {
sdivarci 0:0061165683ee 256 USB_DINEPS[ ep->num ].CTL = 0;
sdivarci 0:0061165683ee 257 daintmask = ep->mask;
sdivarci 0:0061165683ee 258 }
sdivarci 0:0061165683ee 259 else
sdivarci 0:0061165683ee 260 {
sdivarci 0:0061165683ee 261 USB_DOUTEPS[ ep->num ].CTL = 0;
sdivarci 0:0061165683ee 262 daintmask = ep->mask << _USB_DAINTMSK_OUTEPMSK0_SHIFT;
sdivarci 0:0061165683ee 263 }
sdivarci 0:0061165683ee 264
sdivarci 0:0061165683ee 265 /* Disable interrupt for this EP */
sdivarci 0:0061165683ee 266 USB->DAINTMSK &= ~daintmask;
sdivarci 0:0061165683ee 267 }
sdivarci 0:0061165683ee 268
sdivarci 0:0061165683ee 269 __STATIC_INLINE void USBDHAL_EnableInts( USBD_Device_TypeDef *dev )
sdivarci 0:0061165683ee 270 {
sdivarci 0:0061165683ee 271 uint32_t mask;
sdivarci 0:0061165683ee 272
sdivarci 0:0061165683ee 273 /* Disable all interrupts. */
sdivarci 0:0061165683ee 274 USB->GINTMSK = 0;
sdivarci 0:0061165683ee 275
sdivarci 0:0061165683ee 276 /* Clear pending interrupts */
sdivarci 0:0061165683ee 277 USB->GINTSTS = 0xFFFFFFFF;
sdivarci 0:0061165683ee 278
sdivarci 0:0061165683ee 279 mask = USB_GINTMSK_USBSUSPMSK |
sdivarci 0:0061165683ee 280 USB_GINTMSK_USBRSTMSK |
sdivarci 0:0061165683ee 281 USB_GINTMSK_ENUMDONEMSK |
sdivarci 0:0061165683ee 282 USB_GINTMSK_IEPINTMSK |
sdivarci 0:0061165683ee 283 USB_GINTMSK_OEPINTMSK |
sdivarci 0:0061165683ee 284 USB_GINTMSK_WKUPINTMSK;
sdivarci 0:0061165683ee 285
sdivarci 0:0061165683ee 286 if ( dev->callbacks->sofInt )
sdivarci 0:0061165683ee 287 {
sdivarci 0:0061165683ee 288 mask |= USB_GINTMSK_SOFMSK;
sdivarci 0:0061165683ee 289 }
sdivarci 0:0061165683ee 290
sdivarci 0:0061165683ee 291 USB->GINTMSK = mask;
sdivarci 0:0061165683ee 292 }
sdivarci 0:0061165683ee 293
sdivarci 0:0061165683ee 294 __STATIC_INLINE void USBDHAL_EnableUsbResetAndSuspendInt( void )
sdivarci 0:0061165683ee 295 {
sdivarci 0:0061165683ee 296 /* Disable all interrupts. */
sdivarci 0:0061165683ee 297 USB->GINTMSK = 0;
sdivarci 0:0061165683ee 298
sdivarci 0:0061165683ee 299 USB->GINTMSK = USB_GINTMSK_USBRSTMSK | USB_GINTMSK_USBSUSPMSK;
sdivarci 0:0061165683ee 300 }
sdivarci 0:0061165683ee 301
sdivarci 0:0061165683ee 302 __STATIC_INLINE void USBDHAL_Ep0Activate( uint32_t ep0mps )
sdivarci 0:0061165683ee 303 {
sdivarci 0:0061165683ee 304 USB->DCTL = ( USB->DCTL & ~DCTL_WO_BITMASK ) | USB_DCTL_CGNPINNAK;
sdivarci 0:0061165683ee 305
sdivarci 0:0061165683ee 306 USB->DOEP0CTL = ( USB->DOEP0CTL & ~DEPCTL_WO_BITMASK )
sdivarci 0:0061165683ee 307 | USB_DOEP0CTL_CNAK | USB_DOEP0CTL_EPENA
sdivarci 0:0061165683ee 308 | ep0mps;
sdivarci 0:0061165683ee 309 }
sdivarci 0:0061165683ee 310
sdivarci 0:0061165683ee 311 __STATIC_INLINE bool USBDHAL_EpIsStalled( USBD_Ep_TypeDef *ep )
sdivarci 0:0061165683ee 312 {
sdivarci 0:0061165683ee 313 bool retVal = false;
sdivarci 0:0061165683ee 314 uint16_t stallStatus;
sdivarci 0:0061165683ee 315
sdivarci 0:0061165683ee 316 if ( USBDHAL_GetStallStatusEp( ep, &stallStatus ) == USB_STATUS_OK )
sdivarci 0:0061165683ee 317 {
sdivarci 0:0061165683ee 318 retVal = stallStatus & 1 ? true : false;
sdivarci 0:0061165683ee 319 }
sdivarci 0:0061165683ee 320 return retVal;
sdivarci 0:0061165683ee 321 }
sdivarci 0:0061165683ee 322
sdivarci 0:0061165683ee 323 __STATIC_INLINE uint32_t USBDHAL_GetAllInEpInts( void )
sdivarci 0:0061165683ee 324 {
sdivarci 0:0061165683ee 325 uint32_t retVal;
sdivarci 0:0061165683ee 326
sdivarci 0:0061165683ee 327 retVal = USB->DAINT;
sdivarci 0:0061165683ee 328 retVal &= USB->DAINTMSK;
sdivarci 0:0061165683ee 329 return retVal & 0xFFFF;
sdivarci 0:0061165683ee 330 }
sdivarci 0:0061165683ee 331
sdivarci 0:0061165683ee 332 __STATIC_INLINE uint32_t USBDHAL_GetAllOutEpInts( void )
sdivarci 0:0061165683ee 333 {
sdivarci 0:0061165683ee 334 uint32_t retVal;
sdivarci 0:0061165683ee 335
sdivarci 0:0061165683ee 336 retVal = USB->DAINT;
sdivarci 0:0061165683ee 337 retVal &= USB->DAINTMSK;
sdivarci 0:0061165683ee 338 return retVal >> 16;
sdivarci 0:0061165683ee 339 }
sdivarci 0:0061165683ee 340
sdivarci 0:0061165683ee 341 __STATIC_INLINE uint32_t USBDHAL_GetInEpInts( USBD_Ep_TypeDef *ep )
sdivarci 0:0061165683ee 342 {
sdivarci 0:0061165683ee 343 uint32_t retVal, msk;
sdivarci 0:0061165683ee 344
sdivarci 0:0061165683ee 345 msk = USB->DIEPMSK;
sdivarci 0:0061165683ee 346 retVal = USB_DINEPS[ ep->num ].INT;
sdivarci 0:0061165683ee 347
sdivarci 0:0061165683ee 348 return retVal & msk;
sdivarci 0:0061165683ee 349 }
sdivarci 0:0061165683ee 350
sdivarci 0:0061165683ee 351 __STATIC_INLINE uint32_t USBDHAL_GetOutEpInts( USBD_Ep_TypeDef *ep )
sdivarci 0:0061165683ee 352 {
sdivarci 0:0061165683ee 353 uint32_t retVal;
sdivarci 0:0061165683ee 354
sdivarci 0:0061165683ee 355 retVal = USB_DOUTEPS[ ep->num ].INT;
sdivarci 0:0061165683ee 356 #if defined( USB_DOEP0INT_STUPPKTRCVD )
sdivarci 0:0061165683ee 357 retVal &= USB->DOEPMSK | USB_DOEP0INT_STUPPKTRCVD;
sdivarci 0:0061165683ee 358 #else
sdivarci 0:0061165683ee 359 retVal &= USB->DOEPMSK;
sdivarci 0:0061165683ee 360 #endif
sdivarci 0:0061165683ee 361
sdivarci 0:0061165683ee 362 return retVal;
sdivarci 0:0061165683ee 363 }
sdivarci 0:0061165683ee 364
sdivarci 0:0061165683ee 365 __STATIC_INLINE USB_Status_TypeDef USBDHAL_GetStallStatusEp(
sdivarci 0:0061165683ee 366 USBD_Ep_TypeDef *ep, uint16_t *halt )
sdivarci 0:0061165683ee 367 {
sdivarci 0:0061165683ee 368 uint32_t depctl, eptype;
sdivarci 0:0061165683ee 369 USB_Status_TypeDef retVal = USB_STATUS_REQ_ERR;
sdivarci 0:0061165683ee 370
sdivarci 0:0061165683ee 371 if ( ep->in == true )
sdivarci 0:0061165683ee 372 {
sdivarci 0:0061165683ee 373 depctl = USB_DINEPS[ ep->num ].CTL;
sdivarci 0:0061165683ee 374 eptype = depctl & _USB_DIEP_CTL_EPTYPE_MASK;
sdivarci 0:0061165683ee 375
sdivarci 0:0061165683ee 376 if (( eptype == DIEPCTL_EPTYPE_INTR ) || ( eptype == DIEPCTL_EPTYPE_BULK ))
sdivarci 0:0061165683ee 377 {
sdivarci 0:0061165683ee 378 *halt = depctl & USB_DIEP_CTL_STALL ? 1 : 0;
sdivarci 0:0061165683ee 379 retVal = USB_STATUS_OK;
sdivarci 0:0061165683ee 380 }
sdivarci 0:0061165683ee 381 }
sdivarci 0:0061165683ee 382 else
sdivarci 0:0061165683ee 383 {
sdivarci 0:0061165683ee 384 depctl = USB_DOUTEPS[ ep->num ].CTL;
sdivarci 0:0061165683ee 385 eptype = depctl & _USB_DOEP_CTL_EPTYPE_MASK;
sdivarci 0:0061165683ee 386
sdivarci 0:0061165683ee 387 if (( eptype == DOEPCTL_EPTYPE_INTR ) || ( eptype == DOEPCTL_EPTYPE_BULK ))
sdivarci 0:0061165683ee 388 {
sdivarci 0:0061165683ee 389 *halt = depctl & USB_DOEP_CTL_STALL ? 1 : 0;
sdivarci 0:0061165683ee 390 retVal = USB_STATUS_OK;
sdivarci 0:0061165683ee 391 }
sdivarci 0:0061165683ee 392 }
sdivarci 0:0061165683ee 393
sdivarci 0:0061165683ee 394 return retVal;
sdivarci 0:0061165683ee 395 }
sdivarci 0:0061165683ee 396
sdivarci 0:0061165683ee 397 __STATIC_INLINE void USBDHAL_ReenableEp0Setup( USBD_Device_TypeDef *dev )
sdivarci 0:0061165683ee 398
sdivarci 0:0061165683ee 399 {
sdivarci 0:0061165683ee 400 USB->DOEP0DMAADDR = (uint32_t)dev->setupPkt;
sdivarci 0:0061165683ee 401 USB->DOEP0CTL = ( USB->DOEP0CTL & ~DEPCTL_WO_BITMASK )
sdivarci 0:0061165683ee 402 | USB_DOEP0CTL_EPENA
sdivarci 0:0061165683ee 403 | dev->ep0MpsCode;
sdivarci 0:0061165683ee 404 }
sdivarci 0:0061165683ee 405
sdivarci 0:0061165683ee 406 __STATIC_INLINE void USBDHAL_SetAddr( uint8_t addr )
sdivarci 0:0061165683ee 407 {
sdivarci 0:0061165683ee 408 USB->DCFG = ( USB->DCFG &
sdivarci 0:0061165683ee 409 ~_USB_DCFG_DEVADDR_MASK ) |
sdivarci 0:0061165683ee 410 (addr << _USB_DCFG_DEVADDR_SHIFT );
sdivarci 0:0061165683ee 411 }
sdivarci 0:0061165683ee 412
sdivarci 0:0061165683ee 413 __STATIC_INLINE void USBDHAL_SetEp0InDmaPtr( uint8_t* addr )
sdivarci 0:0061165683ee 414 {
sdivarci 0:0061165683ee 415 USB->DIEP0DMAADDR = (uint32_t)addr;
sdivarci 0:0061165683ee 416 }
sdivarci 0:0061165683ee 417
sdivarci 0:0061165683ee 418 __STATIC_INLINE void USBDHAL_SetEp0OutDmaPtr( uint8_t* addr )
sdivarci 0:0061165683ee 419 {
sdivarci 0:0061165683ee 420 USB->DOEP0DMAADDR = (uint32_t)addr;
sdivarci 0:0061165683ee 421 }
sdivarci 0:0061165683ee 422
sdivarci 0:0061165683ee 423 __STATIC_INLINE void USBDHAL_SetEPDISNAK( USBD_Ep_TypeDef *ep )
sdivarci 0:0061165683ee 424 {
sdivarci 0:0061165683ee 425 if ( ep->in )
sdivarci 0:0061165683ee 426 {
sdivarci 0:0061165683ee 427 USB_DINEPS[ ep->num ].CTL = ( USB_DINEPS[ ep->num ].CTL &
sdivarci 0:0061165683ee 428 ~DEPCTL_WO_BITMASK ) |
sdivarci 0:0061165683ee 429 USB_DIEP_CTL_SNAK |
sdivarci 0:0061165683ee 430 USB_DIEP_CTL_EPDIS;
sdivarci 0:0061165683ee 431 }
sdivarci 0:0061165683ee 432 else
sdivarci 0:0061165683ee 433 {
sdivarci 0:0061165683ee 434 USB_DOUTEPS[ ep->num ].CTL = ( USB_DOUTEPS[ ep->num ].CTL &
sdivarci 0:0061165683ee 435 ~DEPCTL_WO_BITMASK ) |
sdivarci 0:0061165683ee 436 USB_DOEP_CTL_EPENA;
sdivarci 0:0061165683ee 437
sdivarci 0:0061165683ee 438 USB_DOUTEPS[ ep->num ].CTL = ( USB_DOUTEPS[ ep->num ].CTL &
sdivarci 0:0061165683ee 439 ~DEPCTL_WO_BITMASK ) |
sdivarci 0:0061165683ee 440 USB_DOEP_CTL_SNAK |
sdivarci 0:0061165683ee 441 USB_DOEP_CTL_EPDIS;
sdivarci 0:0061165683ee 442 }
sdivarci 0:0061165683ee 443 }
sdivarci 0:0061165683ee 444
sdivarci 0:0061165683ee 445 __STATIC_INLINE void USBDHAL_SetRemoteWakeup( void )
sdivarci 0:0061165683ee 446 {
sdivarci 0:0061165683ee 447 USB->DCTL = ( USB->DCTL & ~DCTL_WO_BITMASK ) | USB_DCTL_RMTWKUPSIG;
sdivarci 0:0061165683ee 448 }
sdivarci 0:0061165683ee 449
sdivarci 0:0061165683ee 450 __STATIC_INLINE USB_Status_TypeDef USBDHAL_StallEp( USBD_Ep_TypeDef *ep )
sdivarci 0:0061165683ee 451 {
sdivarci 0:0061165683ee 452 uint32_t depctl, eptype;
sdivarci 0:0061165683ee 453 USB_Status_TypeDef retVal = USB_STATUS_REQ_ERR;
sdivarci 0:0061165683ee 454
sdivarci 0:0061165683ee 455 if ( ep->in == true )
sdivarci 0:0061165683ee 456 {
sdivarci 0:0061165683ee 457 depctl = USB_DINEPS[ ep->num ].CTL & ~DEPCTL_WO_BITMASK;
sdivarci 0:0061165683ee 458 eptype = depctl & _USB_DIEP_CTL_EPTYPE_MASK;
sdivarci 0:0061165683ee 459
sdivarci 0:0061165683ee 460 if ( eptype != DIEPCTL_EPTYPE_ISOC )
sdivarci 0:0061165683ee 461 {
sdivarci 0:0061165683ee 462 if ( depctl & USB_DIEP_CTL_EPENA )
sdivarci 0:0061165683ee 463 {
sdivarci 0:0061165683ee 464 depctl |= USB_DIEP_CTL_EPDIS;
sdivarci 0:0061165683ee 465 }
sdivarci 0:0061165683ee 466 USB_DINEPS[ ep->num ].CTL = depctl | USB_DIEP_CTL_STALL;
sdivarci 0:0061165683ee 467 retVal = USB_STATUS_OK;
sdivarci 0:0061165683ee 468 }
sdivarci 0:0061165683ee 469 }
sdivarci 0:0061165683ee 470 else
sdivarci 0:0061165683ee 471 {
sdivarci 0:0061165683ee 472 depctl = USB_DOUTEPS[ ep->num ].CTL & ~DEPCTL_WO_BITMASK;
sdivarci 0:0061165683ee 473 eptype = depctl & _USB_DOEP_CTL_EPTYPE_MASK;
sdivarci 0:0061165683ee 474
sdivarci 0:0061165683ee 475 if ( eptype != DIEPCTL_EPTYPE_ISOC )
sdivarci 0:0061165683ee 476 {
sdivarci 0:0061165683ee 477 USB_DOUTEPS[ ep->num ].CTL = depctl | USB_DOEP_CTL_STALL;
sdivarci 0:0061165683ee 478 retVal = USB_STATUS_OK;
sdivarci 0:0061165683ee 479 }
sdivarci 0:0061165683ee 480 }
sdivarci 0:0061165683ee 481
sdivarci 0:0061165683ee 482 return retVal;
sdivarci 0:0061165683ee 483 }
sdivarci 0:0061165683ee 484
sdivarci 0:0061165683ee 485 __STATIC_INLINE void USBDHAL_StartEp0In( uint32_t len, uint32_t ep0mps )
sdivarci 0:0061165683ee 486 {
sdivarci 0:0061165683ee 487 USB->DIEP0TSIZ = ( len << _USB_DIEP0TSIZ_XFERSIZE_SHIFT ) |
sdivarci 0:0061165683ee 488 ( 1 << _USB_DIEP0TSIZ_PKTCNT_SHIFT );
sdivarci 0:0061165683ee 489
sdivarci 0:0061165683ee 490 USB->DIEP0CTL = ( USB->DIEP0CTL & ~DEPCTL_WO_BITMASK )
sdivarci 0:0061165683ee 491 | USB_DIEP0CTL_CNAK | USB_DIEP0CTL_EPENA
sdivarci 0:0061165683ee 492 | ep0mps;
sdivarci 0:0061165683ee 493 }
sdivarci 0:0061165683ee 494
sdivarci 0:0061165683ee 495 __STATIC_INLINE void USBDHAL_StartEp0Out( uint32_t len, uint32_t ep0mps )
sdivarci 0:0061165683ee 496 {
sdivarci 0:0061165683ee 497 USB->DOEP0TSIZ = ( len << _USB_DOEP0TSIZ_XFERSIZE_SHIFT ) |
sdivarci 0:0061165683ee 498 ( 1 << _USB_DOEP0TSIZ_PKTCNT_SHIFT );
sdivarci 0:0061165683ee 499
sdivarci 0:0061165683ee 500 USB->DOEP0CTL = ( USB->DOEP0CTL & ~DEPCTL_WO_BITMASK )
sdivarci 0:0061165683ee 501 | USB_DOEP0CTL_CNAK | USB_DOEP0CTL_EPENA
sdivarci 0:0061165683ee 502 | ep0mps;
sdivarci 0:0061165683ee 503 }
sdivarci 0:0061165683ee 504
sdivarci 0:0061165683ee 505 __STATIC_INLINE void USBDHAL_StartEp0Setup( USBD_Device_TypeDef *dev )
sdivarci 0:0061165683ee 506 {
sdivarci 0:0061165683ee 507 dev->ep[ 0 ].in = false;
sdivarci 0:0061165683ee 508
sdivarci 0:0061165683ee 509 #if defined( USB_DOEP0INT_STUPPKTRCVD )
sdivarci 0:0061165683ee 510 USB->DOEP0TSIZ = ( 8*3 << _USB_DOEP0TSIZ_XFERSIZE_SHIFT ) |
sdivarci 0:0061165683ee 511 ( 1 << _USB_DOEP0TSIZ_PKTCNT_SHIFT ) |
sdivarci 0:0061165683ee 512 ( 3 << _USB_DOEP0TSIZ_SUPCNT_SHIFT );
sdivarci 0:0061165683ee 513 #else
sdivarci 0:0061165683ee 514 USB->DOEP0TSIZ = 3 << _USB_DOEP0TSIZ_SUPCNT_SHIFT;
sdivarci 0:0061165683ee 515 #endif
sdivarci 0:0061165683ee 516
sdivarci 0:0061165683ee 517 dev->setup = dev->setupPkt;
sdivarci 0:0061165683ee 518 USB->DOEP0DMAADDR = (uint32_t)dev->setup;
sdivarci 0:0061165683ee 519
sdivarci 0:0061165683ee 520 #if defined( USB_DOEP0INT_STUPPKTRCVD )
sdivarci 0:0061165683ee 521 USB->DOEP0CTL = ( USB->DOEP0CTL & ~DEPCTL_WO_BITMASK )
sdivarci 0:0061165683ee 522 | USB_DOEP0CTL_EPENA
sdivarci 0:0061165683ee 523 | dev->ep0MpsCode;
sdivarci 0:0061165683ee 524 #else
sdivarci 0:0061165683ee 525 USB->DOEP0CTL = ( USB->DOEP0CTL & ~DEPCTL_WO_BITMASK )
sdivarci 0:0061165683ee 526 | USB_DOEP0CTL_CNAK | USB_DOEP0CTL_EPENA
sdivarci 0:0061165683ee 527 | dev->ep0MpsCode;
sdivarci 0:0061165683ee 528 #endif
sdivarci 0:0061165683ee 529 }
sdivarci 0:0061165683ee 530
sdivarci 0:0061165683ee 531 __STATIC_INLINE void USBDHAL_StartEpIn( USBD_Ep_TypeDef *ep )
sdivarci 0:0061165683ee 532 {
sdivarci 0:0061165683ee 533 uint32_t pktcnt, xfersize;
sdivarci 0:0061165683ee 534
sdivarci 0:0061165683ee 535 if ( ep->remaining == 0 ) /* ZLP ? */
sdivarci 0:0061165683ee 536 {
sdivarci 0:0061165683ee 537 pktcnt = 1;
sdivarci 0:0061165683ee 538 xfersize = 0;
sdivarci 0:0061165683ee 539 }
sdivarci 0:0061165683ee 540 else
sdivarci 0:0061165683ee 541 {
sdivarci 0:0061165683ee 542 pktcnt = ( ep->remaining - 1 + ep->packetSize ) / ep->packetSize;
sdivarci 0:0061165683ee 543 xfersize = ep->remaining;
sdivarci 0:0061165683ee 544 }
sdivarci 0:0061165683ee 545
sdivarci 0:0061165683ee 546 USB_DINEPS[ ep->num ].TSIZ =
sdivarci 0:0061165683ee 547 ( USB_DINEPS[ ep->num ].TSIZ &
sdivarci 0:0061165683ee 548 ~DIEP_XFERSIZE_PKTCNT_MASK ) |
sdivarci 0:0061165683ee 549 ( xfersize << _USB_DIEP_TSIZ_XFERSIZE_SHIFT ) |
sdivarci 0:0061165683ee 550 ( pktcnt << _USB_DIEP_TSIZ_PKTCNT_SHIFT );
sdivarci 0:0061165683ee 551
sdivarci 0:0061165683ee 552 USB_DINEPS[ ep->num ].DMAADDR = (uint32_t)ep->buf;
sdivarci 0:0061165683ee 553 USB_DINEPS[ ep->num ].CTL =
sdivarci 0:0061165683ee 554 ( USB_DINEPS[ ep->num ].CTL & ~DEPCTL_WO_BITMASK ) |
sdivarci 0:0061165683ee 555 USB_DIEP_CTL_CNAK |
sdivarci 0:0061165683ee 556 USB_DIEP_CTL_EPENA;
sdivarci 0:0061165683ee 557 }
sdivarci 0:0061165683ee 558
sdivarci 0:0061165683ee 559 __STATIC_INLINE void USBDHAL_StartEpOut( USBD_Ep_TypeDef *ep )
sdivarci 0:0061165683ee 560 {
sdivarci 0:0061165683ee 561 uint32_t pktcnt, xfersize;
sdivarci 0:0061165683ee 562
sdivarci 0:0061165683ee 563 if ( ep->remaining == 0 ) /* ZLP ? */
sdivarci 0:0061165683ee 564 {
sdivarci 0:0061165683ee 565 pktcnt = 1;
sdivarci 0:0061165683ee 566 xfersize = ep->packetSize;
sdivarci 0:0061165683ee 567 }
sdivarci 0:0061165683ee 568 else
sdivarci 0:0061165683ee 569 {
sdivarci 0:0061165683ee 570 pktcnt = ( ep->remaining - 1 + ep->packetSize ) / ep->packetSize;
sdivarci 0:0061165683ee 571 xfersize = pktcnt * ep->packetSize;
sdivarci 0:0061165683ee 572 }
sdivarci 0:0061165683ee 573
sdivarci 0:0061165683ee 574 USB_DOUTEPS[ ep->num ].TSIZ =
sdivarci 0:0061165683ee 575 ( USB_DOUTEPS[ ep->num ].TSIZ &
sdivarci 0:0061165683ee 576 ~DOEP_XFERSIZE_PKTCNT_MASK ) |
sdivarci 0:0061165683ee 577 ( xfersize << _USB_DOEP_TSIZ_XFERSIZE_SHIFT ) |
sdivarci 0:0061165683ee 578 ( pktcnt << _USB_DOEP_TSIZ_PKTCNT_SHIFT );
sdivarci 0:0061165683ee 579
sdivarci 0:0061165683ee 580 ep->hwXferSize = xfersize;
sdivarci 0:0061165683ee 581 USB_DOUTEPS[ ep->num ].DMAADDR = (uint32_t)ep->buf;
sdivarci 0:0061165683ee 582 USB_DOUTEPS[ ep->num ].CTL =
sdivarci 0:0061165683ee 583 ( USB_DOUTEPS[ ep->num ].CTL &
sdivarci 0:0061165683ee 584 ~DEPCTL_WO_BITMASK ) |
sdivarci 0:0061165683ee 585 USB_DOEP_CTL_CNAK |
sdivarci 0:0061165683ee 586 USB_DOEP_CTL_EPENA;
sdivarci 0:0061165683ee 587 }
sdivarci 0:0061165683ee 588
sdivarci 0:0061165683ee 589 __STATIC_INLINE USB_Status_TypeDef USBDHAL_UnStallEp( USBD_Ep_TypeDef *ep )
sdivarci 0:0061165683ee 590 {
sdivarci 0:0061165683ee 591 uint32_t depctl, eptype;
sdivarci 0:0061165683ee 592 USB_Status_TypeDef retVal = USB_STATUS_REQ_ERR;
sdivarci 0:0061165683ee 593
sdivarci 0:0061165683ee 594 if ( ep->in == true )
sdivarci 0:0061165683ee 595 {
sdivarci 0:0061165683ee 596 depctl = USB_DINEPS[ ep->num ].CTL & ~DEPCTL_WO_BITMASK;
sdivarci 0:0061165683ee 597 eptype = depctl & _USB_DIEP_CTL_EPTYPE_MASK;
sdivarci 0:0061165683ee 598
sdivarci 0:0061165683ee 599 if (( eptype == DIEPCTL_EPTYPE_INTR ) || ( eptype == DIEPCTL_EPTYPE_BULK ))
sdivarci 0:0061165683ee 600 {
sdivarci 0:0061165683ee 601 depctl |= USB_DIEP_CTL_SETD0PIDEF;
sdivarci 0:0061165683ee 602 depctl &= ~USB_DIEP_CTL_STALL;
sdivarci 0:0061165683ee 603 USB_DINEPS[ ep->num ].CTL = depctl;
sdivarci 0:0061165683ee 604 retVal = USB_STATUS_OK;
sdivarci 0:0061165683ee 605 }
sdivarci 0:0061165683ee 606 }
sdivarci 0:0061165683ee 607 else
sdivarci 0:0061165683ee 608 {
sdivarci 0:0061165683ee 609 depctl = USB_DOUTEPS[ ep->num ].CTL & ~DEPCTL_WO_BITMASK;
sdivarci 0:0061165683ee 610 eptype = depctl & _USB_DOEP_CTL_EPTYPE_MASK;
sdivarci 0:0061165683ee 611
sdivarci 0:0061165683ee 612 if (( eptype == DIEPCTL_EPTYPE_INTR ) || ( eptype == DIEPCTL_EPTYPE_BULK ))
sdivarci 0:0061165683ee 613 {
sdivarci 0:0061165683ee 614 depctl |= USB_DOEP_CTL_SETD0PIDEF;
sdivarci 0:0061165683ee 615 depctl &= ~USB_DOEP_CTL_STALL;
sdivarci 0:0061165683ee 616 USB_DOUTEPS[ ep->num ].CTL = depctl;
sdivarci 0:0061165683ee 617 retVal = USB_STATUS_OK;
sdivarci 0:0061165683ee 618 }
sdivarci 0:0061165683ee 619 }
sdivarci 0:0061165683ee 620
sdivarci 0:0061165683ee 621 return retVal;
sdivarci 0:0061165683ee 622 }
sdivarci 0:0061165683ee 623 #endif /* defined( USB_DEVICE ) */
sdivarci 0:0061165683ee 624
sdivarci 0:0061165683ee 625 #if defined( USB_HOST )
sdivarci 0:0061165683ee 626 __STATIC_INLINE void USBHHAL_HCActivate( int hcnum, uint32_t hcchar, bool intep )
sdivarci 0:0061165683ee 627 {
sdivarci 0:0061165683ee 628 uint32_t oddframe;
sdivarci 0:0061165683ee 629
sdivarci 0:0061165683ee 630 if ( intep )
sdivarci 0:0061165683ee 631 {
sdivarci 0:0061165683ee 632 oddframe = USB->HFNUM & 1;
sdivarci 0:0061165683ee 633
sdivarci 0:0061165683ee 634 USB->HC[ hcnum ].CHAR =
sdivarci 0:0061165683ee 635 ( hcchar &
sdivarci 0:0061165683ee 636 ~( USB_HC_CHAR_CHDIS | _USB_HC_CHAR_ODDFRM_MASK ) ) |
sdivarci 0:0061165683ee 637
sdivarci 0:0061165683ee 638 /* Schedule INT transfers to start in next frame. */
sdivarci 0:0061165683ee 639 ( oddframe & 1 ? 0 : USB_HC_CHAR_ODDFRM ) |
sdivarci 0:0061165683ee 640
sdivarci 0:0061165683ee 641 USB_HC_CHAR_CHENA;
sdivarci 0:0061165683ee 642 }
sdivarci 0:0061165683ee 643 else
sdivarci 0:0061165683ee 644 {
sdivarci 0:0061165683ee 645 USB->HC[ hcnum ].CHAR = ( hcchar & ~USB_HC_CHAR_CHDIS ) |
sdivarci 0:0061165683ee 646 USB_HC_CHAR_CHENA;
sdivarci 0:0061165683ee 647 }
sdivarci 0:0061165683ee 648 }
sdivarci 0:0061165683ee 649
sdivarci 0:0061165683ee 650 __STATIC_INLINE bool USBHHAL_InitializedAndPowered( void )
sdivarci 0:0061165683ee 651 {
sdivarci 0:0061165683ee 652 if ( ( USB->ROUTE & USB_ROUTE_PHYPEN ) &&
sdivarci 0:0061165683ee 653 ( USB->HPRT & USB_HPRT_PRTPWR ) )
sdivarci 0:0061165683ee 654 return true;
sdivarci 0:0061165683ee 655 return false;
sdivarci 0:0061165683ee 656 }
sdivarci 0:0061165683ee 657
sdivarci 0:0061165683ee 658 __STATIC_INLINE void USBHHAL_EnableInts( void )
sdivarci 0:0061165683ee 659 {
sdivarci 0:0061165683ee 660 /* Disable all interrupts. */
sdivarci 0:0061165683ee 661 USB->GINTMSK = 0;
sdivarci 0:0061165683ee 662
sdivarci 0:0061165683ee 663 /* Clear pending OTG interrupts */
sdivarci 0:0061165683ee 664 USB->GOTGINT = 0xFFFFFFFF;
sdivarci 0:0061165683ee 665
sdivarci 0:0061165683ee 666 /* Clear pending interrupts */
sdivarci 0:0061165683ee 667 USB->GINTSTS = 0xFFFFFFFF;
sdivarci 0:0061165683ee 668
sdivarci 0:0061165683ee 669 USB->GINTMSK = USB_GINTMSK_PRTINTMSK |
sdivarci 0:0061165683ee 670 USB_GINTMSK_HCHINTMSK |
sdivarci 0:0061165683ee 671 USB_GINTMSK_DISCONNINTMSK;
sdivarci 0:0061165683ee 672 }
sdivarci 0:0061165683ee 673
sdivarci 0:0061165683ee 674 __STATIC_INLINE uint16_t USBHHAL_GetFrameNum( void )
sdivarci 0:0061165683ee 675 {
sdivarci 0:0061165683ee 676 return USB->HFNUM;
sdivarci 0:0061165683ee 677 }
sdivarci 0:0061165683ee 678
sdivarci 0:0061165683ee 679 __STATIC_INLINE uint32_t USBHHAL_GetHcChar( uint8_t hcnum )
sdivarci 0:0061165683ee 680 {
sdivarci 0:0061165683ee 681 return USB->HC[ hcnum ].CHAR;
sdivarci 0:0061165683ee 682 }
sdivarci 0:0061165683ee 683
sdivarci 0:0061165683ee 684 __STATIC_INLINE uint32_t USBHHAL_GetHcInts( uint8_t hcnum )
sdivarci 0:0061165683ee 685 {
sdivarci 0:0061165683ee 686 uint32_t retVal;
sdivarci 0:0061165683ee 687
sdivarci 0:0061165683ee 688 retVal = USB->HC[ hcnum ].INT;
sdivarci 0:0061165683ee 689 return retVal;
sdivarci 0:0061165683ee 690 }
sdivarci 0:0061165683ee 691
sdivarci 0:0061165683ee 692 __STATIC_INLINE uint32_t USBHHAL_GetHostChannelInts( void )
sdivarci 0:0061165683ee 693 {
sdivarci 0:0061165683ee 694 return USB->HAINT;
sdivarci 0:0061165683ee 695 }
sdivarci 0:0061165683ee 696
sdivarci 0:0061165683ee 697 __STATIC_INLINE uint8_t USBHHAL_GetPortSpeed( void )
sdivarci 0:0061165683ee 698 {
sdivarci 0:0061165683ee 699 return ( USB->HPRT & _USB_HPRT_PRTSPD_MASK ) >> _USB_HPRT_PRTSPD_SHIFT;
sdivarci 0:0061165683ee 700 }
sdivarci 0:0061165683ee 701
sdivarci 0:0061165683ee 702 __STATIC_INLINE void USBHHAL_PortReset( bool on )
sdivarci 0:0061165683ee 703 {
sdivarci 0:0061165683ee 704 if ( on )
sdivarci 0:0061165683ee 705 {
sdivarci 0:0061165683ee 706 DEBUG_USB_INT_LO_PUTCHAR( '+' );
sdivarci 0:0061165683ee 707 USB->HPRT = ( USB->HPRT & ~HPRT_WC_MASK ) | USB_HPRT_PRTRST;
sdivarci 0:0061165683ee 708 }
sdivarci 0:0061165683ee 709 else
sdivarci 0:0061165683ee 710 {
sdivarci 0:0061165683ee 711 DEBUG_USB_INT_LO_PUTCHAR( '-' );
sdivarci 0:0061165683ee 712 USB->HPRT &= ~( HPRT_WC_MASK | USB_HPRT_PRTRST );
sdivarci 0:0061165683ee 713 }
sdivarci 0:0061165683ee 714 }
sdivarci 0:0061165683ee 715
sdivarci 0:0061165683ee 716 __STATIC_INLINE void USBHHAL_PortResume( bool on )
sdivarci 0:0061165683ee 717 {
sdivarci 0:0061165683ee 718 if ( on )
sdivarci 0:0061165683ee 719 {
sdivarci 0:0061165683ee 720 USB->HPRT = ( USB->HPRT & ~( HPRT_WC_MASK | USB_HPRT_PRTSUSP ) ) |
sdivarci 0:0061165683ee 721 USB_HPRT_PRTRES;
sdivarci 0:0061165683ee 722 }
sdivarci 0:0061165683ee 723 else
sdivarci 0:0061165683ee 724 {
sdivarci 0:0061165683ee 725 USB->HPRT &= ~( HPRT_WC_MASK | USB_HPRT_PRTSUSP | USB_HPRT_PRTRES );
sdivarci 0:0061165683ee 726 }
sdivarci 0:0061165683ee 727 }
sdivarci 0:0061165683ee 728
sdivarci 0:0061165683ee 729 __STATIC_INLINE void USBHHAL_PortSuspend( void )
sdivarci 0:0061165683ee 730 {
sdivarci 0:0061165683ee 731 USB->HPRT = ( USB->HPRT & ~HPRT_WC_MASK ) | USB_HPRT_PRTSUSP;
sdivarci 0:0061165683ee 732 }
sdivarci 0:0061165683ee 733
sdivarci 0:0061165683ee 734 __STATIC_INLINE void USBHHAL_VbusOn( bool on )
sdivarci 0:0061165683ee 735 {
sdivarci 0:0061165683ee 736 if ( on )
sdivarci 0:0061165683ee 737 {
sdivarci 0:0061165683ee 738 USB->HPRT = ( USB->HPRT & ~HPRT_WC_MASK ) | USB_HPRT_PRTPWR;
sdivarci 0:0061165683ee 739 DEBUG_USB_INT_LO_PUTCHAR( '/' );
sdivarci 0:0061165683ee 740 }
sdivarci 0:0061165683ee 741 else
sdivarci 0:0061165683ee 742 {
sdivarci 0:0061165683ee 743 USB->HPRT &= ~( HPRT_WC_MASK | USB_HPRT_PRTPWR );
sdivarci 0:0061165683ee 744 DEBUG_USB_INT_LO_PUTCHAR( '\\' );
sdivarci 0:0061165683ee 745 }
sdivarci 0:0061165683ee 746 }
sdivarci 0:0061165683ee 747 #endif /* defined( USB_HOST ) */
sdivarci 0:0061165683ee 748
sdivarci 0:0061165683ee 749 /** @endcond */
sdivarci 0:0061165683ee 750
sdivarci 0:0061165683ee 751 #ifdef __cplusplus
sdivarci 0:0061165683ee 752 }
sdivarci 0:0061165683ee 753 #endif
sdivarci 0:0061165683ee 754
sdivarci 0:0061165683ee 755 #endif /* defined( USB_DEVICE ) || defined( USB_HOST ) */
sdivarci 0:0061165683ee 756 #endif /* defined( USB_PRESENT ) && ( USB_COUNT == 1 ) */
sdivarci 0:0061165683ee 757 #endif /* __EM_USBHAL_H */