diff options
Diffstat (limited to 'c/src/lib/libbsp/mips/genmongoosev/timer/timer.c')
-rw-r--r-- | c/src/lib/libbsp/mips/genmongoosev/timer/timer.c | 37 |
1 files changed, 22 insertions, 15 deletions
diff --git a/c/src/lib/libbsp/mips/genmongoosev/timer/timer.c b/c/src/lib/libbsp/mips/genmongoosev/timer/timer.c index 154ab66230..16c6ba20cb 100644 --- a/c/src/lib/libbsp/mips/genmongoosev/timer/timer.c +++ b/c/src/lib/libbsp/mips/genmongoosev/timer/timer.c @@ -37,20 +37,21 @@ void Timer_initialize() * the compare register is set to the maximum value. */ - MONGOOSEV_WRITE_REGISTER( - TIMER_BASE, - MONGOOSEV_TIMER_INITIAL_COUNTER_REGISTER, - 0xffffffff - ); - MONGOOSEV_WRITE_REGISTER( - TIMER_BASE, - MONGOOSEV_TIMER_CONTROL_REGISTER, - MONGOOSEV_TIMER_CONTROL_COUNTER_ENABLE - ); + MONGOOSEV_WRITE_REGISTER( TIMER_BASE, MONGOOSEV_TIMER_CONTROL_REGISTER, 0); + + MONGOOSEV_WRITE_REGISTER( TIMER_BASE, + MONGOOSEV_TIMER_INITIAL_COUNTER_REGISTER, + 0xffffffff ); + + MONGOOSEV_WRITE_REGISTER( TIMER_BASE, + MONGOOSEV_TIMER_CONTROL_REGISTER, + MONGOOSEV_TIMER_CONTROL_COUNTER_ENABLE ); + } #define AVG_OVERHEAD 0 /* It typically takes N instructions */ /* to start/stop the timer. */ + #define LEAST_VALID 1 /* Don't trust a value lower than this */ /* mongoose-v can count cycles. :) */ #include <bspIo.h> @@ -61,13 +62,16 @@ int Read_timer() rtems_unsigned32 total; rtems_unsigned32 tcr; - clicks = MONGOOSEV_READ_REGISTER( - TIMER_BASE, - MONGOOSEV_TIMER_INITIAL_COUNTER_REGISTER - ); + clicks = MONGOOSEV_READ_REGISTER( TIMER_BASE, + MONGOOSEV_TIMER_INITIAL_COUNTER_REGISTER ); total = 0xffffffff - clicks; tcr = MONGOOSEV_READ_REGISTER( TIMER_BASE, MONGOOSEV_TIMER_CONTROL_REGISTER ); + + MONGOOSEV_WRITE_REGISTER( TIMER_BASE, + MONGOOSEV_TIMER_CONTROL_REGISTER, + 0 ); + if ( tcr & MONGOOSEV_TIMER_CONTROL_TIMEOUT ) printk( "MG5 timer overran\n" ); @@ -77,7 +81,7 @@ int Read_timer() if ( total < LEAST_VALID ) return 0; /* below timer resolution */ - return total - AVG_OVERHEAD; + return (total - AVG_OVERHEAD) / CPU_CLOCK_RATE_MHZ; } rtems_status_code Empty_function( void ) @@ -91,3 +95,6 @@ void Set_find_average_overhead( { Timer_driver_Find_average_overhead = find_flag; } + + +/* eof */ |