17 #if defined( USB_PRESENT ) && ( USB_COUNT == 1 )
19 #if defined( USB_DEVICE ) || defined( USB_HOST )
23 #if defined( USB_DEVICE )
26 #if defined( USB_HOST )
34 #define EPABORT_BREAK_LOOP_COUNT 15000
38 static const char *
const errMsg[] =
74 return (
char*)errMsg[ 0 ];
76 return (
char*)errMsg[ -error ];
80 #if defined( USB_USE_PRINTF )
112 #if defined( DEBUG_EFM_USER )
113 static void PrintI(
int i )
115 #if !defined ( USER_PUTCHAR )
123 DEBUG_USB_API_PUTCHAR( ( i % 10 ) +
'0' );
127 void assertEFM(
const char *file,
int line )
129 #if !defined ( USER_PUTCHAR )
133 DEBUG_USB_API_PUTS(
"\nASSERT " );
134 DEBUG_USB_API_PUTS( file );
135 DEBUG_USB_API_PUTCHAR(
' ' );
141 #if defined ( USER_PUTCHAR )
142 void USB_Puts(
const char *p )
149 void USBHAL_CoreReset(
void )
165 void USBDHAL_Connect(
void )
171 uint32_t totalTxFifoSize )
174 uint16_t start, depth;
177 #if !defined( USB_VBUS_SWITCH_NOT_PRESENT )
187 #if defined( USB_GUSBCFG_FORCEHSTMODE )
189 USB->GUSBCFG = (
USB->GUSBCFG &
214 start =
EFM32_MAX( totalRxFifoSize, MIN_EP_FIFO_SIZE_INWORDS );
219 depth =
EFM32_MAX( dev->ep[ 0 ].fifoSize, MIN_EP_FIFO_SIZE_INWORDS );
227 for ( j = 1; j <= MAX_NUM_TX_FIFOS; j++ )
229 for ( i = 1; i <= MAX_NUM_IN_EPS; i++ )
234 if ( ep->txFifoNum == j )
237 depth =
EFM32_MAX( ep->fifoSize, MIN_EP_FIFO_SIZE_INWORDS );
238 USB_DIEPTXFS[ ep->txFifoNum - 1 ] =
246 if ( totalRxFifoSize + totalTxFifoSize > MAX_DEVICE_FIFO_SIZE_INWORDS )
249 if ( start > MAX_DEVICE_FIFO_SIZE_INWORDS )
253 USBHAL_FlushTxFifo( 0x10 );
254 USBHAL_FlushRxFifo();
263 for ( i = 0; i <= MAX_NUM_IN_EPS; i++ )
265 USB_DINEPS[ i ].CTL = 0;
266 USB_DINEPS[ i ].TSIZ = 0;
267 USB_DINEPS[ i ].INT = 0xFFFFFFFF;
270 for ( i = 0; i <= MAX_NUM_OUT_EPS; i++ )
272 USB_DOUTEPS[ i ].CTL = 0;
273 USB_DOUTEPS[ i ].TSIZ = 0;
274 USB_DOUTEPS[ i ].INT = 0xFFFFFFFF;
277 #if ( USB_DCTL_SFTDISCON_DEFAULT != 0 )
294 void USBDHAL_Disconnect(
void )
299 void USBDHAL_AbortEpIn( USBD_Ep_TypeDef *ep )
307 USB_DINEPS[ ep->num ].CTL = ( USB_DINEPS[ ep->num ].CTL &
308 ~DEPCTL_WO_BITMASK ) |
316 DEBUG_USB_INT_LO_PUTCHAR(
'.' );
318 USBDHAL_SetEPDISNAK( ep );
323 USBHAL_FlushTxFifo( ep->txFifoNum );
328 DEBUG_USB_INT_LO_PUTCHAR(
'.' );
331 void USBDHAL_AbortEpOut( USBD_Ep_TypeDef *ep )
346 cnt = EPABORT_BREAK_LOOP_COUNT;
355 DEBUG_USB_INT_LO_PUTCHAR(
',' );
357 USBDHAL_SetEPDISNAK( ep );
360 cnt = EPABORT_BREAK_LOOP_COUNT;
375 DEBUG_USB_INT_LO_PUTCHAR(
',' );
378 void USBDHAL_AbortAllEps(
void )
382 uint16_t im, om, inmask=0, outmask=0;
385 for ( i = 1; i <= NUM_EP_USED; i++ )
388 if ( ep->state != D_EP_IDLE )
411 for ( i = 1; i <= NUM_EP_USED; i++ )
416 USB_DINEPS[ ep->num ].CTL = ( USB_DINEPS[ ep->num ].CTL &
417 ~DEPCTL_WO_BITMASK ) |
434 cnt = EPABORT_BREAK_LOOP_COUNT;
447 cnt = EPABORT_BREAK_LOOP_COUNT;
450 for ( i = 1; i <= NUM_EP_USED; i++ )
463 }
while ( im && cnt );
467 DEBUG_USB_INT_LO_PUTCHAR(
'\'' );
470 for ( i = 1; i <= NUM_EP_USED; i++ )
473 if ( ep->state != D_EP_IDLE )
475 USBDHAL_SetEPDISNAK( ep );
482 cnt = EPABORT_BREAK_LOOP_COUNT;
485 for ( i = 1; i <= NUM_EP_USED; i++ )
488 if ( ep->in && ( im & ep->mask ) )
497 if ( !ep->in && ( om & ep->mask ) )
507 }
while ( ( im || om ) && cnt );
512 USBHAL_FlushTxFifo( 0x10 );
522 DEBUG_USB_INT_LO_PUTCHAR(
'\'' );
533 USBDHAL_AbortAllEps();
536 for ( i = 1; i <= NUM_EP_USED; i++ )
539 if ( ep->state != D_EP_IDLE )
541 ep->state = D_EP_IDLE;
542 if ( ep->xferCompleteCb )
544 callback = ep->xferCompleteCb;
545 ep->xferCompleteCb = NULL;
550 USBDHAL_DeactivateEp( ep );
553 DEBUG_TRACE_ABORT( reason );
554 callback( reason, ep->xferred, ep->remaining );
564 #if defined( USB_HOST )
566 uint32_t nptxFifoSize,
567 uint32_t ptxFifoSize )
578 #if ( USB_VBUSOVRCUR_PORT != USB_VBUSOVRCUR_PORT_NONE )
587 USB->GUSBCFG = (
USB->GUSBCFG &
608 USB->GNPTXFSIZ = ( ( nptxFifoSize <<
613 _USB_GNPTXFSIZ_NPTXFSTADDR_MASK );
617 ( ( ( rxFifoSize + nptxFifoSize )
622 USBHAL_FlushTxFifo( 0x10 );
623 USBHAL_FlushRxFifo();
625 for ( i = 0; i < MAX_NUM_HOSTCHANNELS; i++ )
628 USB->HC[ i ].INT = 0xFFFFFFFF;
632 for ( i = 0; i < MAX_NUM_HOSTCHANNELS; i++ )
637 __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
643 for ( i = 0; i < MAX_NUM_HOSTCHANNELS; i++ )
645 USB->HC[ i ].INTMSK = 0;
653 void USBHHAL_HCHalt(
int hcnum, uint32_t hcchar )
656 USB->HC[ hcnum ].CHAR = hcchar;
659 void USBHHAL_HCInit(
int hcnum )
663 ep = hcs[ hcnum ].ep;
664 USB->HC[ hcnum ].INT = 0xFFFFFFFF;
675 hcs[ hcnum ].errorCnt = 0;
677 USB->HAINTMSK |= 1 << hcnum;
679 USB->HC[ hcnum ].CHAR =
690 void USBHHAL_HCStart(
int hcnum )
693 uint16_t packets, len;
699 if ( hc->remaining > 0 )
701 packets = ( hc->remaining + hc->ep->packetSize - 1 ) / hc->ep->packetSize;
710 len = packets * hc->ep->packetSize;
718 hc->hwXferSize = len;
719 USB->HC[ hcnum ].TSIZ =
727 USB->HC[ hcnum ].DMAADDR = (uint32_t)hc->buf;
729 USBHHAL_HCActivate( hcnum,
730 USB->HC[ hcnum ].CHAR,
USB protocol stack library API for EFM32/EZR32.
Clock management unit (CMU) API.
#define _USB_HC_TSIZ_PKTCNT_SHIFT
#define USB_GUSBCFG_FORCEDEVMODE
#define USB_GINTMSK_GOUTNAKEFFMSK
#define _USB_HC_CHAR_DEVADDR_SHIFT
#define _USB_GRXFSIZ_RXFDEP_SHIFT
#define _USB_HCFG_FSLSPCLKSEL_MASK
#define USB_CTRL_VREGOSEN
#define _USB_GRXFSIZ_RXFDEP_MASK
#define USB_DIEPMSK_INEPNAKEFFMSK
#define _USB_HC_CHAR_MPS_SHIFT
USB protocol stack library API for EFM32/EZR32.
#define _USB_HC_TSIZ_PID_SHIFT
#define _USB_GAHBCFG_HBSTLEN_MASK
#define USB_DCTL_IGNRFRMNUM
int USB_PRINTF(const char *format,...)
Transmit "printf" formated data on the debug serial port.
#define _USB_HPRT_PRTSPD_SHIFT
#define USB_GRSTCTL_CSFTRST
__STATIC_INLINE uint32_t INT_Enable(void)
Enable interrupts.
void USB_PrintErrorMsgString(char *pre, int error)
Format and print a text string given an error code, prepends an optional user supplied leader string...
#define USB_DIEPMSK_EPDISBLDMSK
CMSIS Cortex-M Peripheral Access Layer for Silicon Laboratories microcontroller devices.
#define _USB_GNPTXFSIZ_NPTXFSTADDR_SHIFT
#define USB_SETUP_DIR_MASK
#define USB_GAHBCFG_DMAEN
void USBD_Connect(void)
Start USB device operation.
char * USB_GetErrorMsgString(int error)
Return an error message string for a given error code.
#define USB_DCTL_SFTDISCON
#define _USB_HPTXFSIZ_PTXFSTADDR_SHIFT
void USBTIMER_DelayMs(uint32_t msec)
Active wait millisecond delay function. Can also be used inside interrupt handlers.
#define USB_HC_CHAR_EPDIR
#define _USB_GNPTXFSIZ_NPTXFINEPTXF0DEP_MASK
#define _USB_DIEPTXF1_INEPNTXFDEP_SHIFT
int(* USB_XferCompleteCb_TypeDef)(USB_Status_TypeDef status, uint32_t xferred, uint32_t remaining)
USB transfer callback function.
#define USB_DIEP_CTL_SNAK
#define _USB_HPTXFSIZ_PTXFSIZE_SHIFT
USB_Status_TypeDef
USB transfer status enumerator.
#define USB_HC_CHAR_CHENA
void GPIO_PinModeSet(GPIO_Port_TypeDef port, unsigned int pin, GPIO_Mode_TypeDef mode, unsigned int out)
Set the mode for a GPIO pin.
struct USBH_Device_TypeDef * parentDevice
#define _USB_HC_CHAR_EPTYPE_SHIFT
#define USB_HCFG_FSLSSUPP
#define USB_GRSTCTL_AHBIDLE
General Purpose IO (GPIO) peripheral API.
#define _USB_HC_CHAR_EPNUM_SHIFT
#define _USB_HC_TSIZ_XFERSIZE_SHIFT
#define USB_DOEP_INT_EPDISBLD
#define USB_PCGCCTL_PWRCLMP
#define USB_DCTL_SGOUTNAK
#define USB_ROUTE_VBUSENPEN
#define _USB_GNPTXFSIZ_NPTXFSTADDR_MASK
#define _USB_HPTXFSIZ_PTXFSIZE_MASK
USB protocol stack library API for EFM32/EZR32.
#define _USB_HPTXFSIZ_PTXFSTADDR_MASK
void CMU_ClockEnable(CMU_Clock_TypeDef clock, bool enable)
Enable/disable a clock.
#define USB_HC_CHAR_LSPDDEV
#define _USB_GNPTXFSIZ_NPTXFINEPTXF0DEP_SHIFT
#define USB_DCFG_NZSTSOUTHSHK
#define USB_HC_INT_CHHLTD
#define USB_PCGCCTL_STOPPCLK
#define _USB_HCFG_FSLSPCLKSEL_SHIFT
#define USB_STATUS_VREGOS
#define _USB_HC_TSIZ_PKTCNT_MASK
#define _USB_HC_TSIZ_XFERSIZE_MASK
#define _USB_HC_TSIZ_PID_MASK
#define USB_HC_CHAR_CHDIS
#define USB_GAHBCFG_HBSTLEN_INCR
#define _USB_DCFG_PERFRINT_MASK
#define USB_DCTL_CGOUTNAK
USB protocol stack library, low level USB peripheral access.
#define USB_GINTSTS_GOUTNAKEFF
#define _USB_DIEPTXF1_INEPNTXFSTADDR_MASK
__STATIC_INLINE uint32_t INT_Disable(void)
Disable interrupts.
#define USB_DIEP_INT_INEPNAKEFF
USB HOST endpoint status data.
#define USB_DIEP_INT_EPDISBLD
USB protocol stack library, internal type definitions.
#define USB_PCGCCTL_RSTPDWNMODULE
int USB_PUTCHAR(char c)
Transmit a single char on the debug serial port.
#define USB_GUSBCFG_FORCEHSTMODE
void USBTIMER_DelayUs(uint32_t usec)
Active wait microsecond delay function. Can also be used inside interrupt handlers.
#define USB_DOEPMSK_EPDISBLDMSK
#define _USB_DCFG_DEVSPD_MASK