00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "at91sam7s64.h"
00021
00022 #include "global.h"
00023
00024 #include "processor.h"
00025
00026
00027
00028 extern void AT91F_Spurious_handler(void);
00029 extern void AT91F_Default_IRQ_handler(void);
00030 extern void AT91F_Default_FIQ_handler(void);
00031
00032
00033
00034
00035
00036 #ifndef SYS_INTERRUPT_LEVEL
00037 #define SYS_INTERRUPT_LEVEL AT91C_AIC_PRIOR_HIGHEST
00038 #endif
00039
00040 typedef void (*voidFuncPtr)(void);
00041 volatile static voidFuncPtr SysIntFunc[SYSPID_NUM];
00042
00043
00044
00045
00046 void processorInit( void)
00047 {
00048
00049
00050
00051
00052
00053 AT91C_BASE_MC->MC_FMR = AT91C_MC_FWS_1FWS;
00054
00055
00056 AT91C_BASE_WDTC->WDTC_WDMR= AT91C_WDTC_WDDIS;
00057
00058
00059
00060
00061 AT91C_BASE_PMC->PMC_MOR = (( AT91C_CKGR_OSCOUNT & (0x06<<8) ) | AT91C_CKGR_MOSCEN );
00062
00063 while(!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MOSCS));
00064
00065
00066
00067
00068
00069
00070
00071
00072 AT91C_BASE_PMC->PMC_PLLR =
00073 ((AT91C_CKGR_DIV & (OSC_DIV)) |
00074 (AT91C_CKGR_PLLCOUNT & (28<<8)) |
00075 (AT91C_CKGR_MUL & ((PLL_MUL-1)<<16)));
00076
00077
00078 while(!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_LOCK));
00079 while(!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY));
00080
00081
00082 AT91C_BASE_PMC->PMC_MCKR = AT91C_PMC_PRES_CLK_2;
00083 while(!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY));
00084
00085 AT91C_BASE_PMC->PMC_MCKR |= AT91C_PMC_CSS_PLL_CLK;
00086 while(!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY));
00087
00088
00089
00090
00091 processorAicInit();
00092
00093 processorAicAttach(AT91C_ID_SYS, (SYS_INTERRUPT_LEVEL|AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL), processorSysIntService);
00094 }
00095
00096 unsigned int processorDisableInt(unsigned int cpsr_mask)
00097 {
00098 unsigned int cpsr;
00099
00100 asm volatile ("mrs %0, cpsr" : "=r" (cpsr) : );
00101
00102 asm volatile ("msr cpsr, %0" : : "r" (cpsr|(cpsr_mask&CPSR_MASK_INT)) );
00103
00104 return cpsr;
00105 }
00106
00107 unsigned int processorEnableInt(unsigned int cpsr_mask)
00108 {
00109 unsigned int cpsr;
00110
00111 asm volatile ("mrs %0, cpsr" : "=r" (cpsr) : );
00112
00113 asm volatile ("msr cpsr, %0" : : "r" (cpsr&~(cpsr_mask&CPSR_MASK_INT)) );
00114
00115 return cpsr;
00116 }
00117
00118 unsigned int processorRestoreInt(unsigned int cpsr_orig)
00119 {
00120 unsigned int cpsr;
00121
00122 asm volatile ("mrs %0, cpsr" : "=r" (cpsr) : );
00123
00124 asm volatile ("msr cpsr, %0" : : "r" ( (cpsr&~CPSR_MASK_INT) | (cpsr_orig&CPSR_MASK_INT)) );
00125
00126 return cpsr;
00127 }
00128
00129 void processorAicInit(void)
00130 {
00131 int i;
00132
00133
00134 AT91C_BASE_AIC->AIC_SVR[0] = (unsigned int)AT91F_Default_FIQ_handler;
00135 for(i=1; i<31; i++)
00136 {
00137 AT91C_BASE_AIC->AIC_SVR[i] = (unsigned int)AT91F_Default_IRQ_handler;
00138 }
00139 AT91C_BASE_AIC->AIC_SPU = (unsigned int)AT91F_Spurious_handler;
00140 }
00141
00142 void processorAicAttach(int pid, int srcmode, void (*userFunc)(void) )
00143 {
00144
00145 AT91C_BASE_AIC->AIC_IDCR = (1<<pid);
00146
00147 AT91C_BASE_AIC->AIC_SVR[pid] = (unsigned int)userFunc;
00148
00149 AT91C_BASE_AIC->AIC_SMR[pid] = srcmode;
00150
00151 AT91C_BASE_AIC->AIC_ICCR = (1<<pid);
00152
00153 AT91C_BASE_AIC->AIC_IECR = (1<<pid);
00154 }
00155
00156 void processorAicDetach(int pid)
00157 {
00158
00159 AT91C_BASE_AIC->AIC_IDCR = (1<<pid);
00160
00161 AT91C_BASE_AIC->AIC_ICCR = (1<<pid);
00162
00163 AT91C_BASE_AIC->AIC_SVR[pid] = 0;
00164 }
00165
00166 void processorAicAttachSys(int syspid, void (*userFunc)(void) )
00167 {
00168
00169 if(syspid < SYSPID_NUM)
00170 {
00171
00172 SysIntFunc[syspid] = userFunc;
00173 }
00174 }
00175
00176 void processorSysIntService(void)
00177 {
00178
00179
00180
00181
00182 if( (AT91C_BASE_PITC->PITC_PIMR & AT91C_PITC_PITIEN) &&
00183 (AT91C_BASE_PITC->PITC_PISR & AT91C_PITC_PITS) )
00184 {
00185 if(SysIntFunc[SYSPID_PITC]) SysIntFunc[SYSPID_PITC]();
00186 return;
00187 }
00188
00189 if(AT91C_BASE_DBGU->DBGU_IMR & AT91C_BASE_DBGU->DBGU_CSR)
00190 {
00191 if(SysIntFunc[SYSPID_DBGU]) SysIntFunc[SYSPID_DBGU]();
00192 return;
00193 }
00194
00195 if( ((AT91C_BASE_RTTC->RTTC_RTMR>>16) & AT91C_BASE_RTTC->RTTC_RTSR) &
00196 (AT91C_RTTC_RTTINC|AT91C_RTTC_ALMS) )
00197 {
00198 if(SysIntFunc[SYSPID_RTTC]) SysIntFunc[SYSPID_RTTC]();
00199 return;
00200 }
00201
00202 if( (AT91C_BASE_MC->MC_FMR & AT91C_BASE_MC->MC_FSR) &
00203 (AT91C_MC_FRDY|AT91C_MC_LOCKE|AT91C_MC_PROGE) )
00204 {
00205 if(SysIntFunc[SYSPID_EFC]) SysIntFunc[SYSPID_EFC]();
00206 return;
00207 }
00208
00209 if( AT91C_BASE_PMC->PMC_IER & AT91C_BASE_PMC->PMC_SR )
00210 {
00211 if(SysIntFunc[SYSPID_PMC]) SysIntFunc[SYSPID_PMC]();
00212 return;
00213 }
00214
00215
00216
00217 }
00218