FreeCalypso > hg > fc-selenite
diff src/cs/drivers/drv_app/ffs/board/drv.c @ 72:4484ab3f6ab3
FFS interrupt voodoo: made original TMS470 approach work with gcc
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Fri, 20 Jul 2018 03:35:25 +0000 |
parents | 8019491a67a9 |
children | 7d50d8d13711 |
line wrap: on
line diff
--- a/src/cs/drivers/drv_app/ffs/board/drv.c Fri Jul 20 02:48:06 2018 +0000 +++ b/src/cs/drivers/drv_app/ffs/board/drv.c Fri Jul 20 03:35:25 2018 +0000 @@ -1426,30 +1426,48 @@ // Note that we use our own interrupt disable/enable function because // Nucleus allegedly should have a bug in its implementation for this. -uint32 int_disable(void) +#ifdef __GNUC__ +#define NOINLINE __attribute__ ((noinline)) +#else +#define NOINLINE +#endif + +uint32 NOINLINE int_disable(void) { #ifdef __GNUC__ - return NU_Control_Interrupts(0xC0); + asm(" .code 16"); #else asm(" .state16"); +#endif asm(" mov A1, #0xC0"); asm(" ldr A2, tct_disable"); asm(" bx A2 "); +#ifdef __GNUC__ + asm(".balign 4"); + asm("tct_disable:"); + asm(" .word TCT_Control_Interrupts"); +#else asm("tct_disable .field _TCT_Control_Interrupts+0,32"); asm(" .global _TCT_Control_Interrupts"); #endif } -void int_enable(uint32 cpsr) +void NOINLINE int_enable(uint32 cpsr) { #ifdef __GNUC__ - return NU_Control_Interrupts(cpsr); + asm(" .code 16"); #else asm(" .state16"); +#endif asm(" ldr A2, tct_enable"); asm(" bx A2 "); +#ifdef __GNUC__ + asm(".balign 4"); + asm("tct_enable:"); + asm(" .word TCT_Control_Interrupts"); +#else asm("tct_enable .field _TCT_Control_Interrupts+0,32"); asm(" .global _TCT_Control_Interrupts"); #endif