2 #include <ros/common.h>
7 #include <ros/procinfo.h>
12 __proc_global_info.tsc_freq = TSC_HZ;
13 cprintf("TSC Frequency: %llu\n", __proc_global_info.tsc_freq);
17 set_core_timer(uint32_t usec, bool periodic)
19 // we could implement periodic timers using one-shot timers,
20 // but for now we only support one-shot
25 uint32_t clocks = (uint64_t)usec*TSC_HZ/1000000;
28 disable_irqsave(&irq_state);
31 mtpcr(PCR_COMPARE, clocks);
32 mtpcr(PCR_SR, mfpcr(PCR_SR) | (1 << (IRQ_TIMER+SR_IM_SHIFT)));
34 enable_irqsave(&irq_state);
38 mtpcr(PCR_SR, mfpcr(PCR_SR) & ~(1 << (IRQ_TIMER+SR_IM_SHIFT)));
45 if (__proc_global_info.tsc_freq != 0)
47 uint64_t start, end, now;
50 end = start + (__proc_global_info.tsc_freq * usec) / 1000000;
56 } while (now < end || (now > start && end < start));
58 else panic("udelay() was called before timer_init(), moron!");
61 uint64_t read_persistent_clock(void)
63 return 1242129600 * 1000000000UL; /* nanwan's birthday */