mirror of https://github.com/ARMmbed/mbed-os.git
Convert USB library from em_int to em_core
parent
e900d5a04d
commit
2becfbe2e4
|
|
@ -45,8 +45,6 @@
|
|||
#define EFM32_WEAK SL_WEAK
|
||||
#define EFM32_ATTRIBUTE_SECTION(X) SL_ATTRIBUTE_SECTION(X)
|
||||
|
||||
#include "em_int.h"
|
||||
|
||||
#if defined( USB_USE_PRINTF )
|
||||
#include <stdio.h>
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -27,6 +27,7 @@
|
|||
#if defined( USB_DEVICE )
|
||||
|
||||
#include "em_cmu.h"
|
||||
#include "em_core.h"
|
||||
#include "em_usbtypes.h"
|
||||
#include "em_usbhal.h"
|
||||
#include "em_usbd.h"
|
||||
|
|
@ -69,9 +70,10 @@ static const char *stateNames[] =
|
|||
******************************************************************************/
|
||||
void USBD_AbortAllTransfers( void )
|
||||
{
|
||||
INT_Disable();
|
||||
CORE_DECLARE_IRQ_STATE;
|
||||
CORE_ENTER_CRITICAL();
|
||||
USBDHAL_AbortAllTransfers( USB_STATUS_EP_ABORTED );
|
||||
INT_Enable();
|
||||
CORE_EXIT_CRITICAL();
|
||||
}
|
||||
|
||||
/***************************************************************************//**
|
||||
|
|
@ -85,6 +87,7 @@ int USBD_AbortTransfer( int epAddr )
|
|||
{
|
||||
USB_XferCompleteCb_TypeDef callback;
|
||||
USBD_Ep_TypeDef *ep = USBD_GetEpFromAddr( epAddr );
|
||||
CORE_DECLARE_IRQ_STATE;
|
||||
|
||||
if ( ep == NULL )
|
||||
{
|
||||
|
|
@ -100,10 +103,10 @@ int USBD_AbortTransfer( int epAddr )
|
|||
return USB_STATUS_ILLEGAL;
|
||||
}
|
||||
|
||||
INT_Disable();
|
||||
CORE_ENTER_CRITICAL();
|
||||
if ( ep->state == D_EP_IDLE )
|
||||
{
|
||||
INT_Enable();
|
||||
CORE_EXIT_CRITICAL();
|
||||
return USB_STATUS_OK;
|
||||
}
|
||||
|
||||
|
|
@ -125,7 +128,7 @@ int USBD_AbortTransfer( int epAddr )
|
|||
callback( USB_STATUS_EP_ABORTED, ep->xferred, ep->remaining );
|
||||
}
|
||||
|
||||
INT_Enable();
|
||||
CORE_EXIT_CRITICAL();
|
||||
return USB_STATUS_OK;
|
||||
}
|
||||
|
||||
|
|
@ -139,9 +142,10 @@ int USBD_AbortTransfer( int epAddr )
|
|||
******************************************************************************/
|
||||
void USBD_Connect( void )
|
||||
{
|
||||
INT_Disable();
|
||||
CORE_DECLARE_IRQ_STATE;
|
||||
CORE_ENTER_CRITICAL();
|
||||
USBDHAL_Connect();
|
||||
INT_Enable();
|
||||
CORE_EXIT_CRITICAL();
|
||||
}
|
||||
|
||||
/***************************************************************************//**
|
||||
|
|
@ -154,9 +158,10 @@ void USBD_Connect( void )
|
|||
******************************************************************************/
|
||||
void USBD_Disconnect( void )
|
||||
{
|
||||
INT_Disable();
|
||||
CORE_DECLARE_IRQ_STATE;
|
||||
CORE_ENTER_CRITICAL();
|
||||
USBDHAL_Disconnect();
|
||||
INT_Enable();
|
||||
CORE_EXIT_CRITICAL();
|
||||
}
|
||||
|
||||
/***************************************************************************//**
|
||||
|
|
@ -239,6 +244,7 @@ const char *USBD_GetUsbStateName( USBD_State_TypeDef state )
|
|||
int USBD_Init( const USBD_Init_TypeDef *p )
|
||||
{
|
||||
USBD_Ep_TypeDef *ep;
|
||||
CORE_DECLARE_IRQ_STATE;
|
||||
|
||||
#if !defined( USB_CORECLK_HFRCO ) || !defined( CMU_OSCENCMD_USHFRCOEN )
|
||||
/* Devices supporting crystal-less USB can use HFRCO or HFXO as core clock. */
|
||||
|
|
@ -308,7 +314,7 @@ int USBD_Init( const USBD_Init_TypeDef *p )
|
|||
*/
|
||||
totalRxFifoSize += 10 + 1 + ( 2 * (MAX_NUM_OUT_EPS + 1) );
|
||||
|
||||
INT_Disable();
|
||||
CORE_ENTER_CRITICAL();
|
||||
|
||||
/* Enable USB clock */
|
||||
CMU->HFCORECLKEN0 |= CMU_HFCORECLKEN0_USB | CMU_HFCORECLKEN0_USBC;
|
||||
|
|
@ -339,7 +345,7 @@ int USBD_Init( const USBD_Init_TypeDef *p )
|
|||
}
|
||||
else
|
||||
{
|
||||
INT_Enable();
|
||||
CORE_EXIT_CRITICAL();
|
||||
DEBUG_USB_API_PUTS( "\nUSBD_Init(), FIFO setup error" );
|
||||
EFM_ASSERT( false );
|
||||
return USB_STATUS_ILLEGAL;
|
||||
|
|
@ -356,7 +362,7 @@ int USBD_Init( const USBD_Init_TypeDef *p )
|
|||
USBD_SetUsbState( USBD_STATE_NONE );
|
||||
}
|
||||
|
||||
INT_Enable();
|
||||
CORE_EXIT_CRITICAL();
|
||||
return USB_STATUS_OK;
|
||||
}
|
||||
|
||||
|
|
@ -389,6 +395,7 @@ int USBD_Init( const USBD_Init_TypeDef *p )
|
|||
int USBD_Read( int epAddr, void *data, int byteCount,
|
||||
USB_XferCompleteCb_TypeDef callback )
|
||||
{
|
||||
CORE_DECLARE_IRQ_STATE;
|
||||
USBD_Ep_TypeDef *ep = USBD_GetEpFromAddr( epAddr );
|
||||
|
||||
USB_PRINTF("USBD: Read addr %x, data %p, size %d, cb 0x%lx\n",
|
||||
|
|
@ -416,24 +423,25 @@ int USBD_Read( int epAddr, void *data, int byteCount,
|
|||
return USB_STATUS_ILLEGAL;
|
||||
}
|
||||
|
||||
INT_Disable();
|
||||
CORE_ENTER_CRITICAL();
|
||||
|
||||
if ( USBDHAL_EpIsStalled( ep ) )
|
||||
{
|
||||
INT_Enable();
|
||||
CORE_EXIT_CRITICAL();
|
||||
DEBUG_USB_API_PUTS( "\nUSBD_Read(), Endpoint is halted" );
|
||||
return USB_STATUS_EP_STALLED;
|
||||
}
|
||||
|
||||
if ( ep->state != D_EP_IDLE )
|
||||
{
|
||||
INT_Enable();
|
||||
CORE_EXIT_CRITICAL();
|
||||
DEBUG_USB_API_PUTS( "\nUSBD_Read(), Endpoint is busy" );
|
||||
return USB_STATUS_EP_BUSY;
|
||||
}
|
||||
|
||||
if ( ( ep->num > 0 ) && ( USBD_GetUsbState() != USBD_STATE_CONFIGURED ) )
|
||||
{
|
||||
INT_Enable();
|
||||
CORE_EXIT_CRITICAL();
|
||||
DEBUG_USB_API_PUTS( "\nUSBD_Read(), Device not configured" );
|
||||
return USB_STATUS_DEVICE_UNCONFIGURED;
|
||||
}
|
||||
|
|
@ -448,7 +456,7 @@ int USBD_Read( int epAddr, void *data, int byteCount,
|
|||
}
|
||||
else if ( ep->in != false )
|
||||
{
|
||||
INT_Enable();
|
||||
CORE_EXIT_CRITICAL();
|
||||
DEBUG_USB_API_PUTS( "\nUSBD_Read(), Illegal EP direction" );
|
||||
EFM_ASSERT( false );
|
||||
return USB_STATUS_ILLEGAL;
|
||||
|
|
@ -458,7 +466,7 @@ int USBD_Read( int epAddr, void *data, int byteCount,
|
|||
ep->xferCompleteCb = callback;
|
||||
|
||||
USBD_ArmEp( ep );
|
||||
INT_Enable();
|
||||
CORE_EXIT_CRITICAL();
|
||||
return USB_STATUS_OK;
|
||||
}
|
||||
|
||||
|
|
@ -477,22 +485,26 @@ int USBD_Read( int epAddr, void *data, int byteCount,
|
|||
******************************************************************************/
|
||||
int USBD_RemoteWakeup( void )
|
||||
{
|
||||
INT_Disable();
|
||||
CORE_DECLARE_IRQ_STATE;
|
||||
CORE_ENTER_CRITICAL();
|
||||
|
||||
if ( ( dev->state != USBD_STATE_SUSPENDED ) ||
|
||||
( dev->remoteWakeupEnabled == false ) )
|
||||
{
|
||||
INT_Enable();
|
||||
CORE_EXIT_CRITICAL();
|
||||
DEBUG_USB_API_PUTS( "\nUSBD_RemoteWakeup(), Illegal remote wakeup" );
|
||||
return USB_STATUS_ILLEGAL;
|
||||
}
|
||||
|
||||
USBDHAL_SetRemoteWakeup();
|
||||
INT_Enable();
|
||||
CORE_EXIT_CRITICAL();
|
||||
|
||||
USBTIMER_DelayMs( 10 );
|
||||
INT_Disable();
|
||||
|
||||
CORE_ENTER_CRITICAL();
|
||||
USBDHAL_ClearRemoteWakeup();
|
||||
INT_Enable();
|
||||
CORE_EXIT_CRITICAL();
|
||||
|
||||
return USB_STATUS_OK;
|
||||
}
|
||||
|
||||
|
|
@ -565,6 +577,7 @@ void USBD_SetUsbState( USBD_State_TypeDef newState )
|
|||
int USBD_StallEp( int epAddr )
|
||||
{
|
||||
USB_Status_TypeDef retVal;
|
||||
CORE_DECLARE_IRQ_STATE;
|
||||
USBD_Ep_TypeDef *ep = USBD_GetEpFromAddr( epAddr );
|
||||
|
||||
if ( ep == NULL )
|
||||
|
|
@ -581,9 +594,9 @@ int USBD_StallEp( int epAddr )
|
|||
return USB_STATUS_ILLEGAL;
|
||||
}
|
||||
|
||||
INT_Disable();
|
||||
CORE_ENTER_CRITICAL();
|
||||
retVal = USBDHAL_StallEp( ep );
|
||||
INT_Enable();
|
||||
CORE_EXIT_CRITICAL();
|
||||
|
||||
if ( retVal != USB_STATUS_OK )
|
||||
{
|
||||
|
|
@ -626,6 +639,7 @@ void USBD_Stop( void )
|
|||
int USBD_UnStallEp( int epAddr )
|
||||
{
|
||||
USB_Status_TypeDef retVal;
|
||||
CORE_DECLARE_IRQ_STATE;
|
||||
USBD_Ep_TypeDef *ep = USBD_GetEpFromAddr( epAddr );
|
||||
|
||||
if ( ep == NULL )
|
||||
|
|
@ -642,9 +656,9 @@ int USBD_UnStallEp( int epAddr )
|
|||
return USB_STATUS_ILLEGAL;
|
||||
}
|
||||
|
||||
INT_Disable();
|
||||
CORE_ENTER_CRITICAL();
|
||||
retVal = USBDHAL_UnStallEp( ep );
|
||||
INT_Enable();
|
||||
CORE_EXIT_CRITICAL();
|
||||
|
||||
if ( retVal != USB_STATUS_OK )
|
||||
{
|
||||
|
|
@ -678,6 +692,7 @@ int USBD_Write( int epAddr, void *data, int byteCount,
|
|||
USB_XferCompleteCb_TypeDef callback )
|
||||
{
|
||||
USBD_Ep_TypeDef *ep = USBD_GetEpFromAddr( epAddr );
|
||||
CORE_DECLARE_IRQ_STATE;
|
||||
|
||||
USB_PRINTF("USBD: Write addr %x, data %p, size %d, cb 0x%lx\n",
|
||||
epAddr, data, byteCount, (uint32_t)callback);
|
||||
|
|
@ -704,24 +719,25 @@ int USBD_Write( int epAddr, void *data, int byteCount,
|
|||
return USB_STATUS_ILLEGAL;
|
||||
}
|
||||
|
||||
INT_Disable();
|
||||
CORE_ENTER_CRITICAL();
|
||||
|
||||
if ( USBDHAL_EpIsStalled( ep ) )
|
||||
{
|
||||
INT_Enable();
|
||||
CORE_EXIT_CRITICAL();
|
||||
DEBUG_USB_API_PUTS( "\nUSBD_Write(), Endpoint is halted" );
|
||||
return USB_STATUS_EP_STALLED;
|
||||
}
|
||||
|
||||
if ( ep->state != D_EP_IDLE )
|
||||
{
|
||||
INT_Enable();
|
||||
CORE_EXIT_CRITICAL();
|
||||
DEBUG_USB_API_PUTS( "\nUSBD_Write(), Endpoint is busy" );
|
||||
return USB_STATUS_EP_BUSY;
|
||||
}
|
||||
|
||||
if ( ( ep->num > 0 ) && ( USBD_GetUsbState() != USBD_STATE_CONFIGURED ) )
|
||||
{
|
||||
INT_Enable();
|
||||
CORE_EXIT_CRITICAL();
|
||||
DEBUG_USB_API_PUTS( "\nUSBD_Write(), Device not configured" );
|
||||
return USB_STATUS_DEVICE_UNCONFIGURED;
|
||||
}
|
||||
|
|
@ -736,7 +752,7 @@ int USBD_Write( int epAddr, void *data, int byteCount,
|
|||
}
|
||||
else if ( ep->in != true )
|
||||
{
|
||||
INT_Enable();
|
||||
CORE_EXIT_CRITICAL();
|
||||
DEBUG_USB_API_PUTS( "\nUSBD_Write(), Illegal EP direction" );
|
||||
EFM_ASSERT( false );
|
||||
return USB_STATUS_ILLEGAL;
|
||||
|
|
@ -746,7 +762,7 @@ int USBD_Write( int epAddr, void *data, int byteCount,
|
|||
ep->xferCompleteCb = callback;
|
||||
|
||||
USBD_ArmEp( ep );
|
||||
INT_Enable();
|
||||
CORE_EXIT_CRITICAL();
|
||||
return USB_STATUS_OK;
|
||||
}
|
||||
|
||||
|
|
@ -841,6 +857,7 @@ static void USBD_ResetEndpoints(void)
|
|||
int USBD_AddEndpoint(int epAddr, int transferType,
|
||||
int maxPacketSize, int bufferMult)
|
||||
{
|
||||
CORE_DECLARE_IRQ_STATE;
|
||||
USBD_Ep_TypeDef *ep;
|
||||
|
||||
numEps++;
|
||||
|
|
@ -890,7 +907,7 @@ int USBD_AddEndpoint(int epAddr, int transferType,
|
|||
ep->num, numEps, ep->in, ep->addr, ep->type, ep->packetSize, ep->fifoSize,
|
||||
totalTxFifoSize, totalRxFifoSize);
|
||||
|
||||
INT_Disable();
|
||||
CORE_ENTER_CRITICAL();
|
||||
#if defined( CMU_OSCENCMD_USHFRCOEN )
|
||||
/* Happy Gecko workaround: disable LEM GATE mode if using ISOC endpoints. */
|
||||
if ( transferType == USB_EPTYPE_ISOC )
|
||||
|
|
@ -900,7 +917,7 @@ int USBD_AddEndpoint(int epAddr, int transferType,
|
|||
#endif
|
||||
|
||||
int ret = USBDHAL_ReconfigureFifos(totalRxFifoSize, totalTxFifoSize);
|
||||
INT_Enable();
|
||||
CORE_EXIT_CRITICAL();
|
||||
|
||||
if( ret != USB_STATUS_OK ) {
|
||||
return ret;
|
||||
|
|
|
|||
|
|
@ -27,6 +27,7 @@
|
|||
#if defined( USB_DEVICE )
|
||||
|
||||
#include "em_cmu.h"
|
||||
#include "em_core.h"
|
||||
#include "em_usbtypes.h"
|
||||
#include "em_usbhal.h"
|
||||
#include "em_usbd.h"
|
||||
|
|
@ -106,8 +107,9 @@ void USB_IRQHandler( void )
|
|||
{
|
||||
uint32_t status;
|
||||
bool servedVbusInterrupt = false;
|
||||
CORE_DECLARE_IRQ_STATE;
|
||||
|
||||
INT_Disable();
|
||||
CORE_ENTER_CRITICAL();
|
||||
|
||||
#if ( USB_PWRSAVE_MODE )
|
||||
if ( USBD_poweredDown )
|
||||
|
|
@ -192,7 +194,7 @@ void USB_IRQHandler( void )
|
|||
status = USBHAL_GetCoreInts();
|
||||
if ( status == 0 )
|
||||
{
|
||||
INT_Enable();
|
||||
CORE_EXIT_CRITICAL();
|
||||
if ( !servedVbusInterrupt )
|
||||
{
|
||||
DEBUG_USB_INT_LO_PUTS( "\nSinT" );
|
||||
|
|
@ -209,7 +211,7 @@ void USB_IRQHandler( void )
|
|||
HANDLE_INT( USB_GINTSTS_IEPINT )
|
||||
HANDLE_INT( USB_GINTSTS_OEPINT )
|
||||
|
||||
INT_Enable();
|
||||
CORE_EXIT_CRITICAL();
|
||||
|
||||
if ( status != 0 )
|
||||
{
|
||||
|
|
|
|||
|
|
@ -199,9 +199,7 @@ USB_Status_TypeDef USBDHAL_CoreInit( uint32_t totalRxFifoSize,
|
|||
USB_GUSBCFG_FORCEDEVMODE;
|
||||
#endif
|
||||
|
||||
INT_Enable();
|
||||
USBTIMER_DelayMs( 50 );
|
||||
INT_Disable();
|
||||
|
||||
/* Set device speed */
|
||||
USB->DCFG = ( USB->DCFG & ~_USB_DCFG_DEVSPD_MASK ) | 3; /* Full speed PHY */
|
||||
|
|
@ -649,9 +647,7 @@ USB_Status_TypeDef USBHHAL_CoreInit( uint32_t rxFifoSize,
|
|||
~(GUSBCFG_WO_BITMASK | USB_GUSBCFG_FORCEDEVMODE ) ) |
|
||||
USB_GUSBCFG_FORCEHSTMODE;
|
||||
|
||||
INT_Enable();
|
||||
USBTIMER_DelayMs( 100 );
|
||||
INT_Disable();
|
||||
|
||||
/* Set 48 MHz PHY clock, FS/LS mode */
|
||||
USB->HCFG = ( USB->HCFG & ~_USB_HCFG_FSLSPCLKSEL_MASK ) |
|
||||
|
|
|
|||
|
|
@ -25,6 +25,7 @@
|
|||
#include "em_usb.h"
|
||||
#if defined( USB_DEVICE ) || defined( USB_HOST )
|
||||
#include "em_cmu.h"
|
||||
#include "em_core.h"
|
||||
#include "em_timer.h"
|
||||
#include "em_usbtypes.h"
|
||||
#include "em_usbhal.h"
|
||||
|
|
@ -244,8 +245,9 @@ void USBTIMER_Start( uint32_t id, uint32_t timeout,
|
|||
{
|
||||
uint32_t accumulated;
|
||||
USBTIMER_Timer_TypeDef *this, **last;
|
||||
CORE_DECLARE_IRQ_STATE;
|
||||
|
||||
INT_Disable();
|
||||
CORE_ENTER_CRITICAL();
|
||||
|
||||
if ( timers[ id ].running )
|
||||
{
|
||||
|
|
@ -255,7 +257,7 @@ void USBTIMER_Start( uint32_t id, uint32_t timeout,
|
|||
if ( timeout == 0 )
|
||||
{
|
||||
callback();
|
||||
INT_Enable();
|
||||
CORE_EXIT_CRITICAL();
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -297,7 +299,7 @@ void USBTIMER_Start( uint32_t id, uint32_t timeout,
|
|||
}
|
||||
}
|
||||
|
||||
INT_Enable();
|
||||
CORE_EXIT_CRITICAL();
|
||||
}
|
||||
|
||||
/***************************************************************************//**
|
||||
|
|
@ -310,8 +312,9 @@ void USBTIMER_Start( uint32_t id, uint32_t timeout,
|
|||
void USBTIMER_Stop( uint32_t id )
|
||||
{
|
||||
USBTIMER_Timer_TypeDef *this, **last;
|
||||
CORE_DECLARE_IRQ_STATE;
|
||||
|
||||
INT_Disable();
|
||||
CORE_ENTER_CRITICAL();
|
||||
|
||||
if ( head ) /* Queue empty ? */
|
||||
{
|
||||
|
|
@ -335,7 +338,7 @@ void USBTIMER_Stop( uint32_t id )
|
|||
}
|
||||
}
|
||||
|
||||
INT_Enable();
|
||||
CORE_EXIT_CRITICAL();
|
||||
}
|
||||
#endif /* ( NUM_QTIMERS > 0 ) */
|
||||
|
||||
|
|
@ -347,8 +350,9 @@ void USBTIMER_Stop( uint32_t id )
|
|||
static void TimerTick( void )
|
||||
{
|
||||
USBTIMER_Callback_TypeDef cb;
|
||||
CORE_DECLARE_IRQ_STATE;
|
||||
|
||||
INT_Disable();
|
||||
CORE_ENTER_CRITICAL();
|
||||
|
||||
if ( head )
|
||||
{
|
||||
|
|
@ -372,7 +376,7 @@ static void TimerTick( void )
|
|||
}
|
||||
}
|
||||
|
||||
INT_Enable();
|
||||
CORE_EXIT_CRITICAL();
|
||||
}
|
||||
/** @endcond */
|
||||
#endif /* ( NUM_QTIMERS > 0 ) */
|
||||
|
|
|
|||
Loading…
Reference in New Issue