3 #define BASE_TICKS_PER_US 200
4 #define CLOCK_DIVIDER 16
5 #define TOCR 0xFFD80000 /* Output control register */
6 #define TSTR 0xFFD80004 /* Start register */
7 #define TCOR(c) (0xFFD80008 + (c*12)) /* Constant register */
8 #define TCNT(c) (0xFFD8000C + (c*12)) /* Count register */
9 #define TCR(c) (0xFFD80010 + (c*12)) /* Control register */
12 * Initialize the on-chip timer controller. We snag TMU channel 2 in its
13 * highest resolution mode, and start it counting down from max_int.
16 unsigned int val = byte_read(TSTR);
17 byte_write( TSTR, val & (~(1<<TMU_CHANNEL)) ); /* Stop counter */
18 long_write( TCOR(TMU_CHANNEL), 0xFFFFFFFF );
19 long_write( TCNT(TMU_CHANNEL), 0xFFFFFFFF );
20 word_write( TCR(TMU_CHANNEL), 0x00000000 );
24 byte_write( TSTR, byte_read(TSTR) | (1<<TMU_CHANNEL) );
33 * Report the current value of TMU2.
35 unsigned int timer_gettime() {
36 return long_read(TCNT(TMU_CHANNEL));
40 * Stop TMU2 and report the current value.
42 unsigned int timer_stop() {
43 long_write( TSTR, long_read(TSTR) & (~(1<<TMU_CHANNEL)) );
44 return long_read( TCNT(TMU_CHANNEL) );
49 * Convert the supplied timer value to a number of micro seconds since the timer
52 unsigned int timer_to_microsecs( unsigned int value ) {
53 return (0xFFFFFFFF - value) * CLOCK_DIVIDER / BASE_TICKS_PER_US;
56 unsigned int timer_gettime_us() {
57 return timer_to_microsecs( timer_gettime() );
.