00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070 #include <cfg/arch.h>
00071 #if defined(MCU_AT91R40008)
00072 #include <arch/arm/at91.h>
00073
00074 #elif defined(MCU_S3C4510B)
00075 #include <arch/arm.h>
00076 #include <dev/s3c4510b_hw.h>
00077 #include <dev/s3c4510b_irqs.h>
00078
00079 #elif defined(MCU_GBA)
00080 #include <arch/gba.h>
00081 #include <dev/irqreg.h>
00082
00083 #endif
00084
00085 #ifndef NUT_CPU_FREQ
00086 #define NUT_CPU_FREQ 1000000UL
00087 #endif
00088
00089 #ifndef NUT_TICK_FREQ
00090 #define NUT_TICK_FREQ 1000UL
00091 #endif
00092
00093 #if defined(MCU_AT91R40008)
00094 static int dummy;
00095 #endif
00096
00097 static void (*os_handler) (void *);
00098
00112 void NutDelay(u_char ms)
00113 {
00114 u_short delay_cnt = 2400;
00115 u_short delay_cnt_buffer;
00116
00117 while (ms--) {
00118 delay_cnt_buffer = delay_cnt;
00119 while (delay_cnt_buffer--);
00120 }
00121 }
00122
00123
00127 #if defined(MCU_AT91R40008)
00128 void Timer0Entry(void) __attribute__ ((naked));
00129 void Timer0Entry(void)
00130 {
00131 IRQ_ENTRY();
00132 dummy = inr(TC0_SR);
00133 os_handler(0);
00134 IRQ_EXIT();
00135 }
00136
00137 #elif defined(MCU_GBA)
00138
00139 void Timer3Entry(void *arg)
00140 {
00141 outw(REG_IF, INT_TMR3);
00142 os_handler(0);
00143 }
00144
00145 #endif
00146
00158 void NutRegisterTimer(void (*handler) (void *))
00159 {
00160 os_handler = handler;
00161
00162 #if defined(MCU_AT91R40008)
00163
00164
00165 outr(TC0_CCR, TC_CLKDIS);
00166
00167 outr(TC0_IDR, 0xFFFFFFFF);
00168
00169 dummy = inr(TC0_SR);
00170
00171 outr(TC0_CMR, TC_CLKS_MCK32 | TC_CPCTRG);
00172
00173 outr(TC0_CCR, TC_CLKEN);
00174
00175 outr(TC0_IER, TC_CPCS);
00176
00177
00178 outr(AIC_IDCR, _BV(TC0_ID));
00179
00180 outr(AIC_SVR(4), (unsigned int)Timer0Entry);
00181
00182
00183 outr(AIC_SMR(4), (AIC_SRCTYPE_INT_LEVEL_SENSITIVE | 0x4));
00184
00185 outr(AIC_ICCR, _BV(TC0_ID));
00186
00187 outr(AIC_IECR, _BV(TC0_ID));
00188
00189
00190 outr(TC0_RC, 0x80F);
00191
00192 outr(TC0_CCR, TC_SWTRG);
00193
00194 #elif defined(MCU_S3C4510B)
00195
00196 INT_DISABLE(IRQ_TIMER);
00197 CSR_WRITE(TCNT0, 0);
00198 CSR_WRITE(TDATA0, CLOCK_TICK_RATE);
00199 CSR_WRITE(TMOD, TMOD_TIMER0_VAL);
00200
00201 CLEAR_PEND_INT(IRQ_TIMER);
00202
00203 NutRegisterIrqHandler(
00204 &InterruptHandlers[IRQ_TIMER], handler, 0);
00205
00206 INT_ENABLE(IRQ_TIMER);
00207
00208 #elif defined(MCU_GBA)
00209
00210
00211 outw(REG_IME, 0);
00212
00213
00214 NutRegisterIrqHandler(&sig_TMR3, Timer3Entry, 0);
00215
00216
00217 outdw(REG_TMR3CNT, TMR_IRQ_ENA | TMR_ENA | 48756);
00218
00219
00220 outw(REG_IE, inw(REG_IE) | INT_TMR3);
00221
00222
00223 outw(REG_IME, 1);
00224
00225 #else
00226 #warning "MCU not defined"
00227 #endif
00228 }
00229
00235 u_long NutGetCpuClock(void)
00236 {
00237 return NUT_CPU_FREQ;
00238 }
00239
00245 u_long NutGetTickClock(void)
00246 {
00247 return NUT_TICK_FREQ;
00248 }
00249
00253 u_long NutTimerMillisToTicks(u_long ms)
00254 {
00255 return ms * 1000L / NutGetTickClock();
00256 }
00257
00258