]> rtime.felk.cvut.cz Git - l4.git/blob - kernel/fiasco/src/kern/arm/bsp/realview/timer-arm-realview.cpp
8cbd14057fa864d8b8b5de75be33d5e76716ab26
[l4.git] / kernel / fiasco / src / kern / arm / bsp / realview / timer-arm-realview.cpp
1 // --------------------------------------------------------------------------
2 INTERFACE [arm]:
3
4 #include "kmem.h"
5
6 class Timer_sp804
7 {
8 public:
9   enum {
10     System_control = Kmem::System_ctrl_map_base,
11
12     Refclk = 0,
13     Timclk = 1,
14
15     Timer0_enable = 15,
16     Timer1_enable = 17,
17     Timer2_enable = 19,
18     Timer3_enable = 21,
19
20     Timer_load   = 0x00,
21     Timer_value  = 0x04,
22     Timer_ctrl   = 0x08,
23     Timer_intclr = 0x0c,
24
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,
29
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,
34
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,
39
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,
44
45     Interval = 1000,
46
47     Ctrl_ie        = 1 << 5,
48     Ctrl_periodic  = 1 << 6,
49     Ctrl_enable    = 1 << 7,
50   };
51 };
52
53 // --------------------------------------------------------------------------
54 INTERFACE [arm && sp804]:
55
56 EXTENSION class Timer
57 {
58 public:
59   static unsigned irq() { return 36; }
60
61 private:
62   enum {
63     Interval = 1000,
64   };
65 };
66
67 // -----------------------------------------------------------------------
68 IMPLEMENTATION [arm && sp804]:
69
70 #include "config.h"
71 #include "kip.h"
72 #include "io.h"
73
74 #include <cstdio>
75
76 IMPLEMENT
77 void Timer::init(unsigned)
78 {
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);
82
83   // all timers off
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);
88
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,
94                    Timer_sp804::Ctrl_0);
95 }
96
97 static inline
98 Unsigned64
99 Timer::timer_to_us(Unsigned32 /*cr*/)
100 { return 0; }
101
102 static inline
103 Unsigned64
104 Timer::us_to_timer(Unsigned64 us)
105 { (void)us; return 0; }
106
107 PUBLIC static inline NEEDS["io.h"]
108 void
109 Timer::acknowledge()
110 {
111   Io::write<Mword>(0, Timer_sp804::Intclr_0);
112 }
113
114 IMPLEMENT inline
115 void
116 Timer::update_one_shot(Unsigned64 wakeup)
117 {
118   (void)wakeup;
119 }
120
121 IMPLEMENT inline NEEDS["config.h", "kip.h"]
122 Unsigned64
123 Timer::system_clock()
124 {
125   if (Config::Scheduler_one_shot)
126     return 0;
127   else
128     return Kip::k()->clock;
129 }