BA / SerialCom

Fork of OmniWheels by Gustav Atmel

Committer:
gustavatmel
Date:
Tue May 01 15:47:08 2018 +0000
Revision:
1:9c5af431a1f1
sdf

Who changed what in which revision?

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