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_WAITEN = 1 << 19, // wait enabled
23 EPITCR_CLKSRC_IPG_CLK = 1 << 24,
24 EPITCR_CLKSRC_IPG_CLK_HIGHFREQ = 2 << 24,
25 EPITCR_CLKSRC_IPG_CLK_32K = 3 << 24,
26 EPITCR_PRESCALER_SHIFT = 4,
27 EPITCR_PRESCALER_MASK = ((1 << 12) - 1) << EPITCR_PRESCALER_SHIFT,
35 // ----------------------------------------------------------------------
36 IMPLEMENTATION [arm && imx_epit]:
51 Io::write<Mword>(0, EPITCR); // Disable
52 Io::write<Mword>(EPITCR_SWR, EPITCR);
53 while (Io::read<Mword>(EPITCR) & EPITCR_SWR)
56 Io::write<Mword>(EPITSR_OCIF, EPITSR);
58 Io::write<Mword>(EPITCR_CLKSRC_IPG_CLK_32K
59 | (0 << EPITCR_PRESCALER_SHIFT)
66 Io::write<Mword>(0, EPITCMPR);
68 Io::write<Mword>(32, EPITLR);
71 Irq_chip::hw_chip->reserve(Config::Scheduling_irq);
74 Irq_chip::hw_chip->setup(&ib, Config::Scheduling_irq);
77 Io::set<Mword>(EPITCR_ENABLE, EPITCR);
82 Timer::timer_to_us(Unsigned32 /*cr*/)
87 Timer::us_to_timer(Unsigned64 us)
88 { (void)us; return 0; }
90 IMPLEMENT inline NEEDS["io.h"]
91 void Timer::acknowledge()
93 Io::write<Mword>(EPITSR_OCIF, EPITSR);
96 IMPLEMENT inline NEEDS["irq_pin.h"]
102 IMPLEMENT inline NEEDS["irq_pin.h"]
103 void Timer::disable()
108 IMPLEMENT inline NEEDS["kip.h", "io.h", Timer::timer_to_us, Timer::us_to_timer]
110 Timer::update_one_shot(Unsigned64 /*wakeup*/)
114 IMPLEMENT inline NEEDS["config.h", "kip.h", "io.h", Timer::timer_to_us]
116 Timer::system_clock()
118 if (Config::scheduler_one_shot)
121 return Kip::k()->clock;