FreeCalypso > hg > fc-selenite
diff src/cs/drivers/drv_app/ffs/board/intelsbdrv.c @ 46:559a8b3ef10b
FFS code: first attempt at non-invasive gcc support
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Thu, 19 Jul 2018 00:35:33 +0000 |
parents | b6a5e36de839 |
children | 4484ab3f6ab3 |
line wrap: on
line diff
--- a/src/cs/drivers/drv_app/ffs/board/intelsbdrv.c Tue Jul 17 18:17:27 2018 +0000 +++ b/src/cs/drivers/drv_app/ffs/board/intelsbdrv.c Thu Jul 19 00:35:33 2018 +0000 @@ -13,6 +13,7 @@ #include "ffs/ffs.h" #include "ffs/board/drv.h" #include "ffs/board/ffstrace.h" +#include "nucleus.h" #define INTEL_UNLOCK_SLOW 1 @@ -28,8 +29,13 @@ #define FLASH_READ(addr) (*(volatile uint16 *) (addr)) #define FLASH_WRITE(addr, data) (*(volatile uint16 *) (addr)) = data +#ifdef __GNUC__ +asm(".globl ffsdrv_ram_intel_begin"); +asm("ffsdrv_ram_intel_begin:"); +#else asm(" .label _ffsdrv_ram_intel_begin"); asm(" .def _ffsdrv_ram_intel_begin"); +#endif uint32 intel_int_disable(void); void intel_int_enable(uint32 tmp); @@ -222,6 +228,9 @@ uint32 intel_int_disable(void) { +#ifdef __GNUC__ + return NU_Control_Interrupts(0xC0); +#else asm(" .state16"); asm(" mov A1, #0xC0"); asm(" ldr A2, tct_intel_disable"); @@ -229,20 +238,30 @@ asm("tct_intel_disable .field _TCT_Control_Interrupts+0,32"); asm(" .global _TCT_Control_Interrupts"); +#endif } void intel_int_enable(uint32 cpsr) { +#ifdef __GNUC__ + return NU_Control_Interrupts(cpsr); +#else asm(" .state16"); asm(" ldr A2, tct_intel_enable"); asm(" bx A2 "); asm("tct_intel_enable .field _TCT_Control_Interrupts+0,32"); asm(" .global _TCT_Control_Interrupts"); +#endif } // Even though we have this end label, we cannot determine the number of // constant/PC-relative data following the code! +#ifdef __GNUC__ +asm(".globl ffsdrv_ram_intel_end"); +asm("ffsdrv_ram_intel_end:"); +#else asm(" .state32"); asm(" .label _ffsdrv_ram_intel_end"); asm(" .def _ffsdrv_ram_intel_end"); +#endif