00001 /****************************************************************************** 00002 * 00003 * $RCSfile: $ 00004 * $Revision: $ 00005 * 00006 * This module provides the interface routines for setting up and 00007 * controlling the various interrupt modes present on the ARM processor. 00008 * Copyright 2004, R O SoftWare 00009 * No guarantees, warrantees, or promises, implied or otherwise. 00010 * May be used for hobby or commercial purposes provided copyright 00011 * notice remains intact. 00012 * 00013 *****************************************************************************/ 00014 #include "types.h" 00015 #include "armVIC.h" 00016 00017 #define IRQ_MASK 0x00000080 00018 #define FIQ_MASK 0x00000040 00019 #define INT_MASK (IRQ_MASK | FIQ_MASK) 00020 00021 static inline unsigned __get_cpsr(void) 00022 { 00023 unsigned long retval; 00024 asm volatile (" mrs %0, cpsr" : "=r" (retval) : /* no inputs */ ); 00025 return retval; 00026 } 00027 00028 static inline void __set_cpsr(unsigned val) 00029 { 00030 asm volatile (" msr cpsr, %0" : /* no outputs */ : "r" (val) ); 00031 } 00032 00033 unsigned disableIRQ(void) 00034 { 00035 unsigned _cpsr; 00036 00037 _cpsr = __get_cpsr(); 00038 __set_cpsr(_cpsr | IRQ_MASK); 00039 return _cpsr; 00040 } 00041 00042 unsigned restoreIRQ(unsigned oldCPSR) 00043 { 00044 unsigned _cpsr; 00045 00046 _cpsr = __get_cpsr(); 00047 __set_cpsr((_cpsr & ~IRQ_MASK) | (oldCPSR & IRQ_MASK)); 00048 return _cpsr; 00049 } 00050 00051 unsigned enableIRQ(void) 00052 { 00053 unsigned _cpsr; 00054 00055 _cpsr = __get_cpsr(); 00056 __set_cpsr(_cpsr & ~IRQ_MASK); 00057 return _cpsr; 00058 } 00059 00060 unsigned disableFIQ(void) 00061 { 00062 unsigned _cpsr; 00063 00064 _cpsr = __get_cpsr(); 00065 __set_cpsr(_cpsr | FIQ_MASK); 00066 return _cpsr; 00067 } 00068 00069 unsigned restoreFIQ(unsigned oldCPSR) 00070 { 00071 unsigned _cpsr; 00072 00073 _cpsr = __get_cpsr(); 00074 __set_cpsr((_cpsr & ~FIQ_MASK) | (oldCPSR & FIQ_MASK)); 00075 return _cpsr; 00076 } 00077 unsigned getCPRS(void) 00078 { 00079 return __get_cpsr(); 00080 } 00081 unsigned setCPRS(unsigned cprs) 00082 { 00083 unsigned oldCprs=__get_cpsr(); 00084 __set_cpsr(cprs); 00085 return oldCprs; 00086 } 00087 unsigned enableFIQ(void) 00088 { 00089 unsigned _cpsr; 00090 00091 _cpsr = __get_cpsr(); 00092 __set_cpsr(_cpsr & ~FIQ_MASK); 00093 return _cpsr; 00094 }
1.4.7