1 // --------------------------------------------------------------------------
10 System_control = Kmem::System_ctrl_map_base,
25 Load_0 = Kmem::Timer0_map_base + Timer_load,
26 Load_1 = Kmem::Timer1_map_base + Timer_load,
27 Load_2 = Kmem::Timer2_map_base + Timer_load,
28 Load_3 = Kmem::Timer3_map_base + Timer_load,
30 Value_0 = Kmem::Timer0_map_base + Timer_value,
31 Value_1 = Kmem::Timer1_map_base + Timer_value,
32 Value_2 = Kmem::Timer2_map_base + Timer_value,
33 Value_3 = Kmem::Timer3_map_base + Timer_value,
35 Ctrl_0 = Kmem::Timer0_map_base + Timer_ctrl,
36 Ctrl_1 = Kmem::Timer1_map_base + Timer_ctrl,
37 Ctrl_2 = Kmem::Timer2_map_base + Timer_ctrl,
38 Ctrl_3 = Kmem::Timer3_map_base + Timer_ctrl,
40 Intclr_0 = Kmem::Timer0_map_base + Timer_intclr,
41 Intclr_1 = Kmem::Timer1_map_base + Timer_intclr,
42 Intclr_2 = Kmem::Timer2_map_base + Timer_intclr,
43 Intclr_3 = Kmem::Timer3_map_base + Timer_intclr,
48 Ctrl_periodic = 1 << 6,
53 // --------------------------------------------------------------------------
54 INTERFACE [arm && sp804]:
59 static unsigned irq() { return 36; }
67 // -----------------------------------------------------------------------
68 IMPLEMENTATION [arm && sp804]:
77 void Timer::init(unsigned)
79 Mword v = Io::read<Mword>(Timer_sp804::System_control);
80 v |= Timer_sp804::Timclk << Timer_sp804::Timer0_enable;
81 Io::write<Mword>(v, Timer_sp804::System_control);
84 Io::write<Mword>(0, Timer_sp804::Ctrl_0);
85 Io::write<Mword>(0, Timer_sp804::Ctrl_1);
86 Io::write<Mword>(0, Timer_sp804::Ctrl_2);
87 Io::write<Mword>(0, Timer_sp804::Ctrl_3);
89 Io::write<Mword>(Interval, Timer_sp804::Load_0);
90 Io::write<Mword>(Interval, Timer_sp804::Value_0);
91 Io::write<Mword> (Timer_sp804::Ctrl_enable
92 | Timer_sp804::Ctrl_periodic
93 | Timer_sp804::Ctrl_ie,
99 Timer::timer_to_us(Unsigned32 /*cr*/)
104 Timer::us_to_timer(Unsigned64 us)
105 { (void)us; return 0; }
107 PUBLIC static inline NEEDS["io.h"]
111 Io::write<Mword>(0, Timer_sp804::Intclr_0);
116 Timer::update_one_shot(Unsigned64 wakeup)
121 IMPLEMENT inline NEEDS["config.h", "kip.h"]
123 Timer::system_clock()
125 if (Config::Scheduler_one_shot)
128 return Kip::k()->clock;