1 // --------------------------------------------------------------------------
2 INTERFACE [arm && sp804]:
12 System_control = Kmem::System_ctrl_map_base,
27 Load_0 = Kmem::Timer0_map_base + Timer_load,
28 Load_1 = Kmem::Timer1_map_base + Timer_load,
29 Load_2 = Kmem::Timer2_map_base + Timer_load,
30 Load_3 = Kmem::Timer3_map_base + Timer_load,
32 Value_0 = Kmem::Timer0_map_base + Timer_value,
33 Value_1 = Kmem::Timer1_map_base + Timer_value,
34 Value_2 = Kmem::Timer2_map_base + Timer_value,
35 Value_3 = Kmem::Timer3_map_base + Timer_value,
37 Ctrl_0 = Kmem::Timer0_map_base + Timer_ctrl,
38 Ctrl_1 = Kmem::Timer1_map_base + Timer_ctrl,
39 Ctrl_2 = Kmem::Timer2_map_base + Timer_ctrl,
40 Ctrl_3 = Kmem::Timer3_map_base + Timer_ctrl,
42 Intclr_0 = Kmem::Timer0_map_base + Timer_intclr,
43 Intclr_1 = Kmem::Timer1_map_base + Timer_intclr,
44 Intclr_2 = Kmem::Timer2_map_base + Timer_intclr,
45 Intclr_3 = Kmem::Timer3_map_base + Timer_intclr,
50 Ctrl_periodic = 1 << 6,
57 // -----------------------------------------------------------------------
58 IMPLEMENTATION [arm && sp804]:
73 v = Io::read<Mword>(System_control);
74 v |= Timclk << Timer1_enable;
75 Io::write<Mword>(v, System_control);
78 Io::write<Mword>(0, Ctrl_0);
79 Io::write<Mword>(0, Ctrl_1);
80 Io::write<Mword>(0, Ctrl_2);
81 Io::write<Mword>(0, Ctrl_3);
83 Io::write<Mword>(Interval, Load_0);
84 Io::write<Mword>(Interval, Value_0);
85 Io::write<Mword>(Ctrl_enable | Ctrl_periodic | Ctrl_ie, Ctrl_0);
89 Irq_chip::hw_chip->reserve(Config::Scheduling_irq);
92 Irq_chip::hw_chip->setup(&ib, Config::Scheduling_irq);
99 Timer::timer_to_us(Unsigned32 /*cr*/)
104 Timer::us_to_timer(Unsigned64 us)
105 { (void)us; return 0; }
107 IMPLEMENT inline NEEDS["io.h"]
108 void Timer::acknowledge()
110 Io::write<Mword>(0, Intclr_0);
117 irq->pin()->unmask();
121 void Timer::disable()
126 IMPLEMENT inline NEEDS["kip.h", "io.h", Timer::timer_to_us, Timer::us_to_timer]
128 Timer::update_one_shot(Unsigned64 wakeup)
131 //Kip::k()->clock += timer_to_us(Io::read<Unsigned32>(Oscr));
132 Unsigned64 now = Kip::k()->clock;
134 if (EXPECT_FALSE (wakeup <= now) )
139 apic = us_to_timer(wakeup - now);
140 if (EXPECT_FALSE(apic > 0x0ffffffff))
142 if (EXPECT_FALSE (apic < 1) )
148 IMPLEMENT inline NEEDS["config.h", "kip.h"]
150 Timer::system_clock()
152 if (Config::scheduler_one_shot)
155 return Kip::k()->clock;