Search
lxdream.org :: lxdream/test/timer.c
lxdream 0.9.1
released Jun 29
Download Now
filename test/timer.c
changeset 262:bc96e0b79308
prev225:e5cea6125580
next272:fb6be85235e8
author nkeynes
date Wed Jan 03 09:03:50 2007 +0000 (17 years ago)
permissions -rw-r--r--
last change Fix to actually work (need the write read/write sizes)
Implement the microsecond conversion function
file annotate diff log raw
nkeynes@225
     1
#include "../lib.h"
nkeynes@225
     2
#define TMU_CHANNEL 2
nkeynes@262
     3
#define BASE_TICKS_PER_US 200
nkeynes@262
     4
#define CLOCK_DIVIDER 16
nkeynes@225
     5
#define TOCR 0xFFD80000  /* Output control register */
nkeynes@225
     6
#define TSTR 0xFFD80004  /* Start register */
nkeynes@225
     7
#define TCOR(c) (0xFFD80008 + (c*12))  /* Constant register */
nkeynes@225
     8
#define TCNT(c) (0xFFD8000C + (c*12))  /* Count register */
nkeynes@225
     9
#define TCR(c)  (0xFFD80010 + (c*12))  /* Control register */
nkeynes@225
    10
nkeynes@225
    11
/**
nkeynes@225
    12
 * Initialize the on-chip timer controller. We snag TMU channel 2 in its
nkeynes@225
    13
 * highest resolution mode, and start it counting down from max_int. 
nkeynes@225
    14
 */
nkeynes@225
    15
void timer_start() {
nkeynes@262
    16
    unsigned int val = byte_read(TSTR);
nkeynes@262
    17
    byte_write( TSTR, val & (~(1<<TMU_CHANNEL)) ); /* Stop counter */
nkeynes@225
    18
    long_write( TCOR(TMU_CHANNEL), 0xFFFFFFFF );
nkeynes@225
    19
    long_write( TCNT(TMU_CHANNEL), 0xFFFFFFFF );
nkeynes@262
    20
    word_write( TCR(TMU_CHANNEL), 0x00000000 );
nkeynes@262
    21
    byte_write( TSTR, val | (1<<TMU_CHANNEL) );
nkeynes@225
    22
}
nkeynes@225
    23
nkeynes@225
    24
/**
nkeynes@225
    25
 * Report the current value of TMU2.
nkeynes@225
    26
 */
nkeynes@262
    27
unsigned int timer_gettime() {
nkeynes@225
    28
    return long_read(TCNT(TMU_CHANNEL));
nkeynes@225
    29
}
nkeynes@225
    30
nkeynes@225
    31
/**
nkeynes@225
    32
 * Stop TMU2 and report the current value.
nkeynes@225
    33
 */
nkeynes@262
    34
unsigned int timer_stop() {
nkeynes@225
    35
    long_write( TSTR, long_read(TSTR) & (~(1<<TMU_CHANNEL)) );
nkeynes@225
    36
    return long_read( TCNT(TMU_CHANNEL) );
nkeynes@225
    37
}
nkeynes@225
    38
nkeynes@225
    39
nkeynes@225
    40
/**
nkeynes@225
    41
 * Convert the supplied timer value to a number of micro seconds since the timer
nkeynes@225
    42
 * was started.
nkeynes@225
    43
 */
nkeynes@262
    44
unsigned int timer_to_microsecs( unsigned int value ) {
nkeynes@262
    45
    return (0xFFFFFFFF - value) * CLOCK_DIVIDER / BASE_TICKS_PER_US;
nkeynes@225
    46
}
nkeynes@262
    47
nkeynes@262
    48
unsigned int timer_gettime_us() {
nkeynes@262
    49
    return timer_to_microsecs( timer_gettime() );
nkeynes@262
    50
}
.