1 // --------------------------------------------------------------------------
2 INTERFACE [arm && imx_epit]:
10 EPITCR = Kmem::Timer_map_base + 0x00,
11 EPITSR = Kmem::Timer_map_base + 0x04,
12 EPITLR = Kmem::Timer_map_base + 0x08,
13 EPITCMPR = Kmem::Timer_map_base + 0x0c,
14 EPITCNR = Kmem::Timer_map_base + 0x10,
16 EPITCR_ENABLE = 1 << 0, // enable EPIT
17 EPITCR_ENMOD = 1 << 1, // enable mode
18 EPITCR_OCIEN = 1 << 2, // output compare irq enable
19 EPITCR_RLD = 1 << 3, // reload
20 EPITCR_SWR = 1 << 16, // software reset
21 EPITCR_WAITEN = 1 << 19, // wait enabled
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,
33 INTERFACE [arm && imx35]: // ----------------------------------------------
38 static unsigned irq() { return 28; }
42 INTERFACE [arm && (imx51 || imx53)]: // -----------------------------------
47 static unsigned irq() { return 40; }
51 // ------------------------------------------------------------------------
52 IMPLEMENTATION [arm && imx_epit]:
58 void Timer::init(unsigned)
60 Io::write<Mword>(0, EPITCR); // Disable
61 Io::write<Mword>(EPITCR_SWR, EPITCR);
62 while (Io::read<Mword>(EPITCR) & EPITCR_SWR)
65 Io::write<Mword>(EPITSR_OCIF, EPITSR);
67 Io::write<Mword>(EPITCR_CLKSRC_IPG_CLK_32K
68 | (0 << EPITCR_PRESCALER_SHIFT)
75 Io::write<Mword>(0, EPITCMPR);
77 Io::write<Mword>(32, EPITLR);
79 Io::set<Mword>(EPITCR_ENABLE, EPITCR);
84 Timer::timer_to_us(Unsigned32 /*cr*/)
89 Timer::us_to_timer(Unsigned64 us)
90 { (void)us; return 0; }
92 PUBLIC static inline NEEDS["io.h"]
96 Io::write<Mword>(EPITSR_OCIF, EPITSR);
101 Timer::update_one_shot(Unsigned64 /*wakeup*/)
104 IMPLEMENT inline NEEDS["config.h", "kip.h"]
106 Timer::system_clock()
108 if (Config::Scheduler_one_shot)
111 return Kip::k()->clock;