]> rtime.felk.cvut.cz Git - l4.git/blob - kernel/fiasco/src/kern/arm/bsp/realview/timer-arm-mptimer-realview.cpp
0106124b2024d01d409509c8dced46d34c8001a3
[l4.git] / kernel / fiasco / src / kern / arm / bsp / realview / timer-arm-mptimer-realview.cpp
1 // --------------------------------------------------------------------------
2 IMPLEMENTATION[arm && mptimer]:
3
4 PRIVATE static Mword Timer::interval()
5 {
6   Mword v = Io::read<Mword>(Timer_sp804::System_control);
7   v |= Timer_sp804::Timclk << Timer_sp804::Timer0_enable;
8   Io::write<Mword>(v, Timer_sp804::System_control);
9
10   Mword frequency = 1000000;
11   Mword timer_start = ~0UL;
12   unsigned factor = 5;
13   Mword sp_c = timer_start - frequency / 1000 * (1 << factor);
14
15   Io::write<Mword>(0, Timer_sp804::Ctrl_0);
16   Io::write<Mword>(timer_start, Timer_sp804::Value_0);
17   Io::write<Mword>(timer_start, Timer_sp804::Load_0);
18   Io::write<Mword>(  Timer_sp804::Ctrl_enable
19                    | Timer_sp804::Ctrl_periodic,
20                    Timer_sp804::Ctrl_0);
21
22   Mword vc = start_as_counter();
23   while (sp_c < Io::read<Mword>(Timer_sp804::Value_0))
24     ;
25   Mword interval = (vc - stop_counter()) >> factor;
26   Io::write<Mword>(0, Timer_sp804::Ctrl_0);
27   return interval;
28 }