USBDevice with MAX32620HSP platform support

Fork of USBDevice by mbed official

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

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

Silicon Labs - Add support for USBDevice

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 59:2af474687369 1 /**************************************************************************//**
mbed_official 59:2af474687369 2 * @file em_usbhal.c
mbed_official 59:2af474687369 3 * @brief USB protocol stack library, low level USB peripheral access.
mbed_official 59:2af474687369 4 * @version 3.20.14
mbed_official 59:2af474687369 5 ******************************************************************************
mbed_official 59:2af474687369 6 * @section License
mbed_official 59:2af474687369 7 * <b>(C) Copyright 2014 Silicon Labs, http://www.silabs.com</b>
mbed_official 59:2af474687369 8 *******************************************************************************
mbed_official 59:2af474687369 9 *
mbed_official 59:2af474687369 10 * Licensed under the Apache License, Version 2.0 (the "License");
mbed_official 59:2af474687369 11 * you may not use this file except in compliance with the License.
mbed_official 59:2af474687369 12 * You may obtain a copy of the License at
mbed_official 59:2af474687369 13 *
mbed_official 59:2af474687369 14 * http://www.apache.org/licenses/LICENSE-2.0
mbed_official 59:2af474687369 15 *
mbed_official 59:2af474687369 16 * Unless required by applicable law or agreed to in writing, software
mbed_official 59:2af474687369 17 * distributed under the License is distributed on an "AS IS" BASIS,
mbed_official 59:2af474687369 18 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
mbed_official 59:2af474687369 19 * See the License for the specific language governing permissions and
mbed_official 59:2af474687369 20 * limitations under the License.
mbed_official 59:2af474687369 21 *
mbed_official 59:2af474687369 22 ******************************************************************************/
mbed_official 59:2af474687369 23
mbed_official 59:2af474687369 24 #include "em_device.h"
mbed_official 59:2af474687369 25 #if defined( USB_PRESENT ) && ( USB_COUNT == 1 )
mbed_official 59:2af474687369 26 #include "em_usb.h"
mbed_official 59:2af474687369 27 #if defined( USB_DEVICE ) || defined( USB_HOST )
mbed_official 59:2af474687369 28
mbed_official 59:2af474687369 29 #include "em_usbtypes.h"
mbed_official 59:2af474687369 30 #include "em_usbhal.h"
mbed_official 59:2af474687369 31 #if defined( USB_DEVICE )
mbed_official 59:2af474687369 32 #include "em_usbd.h"
mbed_official 59:2af474687369 33 #endif
mbed_official 59:2af474687369 34 #if defined( USB_HOST )
mbed_official 59:2af474687369 35 #include "em_usbh.h"
mbed_official 59:2af474687369 36 #endif
mbed_official 59:2af474687369 37 #include "em_cmu.h"
mbed_official 59:2af474687369 38 #include "em_gpio.h"
mbed_official 59:2af474687369 39
mbed_official 59:2af474687369 40 /** @cond DO_NOT_INCLUDE_WITH_DOXYGEN */
mbed_official 59:2af474687369 41
mbed_official 59:2af474687369 42 #define EPABORT_BREAK_LOOP_COUNT 15000 /* Approx. 100 ms */
mbed_official 59:2af474687369 43
mbed_official 59:2af474687369 44 /* NOTE: The sequence of error message strings must agree with the */
mbed_official 59:2af474687369 45 /* definition of USB_Status_TypeDef enum. */
mbed_official 59:2af474687369 46 static const char * const errMsg[] =
mbed_official 59:2af474687369 47 {
mbed_official 59:2af474687369 48 [ USB_STATUS_OK ] = "No errors",
mbed_official 59:2af474687369 49 [ -USB_STATUS_REQ_ERR ] = "Setup request error",
mbed_official 59:2af474687369 50 [ -USB_STATUS_EP_BUSY ] = "Endpoint is busy",
mbed_official 59:2af474687369 51 [ -USB_STATUS_REQ_UNHANDLED ] = "Setup request not handled",
mbed_official 59:2af474687369 52 [ -USB_STATUS_ILLEGAL ] = "Illegal operation attempted",
mbed_official 59:2af474687369 53 [ -USB_STATUS_EP_STALLED ] = "Endpoint is stalled",
mbed_official 59:2af474687369 54 [ -USB_STATUS_EP_ABORTED ] = "Transfer aborted",
mbed_official 59:2af474687369 55 [ -USB_STATUS_EP_ERROR ] = "Transfer error",
mbed_official 59:2af474687369 56 [ -USB_STATUS_EP_NAK ] = "Endpoint NAK",
mbed_official 59:2af474687369 57 [ -USB_STATUS_DEVICE_UNCONFIGURED ] = "Device is not configured",
mbed_official 59:2af474687369 58 [ -USB_STATUS_DEVICE_SUSPENDED ] = "Device is suspended",
mbed_official 59:2af474687369 59 [ -USB_STATUS_DEVICE_RESET ] = "Device has been reset",
mbed_official 59:2af474687369 60 [ -USB_STATUS_TIMEOUT ] = "Transfer timeout",
mbed_official 59:2af474687369 61 [ -USB_STATUS_DEVICE_REMOVED ] = "Device removed",
mbed_official 59:2af474687369 62 [ -USB_STATUS_HC_BUSY ] = "Host channel is busy",
mbed_official 59:2af474687369 63 [ -USB_STATUS_DEVICE_MALFUNCTION ] = "Device malfunction",
mbed_official 59:2af474687369 64 [ -USB_STATUS_PORT_OVERCURRENT ] = "VBUS overcurrent",
mbed_official 59:2af474687369 65 };
mbed_official 59:2af474687369 66 /** @endcond */
mbed_official 59:2af474687369 67
mbed_official 59:2af474687369 68
mbed_official 59:2af474687369 69 /***************************************************************************//**
mbed_official 59:2af474687369 70 * @brief
mbed_official 59:2af474687369 71 * Return an error message string for a given error code.
mbed_official 59:2af474687369 72 *
mbed_official 59:2af474687369 73 * @param[in] error
mbed_official 59:2af474687369 74 * Error code, see \ref USB_Status_TypeDef.
mbed_official 59:2af474687369 75 *
mbed_official 59:2af474687369 76 * @return
mbed_official 59:2af474687369 77 * Error message string pointer.
mbed_official 59:2af474687369 78 ******************************************************************************/
mbed_official 59:2af474687369 79 char *USB_GetErrorMsgString( int error )
mbed_official 59:2af474687369 80 {
mbed_official 59:2af474687369 81 if ( error >= 0 )
mbed_official 59:2af474687369 82 return (char*)errMsg[ 0 ];
mbed_official 59:2af474687369 83
mbed_official 59:2af474687369 84 return (char*)errMsg[ -error ];
mbed_official 59:2af474687369 85 }
mbed_official 59:2af474687369 86
mbed_official 59:2af474687369 87
mbed_official 59:2af474687369 88 #if defined( USB_USE_PRINTF )
mbed_official 59:2af474687369 89 /***************************************************************************//**
mbed_official 59:2af474687369 90 * @brief
mbed_official 59:2af474687369 91 * Format and print a text string given an error code, prepends an optional user
mbed_official 59:2af474687369 92 * supplied leader string.
mbed_official 59:2af474687369 93 *
mbed_official 59:2af474687369 94 * @param[in] pre
mbed_official 59:2af474687369 95 * Optional leader string to prepend to error message string.
mbed_official 59:2af474687369 96 *
mbed_official 59:2af474687369 97 * @param[in] error
mbed_official 59:2af474687369 98 * Error code, see \ref USB_Status_TypeDef.
mbed_official 59:2af474687369 99 ******************************************************************************/
mbed_official 59:2af474687369 100 void USB_PrintErrorMsgString( char *pre, int error )
mbed_official 59:2af474687369 101 {
mbed_official 59:2af474687369 102 if ( pre )
mbed_official 59:2af474687369 103 {
mbed_official 59:2af474687369 104 USB_PRINTF( "%s", pre );
mbed_official 59:2af474687369 105 }
mbed_official 59:2af474687369 106
mbed_official 59:2af474687369 107 if ( error > USB_STATUS_OK )
mbed_official 59:2af474687369 108 {
mbed_official 59:2af474687369 109 USB_PRINTF( "%d", error );
mbed_official 59:2af474687369 110 }
mbed_official 59:2af474687369 111 else
mbed_official 59:2af474687369 112 {
mbed_official 59:2af474687369 113 USB_PRINTF( "%s", USB_GetErrorMsgString( error ) );
mbed_official 59:2af474687369 114 }
mbed_official 59:2af474687369 115 }
mbed_official 59:2af474687369 116 #endif /* defined( USB_USE_PRINTF ) */
mbed_official 59:2af474687369 117
mbed_official 59:2af474687369 118 /** @cond DO_NOT_INCLUDE_WITH_DOXYGEN */
mbed_official 59:2af474687369 119
mbed_official 59:2af474687369 120 #if defined( DEBUG_EFM_USER )
mbed_official 59:2af474687369 121 static void PrintI( int i )
mbed_official 59:2af474687369 122 {
mbed_official 59:2af474687369 123 #if !defined ( USER_PUTCHAR )
mbed_official 59:2af474687369 124 (void)i;
mbed_official 59:2af474687369 125 #else
mbed_official 59:2af474687369 126 if ( i >= 10 )
mbed_official 59:2af474687369 127 {
mbed_official 59:2af474687369 128 PrintI( i / 10 );
mbed_official 59:2af474687369 129 }
mbed_official 59:2af474687369 130
mbed_official 59:2af474687369 131 DEBUG_USB_API_PUTCHAR( ( i % 10 ) + '0' );
mbed_official 59:2af474687369 132 #endif
mbed_official 59:2af474687369 133 }
mbed_official 59:2af474687369 134
mbed_official 59:2af474687369 135 void assertEFM( const char *file, int line )
mbed_official 59:2af474687369 136 {
mbed_official 59:2af474687369 137 #if !defined ( USER_PUTCHAR )
mbed_official 59:2af474687369 138 (void)file;
mbed_official 59:2af474687369 139 #endif
mbed_official 59:2af474687369 140
mbed_official 59:2af474687369 141 DEBUG_USB_API_PUTS( "\nASSERT " );
mbed_official 59:2af474687369 142 DEBUG_USB_API_PUTS( file );
mbed_official 59:2af474687369 143 DEBUG_USB_API_PUTCHAR( ' ' );
mbed_official 59:2af474687369 144 PrintI( line );
mbed_official 59:2af474687369 145 for(;;){}
mbed_official 59:2af474687369 146 }
mbed_official 59:2af474687369 147 #endif /* defined( DEBUG_EFM_USER ) */
mbed_official 59:2af474687369 148
mbed_official 59:2af474687369 149 #if defined ( USER_PUTCHAR )
mbed_official 59:2af474687369 150 void USB_Puts( const char *p )
mbed_official 59:2af474687369 151 {
mbed_official 59:2af474687369 152 while( *p )
mbed_official 59:2af474687369 153 USB_PUTCHAR( *p++ );
mbed_official 59:2af474687369 154 }
mbed_official 59:2af474687369 155 #endif /* defined ( USER_PUTCHAR ) */
mbed_official 59:2af474687369 156
mbed_official 59:2af474687369 157 void USBHAL_CoreReset( void )
mbed_official 59:2af474687369 158 {
mbed_official 59:2af474687369 159 USB->PCGCCTL &= ~USB_PCGCCTL_STOPPCLK;
mbed_official 59:2af474687369 160 USB->PCGCCTL &= ~(USB_PCGCCTL_PWRCLMP | USB_PCGCCTL_RSTPDWNMODULE);
mbed_official 59:2af474687369 161
mbed_official 59:2af474687369 162 /* Core Soft Reset */
mbed_official 59:2af474687369 163 USB->GRSTCTL |= USB_GRSTCTL_CSFTRST;
mbed_official 59:2af474687369 164 while ( USB->GRSTCTL & USB_GRSTCTL_CSFTRST ) {}
mbed_official 59:2af474687369 165
mbed_official 59:2af474687369 166 USBTIMER_DelayUs( 1 );
mbed_official 59:2af474687369 167
mbed_official 59:2af474687369 168 /* Wait for AHB master IDLE state. */
mbed_official 59:2af474687369 169 while ( !( USB->GRSTCTL & USB_GRSTCTL_AHBIDLE ) ) {}
mbed_official 59:2af474687369 170 }
mbed_official 59:2af474687369 171
mbed_official 59:2af474687369 172 #ifdef USB_DEVICE
mbed_official 59:2af474687369 173 void USBDHAL_Connect( void )
mbed_official 59:2af474687369 174 {
mbed_official 59:2af474687369 175 USB->DCTL &= ~( DCTL_WO_BITMASK | USB_DCTL_SFTDISCON );
mbed_official 59:2af474687369 176 }
mbed_official 59:2af474687369 177
mbed_official 59:2af474687369 178 USB_Status_TypeDef USBDHAL_CoreInit( uint32_t totalRxFifoSize,
mbed_official 59:2af474687369 179 uint32_t totalTxFifoSize )
mbed_official 59:2af474687369 180 {
mbed_official 59:2af474687369 181 uint8_t i, j;
mbed_official 59:2af474687369 182 uint16_t start, depth;
mbed_official 59:2af474687369 183 USBD_Ep_TypeDef *ep;
mbed_official 59:2af474687369 184
mbed_official 59:2af474687369 185 #if !defined( USB_VBUS_SWITCH_NOT_PRESENT )
mbed_official 59:2af474687369 186 CMU_ClockEnable( cmuClock_GPIO, true );
mbed_official 59:2af474687369 187 GPIO_PinModeSet( gpioPortF, 5, gpioModePushPull, 0 ); /* Enable VBUSEN pin */
mbed_official 59:2af474687369 188 USB->ROUTE = USB_ROUTE_PHYPEN | USB_ROUTE_VBUSENPEN; /* Enable PHY pins. */
mbed_official 59:2af474687369 189 #else
mbed_official 59:2af474687369 190 USB->ROUTE = USB_ROUTE_PHYPEN; /* Enable PHY pins. */
mbed_official 59:2af474687369 191 #endif
mbed_official 59:2af474687369 192
mbed_official 59:2af474687369 193 USBHAL_CoreReset(); /* Reset USB core */
mbed_official 59:2af474687369 194
mbed_official 59:2af474687369 195 #if defined( USB_GUSBCFG_FORCEHSTMODE )
mbed_official 59:2af474687369 196 /* Force Device Mode */
mbed_official 59:2af474687369 197 USB->GUSBCFG = ( USB->GUSBCFG &
mbed_official 59:2af474687369 198 ~(GUSBCFG_WO_BITMASK | USB_GUSBCFG_FORCEHSTMODE ) ) |
mbed_official 59:2af474687369 199 USB_GUSBCFG_FORCEDEVMODE;
mbed_official 59:2af474687369 200 #endif
mbed_official 59:2af474687369 201
mbed_official 59:2af474687369 202 INT_Enable();
mbed_official 59:2af474687369 203 USBTIMER_DelayMs( 50 );
mbed_official 59:2af474687369 204 INT_Disable();
mbed_official 59:2af474687369 205
mbed_official 59:2af474687369 206 /* Set device speed */
mbed_official 59:2af474687369 207 USB->DCFG = ( USB->DCFG & ~_USB_DCFG_DEVSPD_MASK ) | 3; /* Full speed PHY */
mbed_official 59:2af474687369 208
mbed_official 59:2af474687369 209 /* Stall on non-zero len status OUT packets (ctrl transfers). */
mbed_official 59:2af474687369 210 USB->DCFG |= USB_DCFG_NZSTSOUTHSHK;
mbed_official 59:2af474687369 211
mbed_official 59:2af474687369 212 /* Set periodic frame interval to 80% */
mbed_official 59:2af474687369 213 USB->DCFG &= ~_USB_DCFG_PERFRINT_MASK;
mbed_official 59:2af474687369 214
mbed_official 59:2af474687369 215 USB->GAHBCFG = ( USB->GAHBCFG & ~_USB_GAHBCFG_HBSTLEN_MASK ) |
mbed_official 59:2af474687369 216 USB_GAHBCFG_DMAEN | USB_GAHBCFG_HBSTLEN_INCR;
mbed_official 59:2af474687369 217
mbed_official 59:2af474687369 218 /* Ignore frame numbers on ISO transfers. */
mbed_official 59:2af474687369 219 USB->DCTL = ( USB->DCTL & ~DCTL_WO_BITMASK ) | USB_DCTL_IGNRFRMNUM;
mbed_official 59:2af474687369 220
mbed_official 59:2af474687369 221 /* Set Rx FIFO size */
mbed_official 59:2af474687369 222 start = EFM32_MAX( totalRxFifoSize, MIN_EP_FIFO_SIZE_INWORDS );
mbed_official 59:2af474687369 223 USB->GRXFSIZ = ( start << _USB_GRXFSIZ_RXFDEP_SHIFT ) &
mbed_official 59:2af474687369 224 _USB_GRXFSIZ_RXFDEP_MASK;
mbed_official 59:2af474687369 225
mbed_official 59:2af474687369 226 /* Set Tx EP0 FIFO size */
mbed_official 59:2af474687369 227 depth = EFM32_MAX( dev->ep[ 0 ].fifoSize, MIN_EP_FIFO_SIZE_INWORDS );
mbed_official 59:2af474687369 228 USB->GNPTXFSIZ = ( ( depth << _USB_GNPTXFSIZ_NPTXFINEPTXF0DEP_SHIFT ) &
mbed_official 59:2af474687369 229 _USB_GNPTXFSIZ_NPTXFINEPTXF0DEP_MASK ) |
mbed_official 59:2af474687369 230 ( ( start << _USB_GNPTXFSIZ_NPTXFSTADDR_SHIFT ) &
mbed_official 59:2af474687369 231 _USB_GNPTXFSIZ_NPTXFSTADDR_MASK );
mbed_official 59:2af474687369 232
mbed_official 59:2af474687369 233
mbed_official 59:2af474687369 234 /* Set Tx EP FIFO sizes for all IN ep's */
mbed_official 59:2af474687369 235 for ( j = 1; j <= MAX_NUM_TX_FIFOS; j++ )
mbed_official 59:2af474687369 236 {
mbed_official 59:2af474687369 237 for ( i = 1; i <= MAX_NUM_IN_EPS; i++ )
mbed_official 59:2af474687369 238 {
mbed_official 59:2af474687369 239 ep = USBD_GetEpFromAddr( USB_SETUP_DIR_MASK | i );
mbed_official 59:2af474687369 240 if ( ep ) /* Is EP in use ? */
mbed_official 59:2af474687369 241 {
mbed_official 59:2af474687369 242 if ( ep->txFifoNum == j ) /* Is it correct FIFO number ? */
mbed_official 59:2af474687369 243 {
mbed_official 59:2af474687369 244 start += depth;
mbed_official 59:2af474687369 245 depth = EFM32_MAX( ep->fifoSize, MIN_EP_FIFO_SIZE_INWORDS );
mbed_official 59:2af474687369 246 USB_DIEPTXFS[ ep->txFifoNum - 1 ] =
mbed_official 59:2af474687369 247 ( depth << _USB_DIEPTXF1_INEPNTXFDEP_SHIFT ) |
mbed_official 59:2af474687369 248 ( start & _USB_DIEPTXF1_INEPNTXFSTADDR_MASK );
mbed_official 59:2af474687369 249 }
mbed_official 59:2af474687369 250 }
mbed_official 59:2af474687369 251 }
mbed_official 59:2af474687369 252 }
mbed_official 59:2af474687369 253
mbed_official 59:2af474687369 254 if ( totalRxFifoSize + totalTxFifoSize > MAX_DEVICE_FIFO_SIZE_INWORDS )
mbed_official 59:2af474687369 255 return USB_STATUS_ILLEGAL;
mbed_official 59:2af474687369 256
mbed_official 59:2af474687369 257 if ( start > MAX_DEVICE_FIFO_SIZE_INWORDS )
mbed_official 59:2af474687369 258 return USB_STATUS_ILLEGAL;
mbed_official 59:2af474687369 259
mbed_official 59:2af474687369 260 /* Flush the FIFO's */
mbed_official 59:2af474687369 261 USBHAL_FlushTxFifo( 0x10 ); /* All Tx FIFO's */
mbed_official 59:2af474687369 262 USBHAL_FlushRxFifo(); /* The Rx FIFO */
mbed_official 59:2af474687369 263
mbed_official 59:2af474687369 264 /* Disable all device interrupts */
mbed_official 59:2af474687369 265 USB->DIEPMSK = 0;
mbed_official 59:2af474687369 266 USB->DOEPMSK = 0;
mbed_official 59:2af474687369 267 USB->DAINTMSK = 0;
mbed_official 59:2af474687369 268 USB->DIEPEMPMSK = 0;
mbed_official 59:2af474687369 269
mbed_official 59:2af474687369 270 /* Disable all EP's, clear all EP ints. */
mbed_official 59:2af474687369 271 for ( i = 0; i <= MAX_NUM_IN_EPS; i++ )
mbed_official 59:2af474687369 272 {
mbed_official 59:2af474687369 273 USB_DINEPS[ i ].CTL = 0;
mbed_official 59:2af474687369 274 USB_DINEPS[ i ].TSIZ = 0;
mbed_official 59:2af474687369 275 USB_DINEPS[ i ].INT = 0xFFFFFFFF;
mbed_official 59:2af474687369 276 }
mbed_official 59:2af474687369 277
mbed_official 59:2af474687369 278 for ( i = 0; i <= MAX_NUM_OUT_EPS; i++ )
mbed_official 59:2af474687369 279 {
mbed_official 59:2af474687369 280 USB_DOUTEPS[ i ].CTL = 0;
mbed_official 59:2af474687369 281 USB_DOUTEPS[ i ].TSIZ = 0;
mbed_official 59:2af474687369 282 USB_DOUTEPS[ i ].INT = 0xFFFFFFFF;
mbed_official 59:2af474687369 283 }
mbed_official 59:2af474687369 284
mbed_official 59:2af474687369 285 #if ( USB_DCTL_SFTDISCON_DEFAULT != 0 )
mbed_official 59:2af474687369 286 USBD_Connect();
mbed_official 59:2af474687369 287 #endif
mbed_official 59:2af474687369 288
mbed_official 59:2af474687369 289 /* Enable VREGO sense. */
mbed_official 59:2af474687369 290 USB->CTRL |= USB_CTRL_VREGOSEN;
mbed_official 59:2af474687369 291 USB->IFC = USB_IFC_VREGOSH | USB_IFC_VREGOSL;
mbed_official 59:2af474687369 292 USB->IEN = USB_IFC_VREGOSH | USB_IFC_VREGOSL;
mbed_official 59:2af474687369 293 /* Force a VREGO interrupt. */
mbed_official 59:2af474687369 294 if ( USB->STATUS & USB_STATUS_VREGOS)
mbed_official 59:2af474687369 295 USB->IFS = USB_IFS_VREGOSH;
mbed_official 59:2af474687369 296 else
mbed_official 59:2af474687369 297 USB->IFS = USB_IFS_VREGOSL;
mbed_official 59:2af474687369 298
mbed_official 59:2af474687369 299 return USB_STATUS_OK;
mbed_official 59:2af474687369 300 }
mbed_official 59:2af474687369 301
mbed_official 59:2af474687369 302 USB_Status_TypeDef USBDHAL_ReconfigureFifos( uint32_t totalRxFifoSize,
mbed_official 59:2af474687369 303 uint32_t totalTxFifoSize )
mbed_official 59:2af474687369 304 {
mbed_official 59:2af474687369 305 uint8_t i, j;
mbed_official 59:2af474687369 306 uint16_t start, depth;
mbed_official 59:2af474687369 307 USBD_Ep_TypeDef *ep;
mbed_official 59:2af474687369 308
mbed_official 59:2af474687369 309 /* Set Rx FIFO size */
mbed_official 59:2af474687369 310 start = EFM32_MAX( totalRxFifoSize, MIN_EP_FIFO_SIZE_INWORDS );
mbed_official 59:2af474687369 311 USB->GRXFSIZ = ( start << _USB_GRXFSIZ_RXFDEP_SHIFT ) &
mbed_official 59:2af474687369 312 _USB_GRXFSIZ_RXFDEP_MASK;
mbed_official 59:2af474687369 313
mbed_official 59:2af474687369 314 /* Set Tx EP0 FIFO size */
mbed_official 59:2af474687369 315 depth = EFM32_MAX( dev->ep[ 0 ].fifoSize, MIN_EP_FIFO_SIZE_INWORDS );
mbed_official 59:2af474687369 316 USB->GNPTXFSIZ = ( ( depth << _USB_GNPTXFSIZ_NPTXFINEPTXF0DEP_SHIFT ) &
mbed_official 59:2af474687369 317 _USB_GNPTXFSIZ_NPTXFINEPTXF0DEP_MASK ) |
mbed_official 59:2af474687369 318 ( ( start << _USB_GNPTXFSIZ_NPTXFSTADDR_SHIFT ) &
mbed_official 59:2af474687369 319 _USB_GNPTXFSIZ_NPTXFSTADDR_MASK );
mbed_official 59:2af474687369 320
mbed_official 59:2af474687369 321
mbed_official 59:2af474687369 322 /* Set Tx EP FIFO sizes for all IN ep's */
mbed_official 59:2af474687369 323 for ( j = 1; j <= MAX_NUM_TX_FIFOS; j++ )
mbed_official 59:2af474687369 324 {
mbed_official 59:2af474687369 325 for ( i = 1; i <= MAX_NUM_IN_EPS; i++ )
mbed_official 59:2af474687369 326 {
mbed_official 59:2af474687369 327 ep = USBD_GetEpFromAddr( USB_SETUP_DIR_MASK | i );
mbed_official 59:2af474687369 328 if ( ep ) /* Is EP in use ? */
mbed_official 59:2af474687369 329 {
mbed_official 59:2af474687369 330 if ( ep->txFifoNum == j ) /* Is it correct FIFO number ? */
mbed_official 59:2af474687369 331 {
mbed_official 59:2af474687369 332 start += depth;
mbed_official 59:2af474687369 333 depth = EFM32_MAX( ep->fifoSize, MIN_EP_FIFO_SIZE_INWORDS );
mbed_official 59:2af474687369 334 USB_DIEPTXFS[ ep->txFifoNum - 1 ] =
mbed_official 59:2af474687369 335 ( depth << _USB_DIEPTXF1_INEPNTXFDEP_SHIFT ) |
mbed_official 59:2af474687369 336 ( start & _USB_DIEPTXF1_INEPNTXFSTADDR_MASK );
mbed_official 59:2af474687369 337 }
mbed_official 59:2af474687369 338 }
mbed_official 59:2af474687369 339 }
mbed_official 59:2af474687369 340 }
mbed_official 59:2af474687369 341
mbed_official 59:2af474687369 342 if ( totalRxFifoSize + totalTxFifoSize > MAX_DEVICE_FIFO_SIZE_INWORDS )
mbed_official 59:2af474687369 343 return USB_STATUS_ILLEGAL;
mbed_official 59:2af474687369 344
mbed_official 59:2af474687369 345 if ( start > MAX_DEVICE_FIFO_SIZE_INWORDS )
mbed_official 59:2af474687369 346 return USB_STATUS_ILLEGAL;
mbed_official 59:2af474687369 347
mbed_official 59:2af474687369 348 /* Flush the FIFO's */
mbed_official 59:2af474687369 349 USBHAL_FlushTxFifo( 0x10 ); /* All Tx FIFO's */
mbed_official 59:2af474687369 350 USBHAL_FlushRxFifo(); /* The Rx FIFO */
mbed_official 59:2af474687369 351
mbed_official 59:2af474687369 352 return USB_STATUS_OK;
mbed_official 59:2af474687369 353 }
mbed_official 59:2af474687369 354
mbed_official 59:2af474687369 355 void USBDHAL_Disconnect( void )
mbed_official 59:2af474687369 356 {
mbed_official 59:2af474687369 357 USB->DCTL = ( USB->DCTL & ~DCTL_WO_BITMASK ) | USB_DCTL_SFTDISCON;
mbed_official 59:2af474687369 358 }
mbed_official 59:2af474687369 359
mbed_official 59:2af474687369 360 void USBDHAL_AbortEpIn( USBD_Ep_TypeDef *ep )
mbed_official 59:2af474687369 361 {
mbed_official 59:2af474687369 362 /* Clear epdis & inepnakeff INT's */
mbed_official 59:2af474687369 363 USB_DINEPS[ ep->num ].INT |= USB_DIEP_INT_EPDISBLD |
mbed_official 59:2af474687369 364 USB_DIEP_INT_INEPNAKEFF;
mbed_official 59:2af474687369 365
mbed_official 59:2af474687369 366 /* Enable epdis & inepnakeff INT's */
mbed_official 59:2af474687369 367 USB->DIEPMSK |= USB_DIEPMSK_EPDISBLDMSK | USB_DIEPMSK_INEPNAKEFFMSK;
mbed_official 59:2af474687369 368 USB_DINEPS[ ep->num ].CTL = ( USB_DINEPS[ ep->num ].CTL &
mbed_official 59:2af474687369 369 ~DEPCTL_WO_BITMASK ) |
mbed_official 59:2af474687369 370 USB_DIEP_CTL_SNAK;
mbed_official 59:2af474687369 371
mbed_official 59:2af474687369 372 /* Wait for inepnakeff INT */
mbed_official 59:2af474687369 373 while ( !( USBDHAL_GetInEpInts( ep ) & USB_DIEP_INT_INEPNAKEFF ) ) {}
mbed_official 59:2af474687369 374 USB_DINEPS[ ep->num ].INT = USB_DIEP_INT_INEPNAKEFF;
mbed_official 59:2af474687369 375 USB->DIEPMSK &= ~USB_DIEPMSK_INEPNAKEFFMSK;
mbed_official 59:2af474687369 376
mbed_official 59:2af474687369 377 DEBUG_USB_INT_LO_PUTCHAR( '.' );
mbed_official 59:2af474687369 378
mbed_official 59:2af474687369 379 USBDHAL_SetEPDISNAK( ep );
mbed_official 59:2af474687369 380 /* Wait for epdis INT */
mbed_official 59:2af474687369 381 while ( !( USBDHAL_GetInEpInts( ep ) & USB_DIEP_INT_EPDISBLD ) ) {}
mbed_official 59:2af474687369 382 USB_DINEPS[ ep->num ].INT = USB_DIEP_INT_EPDISBLD;
mbed_official 59:2af474687369 383 USB->DIEPMSK &= ~USB_DIEPMSK_EPDISBLDMSK;
mbed_official 59:2af474687369 384 USBHAL_FlushTxFifo( ep->txFifoNum );
mbed_official 59:2af474687369 385
mbed_official 59:2af474687369 386 /* Clear any interrupts generated by the abort sequence. */
mbed_official 59:2af474687369 387 NVIC_ClearPendingIRQ( USB_IRQn );
mbed_official 59:2af474687369 388
mbed_official 59:2af474687369 389 DEBUG_USB_INT_LO_PUTCHAR( '.' );
mbed_official 59:2af474687369 390 }
mbed_official 59:2af474687369 391
mbed_official 59:2af474687369 392 void USBDHAL_AbortEpOut( USBD_Ep_TypeDef *ep )
mbed_official 59:2af474687369 393 {
mbed_official 59:2af474687369 394 int cnt;
mbed_official 59:2af474687369 395
mbed_official 59:2af474687369 396 /* Clear epdis INT's */
mbed_official 59:2af474687369 397 USB_DOUTEPS[ ep->num ].INT |= USB_DOEP_INT_EPDISBLD;
mbed_official 59:2af474687369 398
mbed_official 59:2af474687369 399 /* Clear Global OUT NAK if already set */
mbed_official 59:2af474687369 400 USB->DCTL = ( USB->DCTL & ~DCTL_WO_BITMASK ) | USB_DCTL_CGOUTNAK;
mbed_official 59:2af474687369 401 USB->GINTMSK |= USB_GINTMSK_GOUTNAKEFFMSK; /* Enable GOUTNAKEFF int */
mbed_official 59:2af474687369 402
mbed_official 59:2af474687369 403 /* Set Global OUT NAK */
mbed_official 59:2af474687369 404 USB->DCTL = ( USB->DCTL & ~DCTL_WO_BITMASK ) | USB_DCTL_SGOUTNAK;
mbed_official 59:2af474687369 405
mbed_official 59:2af474687369 406 /* Wait for goutnakeff */
mbed_official 59:2af474687369 407 cnt = EPABORT_BREAK_LOOP_COUNT;
mbed_official 59:2af474687369 408 while ( !( USB->GINTSTS & USB_GINTSTS_GOUTNAKEFF ) && cnt )
mbed_official 59:2af474687369 409 {
mbed_official 59:2af474687369 410 cnt--;
mbed_official 59:2af474687369 411 }
mbed_official 59:2af474687369 412
mbed_official 59:2af474687369 413 USB->GINTMSK &= ~USB_GINTMSK_GOUTNAKEFFMSK; /* Disable GOUTNAKEFF int */
mbed_official 59:2af474687369 414 USB->DOEPMSK |= USB_DOEPMSK_EPDISBLDMSK; /* Enable EPDIS interrupt */
mbed_official 59:2af474687369 415
mbed_official 59:2af474687369 416 DEBUG_USB_INT_LO_PUTCHAR( ',' );
mbed_official 59:2af474687369 417
mbed_official 59:2af474687369 418 USBDHAL_SetEPDISNAK( ep ); /* Disable ep */
mbed_official 59:2af474687369 419
mbed_official 59:2af474687369 420 /* Wait for epdis INT */
mbed_official 59:2af474687369 421 cnt = EPABORT_BREAK_LOOP_COUNT;
mbed_official 59:2af474687369 422 while ( !( USBDHAL_GetOutEpInts( ep ) & USB_DOEP_INT_EPDISBLD ) && cnt )
mbed_official 59:2af474687369 423 {
mbed_official 59:2af474687369 424 cnt--;
mbed_official 59:2af474687369 425 }
mbed_official 59:2af474687369 426
mbed_official 59:2af474687369 427 USB_DOUTEPS[ ep->num ].INT = USB_DOEP_INT_EPDISBLD;
mbed_official 59:2af474687369 428 USB->DOEPMSK &= ~USB_DOEPMSK_EPDISBLDMSK; /* Disable EPDIS interrupt */
mbed_official 59:2af474687369 429
mbed_official 59:2af474687369 430 /* Clear Global OUT NAK */
mbed_official 59:2af474687369 431 USB->DCTL = ( USB->DCTL & ~DCTL_WO_BITMASK ) | USB_DCTL_CGOUTNAK;
mbed_official 59:2af474687369 432
mbed_official 59:2af474687369 433 /* Clear any interrupts generated by the abort sequence. */
mbed_official 59:2af474687369 434 NVIC_ClearPendingIRQ( USB_IRQn );
mbed_official 59:2af474687369 435
mbed_official 59:2af474687369 436 DEBUG_USB_INT_LO_PUTCHAR( ',' );
mbed_official 59:2af474687369 437 }
mbed_official 59:2af474687369 438
mbed_official 59:2af474687369 439 void USBDHAL_AbortAllEps( void )
mbed_official 59:2af474687369 440 {
mbed_official 59:2af474687369 441 int i, cnt;
mbed_official 59:2af474687369 442 USBD_Ep_TypeDef *ep;
mbed_official 59:2af474687369 443 uint16_t im, om, inmask=0, outmask=0;
mbed_official 59:2af474687369 444
mbed_official 59:2af474687369 445 /* Clear epdis & inepnakeff INT's */
mbed_official 59:2af474687369 446 for ( i = 1; i <= NUM_EP_USED; i++ )
mbed_official 59:2af474687369 447 {
mbed_official 59:2af474687369 448 ep = &dev->ep[i];
mbed_official 59:2af474687369 449 if ( ep->state != D_EP_IDLE )
mbed_official 59:2af474687369 450 {
mbed_official 59:2af474687369 451 if ( ep->in )
mbed_official 59:2af474687369 452 {
mbed_official 59:2af474687369 453 inmask |= ep->mask;
mbed_official 59:2af474687369 454 USB_DINEPS[ ep->num ].INT |= USB_DIEP_INT_EPDISBLD |
mbed_official 59:2af474687369 455 USB_DIEP_INT_INEPNAKEFF;
mbed_official 59:2af474687369 456 }
mbed_official 59:2af474687369 457 else
mbed_official 59:2af474687369 458 {
mbed_official 59:2af474687369 459 outmask |= ep->mask;
mbed_official 59:2af474687369 460 USB_DOUTEPS[ ep->num ].INT |= USB_DOEP_INT_EPDISBLD;
mbed_official 59:2af474687369 461 }
mbed_official 59:2af474687369 462 }
mbed_official 59:2af474687369 463 }
mbed_official 59:2af474687369 464
mbed_official 59:2af474687369 465 if ( inmask )
mbed_official 59:2af474687369 466 {
mbed_official 59:2af474687369 467 /* Enable epdis & inepnakeff INT's */
mbed_official 59:2af474687369 468 USB->DIEPMSK |= USB_DIEPMSK_EPDISBLDMSK | USB_DIEPMSK_INEPNAKEFFMSK;
mbed_official 59:2af474687369 469
mbed_official 59:2af474687369 470 /* Set NAK on all IN ep's */
mbed_official 59:2af474687369 471 im = inmask;
mbed_official 59:2af474687369 472 for ( i = 1; i <= NUM_EP_USED; i++ )
mbed_official 59:2af474687369 473 {
mbed_official 59:2af474687369 474 ep = &dev->ep[i];
mbed_official 59:2af474687369 475 if ( im & ep->mask )
mbed_official 59:2af474687369 476 {
mbed_official 59:2af474687369 477 USB_DINEPS[ ep->num ].CTL = ( USB_DINEPS[ ep->num ].CTL &
mbed_official 59:2af474687369 478 ~DEPCTL_WO_BITMASK ) |
mbed_official 59:2af474687369 479 USB_DIEP_CTL_SNAK;
mbed_official 59:2af474687369 480 }
mbed_official 59:2af474687369 481 }
mbed_official 59:2af474687369 482 }
mbed_official 59:2af474687369 483
mbed_official 59:2af474687369 484 if ( outmask )
mbed_official 59:2af474687369 485 {
mbed_official 59:2af474687369 486 /* Clear Global OUT NAK if already set */
mbed_official 59:2af474687369 487 USB->DCTL = ( USB->DCTL & ~DCTL_WO_BITMASK ) | USB_DCTL_CGOUTNAK;
mbed_official 59:2af474687369 488
mbed_official 59:2af474687369 489 USB->GINTMSK |= USB_GINTMSK_GOUTNAKEFFMSK; /* Enable GOUTNAKEFF int */
mbed_official 59:2af474687369 490
mbed_official 59:2af474687369 491 /* Set Global OUT NAK */
mbed_official 59:2af474687369 492 USB->DCTL = ( USB->DCTL & ~DCTL_WO_BITMASK ) | USB_DCTL_SGOUTNAK;
mbed_official 59:2af474687369 493
mbed_official 59:2af474687369 494 /* Wait for goutnakeff */
mbed_official 59:2af474687369 495 cnt = EPABORT_BREAK_LOOP_COUNT;
mbed_official 59:2af474687369 496 while ( !( USB->GINTSTS & USB_GINTSTS_GOUTNAKEFF ) && cnt )
mbed_official 59:2af474687369 497 {
mbed_official 59:2af474687369 498 cnt--;
mbed_official 59:2af474687369 499 }
mbed_official 59:2af474687369 500 USB->GINTMSK &= ~USB_GINTMSK_GOUTNAKEFFMSK; /* Disable GOUTNAKEFF int */
mbed_official 59:2af474687369 501 USB->DOEPMSK |= USB_DOEPMSK_EPDISBLDMSK; /* Enable EPDIS interrupt */
mbed_official 59:2af474687369 502 }
mbed_official 59:2af474687369 503
mbed_official 59:2af474687369 504 if ( inmask )
mbed_official 59:2af474687369 505 {
mbed_official 59:2af474687369 506 /* Wait for inepnakeff INT on all IN ep's */
mbed_official 59:2af474687369 507 im = inmask;
mbed_official 59:2af474687369 508 cnt = EPABORT_BREAK_LOOP_COUNT;
mbed_official 59:2af474687369 509 do
mbed_official 59:2af474687369 510 {
mbed_official 59:2af474687369 511 for ( i = 1; i <= NUM_EP_USED; i++ )
mbed_official 59:2af474687369 512 {
mbed_official 59:2af474687369 513 ep = &dev->ep[i];
mbed_official 59:2af474687369 514 if ( im & ep->mask )
mbed_official 59:2af474687369 515 {
mbed_official 59:2af474687369 516 if ( USBDHAL_GetInEpInts( ep ) & USB_DIEP_INT_INEPNAKEFF )
mbed_official 59:2af474687369 517 {
mbed_official 59:2af474687369 518 USB_DINEPS[ ep->num ].INT = USB_DIEP_INT_INEPNAKEFF;
mbed_official 59:2af474687369 519 im &= ~ep->mask;
mbed_official 59:2af474687369 520 }
mbed_official 59:2af474687369 521 }
mbed_official 59:2af474687369 522 }
mbed_official 59:2af474687369 523 cnt--;
mbed_official 59:2af474687369 524 } while ( im && cnt );
mbed_official 59:2af474687369 525 USB->DIEPMSK &= ~USB_DIEPMSK_INEPNAKEFFMSK;
mbed_official 59:2af474687369 526 }
mbed_official 59:2af474687369 527
mbed_official 59:2af474687369 528 DEBUG_USB_INT_LO_PUTCHAR( '\'' );
mbed_official 59:2af474687369 529
mbed_official 59:2af474687369 530 /* Disable ep's */
mbed_official 59:2af474687369 531 for ( i = 1; i <= NUM_EP_USED; i++ )
mbed_official 59:2af474687369 532 {
mbed_official 59:2af474687369 533 ep = &dev->ep[i];
mbed_official 59:2af474687369 534 if ( ep->state != D_EP_IDLE )
mbed_official 59:2af474687369 535 {
mbed_official 59:2af474687369 536 USBDHAL_SetEPDISNAK( ep );
mbed_official 59:2af474687369 537 }
mbed_official 59:2af474687369 538 }
mbed_official 59:2af474687369 539
mbed_official 59:2af474687369 540 /* Wait for epdis INT */
mbed_official 59:2af474687369 541 im = inmask;
mbed_official 59:2af474687369 542 om = outmask;
mbed_official 59:2af474687369 543 cnt = EPABORT_BREAK_LOOP_COUNT;
mbed_official 59:2af474687369 544 do
mbed_official 59:2af474687369 545 {
mbed_official 59:2af474687369 546 for ( i = 1; i <= NUM_EP_USED; i++ )
mbed_official 59:2af474687369 547 {
mbed_official 59:2af474687369 548 ep = &dev->ep[i];
mbed_official 59:2af474687369 549 if ( ep->in && ( im & ep->mask ) )
mbed_official 59:2af474687369 550 {
mbed_official 59:2af474687369 551 if ( USBDHAL_GetInEpInts( ep ) & USB_DIEP_INT_EPDISBLD )
mbed_official 59:2af474687369 552 {
mbed_official 59:2af474687369 553 USB_DINEPS[ ep->num ].INT = USB_DIEP_INT_EPDISBLD;
mbed_official 59:2af474687369 554 im &= ~ep->mask;
mbed_official 59:2af474687369 555 }
mbed_official 59:2af474687369 556 }
mbed_official 59:2af474687369 557
mbed_official 59:2af474687369 558 if ( !ep->in && ( om & ep->mask ) )
mbed_official 59:2af474687369 559 {
mbed_official 59:2af474687369 560 if ( USBDHAL_GetOutEpInts( ep ) & USB_DOEP_INT_EPDISBLD )
mbed_official 59:2af474687369 561 {
mbed_official 59:2af474687369 562 USB_DOUTEPS[ ep->num ].INT = USB_DOEP_INT_EPDISBLD;
mbed_official 59:2af474687369 563 om &= ~ep->mask;
mbed_official 59:2af474687369 564 }
mbed_official 59:2af474687369 565 }
mbed_official 59:2af474687369 566 }
mbed_official 59:2af474687369 567 cnt--;
mbed_official 59:2af474687369 568 } while ( ( im || om ) && cnt );
mbed_official 59:2af474687369 569
mbed_official 59:2af474687369 570 if ( inmask )
mbed_official 59:2af474687369 571 {
mbed_official 59:2af474687369 572 USB->DIEPMSK &= ~USB_DIEPMSK_EPDISBLDMSK; /* Disable EPDIS interrupt */
mbed_official 59:2af474687369 573 USBHAL_FlushTxFifo( 0x10 ); /* Flush all Tx FIFO's */
mbed_official 59:2af474687369 574 }
mbed_official 59:2af474687369 575
mbed_official 59:2af474687369 576 if ( outmask )
mbed_official 59:2af474687369 577 {
mbed_official 59:2af474687369 578 USB->DOEPMSK &= ~USB_DOEPMSK_EPDISBLDMSK; /* Disable EPDIS interrupt */
mbed_official 59:2af474687369 579 /* Clear Global OUT NAK */
mbed_official 59:2af474687369 580 USB->DCTL = ( USB->DCTL & ~DCTL_WO_BITMASK ) | USB_DCTL_CGOUTNAK;
mbed_official 59:2af474687369 581 }
mbed_official 59:2af474687369 582
mbed_official 59:2af474687369 583 DEBUG_USB_INT_LO_PUTCHAR( '\'' );
mbed_official 59:2af474687369 584 }
mbed_official 59:2af474687369 585
mbed_official 59:2af474687369 586 void USBDHAL_AbortAllTransfers( USB_Status_TypeDef reason )
mbed_official 59:2af474687369 587 {
mbed_official 59:2af474687369 588 int i;
mbed_official 59:2af474687369 589 USBD_Ep_TypeDef *ep;
mbed_official 59:2af474687369 590 USB_XferCompleteCb_TypeDef callback;
mbed_official 59:2af474687369 591
mbed_official 59:2af474687369 592 if ( reason != USB_STATUS_DEVICE_RESET )
mbed_official 59:2af474687369 593 {
mbed_official 59:2af474687369 594 USBDHAL_AbortAllEps();
mbed_official 59:2af474687369 595 }
mbed_official 59:2af474687369 596
mbed_official 59:2af474687369 597 for ( i = 1; i <= NUM_EP_USED; i++ )
mbed_official 59:2af474687369 598 {
mbed_official 59:2af474687369 599 ep = &(dev->ep[i]);
mbed_official 59:2af474687369 600 if ( ep->state != D_EP_IDLE )
mbed_official 59:2af474687369 601 {
mbed_official 59:2af474687369 602 ep->state = D_EP_IDLE;
mbed_official 59:2af474687369 603 if ( ep->xferCompleteCb )
mbed_official 59:2af474687369 604 {
mbed_official 59:2af474687369 605 callback = ep->xferCompleteCb;
mbed_official 59:2af474687369 606 ep->xferCompleteCb = NULL;
mbed_official 59:2af474687369 607
mbed_official 59:2af474687369 608 if ( ( dev->lastState == USBD_STATE_CONFIGURED ) &&
mbed_official 59:2af474687369 609 ( dev->state == USBD_STATE_ADDRESSED ) )
mbed_official 59:2af474687369 610 {
mbed_official 59:2af474687369 611 USBDHAL_DeactivateEp( ep );
mbed_official 59:2af474687369 612 }
mbed_official 59:2af474687369 613
mbed_official 59:2af474687369 614 DEBUG_TRACE_ABORT( reason );
mbed_official 59:2af474687369 615 callback( reason, ep->xferred, ep->remaining );
mbed_official 59:2af474687369 616 }
mbed_official 59:2af474687369 617 }
mbed_official 59:2af474687369 618 }
mbed_official 59:2af474687369 619
mbed_official 59:2af474687369 620 /* Clear any interrupts generated by the abort sequence. */
mbed_official 59:2af474687369 621 NVIC_ClearPendingIRQ( USB_IRQn );
mbed_official 59:2af474687369 622 }
mbed_official 59:2af474687369 623 #endif /* defined( USB_DEVICE ) */
mbed_official 59:2af474687369 624
mbed_official 59:2af474687369 625 #if defined( USB_HOST )
mbed_official 59:2af474687369 626 USB_Status_TypeDef USBHHAL_CoreInit( uint32_t rxFifoSize,
mbed_official 59:2af474687369 627 uint32_t nptxFifoSize,
mbed_official 59:2af474687369 628 uint32_t ptxFifoSize )
mbed_official 59:2af474687369 629 {
mbed_official 59:2af474687369 630 uint8_t i;
mbed_official 59:2af474687369 631
mbed_official 59:2af474687369 632 rxFifoSize /= 4; /* Convert from byte count to word count. */
mbed_official 59:2af474687369 633 nptxFifoSize /= 4;
mbed_official 59:2af474687369 634 ptxFifoSize /= 4;
mbed_official 59:2af474687369 635
mbed_official 59:2af474687369 636 CMU_ClockEnable( cmuClock_GPIO, true );
mbed_official 59:2af474687369 637 GPIO_PinModeSet( gpioPortF, 5, gpioModePushPull, 0 ); /* Enable VBUSEN pin */
mbed_official 59:2af474687369 638
mbed_official 59:2af474687369 639 #if ( USB_VBUSOVRCUR_PORT != USB_VBUSOVRCUR_PORT_NONE )
mbed_official 59:2af474687369 640 /* Enable VBUS overcurrent flag pin. */
mbed_official 59:2af474687369 641 GPIO_PinModeSet( USB_VBUSOVRCUR_PORT, USB_VBUSOVRCUR_PIN, gpioModeInput, 0 );
mbed_official 59:2af474687369 642 #endif
mbed_official 59:2af474687369 643
mbed_official 59:2af474687369 644 USB->ROUTE = USB_ROUTE_PHYPEN | USB_ROUTE_VBUSENPEN; /* Enable PHY pins. */
mbed_official 59:2af474687369 645 USBHAL_CoreReset(); /* Reset USB core */
mbed_official 59:2af474687369 646
mbed_official 59:2af474687369 647 /* Force Host Mode */
mbed_official 59:2af474687369 648 USB->GUSBCFG = ( USB->GUSBCFG &
mbed_official 59:2af474687369 649 ~(GUSBCFG_WO_BITMASK | USB_GUSBCFG_FORCEDEVMODE ) ) |
mbed_official 59:2af474687369 650 USB_GUSBCFG_FORCEHSTMODE;
mbed_official 59:2af474687369 651
mbed_official 59:2af474687369 652 INT_Enable();
mbed_official 59:2af474687369 653 USBTIMER_DelayMs( 100 );
mbed_official 59:2af474687369 654 INT_Disable();
mbed_official 59:2af474687369 655
mbed_official 59:2af474687369 656 /* Set 48 MHz PHY clock, FS/LS mode */
mbed_official 59:2af474687369 657 USB->HCFG = ( USB->HCFG & ~_USB_HCFG_FSLSPCLKSEL_MASK ) |
mbed_official 59:2af474687369 658 ( 1 << _USB_HCFG_FSLSPCLKSEL_SHIFT ) |
mbed_official 59:2af474687369 659 ( USB_HCFG_FSLSSUPP );
mbed_official 59:2af474687369 660
mbed_official 59:2af474687369 661 USB->GAHBCFG = ( USB->GAHBCFG & ~_USB_GAHBCFG_HBSTLEN_MASK ) |
mbed_official 59:2af474687369 662 USB_GAHBCFG_DMAEN | USB_GAHBCFG_HBSTLEN_INCR;
mbed_official 59:2af474687369 663
mbed_official 59:2af474687369 664 /* Set Rx FIFO size */
mbed_official 59:2af474687369 665 USB->GRXFSIZ = ( rxFifoSize << _USB_GRXFSIZ_RXFDEP_SHIFT ) &
mbed_official 59:2af474687369 666 _USB_GRXFSIZ_RXFDEP_MASK;
mbed_official 59:2af474687369 667
mbed_official 59:2af474687369 668 /* Set Tx FIFO sizes */
mbed_official 59:2af474687369 669 USB->GNPTXFSIZ = ( ( nptxFifoSize <<
mbed_official 59:2af474687369 670 _USB_GNPTXFSIZ_NPTXFINEPTXF0DEP_SHIFT ) &
mbed_official 59:2af474687369 671 _USB_GNPTXFSIZ_NPTXFINEPTXF0DEP_MASK ) |
mbed_official 59:2af474687369 672 ( ( rxFifoSize <<
mbed_official 59:2af474687369 673 _USB_GNPTXFSIZ_NPTXFSTADDR_SHIFT ) &
mbed_official 59:2af474687369 674 _USB_GNPTXFSIZ_NPTXFSTADDR_MASK );
mbed_official 59:2af474687369 675
mbed_official 59:2af474687369 676 USB->HPTXFSIZ = ( ( ptxFifoSize << _USB_HPTXFSIZ_PTXFSIZE_SHIFT ) &
mbed_official 59:2af474687369 677 _USB_HPTXFSIZ_PTXFSIZE_MASK ) |
mbed_official 59:2af474687369 678 ( ( ( rxFifoSize + nptxFifoSize )
mbed_official 59:2af474687369 679 << _USB_HPTXFSIZ_PTXFSTADDR_SHIFT ) &
mbed_official 59:2af474687369 680 _USB_HPTXFSIZ_PTXFSTADDR_MASK );
mbed_official 59:2af474687369 681
mbed_official 59:2af474687369 682 /* Flush Tx and Rx FIFO's */
mbed_official 59:2af474687369 683 USBHAL_FlushTxFifo( 0x10 );
mbed_official 59:2af474687369 684 USBHAL_FlushRxFifo();
mbed_official 59:2af474687369 685
mbed_official 59:2af474687369 686 for ( i = 0; i < MAX_NUM_HOSTCHANNELS; i++ )
mbed_official 59:2af474687369 687 {
mbed_official 59:2af474687369 688 USB->HC[ i ].CHAR = USB_HC_CHAR_CHDIS; /* Disable channel */
mbed_official 59:2af474687369 689 USB->HC[ i ].INT = 0xFFFFFFFF; /* Clear pending interrupts */
mbed_official 59:2af474687369 690 }
mbed_official 59:2af474687369 691
mbed_official 59:2af474687369 692 /* Enable and halt all channels */
mbed_official 59:2af474687369 693 for ( i = 0; i < MAX_NUM_HOSTCHANNELS; i++ )
mbed_official 59:2af474687369 694 {
mbed_official 59:2af474687369 695 USB->HC[ i ].CHAR |= USB_HC_CHAR_CHDIS | USB_HC_CHAR_CHENA;
mbed_official 59:2af474687369 696 do
mbed_official 59:2af474687369 697 {
mbed_official 59:2af474687369 698 __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
mbed_official 59:2af474687369 699 }
mbed_official 59:2af474687369 700 while ( USB->HC[ i ].CHAR & USB_HC_CHAR_CHENA );
mbed_official 59:2af474687369 701 }
mbed_official 59:2af474687369 702
mbed_official 59:2af474687369 703 /* Disable all interrupts */
mbed_official 59:2af474687369 704 for ( i = 0; i < MAX_NUM_HOSTCHANNELS; i++ )
mbed_official 59:2af474687369 705 {
mbed_official 59:2af474687369 706 USB->HC[ i ].INTMSK = 0;
mbed_official 59:2af474687369 707 }
mbed_official 59:2af474687369 708
mbed_official 59:2af474687369 709 USB->HAINTMSK = 0;
mbed_official 59:2af474687369 710
mbed_official 59:2af474687369 711 return USB_STATUS_OK;
mbed_official 59:2af474687369 712 }
mbed_official 59:2af474687369 713
mbed_official 59:2af474687369 714 void USBHHAL_HCHalt( int hcnum, uint32_t hcchar )
mbed_official 59:2af474687369 715 {
mbed_official 59:2af474687369 716 hcchar |= USB_HC_CHAR_CHENA | USB_HC_CHAR_CHDIS;
mbed_official 59:2af474687369 717 USB->HC[ hcnum ].CHAR = hcchar;
mbed_official 59:2af474687369 718 }
mbed_official 59:2af474687369 719
mbed_official 59:2af474687369 720 void USBHHAL_HCInit( int hcnum )
mbed_official 59:2af474687369 721 {
mbed_official 59:2af474687369 722 USBH_Ep_TypeDef *ep;
mbed_official 59:2af474687369 723
mbed_official 59:2af474687369 724 ep = hcs[ hcnum ].ep;
mbed_official 59:2af474687369 725 USB->HC[ hcnum ].INT = 0xFFFFFFFF; /* Clear all interrupt flags */
mbed_official 59:2af474687369 726
mbed_official 59:2af474687369 727 switch ( ep->type ) /* Enable host channel int. types */
mbed_official 59:2af474687369 728 {
mbed_official 59:2af474687369 729 case USB_EPTYPE_CTRL:
mbed_official 59:2af474687369 730 case USB_EPTYPE_BULK:
mbed_official 59:2af474687369 731 case USB_EPTYPE_INTR:
mbed_official 59:2af474687369 732 USB->HC[ hcnum ].INTMSK = USB_HC_INT_CHHLTD;
mbed_official 59:2af474687369 733 break;
mbed_official 59:2af474687369 734 }
mbed_official 59:2af474687369 735
mbed_official 59:2af474687369 736 hcs[ hcnum ].errorCnt = 0;
mbed_official 59:2af474687369 737
mbed_official 59:2af474687369 738 USB->HAINTMSK |= 1 << hcnum; /* Enable host channel interrupt */
mbed_official 59:2af474687369 739
mbed_official 59:2af474687369 740 USB->HC[ hcnum ].CHAR = /* Program HCCHAR register */
mbed_official 59:2af474687369 741 ( ep->parentDevice->addr << _USB_HC_CHAR_DEVADDR_SHIFT ) |
mbed_official 59:2af474687369 742 ( ( ep->addr & USB_EPNUM_MASK ) << _USB_HC_CHAR_EPNUM_SHIFT ) |
mbed_official 59:2af474687369 743 ( ep->type << _USB_HC_CHAR_EPTYPE_SHIFT ) |
mbed_official 59:2af474687369 744 ( ep->packetSize << _USB_HC_CHAR_MPS_SHIFT ) |
mbed_official 59:2af474687369 745 ( ep->in ? USB_HC_CHAR_EPDIR : 0 ) |
mbed_official 59:2af474687369 746 ( ep->parentDevice->speed ==
mbed_official 59:2af474687369 747 HPRT_L_SPEED >> _USB_HPRT_PRTSPD_SHIFT
mbed_official 59:2af474687369 748 ? USB_HC_CHAR_LSPDDEV : 0 );
mbed_official 59:2af474687369 749 }
mbed_official 59:2af474687369 750
mbed_official 59:2af474687369 751 void USBHHAL_HCStart( int hcnum )
mbed_official 59:2af474687369 752 {
mbed_official 59:2af474687369 753 USBH_Hc_TypeDef *hc;
mbed_official 59:2af474687369 754 uint16_t packets, len;
mbed_official 59:2af474687369 755
mbed_official 59:2af474687369 756 hc = &hcs[ hcnum ];
mbed_official 59:2af474687369 757 hc->status = 0;
mbed_official 59:2af474687369 758 hc->idle = false;
mbed_official 59:2af474687369 759
mbed_official 59:2af474687369 760 if ( hc->remaining > 0 )
mbed_official 59:2af474687369 761 {
mbed_official 59:2af474687369 762 packets = ( hc->remaining + hc->ep->packetSize - 1 ) / hc->ep->packetSize;
mbed_official 59:2af474687369 763 }
mbed_official 59:2af474687369 764 else
mbed_official 59:2af474687369 765 {
mbed_official 59:2af474687369 766 packets = 1;
mbed_official 59:2af474687369 767 }
mbed_official 59:2af474687369 768
mbed_official 59:2af474687369 769 if ( hc->ep->in )
mbed_official 59:2af474687369 770 {
mbed_official 59:2af474687369 771 len = packets * hc->ep->packetSize;
mbed_official 59:2af474687369 772 }
mbed_official 59:2af474687369 773 else
mbed_official 59:2af474687369 774 {
mbed_official 59:2af474687369 775 len = hc->remaining;
mbed_official 59:2af474687369 776 }
mbed_official 59:2af474687369 777
mbed_official 59:2af474687369 778 /* Initialize the HCTSIZn register */
mbed_official 59:2af474687369 779 hc->hwXferSize = len;
mbed_official 59:2af474687369 780 USB->HC[ hcnum ].TSIZ =
mbed_official 59:2af474687369 781 ( ( len << _USB_HC_TSIZ_XFERSIZE_SHIFT ) &
mbed_official 59:2af474687369 782 _USB_HC_TSIZ_XFERSIZE_MASK ) |
mbed_official 59:2af474687369 783 ( ( packets << _USB_HC_TSIZ_PKTCNT_SHIFT ) &
mbed_official 59:2af474687369 784 _USB_HC_TSIZ_PKTCNT_MASK ) |
mbed_official 59:2af474687369 785 ( ( hc->ep->toggle << _USB_HC_TSIZ_PID_SHIFT ) &
mbed_official 59:2af474687369 786 _USB_HC_TSIZ_PID_MASK );
mbed_official 59:2af474687369 787
mbed_official 59:2af474687369 788 USB->HC[ hcnum ].DMAADDR = (uint32_t)hc->buf;
mbed_official 59:2af474687369 789
mbed_official 59:2af474687369 790 USBHHAL_HCActivate( hcnum,
mbed_official 59:2af474687369 791 USB->HC[ hcnum ].CHAR,
mbed_official 59:2af474687369 792 hc->ep->type == USB_EPTYPE_INTR );
mbed_official 59:2af474687369 793 }
mbed_official 59:2af474687369 794 #endif /* defined( USB_HOST ) */
mbed_official 59:2af474687369 795
mbed_official 59:2af474687369 796 /** @endcond */
mbed_official 59:2af474687369 797
mbed_official 59:2af474687369 798 #endif /* defined( USB_DEVICE ) || defined( USB_HOST ) */
mbed_official 59:2af474687369 799 #endif /* defined( USB_PRESENT ) && ( USB_COUNT == 1 ) */