source: rtems/c/src/lib/libbsp/sparc/leon3/timer/timer.c @ 424ee2ba

4.104.114.95
Last change on this file since 424ee2ba was 424ee2ba, checked in by Joel Sherrill <joel.sherrill@…>, on 08/31/08 at 16:47:17

2008-08-31 Joel Sherrill <joel.sherrill@…>

  • timer/timer.c: Rename timer driver methods to follow RTEMS programming conventions.
  • Property mode set to 100644
File size: 2.4 KB
Line 
1/*  timer.c
2 *
3 *  This file implements a benchmark timer using timer 2.
4 *
5 *  COPYRIGHT (c) 1989-1998.
6 *  On-Line Applications Research Corporation (OAR).
7 *
8 *  The license and distribution terms for this file may be
9 *  found in the file LICENSE in this distribution or at
10 *  http://www.rtems.com/license/LICENSE.
11 *
12 *  Ported to LEON implementation of the SPARC by On-Line Applications
13 *  Research Corporation (OAR) under contract to the European Space
14 *  Agency (ESA).
15 *
16 *  LEON modifications of respective RTEMS file: COPYRIGHT (c) 1995.
17 *  European Space Agency.
18 *
19 *  $Id$
20 */
21
22
23#include <bsp.h>
24
25#if defined(RTEMS_MULTIPROCESSING)
26  #define LEON3_TIMER_INDEX \
27      ((rtems_configuration_get_user_multiprocessing_table()) ? \
28        (rtems_configuration_get_user_multiprocessing_table()->node) - 1 : 1)
29#else
30  #define LEON3_TIMER_INDEX 0
31#endif
32
33rtems_boolean benchmark_timerfind_average_overhead;
34
35rtems_boolean benchmark_timeris_initialized = FALSE;
36
37extern volatile LEON3_Timer_Regs_Map *LEON3_Timer_Regs;
38
39void benchmark_timerinitialize(void)
40{
41  /*
42   *  Timer runs long and accurate enough not to require an interrupt.
43   */
44  if (LEON3_Timer_Regs) {
45    if ( benchmark_timeris_initialized == FALSE ) {
46      /* approximately 1 us per countdown */
47      LEON3_Timer_Regs->timer[LEON3_TIMER_INDEX].reload = 0xffffff;
48      LEON3_Timer_Regs->timer[LEON3_TIMER_INDEX].value = 0xffffff;
49    } else {
50      benchmark_timeris_initialized = TRUE;
51    }
52    LEON3_Timer_Regs->timer[LEON3_TIMER_INDEX].conf = LEON3_GPTIMER_EN | LEON3_GPTIMER_LD;
53  }
54}
55
56#define AVG_OVERHEAD      3  /* It typically takes 3.0 microseconds */
57                             /*     to start/stop the timer. */
58#define LEAST_VALID       2  /* Don't trust a value lower than this */
59
60int benchmark_timerread(void)
61{
62  uint32_t total;
63
64  if (LEON3_Timer_Regs) {
65    total = LEON3_Timer_Regs->timer[LEON3_TIMER_INDEX].value;
66   
67    total = 0xffffff - total;
68   
69    if ( benchmark_timerfind_average_overhead == 1 )
70      return total;          /* in one microsecond units */
71   
72    if ( total < LEAST_VALID )
73      return 0;            /* below timer resolution */
74
75    return total - AVG_OVERHEAD;
76  }
77  return 0;
78}
79
80rtems_status_code benchmark_timerempty_function( void )
81{
82  return RTEMS_SUCCESSFUL;
83}
84
85void benchmark_timerdisable_subtracting_average_overhead(
86  rtems_boolean find_flag
87)
88{
89  benchmark_timerfind_average_overhead = find_flag;
90}
Note: See TracBrowser for help on using the repository browser.