Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of OmniWheels by
mbed-os/features/unsupported/USBDevice/targets/TARGET_Silicon_Labs/inc/em_usbhal.h@1:9c5af431a1f1, 2018-05-01 (annotated)
- Committer:
- gustavatmel
- Date:
- Tue May 01 15:47:08 2018 +0000
- Revision:
- 1:9c5af431a1f1
sdf
Who changed what in which revision?
| User | Revision | Line number | New 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 */ |
