summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/powerpc/dmv177/timer/timer.c
blob: c9a406f6bf546a776423c26e96c71cc86bd0d73c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
/*  timer.c
 *
 *  This file implements a benchmark timer using the General Purpose Timer on
 *  the MEC.
 *
 *  The license and distribution terms for this file are in
 *  the file LICENSE in this distribution or at
 *  http://www.rtems.com/license/LICENSE.
 *
 *  $Id$
 */

#include <assert.h>

#include <bsp.h>

uint64_t   Timer_driver_Start_time;

rtems_boolean Timer_driver_Find_average_overhead;

/*PAGE
 *
 *  Timer_initialize
 *
 *  This routine initializes the timer.
 *
 *  Input parameters:   NONE
 *
 *  Output parameters:  NONE
 *
 *  Return values:      NONE
 *
 */

void Timer_initialize()
{
  /*
   *  Timer runs long and accurate enough not to require an interrupt.
   */


  Timer_driver_Start_time = PPC_Get_timebase_register();


}

#define AVG_OVERHEAD     24  /* It typically takes 24 instructions */
                             /*     to start/stop the timer. */
#define LEAST_VALID       1  /* Don't trust a value lower than this */

/*  PAGE
 *
 *  Read_timer
 *
 *  This routine reads the timer.
 *
 *  Input parameters:   NONE
 *
 *  Output parameters:  NONE
 *
 *  Return values:      timer in ms units
 *
 */

int Read_timer()
{
  uint64_t    clicks;
  uint64_t    total64;
  uint32_t    total;

  /* approximately CLOCK_SPEED clicks per microsecond */

  clicks = PPC_Get_timebase_register();

  assert( clicks > Timer_driver_Start_time );

  total64 = clicks - Timer_driver_Start_time;

  assert( total64 <= 0xffffffff );  /* fits into a uint32_t   */

  total = (uint32_t) total64;

  if ( Timer_driver_Find_average_overhead == 1 )
    return total;          /* in one microsecond units */

  if ( total < LEAST_VALID )
    return 0;            /* below timer resolution */

  return total - AVG_OVERHEAD;
}

/*  PAGE
 *
 *  Empty_function
 *
 *  This routine is called during the idle loop.
 *
 *  Input parameters:   NONE
 *
 *  Output parameters:
 *    status code of successful
 *
 *  Return values:      NONE
 *
 */

rtems_status_code Empty_function( void )
{
  return RTEMS_SUCCESSFUL;
}

/*  PAGE
 *
 *  Set_find_average_overhead
 *
 *  This routine sets a global boolean to the value passed in.
 *
 *  Input parameters:
 *    find_flag  - flag to indicate to find the average overhead.
 *
 *  Output parameters:  NONE
 *
 *  Return values:      NONE
 *
 */

void Set_find_average_overhead(
  rtems_boolean find_flag
)
{
  Timer_driver_Find_average_overhead = find_flag;
}