USBDevice with MAX32620HSP platform support

Fork of USBDevice by mbed official

Committer:
mbed_official
Date:
Thu Aug 13 15:46:06 2015 +0100
Revision:
59:2af474687369
Synchronized with git revision 376d6a73e345b728a788041adb166b08cd8d2b95

Full URL: https://github.com/mbedmicro/mbed/commit/376d6a73e345b728a788041adb166b08cd8d2b95/

Silicon Labs - Add support for USBDevice

Who changed what in which revision?

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