2 #include "../port/lib.h"
7 #include "../port/error.h"
11 Timer_ctrl = Saturn + 0x0106,
12 Timer0_load = Saturn + 0x0200,
13 Timer0_cnt = Saturn + 0x0204,
14 Timer1_load = Saturn + 0x0300,
15 Timer1_cnt = Saturn + 0x0304,
17 T0_event = RBIT(13, ushort),
18 T0_ie = RBIT(14, ushort),
19 T0_cen = RBIT(15, ushort),
20 T1_event = RBIT(5, ushort),
21 T1_ie = RBIT(6, ushort),
22 T1_cen = RBIT(7, ushort),
27 static ushort timer_ctl;
30 saturntimerintr(Ureg *u, void*)
32 ushort ctl = *(ushort*)Timer_ctrl, v = 0;
39 *(ushort*)Timer_ctrl = timer_ctl|T0_event|v;
47 *(ushort*)Timer_ctrl = 0;
48 *(ulong*)Timer0_load = m->bushz / HZ;
49 *(ulong*)Timer0_cnt = m->bushz / HZ;
50 *(ulong*)Timer1_load = m->bushz;
51 *(ulong*)Timer1_cnt = m->bushz;
53 intrenable(Vectimer0, saturntimerintr, nil, "timer");
55 timer_ctl = T0_cen|T0_ie|T1_cen;
56 *(ushort*)Timer_ctrl = timer_ctl;
62 assert(*(ushort*)Timer_ctrl&T1_cen);
63 if(*(ushort*)Timer_ctrl&T1_event){
64 *(ushort*)Timer_ctrl = timer_ctl|T1_event;
71 return (uvlong)ticks*m->bushz+(uvlong)(m->bushz-*(ulong*)Timer1_cnt);
81 *(ushort*)Timer_ctrl = T1_cen;
85 if((long)offset < 10000)
87 else if(offset > m->bushz)
90 *(ulong*)Timer0_cnt = offset;
91 *(ushort*)Timer_ctrl = timer_ctl;
92 assert(*(ushort*)Timer_ctrl & T1_cen);