Index: sys/arch/x68k/dev/kbd.c =================================================================== RCS file: /cvsroot/src/sys/arch/x68k/dev/kbd.c,v retrieving revision 1.23 diff -d -p -u -r1.23 kbd.c --- sys/arch/x68k/dev/kbd.c 11 Dec 2005 12:19:37 -0000 1.23 +++ sys/arch/x68k/dev/kbd.c 16 Sep 2006 08:17:03 -0000 @@ -350,7 +350,7 @@ kbdintr(void *arg) } fe->id = KEY_CODE(c); fe->value = KEY_UP(c) ? VKEY_UP : VKEY_DOWN; - fe->time = time; + getmicrotime(&fe->time); k->sc_events.ev_put = put; EV_WAKEUP(&k->sc_events); Index: sys/arch/x68k/dev/ms.c =================================================================== RCS file: /cvsroot/src/sys/arch/x68k/dev/ms.c,v retrieving revision 1.22 diff -d -p -u -r1.22 ms.c --- sys/arch/x68k/dev/ms.c 29 Mar 2006 04:16:48 -0000 1.22 +++ sys/arch/x68k/dev/ms.c 16 Sep 2006 08:17:03 -0000 @@ -423,7 +423,7 @@ ms_input(struct ms_softc *ms, int c) d = to_one[d - 1]; /* from 1..7 to {1,2,4} */ fe->id = to_id[d - 1]; /* from {1,2,4} to ID */ fe->value = mb & d ? VKEY_DOWN : VKEY_UP; - fe->time = time; + getmicrotime(&fe->time); ADVANCE; ub ^= d; any++; @@ -432,7 +432,7 @@ ms_input(struct ms_softc *ms, int c) NEXT; fe->id = LOC_X_DELTA; fe->value = ms->ms_dx; - fe->time = time; + getmicrotime(&fe->time); ADVANCE; ms->ms_dx = 0; any++; @@ -441,7 +441,7 @@ ms_input(struct ms_softc *ms, int c) NEXT; fe->id = LOC_Y_DELTA; fe->value = -ms->ms_dy; /* XXX? */ - fe->time = time; + getmicrotime(&fe->time); ADVANCE; ms->ms_dy = 0; any++; Index: sys/arch/x68k/include/types.h =================================================================== RCS file: /cvsroot/src/sys/arch/x68k/include/types.h,v retrieving revision 1.10 diff -d -p -u -r1.10 types.h --- sys/arch/x68k/include/types.h 14 Sep 2006 01:18:11 -0000 1.10 +++ sys/arch/x68k/include/types.h 16 Sep 2006 08:17:03 -0000 @@ -7,5 +7,6 @@ #define __HAVE_DEVICE_REGISTER #define __HAVE_GENERIC_TODR +#define __HAVE_TIMECOUNTER #endif Index: sys/arch/x68k/x68k/clock.c =================================================================== RCS file: /cvsroot/src/sys/arch/x68k/x68k/clock.c,v retrieving revision 1.23 diff -d -p -u -r1.23 clock.c --- sys/arch/x68k/x68k/clock.c 14 Sep 2006 01:18:11 -0000 1.23 +++ sys/arch/x68k/x68k/clock.c 16 Sep 2006 08:17:03 -0000 @@ -87,6 +87,7 @@ __KERNEL_RCSID(0, "$NetBSD: clock.c,v 1. #include #include #include +#include #include #include @@ -110,6 +111,8 @@ CFATTACH_DECL(clock, sizeof(struct clock static int clock_attached; +static unsigned mfp_get_timecount(struct timecounter *); + static int clock_match(struct device *parent, struct cfdata *cf, void *aux) { @@ -135,25 +138,21 @@ clock_attach(struct device *parent, stru /* * MFP of X68k uses 4MHz clock always and we use 1/200 prescaler here. * Therefore, clock interval is 50 usec. + * + * Note that for timecounters, we'd like to use a finger grained clock, but + * since we only have an 8-bit clock, we can't do that without increasing + * the system clock rate. (Otherwise the counter would roll in less than + * a single system clock.) */ #define CLK_RESOLUTION (50) #define CLOCKS_PER_SEC (1000000 / CLK_RESOLUTION) -static int clkint; /* clock interval */ - -static int clkread(void); - /* * Machine-dependent clock routines. * * Startrtclock restarts the real-time clock, which provides * hardclock interrupts to kern_clock.c. * - * Inittodr initializes the time of day hardware which provides - * date functions. - * - * Resettodr restores the time of day hardware after a time change. - * * A note on the real-time clock: * We actually load the clock with CLK_INTERVAL-1 instead of CLK_INTERVAL. * This is because the counter decrements to zero after N+1 enabled clock @@ -168,18 +167,30 @@ static int clkread(void); void cpu_initclocks(void) { + static struct timecounter tc = { + .tc_name = "mfp", + .tc_frequency = CLOCKS_PER_SEC, + .tc_counter_mask = 0xff, + .tc_get_timecount = mfp_get_timecount, + .tc_quality = 100, + }; + if (CLOCKS_PER_SEC % hz || hz <= (CLOCKS_PER_SEC / 256) || hz > CLOCKS_PER_SEC) { printf("cannot set %d Hz clock. using 100 Hz\n", hz); hz = 100; } - clkint = CLOCKS_PER_SEC / hz; - mfp_set_tcdcr(mfp_get_tcdcr() & 0x0f); /* stop timer C */ + mfp_set_tcdcr(0); /* stop timers C and D */ mfp_set_tcdcr(mfp_get_tcdcr() | 0x70); /* 1/200 delay mode */ - mfp_set_tcdr(clkint); + mfp_set_tcdr(CLOCKS_PER_SEC / hz); mfp_bit_set_ierb(MFP_INTR_TIMER_C); + + mfp_set_tddr(0xff); /* maximum free run -- only 8 bits wide */ + mfp_set_tcdcr(mfp_get_tcdcr() | 0x07); /* 1/200 prescaler */ + + tc_init(&tc); } /* @@ -196,13 +207,14 @@ setstatclockrate(int newhz) * Returns number of usec since last recorded clock "tick" * (i.e. clock interrupt). */ -int -clkread(void) +unsigned +mfp_get_timecount(struct timecounter *tc) { - return (clkint - mfp_get_tcdr()) * CLK_RESOLUTION; + uint8_t val; + val = ~(mfp_get_tddr()); + return (val); } - #if 0 void DELAY(mic) @@ -512,29 +524,6 @@ profclock(caddr_t pc, int ps) #endif /* PROF */ #endif /* PROFTIMER */ -/* - * Return the best possible estimate of the current time. - */ -void -microtime(struct timeval *tvp) -{ - static struct timeval lasttime; - - *tvp = time; - tvp->tv_usec += clkread(); - while (tvp->tv_usec >= 1000000) { - tvp->tv_sec++; - tvp->tv_usec -= 1000000; - } - if (tvp->tv_sec == lasttime.tv_sec && - tvp->tv_usec <= lasttime.tv_usec && - (tvp->tv_usec = lasttime.tv_usec + 1) >= 1000000) { - tvp->tv_sec++; - tvp->tv_usec -= 1000000; - } - lasttime = *tvp; -} - #else /* NCLOCK */ #error loose. #endif