interrupt-utils.c
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #include "interrupt-utils.h"
00015
00016 #define IRQ_MASK 0x00000080
00017 #define FIQ_MASK 0x00000040
00018 #define INT_MASK (IRQ_MASK | FIQ_MASK)
00019
00020 static inline unsigned __get_cpsr(void)
00021 {
00022 unsigned long retval;
00023 asm volatile (" mrs %0, cpsr" : "=r" (retval) : );
00024 return retval;
00025 }
00026
00027 static inline void __set_cpsr(unsigned val)
00028 {
00029 asm volatile (" msr cpsr_c, %0" : : "r" (val) );
00030 }
00031
00032 unsigned disableIRQ(void)
00033 {
00034 unsigned _cpsr;
00035
00036 _cpsr = __get_cpsr();
00037 __set_cpsr(_cpsr | IRQ_MASK);
00038 return _cpsr;
00039 }
00040
00041 unsigned restoreIRQ(unsigned oldCPSR)
00042 {
00043 unsigned _cpsr;
00044
00045 _cpsr = __get_cpsr();
00046 __set_cpsr((_cpsr & ~IRQ_MASK) | (oldCPSR & IRQ_MASK));
00047 return _cpsr;
00048 }
00049
00050 unsigned enableIRQ(void)
00051 {
00052 unsigned _cpsr;
00053
00054 _cpsr = __get_cpsr();
00055 __set_cpsr(_cpsr & ~IRQ_MASK);
00056 return _cpsr;
00057 }
00058
00059 unsigned disableFIQ(void)
00060 {
00061 unsigned _cpsr;
00062
00063 _cpsr = __get_cpsr();
00064 __set_cpsr(_cpsr | FIQ_MASK);
00065 return _cpsr;
00066 }
00067
00068 unsigned restoreFIQ(unsigned oldCPSR)
00069 {
00070 unsigned _cpsr;
00071
00072 _cpsr = __get_cpsr();
00073 __set_cpsr((_cpsr & ~FIQ_MASK) | (oldCPSR & FIQ_MASK));
00074 return _cpsr;
00075 }
00076
00077 unsigned enableFIQ(void)
00078 {
00079 unsigned _cpsr;
00080
00081 _cpsr = __get_cpsr();
00082 __set_cpsr(_cpsr & ~FIQ_MASK);
00083 return _cpsr;
00084 }