17 #if defined( USB_PRESENT ) && ( USB_COUNT == 1 )
19 #if defined( USB_HOST )
24 #if ( USB_VBUSOVRCUR_PORT != USB_VBUSOVRCUR_PORT_NONE )
30 #define HANDLE_INT( x ) if ( status & x ) { Handle_##x(); status &= ~x; }
32 #define FIFO_TXSTS_HCNUM_MASK 0x78000000
33 #define FIFO_TXSTS_HCNUM_SHIFT 27
35 static void Handle_HcInInt( uint8_t hcnum );
36 static void Handle_HcOutInt( uint8_t hcnum );
37 static void Handle_USB_GINTSTS_DISCONNINT (
void );
38 static void Handle_USB_GINTSTS_HCHINT (
void );
39 static void Handle_USB_GINTSTS_PRTINT (
void );
44 void USB_IRQHandler(
void )
50 status = USBHAL_GetCoreInts();
54 DEBUG_USB_INT_LO_PUTS(
"\nSinT" );
66 DEBUG_USB_INT_LO_PUTS(
"\nUinT" );
73 static void Handle_HcInInt( uint8_t hcnum )
77 uint32_t status, hcchar, eptype;
78 #ifdef DEBUG_USB_INT_HI
83 status = USBHHAL_GetHcInts( hcnum );
84 hcchar =
USB->HC[ hcnum ].CHAR;
87 DEBUG_USB_INT_HI_PUTCHAR(
'i' );
91 USB->HC[ hcnum ].INT = 0xFFFFFFFF;
93 #ifdef DEBUG_USB_INT_HI
103 DEBUG_USB_INT_HI_PUTCHAR(
'c' );
105 hc->xferred = hc->hwXferSize -
109 hc->remaining -= hc->xferred;
119 DEBUG_USB_INT_LO_PUTS(
"StaL" );
125 DEBUG_USB_INT_LO_PUTS(
"BabL" );
128 else if ( ( ( status &
131 ( !( hc->status & HCS_TIMEOUT ) ) )
135 DEBUG_USB_INT_LO_PUTS(
"TglE" );
138 if ( hc->errorCnt < 3 )
140 USBHHAL_HCStart( hcnum );
145 else if ( ( ( status &
149 ( !( hc->status & HCS_TIMEOUT ) ) )
153 DEBUG_USB_INT_LO_PUTS(
"XacT" );
156 if ( hc->errorCnt < 3 )
158 USBHHAL_HCStart( hcnum );
163 else if ( hc->status & HCS_TIMEOUT )
165 DEBUG_USB_INT_HI_PUTCHAR(
't' );
171 #ifdef DEBUG_USB_INT_HI
172 if ( !( ( eptype == HCCHAR_EPTYPE_INTR ) &&
181 if ( eptype == HCCHAR_EPTYPE_CTRL )
182 USBHEP_CtrlEpHandler( hc->ep, result );
184 USBHEP_EpHandler( hc->ep, result );
191 static void Handle_HcOutInt( uint8_t hcnum )
195 uint32_t status, hcchar, eptype;
196 #ifdef DEBUG_USB_INT_HI
201 status = USBHHAL_GetHcInts( hcnum );
202 hcchar =
USB->HC[ hcnum ].CHAR;
205 DEBUG_USB_INT_HI_PUTCHAR(
'o' );
207 if ( status & USB_HC_INT_CHHLTD )
209 USB->HC[ hcnum ].INT = 0xFFFFFFFF;
211 #ifdef DEBUG_USB_INT_HI
220 DEBUG_USB_INT_HI_PUTCHAR(
'c' );
222 hc->xferred = hc->remaining;
230 else if ( status & USB_HC_INT_STALL )
233 DEBUG_USB_INT_LO_PUTS(
"StaL" );
238 DEBUG_USB_INT_LO_PUTS(
"XacT" );
242 USBHHAL_HCStart( hcnum );
248 if ( hc->errorCnt < 3 )
250 USBHHAL_HCStart( hcnum );
257 else if ( hc->status & HCS_TIMEOUT )
259 DEBUG_USB_INT_HI_PUTCHAR(
't' );
265 #ifdef DEBUG_USB_INT_HI
266 if ( !( ( eptype == HCCHAR_EPTYPE_INTR ) &&
275 if ( eptype == HCCHAR_EPTYPE_CTRL )
276 USBHEP_CtrlEpHandler( hc->ep, result );
278 USBHEP_EpHandler( hc->ep, result );
285 static void Handle_USB_GINTSTS_DISCONNINT(
void )
293 USBH_portStatus = H_PORT_DISCONNECTED;
295 USBHHAL_PortReset(
false );
297 for ( i=0; i< NUM_HC_USED + 2; i++ )
299 hcchar =
USB->HC[ i ].CHAR;
300 USBHHAL_HCHalt( i, hcchar );
301 USB->HC[ i ].INT = 0xFFFFFFFF;
303 if ( !hcs[ i ].idle )
309 DEBUG_USB_INT_LO_PUTS(
"\nDisC" );
315 static void Handle_USB_GINTSTS_HCHINT(
void )
318 uint32_t hcints, hcmask;
320 hcints = USBHHAL_GetHostChannelInts();
322 for ( hcnum = 0, hcmask = 1;
323 hcnum < NUM_HC_USED + 2;
324 hcnum++, hcmask <<= 1 )
326 if ( hcints & hcmask )
330 Handle_HcInInt( hcnum );
334 Handle_HcOutInt( hcnum );
344 static void PortResetComplete(
void )
348 DEBUG_USB_INT_LO_PUTCHAR(
'5' );
352 USBH_portStatus = H_PORT_DISCONNECTED;
354 USBHHAL_PortReset(
false );
361 static void PortDebounceComplete(
void )
371 DEBUG_USB_INT_LO_PUTCHAR(
'3' );
377 else if ( ( hprt & _USB_HPRT_PRTSPD_MASK ) == HPRT_F_SPEED )
379 DEBUG_USB_INT_LO_PUTCHAR(
'4' );
386 USBH_portStatus = H_PORT_CONNECTED_RESETTING;
388 USBH_attachTiming[ USBH_attachRetryCount ].resetTime,
390 USBHHAL_PortReset(
true );
394 USBH_portStatus = H_PORT_DISCONNECTED;
401 static void Handle_USB_GINTSTS_PRTINT(
void )
407 DEBUG_USB_INT_LO_PUTCHAR(
'^' );
409 switch ( USBH_portStatus )
411 case H_PORT_DISCONNECTED:
414 ( hprt & USB_HPRT_PRTCONNSTS ) )
416 DEBUG_USB_INT_LO_PUTCHAR(
'2' );
417 USBH_portStatus = H_PORT_CONNECTED_DEBOUNCING;
419 USBH_attachTiming[ USBH_attachRetryCount ].debounceTime,
420 PortDebounceComplete );
424 case H_PORT_CONNECTED_DEBOUNCING:
426 DEBUG_USB_INT_LO_PUTCHAR(
'Y' );
429 case H_PORT_CONNECTED_RESETTING:
433 ( hprt & USB_HPRT_PRTCONNSTS ) )
435 DEBUG_USB_INT_LO_PUTCHAR(
'6' );
436 USBH_portStatus = H_PORT_CONNECTED;
440 case H_PORT_CONNECTED:
442 if ( ( hprt & USB_HPRT_PRTENCHNG ) &&
443 ( !( hprt & USB_HPRT_PRTENA ) ) )
445 DEBUG_USB_INT_LO_PUTCHAR(
'X' );
446 #if ( USB_VBUSOVRCUR_PORT != USB_VBUSOVRCUR_PORT_NONE )
447 if (
GPIO_PinInGet( USB_VBUSOVRCUR_PORT, USB_VBUSOVRCUR_PIN ) ==
448 USB_VBUSOVRCUR_POLARITY )
450 DEBUG_USB_INT_LO_PUTCHAR(
'~' );
451 USBHHAL_PortReset(
false );
452 USBHHAL_VbusOn(
false );
454 USBH_portStatus = H_PORT_OVERCURRENT;
460 case H_PORT_OVERCURRENT:
467 DEBUG_USB_INT_LO_PUTCHAR(
'9' );
470 hprt &= ~HPRT_WC_MASK;
void USBTIMER_Stop(uint32_t id)
Stop a timer.
#define _USB_HC_CHAR_EPTYPE_MASK
#define _USB_HC_TSIZ_XFERSIZE_SHIFT
USB protocol stack library API for EFM32/EZR32.
int USB_PRINTF(const char *format,...)
Transmit "printf" formated data on the debug serial port.
__STATIC_INLINE uint32_t INT_Enable(void)
Enable interrupts.
#define USB_HC_INT_CHHLTD
CMSIS Cortex-M Peripheral Access Layer for Silicon Laboratories microcontroller devices.
#define USB_HC_INT_BBLERR
#define USB_HPRT_PRTCONNDET
USB_Status_TypeDef
USB transfer status enumerator.
#define USB_HC_INT_DATATGLERR
General Purpose IO (GPIO) peripheral API.
#define _USB_HC_TSIZ_XFERSIZE_MASK
#define USB_GINTSTS_PRTINT
#define USB_HC_INT_XACTERR
USB protocol stack library API for EFM32/EZR32.
#define USB_GINTSTS_DISCONNINT
#define USB_HPRT_PRTOVRCURRCHNG
#define _USB_HCFG_FSLSPCLKSEL_MASK
#define USB_HC_INT_XFERCOMPL
#define _USB_HCFG_FSLSPCLKSEL_SHIFT
#define USB_HC_CHAR_EPDIR
USB protocol stack library, low level USB peripheral access.
__STATIC_INLINE uint32_t INT_Disable(void)
Disable interrupts.
#define USB_HPRT_PRTCONNSTS
#define _USB_HC_TSIZ_PID_MASK
USB protocol stack library, internal type definitions.
#define _USB_HPRT_PRTSPD_MASK
#define USB_GINTSTS_HCHINT
#define USB_HC_TSIZ_PID_DATA0
void USBTIMER_Start(uint32_t id, uint32_t timeout, USBTIMER_Callback_TypeDef callback)
Start a timer.
__STATIC_INLINE unsigned int GPIO_PinInGet(GPIO_Port_TypeDef port, unsigned int pin)
Read the pad value for a single pin in a GPIO port.
#define USB_HPRT_PRTENCHNG