1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
14:
15: 16: 17: 18:
19:
20: #ifndef _TKDEV_TIMER_
21: #define _TKDEV_TIMER_
22:
23: #include <tk/syslib.h>
24: #include <sys/sysinfo.h>
25: #include "tkdev_conf.h"
26:
27: 28: 29:
30: #define MIN_TIMER_PERIOD 10
31: #define MAX_TIMER_PERIOD 50000
32:
33: 34: 35:
36: Inline void init_hw_timer( void )
37: {
38: UW n, d, imask;
39:
40: DI(imask);
41:
42:
43: out_w(TI_OP, 0);
44:
45:
46: out_w(TI0TIN_SEL, (in_w(TI0TIN_SEL) & ~3) | TITIN_PLL3);
47: d = in_w(DIVTIMTIN);
48:
49:
50: out_w(GCLKCTRL3ENA, in_w(GCLKCTRL3ENA) | TI0_TIN_GCK);
51: out_w(GCLKCTRL3, in_w(GCLKCTRL3) | TI0_TIN_GCK);
52:
53:
54: out_w(TI_OP, TM_EN);
55: while ( (in_w(TI_SCLR) & TM_SCLR) != 0 );
56: WaitUsec(100);
57:
58:
59: n = (TIMER_PERIOD * TIN_CLK(d)) / 1000000 - 1;
60: out_w(TI_SET, n);
61:
62:
63: out_w(TI_OP, TO_EN|TSTART|TM_EN);
64:
65: EI(imask);
66: }
67:
68: 69: 70: 71:
72: Inline void start_hw_timer( void )
73: {
74: IMPORT void timer_handler_startup( void );
75:
76:
77: init_hw_timer();
78:
79:
80: define_inthdr(VECNO_TIMER, timer_handler_startup);
81:
82:
83: SetIntMode(VECNO_TIMER, IM_ENA);
84: ClearInt(VECNO_TIMER);
85: EnableInt(VECNO_TIMER);
86: }
87:
88: 89: 90: 91: 92: 93: 94: 95: 96: 97:
98: Inline void clear_hw_timer_interrupt( void )
99: {
100:
101: out_w(IT0_IDS1, IRQM(IRQ_TIMER));
102:
103:
104: out_w(IT0_IIR, IRQM(IRQ_TIMER));
105: }
106: Inline void end_of_hw_timer_interrupt( void )
107: {
108:
109: out_w(IT0_IEN1, IRQM(IRQ_TIMER));
110: }
111:
112: 113: 114: 115: 116:
117: Inline void terminate_hw_timer( void )
118: {
119: UW imask;
120:
121:
122: DisableInt(VECNO_TIMER);
123:
124: DI(imask);
125:
126:
127: out_w(TI_OP, 0);
128:
129:
130: out_w(GCLKCTRL3, in_w(GCLKCTRL3) & ~TI0_TIN_GCK);
131:
132: EI(imask);
133: }
134:
135: 136: 137: 138: 139: 140: 141:
142: Inline UINT get_hw_timer_nsec( void )
143: {
144: UW ofs, max, ovf, imask, d;
145:
146: DI(imask);
147:
148: d = in_w(DIVTIMTIN);
149:
150: max = in_w(TI_SET);
151: do {
152: ovf = in_w(IT0_RAW1) & IRQM(IRQ_TIMER);
153: ofs = in_w(TI_RCR);
154: } while ( ovf != (in_w(IT0_RAW1) & IRQM(IRQ_TIMER)) );
155: if ( ovf != 0 ) ofs += max + 1;
156:
157: EI(imask);
158:
159: return ofs * 1000000000LL / TIN_CLK(d);
160: }
161:
162: 163: 164:
165: Inline UINT get_hw_timer_usec( void )
166: {
167: UW ofs, max, ovf, imask, d;
168:
169: DI(imask);
170:
171: d = in_w(DIVTIMTIN);
172:
173: max = in_w(TI_SET);
174: do {
175: ovf = in_w(IT0_RAW1) & IRQM(IRQ_TIMER);
176: ofs = in_w(TI_RCR);
177: } while ( ovf != (in_w(IT0_RAW1) & IRQM(IRQ_TIMER)) );
178: if ( ovf != 0 ) ofs += max + 1;
179:
180: EI(imask);
181:
182: return (ofs + 1) * 1000000LL / TIN_CLK(d);
183: }
184:
185: #endif