USBDevice for STM support

Dependents:   Nucleo_Usb_JoyMouse Nucleo_usbmouse ELEC350_1-referral-2018-usb-hid USBJoystick_HelloWorld2_wip ... more

This library contains all mbed usb device library (mbed-os\features\unsupported\USBDevice).

Committer:
frq08711@LMECWL0871.LME.ST.COM
Date:
Thu Dec 15 17:40:59 2016 +0100
Revision:
1:2a3ae13b45ef
copy of git hub directory unsupported/USBDevice

Who changed what in which revision?

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