]> rtime.felk.cvut.cz Git - l4.git/blob - kernel/fiasco/src/kern/arm/bsp/realview/timer-arm-realview.cpp
update
[l4.git] / kernel / fiasco / src / kern / arm / bsp / realview / timer-arm-realview.cpp
1 // --------------------------------------------------------------------------
2 INTERFACE [arm && sp804]:
3
4 #include "timer_sp804.h"
5
6 EXTENSION class Timer
7 {
8 private:
9   static Static_object<Timer_sp804> sp804;
10 };
11
12 // --------------------------------------------------------------------------
13 INTERFACE [arm && sp804 && realview_vexpress_a15]:
14
15 EXTENSION class Timer
16 {
17 public:
18   static unsigned irq() { return 34; }
19 };
20
21 // --------------------------------------------------------------------------
22 INTERFACE [arm && sp804 && !realview_vexpress_a15]:
23
24 EXTENSION class Timer
25 {
26 public:
27   static unsigned irq() { return 36; }
28 };
29
30 // -----------------------------------------------------------------------
31 IMPLEMENTATION [arm && sp804]:
32
33 #include "config.h"
34 #include "kip.h"
35 #include "platform.h"
36
37 #include <cstdio>
38
39 Static_object<Timer_sp804> Timer::sp804;
40
41 IMPLEMENT
42 void Timer::init(Cpu_number)
43 {
44   sp804.construct(Kmem::mmio_remap(Mem_layout::Timer0_phys_base));
45   Platform::system_control->modify<Mword>(Platform::System_control::Timer0_enable, 0, 0);
46
47   // all timers off
48   sp804->disable();
49   //Io::write<Mword>(0, Timer_sp804::Ctrl_1);
50   //Io::write<Mword>(0, Timer_sp804::Ctrl_2);
51   //Io::write<Mword>(0, Timer_sp804::Ctrl_3);
52
53   sp804->reload_value(Timer_sp804::Interval);
54   sp804->counter_value(Timer_sp804::Interval);
55   sp804->enable(Timer_sp804::Ctrl_periodic | Timer_sp804::Ctrl_ie);
56 }
57
58 static inline
59 Unsigned64
60 Timer::timer_to_us(Unsigned32 /*cr*/)
61 { return 0; }
62
63 static inline
64 Unsigned64
65 Timer::us_to_timer(Unsigned64 us)
66 { (void)us; return 0; }
67
68 PUBLIC static inline
69 void
70 Timer::acknowledge()
71 {
72   sp804->irq_clear();
73 }
74
75 IMPLEMENT inline
76 void
77 Timer::update_one_shot(Unsigned64 wakeup)
78 {
79   (void)wakeup;
80 }
81
82 IMPLEMENT inline NEEDS["config.h", "kip.h"]
83 Unsigned64
84 Timer::system_clock()
85 {
86   if (Config::Scheduler_one_shot)
87     return 0;
88   else
89     return Kip::k()->clock;
90 }