The Cycle CouNTer on ARM cannot be used reliably as it wraps around rather quickly and can be altered by user space (on Minix). Furthermore, it's buggy when wrapping and is not implemented at all on the Linaro Beagleboard emulator. This patch programs GPTIMER10 as a free running clock at 1.625 MHz (it doesn't generate interrupts). It's memory mapped into every process, which enables libsys to provide micro_delay(). Change-Id: Iba004c6c62976762fe154ea390d69e518eec1531
35 lines
657 B
C
35 lines
657 B
C
|
|
#include <stdio.h>
|
|
#include <time.h>
|
|
#include <sys/times.h>
|
|
#include <sys/types.h>
|
|
#include <minix/u64.h>
|
|
#include <minix/config.h>
|
|
#include <minix/const.h>
|
|
#include <minix/minlib.h>
|
|
#include <machine/archtypes.h>
|
|
|
|
#include "sysutil.h"
|
|
|
|
#ifndef CONFIG_MAX_CPUS
|
|
#define CONFIG_MAX_CPUS 1
|
|
#endif
|
|
|
|
#define MICROHZ 1000000 /* number of micros per second */
|
|
#define MICROSPERTICK(h) (MICROHZ/(h)) /* number of micros per HZ tick */
|
|
|
|
static u32_t calib_hz = 600000000;
|
|
|
|
u32_t tsc_64_to_micros(u64_t tsc)
|
|
{
|
|
u64_t tmp;
|
|
|
|
tmp = tsc / calib_hz;
|
|
return (u32_t) tmp;
|
|
}
|
|
|
|
u32_t tsc_to_micros(u32_t low, u32_t high)
|
|
{
|
|
return tsc_64_to_micros(make64(low, high));
|
|
}
|
|
|