1 // ------------------------------------------------------------------------
2 INTERFACE [arm && (sa1100 || pxa)]:
12 Base = Kmem::Timer_map_base,
14 // Base = 0x0000000 must be set in ...
26 Timer_diff = (36864 * Config::scheduler_granularity) / 10000, // 36864MHz*1ms
33 // -------------------------------------------------------------
34 IMPLEMENTATION [arm && (sa1100 || pxa)]:
47 Io::write(1, OIER); // enable OSMR0
48 Io::write(0, OWER); // disable Watchdog
49 Io::write<Mword>(Timer_diff, OSMR0);
50 Io::write(0, OSCR); // set timer counter to zero
51 Io::write(~0U, OSSR); // clear all status bits
53 Irq_chip::hw_chip->reserve(26);
56 Irq_chip::hw_chip->setup(&ib, 26);
62 Timer::timer_to_us(Unsigned32 cr)
63 { return (((Unsigned64)cr) << 14) / 60398; }
67 Timer::us_to_timer(Unsigned64 us)
68 { return (us * 60398) >> 14; }
70 IMPLEMENT inline NEEDS["io.h", "pic.h", Timer::timer_to_us]
71 void Timer::acknowledge()
73 if (Config::scheduler_one_shot)
75 Kip::k()->clock += timer_to_us(Io::read<Unsigned32>(OSCR));
76 //puts("Reset timer");
78 Io::write(0xffffffff, OSMR0);
82 Io::write(1, OSSR); // clear all status bits
86 IMPLEMENT inline NEEDS["pic.h"]
92 IMPLEMENT inline NEEDS["pic.h"]
98 IMPLEMENT inline NEEDS["kip.h", "io.h", Timer::timer_to_us, Timer::us_to_timer]
100 Timer::update_one_shot(Unsigned64 wakeup)
103 Kip::k()->clock += timer_to_us(Io::read<Unsigned32>(OSCR));
105 Unsigned64 now = Kip::k()->clock;
107 if (EXPECT_FALSE (wakeup <= now) )
112 apic = us_to_timer(wakeup - now);
113 if (EXPECT_FALSE(apic > 0x0ffffffff))
115 if (EXPECT_FALSE (apic < 1) )
120 //printf("%15lld: Set Timer to %lld [%08x]\n", now, wakeup, apic);
122 Io::write(apic, OSMR0);
123 Io::write(1, OSSR); // clear all status bits
126 IMPLEMENT inline NEEDS["config.h", "kip.h", "io.h", Timer::timer_to_us]
128 Timer::system_clock()
130 if (Config::scheduler_one_shot)
131 return Kip::k()->clock + timer_to_us(Io::read<Unsigned32>(OSCR));
133 return Kip::k()->clock;