1 // --------------------------------------------------------------------------
2 INTERFACE [arm && imx_epit]:
11 EPITCR = Kmem::Timer_map_base + 0x00,
12 EPITSR = Kmem::Timer_map_base + 0x04,
13 EPITLR = Kmem::Timer_map_base + 0x08,
14 EPITCMPR = Kmem::Timer_map_base + 0x0c,
15 EPITCNR = Kmem::Timer_map_base + 0x10,
17 EPITCR_ENABLE = 1 << 0, // enable EPIT
18 EPITCR_ENMOD = 1 << 1, // enable mode
19 EPITCR_OCIEN = 1 << 2, // output compare irq enable
20 EPITCR_RLD = 1 << 3, // reload
21 EPITCR_SWR = 1 << 16, // software reset
22 EPITCR_CLKSRC_IPG_CLK = 1 << 24,
23 EPITCR_CLKSRC_IPG_CLK_HIGHFREQ = 2 << 24,
24 EPITCR_CLKSRC_IPG_CLK_32K = 3 << 24,
25 EPITCR_PRESCALER_SHIFT = 4,
26 EPITCR_PRESCALER_MASK = ((1 << 12) - 1) << EPITCR_PRESCALER_SHIFT,
34 // ----------------------------------------------------------------------
35 IMPLEMENTATION [arm && imx_epit]:
50 Io::write<Mword>(0, EPITCR); // Disable
51 Io::write<Mword>(EPITCR_SWR, EPITCR);
52 while (Io::read<Mword>(EPITCR) & EPITCR_SWR)
55 Io::write<Mword>(EPITSR_OCIF, EPITSR);
57 Io::write<Mword>(EPITCR_CLKSRC_IPG_CLK_32K
58 | (0 << EPITCR_PRESCALER_SHIFT)
64 Io::write<Mword>(0, EPITCMPR);
66 Io::write<Mword>(32, EPITLR);
69 Irq_chip::hw_chip->reserve(Config::Scheduling_irq);
72 Irq_chip::hw_chip->setup(&ib, Config::Scheduling_irq);
75 Io::set<Mword>(EPITCR_ENABLE, EPITCR);
80 Timer::timer_to_us(Unsigned32 /*cr*/)
85 Timer::us_to_timer(Unsigned64 us)
86 { (void)us; return 0; }
88 IMPLEMENT inline NEEDS["io.h"]
89 void Timer::acknowledge()
91 Io::write<Mword>(EPITSR_OCIF, EPITSR);
94 IMPLEMENT inline NEEDS["irq_pin.h"]
100 IMPLEMENT inline NEEDS["irq_pin.h"]
101 void Timer::disable()
106 IMPLEMENT inline NEEDS["kip.h", "io.h", Timer::timer_to_us, Timer::us_to_timer]
108 Timer::update_one_shot(Unsigned64 /*wakeup*/)
112 IMPLEMENT inline NEEDS["config.h", "kip.h", "io.h", Timer::timer_to_us]
114 Timer::system_clock()
116 if (Config::scheduler_one_shot)
117 //return Kip::k()->clock + timer_to_us(Io::read<Unsigned32>(OSCR));
120 return Kip::k()->clock;