USB device stack

Dependents:   mbed-mX-USB-TEST1 USBMSD_SD_HID_HelloWorld HidTest MIDI_usb_bridge ... more

Legacy Warning

This is an mbed 2 library. To learn more about mbed OS 5, visit the docs.

Pull requests against this repository are no longer supported. Please raise against mbed OS 5 as documented above.

Committer:
Kojto
Date:
Thu Jul 27 12:14:04 2017 +0100
Revision:
71:53949e6131f6
Update libraries

Fixes the previous commmit, as some devices were not copied. USBDevice contains
now targets directory with all targets implementations

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Kojto 71:53949e6131f6 1 /***************************************************************************//**
Kojto 71:53949e6131f6 2 * @file em_usbd.h
Kojto 71:53949e6131f6 3 * @brief USB protocol stack library API for EFM32.
Kojto 71:53949e6131f6 4 * @version 3.20.14
Kojto 71:53949e6131f6 5 *******************************************************************************
Kojto 71:53949e6131f6 6 * @section License
Kojto 71:53949e6131f6 7 * <b>(C) Copyright 2014 Silicon Labs, http://www.silabs.com</b>
Kojto 71:53949e6131f6 8 *******************************************************************************
Kojto 71:53949e6131f6 9 *
Kojto 71:53949e6131f6 10 * Licensed under the Apache License, Version 2.0 (the "License");
Kojto 71:53949e6131f6 11 * you may not use this file except in compliance with the License.
Kojto 71:53949e6131f6 12 * You may obtain a copy of the License at
Kojto 71:53949e6131f6 13 *
Kojto 71:53949e6131f6 14 * http://www.apache.org/licenses/LICENSE-2.0
Kojto 71:53949e6131f6 15 *
Kojto 71:53949e6131f6 16 * Unless required by applicable law or agreed to in writing, software
Kojto 71:53949e6131f6 17 * distributed under the License is distributed on an "AS IS" BASIS,
Kojto 71:53949e6131f6 18 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Kojto 71:53949e6131f6 19 * See the License for the specific language governing permissions and
Kojto 71:53949e6131f6 20 * limitations under the License.
Kojto 71:53949e6131f6 21 *
Kojto 71:53949e6131f6 22 ******************************************************************************/
Kojto 71:53949e6131f6 23
Kojto 71:53949e6131f6 24 #ifndef __EM_USBD_H
Kojto 71:53949e6131f6 25 #define __EM_USBD_H
Kojto 71:53949e6131f6 26
Kojto 71:53949e6131f6 27 #include "em_device.h"
Kojto 71:53949e6131f6 28 #if defined( USB_PRESENT ) && ( USB_COUNT == 1 )
Kojto 71:53949e6131f6 29 #include "em_usb.h"
Kojto 71:53949e6131f6 30 #if defined( USB_DEVICE )
Kojto 71:53949e6131f6 31
Kojto 71:53949e6131f6 32 #ifdef __cplusplus
Kojto 71:53949e6131f6 33 extern "C" {
Kojto 71:53949e6131f6 34 #endif
Kojto 71:53949e6131f6 35
Kojto 71:53949e6131f6 36 /** @cond DO_NOT_INCLUDE_WITH_DOXYGEN */
Kojto 71:53949e6131f6 37
Kojto 71:53949e6131f6 38 #if defined( DEBUG_USB_API )
Kojto 71:53949e6131f6 39 #define DEBUG_TRACE_ABORT( x ) \
Kojto 71:53949e6131f6 40 { \
Kojto 71:53949e6131f6 41 if ( x == USB_STATUS_EP_STALLED ) \
Kojto 71:53949e6131f6 42 { DEBUG_USB_API_PUTS( "\nEP cb(), EP stalled" ); } \
Kojto 71:53949e6131f6 43 else if ( x == USB_STATUS_EP_ABORTED ) \
Kojto 71:53949e6131f6 44 { DEBUG_USB_API_PUTS( "\nEP cb(), EP aborted" ); } \
Kojto 71:53949e6131f6 45 else if ( x == USB_STATUS_DEVICE_UNCONFIGURED ) \
Kojto 71:53949e6131f6 46 { DEBUG_USB_API_PUTS( "\nEP cb(), device unconfigured" ); } \
Kojto 71:53949e6131f6 47 else if ( x == USB_STATUS_DEVICE_SUSPENDED ) \
Kojto 71:53949e6131f6 48 { DEBUG_USB_API_PUTS( "\nEP cb(), device suspended" ); } \
Kojto 71:53949e6131f6 49 else /* ( x == USB_STATUS_DEVICE_RESET ) */ \
Kojto 71:53949e6131f6 50 { DEBUG_USB_API_PUTS( "\nEP cb(), device reset" ); } \
Kojto 71:53949e6131f6 51 }
Kojto 71:53949e6131f6 52 #else
Kojto 71:53949e6131f6 53 #define DEBUG_TRACE_ABORT( x )
Kojto 71:53949e6131f6 54 #endif
Kojto 71:53949e6131f6 55
Kojto 71:53949e6131f6 56 extern USBD_Device_TypeDef *dev;
Kojto 71:53949e6131f6 57 extern volatile bool USBD_poweredDown;
Kojto 71:53949e6131f6 58
Kojto 71:53949e6131f6 59 __STATIC_INLINE void USBD_ArmEp0( USBD_Ep_TypeDef *ep );
Kojto 71:53949e6131f6 60 __STATIC_INLINE void USBD_ArmEpN( USBD_Ep_TypeDef *ep );
Kojto 71:53949e6131f6 61 __STATIC_INLINE void USBD_AbortEp( USBD_Ep_TypeDef *ep );
Kojto 71:53949e6131f6 62
Kojto 71:53949e6131f6 63 void USBD_SetUsbState( USBD_State_TypeDef newState );
Kojto 71:53949e6131f6 64
Kojto 71:53949e6131f6 65 int USBDCH9_SetupCmd( USBD_Device_TypeDef *device );
Kojto 71:53949e6131f6 66
Kojto 71:53949e6131f6 67 void USBDEP_Ep0Handler( USBD_Device_TypeDef *device );
Kojto 71:53949e6131f6 68 void USBDEP_EpHandler( uint8_t epAddr );
Kojto 71:53949e6131f6 69
Kojto 71:53949e6131f6 70 __STATIC_INLINE void USBD_ActivateAllEps( bool forceIdle )
Kojto 71:53949e6131f6 71 {
Kojto 71:53949e6131f6 72 int i;
Kojto 71:53949e6131f6 73
Kojto 71:53949e6131f6 74 for ( i = 1; i <= NUM_EP_USED; i++ )
Kojto 71:53949e6131f6 75 {
Kojto 71:53949e6131f6 76 USBDHAL_ActivateEp( &dev->ep[ i ], forceIdle );
Kojto 71:53949e6131f6 77 }
Kojto 71:53949e6131f6 78 }
Kojto 71:53949e6131f6 79
Kojto 71:53949e6131f6 80 __STATIC_INLINE void USBD_ArmEp( USBD_Ep_TypeDef *ep )
Kojto 71:53949e6131f6 81 {
Kojto 71:53949e6131f6 82 if ( ep->num == 0 )
Kojto 71:53949e6131f6 83 {
Kojto 71:53949e6131f6 84 USBD_ArmEp0( ep );
Kojto 71:53949e6131f6 85 }
Kojto 71:53949e6131f6 86 else
Kojto 71:53949e6131f6 87 {
Kojto 71:53949e6131f6 88 USBD_ArmEpN( ep );
Kojto 71:53949e6131f6 89 }
Kojto 71:53949e6131f6 90 }
Kojto 71:53949e6131f6 91
Kojto 71:53949e6131f6 92 __STATIC_INLINE void USBD_ArmEp0( USBD_Ep_TypeDef *ep )
Kojto 71:53949e6131f6 93 {
Kojto 71:53949e6131f6 94 if ( ep->in )
Kojto 71:53949e6131f6 95 {
Kojto 71:53949e6131f6 96 if ( ep->remaining == 0 ) /* Zero Length Packet? */
Kojto 71:53949e6131f6 97 {
Kojto 71:53949e6131f6 98 ep->zlp = 1;
Kojto 71:53949e6131f6 99 }
Kojto 71:53949e6131f6 100
Kojto 71:53949e6131f6 101 USBDHAL_SetEp0InDmaPtr( ep->buf );
Kojto 71:53949e6131f6 102 USBDHAL_StartEp0In( EFM32_MIN( ep->remaining, ep->packetSize ),
Kojto 71:53949e6131f6 103 dev->ep0MpsCode );
Kojto 71:53949e6131f6 104 }
Kojto 71:53949e6131f6 105 else
Kojto 71:53949e6131f6 106 {
Kojto 71:53949e6131f6 107 USBDHAL_SetEp0OutDmaPtr( ep->buf );
Kojto 71:53949e6131f6 108 USBDHAL_StartEp0Out( ep->packetSize, dev->ep0MpsCode );
Kojto 71:53949e6131f6 109 }
Kojto 71:53949e6131f6 110 }
Kojto 71:53949e6131f6 111
Kojto 71:53949e6131f6 112 __STATIC_INLINE void USBD_ArmEpN( USBD_Ep_TypeDef *ep )
Kojto 71:53949e6131f6 113 {
Kojto 71:53949e6131f6 114 if ( ep->in )
Kojto 71:53949e6131f6 115 {
Kojto 71:53949e6131f6 116 USBDHAL_StartEpIn( ep );
Kojto 71:53949e6131f6 117 }
Kojto 71:53949e6131f6 118 else
Kojto 71:53949e6131f6 119 {
Kojto 71:53949e6131f6 120 USBDHAL_StartEpOut( ep );
Kojto 71:53949e6131f6 121 }
Kojto 71:53949e6131f6 122 }
Kojto 71:53949e6131f6 123
Kojto 71:53949e6131f6 124 __STATIC_INLINE void USBD_DeactivateAllEps( USB_Status_TypeDef reason )
Kojto 71:53949e6131f6 125 {
Kojto 71:53949e6131f6 126 int i;
Kojto 71:53949e6131f6 127 USBD_Ep_TypeDef *ep;
Kojto 71:53949e6131f6 128
Kojto 71:53949e6131f6 129 for ( i = 1; i <= NUM_EP_USED; i++ )
Kojto 71:53949e6131f6 130 {
Kojto 71:53949e6131f6 131 ep = &dev->ep[ i ];
Kojto 71:53949e6131f6 132
Kojto 71:53949e6131f6 133 if ( ep->state == D_EP_IDLE )
Kojto 71:53949e6131f6 134 {
Kojto 71:53949e6131f6 135 USBDHAL_DeactivateEp( ep );
Kojto 71:53949e6131f6 136 }
Kojto 71:53949e6131f6 137 }
Kojto 71:53949e6131f6 138
Kojto 71:53949e6131f6 139 USBDHAL_AbortAllTransfers( reason );
Kojto 71:53949e6131f6 140 }
Kojto 71:53949e6131f6 141
Kojto 71:53949e6131f6 142 __STATIC_INLINE USBD_Ep_TypeDef *USBD_GetEpFromAddr( uint8_t epAddr )
Kojto 71:53949e6131f6 143 {
Kojto 71:53949e6131f6 144 int epIndex;
Kojto 71:53949e6131f6 145 USBD_Ep_TypeDef *ep = NULL;
Kojto 71:53949e6131f6 146
Kojto 71:53949e6131f6 147 if ( epAddr & USB_SETUP_DIR_MASK )
Kojto 71:53949e6131f6 148 {
Kojto 71:53949e6131f6 149 epIndex = dev->inEpAddr2EpIndex[ epAddr & USB_EPNUM_MASK ];
Kojto 71:53949e6131f6 150 }
Kojto 71:53949e6131f6 151 else
Kojto 71:53949e6131f6 152 {
Kojto 71:53949e6131f6 153 epIndex = dev->outEpAddr2EpIndex[ epAddr & USB_EPNUM_MASK ];
Kojto 71:53949e6131f6 154 }
Kojto 71:53949e6131f6 155
Kojto 71:53949e6131f6 156 if ( epIndex )
Kojto 71:53949e6131f6 157 {
Kojto 71:53949e6131f6 158 ep = &dev->ep[ epIndex ];
Kojto 71:53949e6131f6 159 }
Kojto 71:53949e6131f6 160 else if ( ( epAddr & USB_EPNUM_MASK ) == 0 )
Kojto 71:53949e6131f6 161 {
Kojto 71:53949e6131f6 162 ep = &dev->ep[ 0 ];
Kojto 71:53949e6131f6 163 }
Kojto 71:53949e6131f6 164
Kojto 71:53949e6131f6 165 return ep;
Kojto 71:53949e6131f6 166 }
Kojto 71:53949e6131f6 167
Kojto 71:53949e6131f6 168 __STATIC_INLINE void USBD_ReArmEp0( USBD_Ep_TypeDef *ep )
Kojto 71:53949e6131f6 169 {
Kojto 71:53949e6131f6 170 if ( ep->in )
Kojto 71:53949e6131f6 171 {
Kojto 71:53949e6131f6 172 USBDHAL_StartEp0In( EFM32_MIN( ep->remaining, ep->packetSize ),
Kojto 71:53949e6131f6 173 dev->ep0MpsCode );
Kojto 71:53949e6131f6 174 }
Kojto 71:53949e6131f6 175 else
Kojto 71:53949e6131f6 176 {
Kojto 71:53949e6131f6 177 USBDHAL_StartEp0Out( ep->packetSize, dev->ep0MpsCode );
Kojto 71:53949e6131f6 178 }
Kojto 71:53949e6131f6 179 }
Kojto 71:53949e6131f6 180
Kojto 71:53949e6131f6 181 __STATIC_INLINE void USBD_AbortEp( USBD_Ep_TypeDef *ep )
Kojto 71:53949e6131f6 182 {
Kojto 71:53949e6131f6 183 if ( ep->state == D_EP_IDLE )
Kojto 71:53949e6131f6 184 {
Kojto 71:53949e6131f6 185 return;
Kojto 71:53949e6131f6 186 }
Kojto 71:53949e6131f6 187
Kojto 71:53949e6131f6 188 if ( ep->in )
Kojto 71:53949e6131f6 189 {
Kojto 71:53949e6131f6 190 USBDHAL_AbortEpIn( ep );
Kojto 71:53949e6131f6 191 }
Kojto 71:53949e6131f6 192 else
Kojto 71:53949e6131f6 193 {
Kojto 71:53949e6131f6 194 USBDHAL_AbortEpOut( ep );
Kojto 71:53949e6131f6 195 }
Kojto 71:53949e6131f6 196 }
Kojto 71:53949e6131f6 197
Kojto 71:53949e6131f6 198 /** @endcond */
Kojto 71:53949e6131f6 199
Kojto 71:53949e6131f6 200 #ifdef __cplusplus
Kojto 71:53949e6131f6 201 }
Kojto 71:53949e6131f6 202 #endif
Kojto 71:53949e6131f6 203
Kojto 71:53949e6131f6 204 #endif /* defined( USB_DEVICE ) */
Kojto 71:53949e6131f6 205 #endif /* defined( USB_PRESENT ) && ( USB_COUNT == 1 ) */
Kojto 71:53949e6131f6 206 #endif /* __EM_USBD_H */