/* * USB_IRQHandler() is the first level handler for the USB peripheral interrupt. */ void USB_IRQHandler( void ) { uint32_t status; INT_Disable(); status = USBHAL_GetCoreInts(); if ( status == 0 ) { INT_Enable(); DEBUG_USB_INT_LO_PUTS( "\nSinT" ); return; } HANDLE_INT( USB_GINTSTS_HCHINT ) HANDLE_INT( USB_GINTSTS_PRTINT ) HANDLE_INT( USB_GINTSTS_DISCONNINT ) INT_Enable(); if ( status != 0 ) { DEBUG_USB_INT_LO_PUTS( "\nUinT" ); } }
/* * USB_IRQHandler() is the first level handler for the USB peripheral interrupt. */ void USB_IRQHandler( void ) { uint32_t status; INT_Disable(); status = USBHAL_GetCoreInts(); if ( status == 0 ) { INT_Enable(); DEBUG_USB_INT_LO_PUTS( "\nSinT" ); return; } #if defined( USB_SLAVEMODE ) HANDLE_INT( USB_GINTSTS_RXFLVL ) HANDLE_INT( USB_GINTSTS_NPTXFEMP ) HANDLE_INT( USB_GINTSTS_PTXFEMP ) #endif HANDLE_INT( USB_GINTSTS_HCHINT ) HANDLE_INT( USB_GINTSTS_PRTINT ) HANDLE_INT( USB_GINTSTS_DISCONNINT ) INT_Enable(); if ( status != 0 ) { DEBUG_USB_INT_LO_PUTS( "\nUinT" ); } }
/* Marshals integral types from C to Lua. */ static void marshal_2lua_int (lua_State *L, GITypeTag tag, GIArgument *val, int parent) { switch (tag) { #define HANDLE_INT(nameupper, namelower, ptrconv, ut) \ case GI_TYPE_TAG_ ## nameupper: \ if (sizeof (g ## namelower) <= sizeof (long) \ && parent == LGI_PARENT_IS_RETVAL) \ { \ ReturnUnion *ru = (ReturnUnion *) val; \ ru->arg.v_ ## namelower = (g ## namelower) ru->ut; \ } \ lua_pushnumber (L, parent == LGI_PARENT_FORCE_POINTER \ ? GPOINTER_TO_ ## ptrconv (val->v_pointer) \ : val->v_ ## namelower); \ break; HANDLE_INT(INT8, int8, INT, s); HANDLE_INT(UINT8, uint8, UINT, u); HANDLE_INT(INT16, int16, INT, s); HANDLE_INT(UINT16, uint16, UINT, u); HANDLE_INT(INT32, int32, INT, s); HANDLE_INT(UINT32, uint32, UINT, u); HANDLE_INT(UNICHAR, uint32, UINT, u); HANDLE_INT(INT64, int64, INT, s); HANDLE_INT(UINT64, uint64, UINT, u); #undef HANDLE_INT case GI_TYPE_TAG_GTYPE: lua_pushstring (L, g_type_name ( #if GLIB_SIZEOF_SIZE_T == 4 val->v_uint32 #else val->v_uint64 #endif )); break; default: g_assert_not_reached (); } }
/* * USB_IRQHandler() is the first level handler for the USB peripheral interrupt. */ void USB_IRQHandler( void ) { uint32_t status; bool servedVbusInterrupt = false; INT_Disable(); #if ( USB_PWRSAVE_MODE ) if ( USBD_poweredDown ) { /* Switch USBC clock from 32kHz to a 48MHz clock to be able to */ /* read USB peripheral registers. */ /* If we woke up from EM2, HFCLK is now HFRCO. */ /* Restore clock oscillators.*/ #if defined( CMU_OSCENCMD_USHFRCOEN ) if ( ( CMU->STATUS & CMU_STATUS_USHFRCOENS ) == 0 )/*Wakeup from EM2 ?*/ { CMU->OSCENCMD = ( cmuStatus & ( CMU_STATUS_AUXHFRCOENS | CMU_STATUS_HFXOENS ) ) | CMU_OSCENCMD_USHFRCOEN; } #else if ( ( CMU->STATUS & CMU_STATUS_HFXOENS ) == 0 ) /* Wakeup from EM2 ? */ { CMU->OSCENCMD = cmuStatus & ( CMU_STATUS_AUXHFRCOENS | CMU_STATUS_HFXOENS ); } #endif /* Select correct USBC clock.*/ #if defined( CMU_OSCENCMD_USHFRCOEN ) CMU->CMD = CMU_CMD_USBCCLKSEL_USHFRCO; while ( ( CMU->STATUS & CMU_STATUS_USBCUSHFRCOSEL ) == 0 ){} #else CMU->CMD = CMU_CMD_USBCCLKSEL_HFCLKNODIV; while ( ( CMU->STATUS & CMU_STATUS_USBCHFCLKSEL ) == 0 ){} #endif } #endif /* if ( USB_PWRSAVE_MODE ) */ if ( USB->IF && ( USB->CTRL & USB_CTRL_VREGOSEN ) ) { if ( USB->IF & USB_IF_VREGOSH ) { USB->IFC = USB_IFC_VREGOSH; if ( USB->STATUS & USB_STATUS_VREGOS ) { servedVbusInterrupt = true; DEBUG_USB_INT_LO_PUTS( "\nVboN" ); #if ( USB_PWRSAVE_MODE ) if ( UsbPowerUp() ) { USBDHAL_EnableUsbResetAndSuspendInt(); } USBD_SetUsbState( USBD_STATE_POWERED ); #endif } } if ( USB->IF & USB_IF_VREGOSL ) { USB->IFC = USB_IFC_VREGOSL; if ( ( USB->STATUS & USB_STATUS_VREGOS ) == 0 ) { servedVbusInterrupt = true; DEBUG_USB_INT_LO_PUTS( "\nVboF" ); #if ( USB_PWRSAVE_MODE ) #if ( USB_PWRSAVE_MODE & USB_PWRSAVE_MODE_ONVBUSOFF ) if ( !USBD_poweredDown ) { USB->GINTMSK = 0; USB->GINTSTS = 0xFFFFFFFF; } UsbPowerDown(); #endif USBD_SetUsbState( USBD_STATE_NONE ); #endif } } } status = USBHAL_GetCoreInts(); if ( status == 0 ) { INT_Enable(); if ( !servedVbusInterrupt ) { DEBUG_USB_INT_LO_PUTS( "\nSinT" ); } return; } HANDLE_INT( USB_GINTSTS_RESETDET ) HANDLE_INT( USB_GINTSTS_WKUPINT ) HANDLE_INT( USB_GINTSTS_USBSUSP ) HANDLE_INT( USB_GINTSTS_SOF ) HANDLE_INT( USB_GINTSTS_ENUMDONE ) HANDLE_INT( USB_GINTSTS_USBRST ) HANDLE_INT( USB_GINTSTS_IEPINT ) HANDLE_INT( USB_GINTSTS_OEPINT ) INT_Enable(); if ( status != 0 ) { DEBUG_USB_INT_LO_PUTS( "\nUinT" ); } }
/* * USB_IRQHandler() is the first level handler for the USB peripheral interrupt. */ void USB_IRQHandler( void ) { uint32_t status; bool servedVbusInterrupt = false; INT_Disable(); #if ( USB_PWRSAVE_MODE ) if ( USBD_poweredDown ) { /* Switch USBC clock from 32kHz to HFCLK to be able to read USB */ /* peripheral registers. */ /* If we woke up from EM2, HFCLK is now HFRCO. */ CMU_OscillatorEnable( cmuOsc_HFXO, true, false); /* Prepare HFXO. */ CMU->CMD = CMU_CMD_USBCCLKSEL_HFCLKNODIV; while ( !( CMU->STATUS & CMU_STATUS_USBCHFCLKSEL ) ) { } } #endif /* if ( USB_PWRSAVE_MODE ) */ if ( USB->IF && ( USB->CTRL & USB_CTRL_VREGOSEN ) ) { if ( USB->IF & USB_IF_VREGOSH ) { USB->IFC = USB_IFC_VREGOSH; if ( USB->STATUS & USB_STATUS_VREGOS ) { servedVbusInterrupt = true; DEBUG_USB_INT_LO_PUTS( "\nVboN" ); #if ( USB_PWRSAVE_MODE & USB_PWRSAVE_MODE_ONVBUSOFF ) if ( UsbPowerUp() ) #endif { USBDHAL_EnableUsbResetInt(); } USBD_SetUsbState( USBD_STATE_POWERED ); } } if ( USB->IF & USB_IF_VREGOSL ) { USB->IFC = USB_IFC_VREGOSL; if ( !( USB->STATUS & USB_STATUS_VREGOS ) ) { servedVbusInterrupt = true; DEBUG_USB_INT_LO_PUTS( "\nVboF" ); USB->GINTMSK = 0; USB->GINTSTS = 0xFFFFFFFF; #if ( USB_PWRSAVE_MODE & USB_PWRSAVE_MODE_ONVBUSOFF ) UsbPowerDown(); #endif USBD_SetUsbState( USBD_STATE_NONE ); } } } status = USBHAL_GetCoreInts(); if ( status == 0 ) { INT_Enable(); if ( !servedVbusInterrupt ) { DEBUG_USB_INT_LO_PUTS( "\nSinT" ); } return; } HANDLE_INT( USB_GINTSTS_RESETDET ) HANDLE_INT( USB_GINTSTS_WKUPINT ) HANDLE_INT( USB_GINTSTS_USBSUSP ) HANDLE_INT( USB_GINTSTS_SOF ) HANDLE_INT( USB_GINTSTS_ENUMDONE ) HANDLE_INT( USB_GINTSTS_USBRST ) HANDLE_INT( USB_GINTSTS_IEPINT ) HANDLE_INT( USB_GINTSTS_OEPINT ) INT_Enable(); if ( status != 0 ) { DEBUG_USB_INT_LO_PUTS( "\nUinT" ); } }
/* Marshals integral types to C. If requested, makes sure that the value is actually marshalled into val->v_pointer no matter what the input type is. */ static void marshal_2c_int (lua_State *L, GITypeTag tag, GIArgument *val, int narg, gboolean optional, int parent) { (void) optional; switch (tag) { #define HANDLE_INT(nameup, namelow, ptrconv, pct, val_min, val_max, ut) \ case GI_TYPE_TAG_ ## nameup: \ val->v_ ## namelow = check_number (L, narg, val_min, val_max); \ if (parent == LGI_PARENT_FORCE_POINTER) \ val->v_pointer = \ G ## ptrconv ## _TO_POINTER ((pct) val->v_ ## namelow); \ else if (sizeof (g ## namelow) <= sizeof (long) \ && parent == LGI_PARENT_IS_RETVAL) \ { \ ReturnUnion *ru = (ReturnUnion *) val; \ ru->ut = ru->arg.v_ ## namelow; \ } \ break #define HANDLE_INT_NOPTR(nameup, namelow, val_min, val_max, ut) \ case GI_TYPE_TAG_ ## nameup: \ val->v_ ## namelow = check_number (L, narg, val_min, val_max); \ g_assert (parent != LGI_PARENT_FORCE_POINTER); \ if (sizeof (g ## namelow) <= sizeof (long) \ && parent == LGI_PARENT_IS_RETVAL) \ { \ ReturnUnion *ru = (ReturnUnion *) val; \ ru->ut = ru->arg.v_ ## namelow; \ } \ break HANDLE_INT(INT8, int8, INT, gint, -0x80, 0x7f, s); HANDLE_INT(UINT8, uint8, UINT, guint, 0, 0xff, u); HANDLE_INT(INT16, int16, INT, gint, -0x8000, 0x7fff, s); HANDLE_INT(UINT16, uint16, UINT, guint, 0, 0xffff, u); HANDLE_INT(INT32, int32, INT, gint, -0x80000000LL, 0x7fffffffLL, s); HANDLE_INT(UINT32, uint32, UINT, guint, 0, 0xffffffffUL, u); HANDLE_INT(UNICHAR, uint32, UINT, guint, 0, 0x7fffffffLL, u); HANDLE_INT_NOPTR(INT64, int64, ((lua_Number) -0x7f00000000000000LL) - 1, 0x7fffffffffffffffLL, s); HANDLE_INT_NOPTR(UINT64, uint64, 0, 0xffffffffffffffffULL, u); #undef HANDLE_INT #undef HANDLE_INT_NOPTR case GI_TYPE_TAG_GTYPE: { #if GLIB_SIZEOF_SIZE_T == 4 val->v_uint32 = #else val->v_uint64 = #endif lgi_type_get_gtype (L, narg); break; } default: g_assert_not_reached (); } }
/* Calculates size and alignment of specified type. size, align = marshal.typeinfo(tiinfo) */ static int marshal_typeinfo (lua_State *L) { GIBaseInfo **info = luaL_checkudata (L, 1, LGI_GI_INFO); switch (g_type_info_get_tag (*info)) { #define HANDLE_INT(upper, type) \ case GI_TYPE_TAG_ ## upper: \ { \ struct Test { char offender; type examined; }; \ lua_pushnumber (L, sizeof (type)); \ lua_pushnumber (L, G_STRUCT_OFFSET (struct Test, examined)); \ } \ break HANDLE_INT (VOID, gpointer); HANDLE_INT (BOOLEAN, gboolean); HANDLE_INT (INT8, gint8); HANDLE_INT (UINT8, guint8); HANDLE_INT (INT16, gint16); HANDLE_INT (UINT16, guint16); HANDLE_INT (INT32, gint32); HANDLE_INT (UINT32, guint32); HANDLE_INT (INT64, gint64); HANDLE_INT (UINT64, guint64); HANDLE_INT (FLOAT, gfloat); HANDLE_INT (DOUBLE, gdouble); HANDLE_INT (GTYPE, GType); HANDLE_INT (UTF8, const gchar *); HANDLE_INT (FILENAME, const gchar *); HANDLE_INT (UNICHAR, gunichar); #undef HANDLE_INT default: return luaL_argerror (L, 1, "bad typeinfo"); } return 2; }