source: rtems/c/src/lib/libcpu/powerpc/ppc403/timer/timer.c @ c4cc8199

4.104.114.9
Last change on this file since c4cc8199 was c4cc8199, checked in by Joel Sherrill <joel.sherrill@…>, on Nov 28, 2007 at 9:45:06 PM

2007-11-28 Joel Sherrill <joel.sherrill@…>

  • mpc5xx/clock/clock.c, mpc5xx/timer/timer.c, mpc8260/clock/clock.c, mpc8260/cpm/brg.c, mpc8260/timer/timer.c, mpc8xx/clock/clock.c, mpc8xx/console-generic/console-generic.c, mpc8xx/timer/timer.c, new-exceptions/raw_exception.c, old-exceptions/cpu.c, ppc403/clock/clock.c, ppc403/console/console.c, ppc403/console/console.c.polled, ppc403/console/console405.c, ppc403/ictrl/ictrl.c, ppc403/irq/ictrl.c, ppc403/timer/timer.c, ppc403/tty_drv/tty_drv.c: Eliminate PowerPC specific elements from the CPU Table. They have been replaced with variables named bsp_XXX as needed.
  • Property mode set to 100644
File size: 3.2 KB
Line 
1/*  timer.c
2 *
3 *  This file manages the interval timer on the PowerPC 403*.
4 *  We shall use the bottom 32 bits of the timebase register,
5 *
6 *  NOTE: It is important that the timer start/stop overhead be
7 *        determined when porting or modifying this code.
8 *
9 *  Author:     Andrew Bray <andy@i-cubed.co.uk>
10 *
11 *  COPYRIGHT (c) 1995 by i-cubed ltd.
12 *
13 *  To anyone who acknowledges that this file is provided "AS IS"
14 *  without any express or implied warranty:
15 *      permission to use, copy, modify, and distribute this file
16 *      for any purpose is hereby granted without fee, provided that
17 *      the above copyright notice and this notice appears in all
18 *      copies, and that the name of i-cubed limited not be used in
19 *      advertising or publicity pertaining to distribution of the
20 *      software without specific, written prior permission.
21 *      i-cubed limited makes no representations about the suitability
22 *      of this software for any purpose.
23 *
24 *  Derived from c/src/lib/libcpu/hppa1.1/timer/timer.c:
25 *
26 *  COPYRIGHT (c) 1989-2007.
27 *  On-Line Applications Research Corporation (OAR).
28 *
29 *  The license and distribution terms for this file may be
30 *  found in the file LICENSE in this distribution or at
31 *  http://www.rtems.com/license/LICENSE.
32 *
33 *  Modifications for PPC405GP by Dennis Ehlin
34 *
35 *  $Id$
36 *
37 */
38
39#include <rtems.h>
40
41static volatile uint32_t   Timer_starting;
42static rtems_boolean Timer_driver_Find_average_overhead;
43
44/*
45 *  This is so small that this code will be reproduced where needed.
46 */
47static inline uint32_t   get_itimer(void)
48{
49   uint32_t   ret;
50
51#ifndef ppc405
52   asm volatile ("mfspr %0, 0x3dd" : "=r" ((ret))); /* TBLO */
53#else /* ppc405 */
54/*   asm volatile ("mfspr %0, 0x3dd" : "=r" ((ret)));  TBLO */
55
56   asm volatile ("mfspr %0, 0x10c" : "=r" ((ret))); /* 405GP TBL */
57#endif /* ppc405 */
58
59   return ret;
60}
61
62void Timer_initialize()
63{
64  uint32_t   iocr;
65
66#ifndef ppc405
67  asm volatile ("mfdcr %0, 0xa0" : "=r" (iocr)); /* IOCR */
68  iocr &= ~4;
69  iocr |= 4;  /* Select external timer clock */
70  asm volatile ("mtdcr 0xa0, %0" : "=r" (iocr) : "0" (iocr)); /* IOCR */
71#else /* ppc405 */
72  asm volatile ("mfdcr %0, 0x0b2" : "=r" (iocr));  /*405GP CPC0_CR1 */
73/*  asm volatile ("mfdcr %0, 0xa0" : "=r" (iocr)); IOCR */
74
75  /* iocr |= 0x800000;  select external timer clock CETE*/
76  iocr &= ~0x800000; /* timer clocked from system clock CETE*/
77
78  asm volatile ("mtdcr 0x0b2, %0" : "=r" (iocr) : "0" (iocr)); /* 405GP CPC0_CR1 */
79/*  asm volatile ("mtdcr 0xa0, %0" : "=r" (iocr) : "0" (iocr));  IOCR */
80#endif /* ppc405 */
81
82  Timer_starting = get_itimer();
83}
84
85int Read_timer()
86{
87  uint32_t   clicks;
88  uint32_t   total;
89  extern uint32_t bsp_timer_least_valid;
90  extern uint32_t bsp_timer_average_overhead;
91
92  clicks = get_itimer();
93
94  total = clicks - Timer_starting;
95
96  if ( Timer_driver_Find_average_overhead == 1 )
97    return total;          /* in XXX microsecond units */
98
99  else {
100    if ( total < bsp_timer_least_valid )
101      return 0;            /* below timer resolution */
102    return (total - bsp_timer_average_overhead);
103  }
104}
105
106rtems_status_code Empty_function( void )
107{
108  return RTEMS_SUCCESSFUL;
109}
110
111void Set_find_average_overhead(
112  rtems_boolean find_flag
113)
114{
115  Timer_driver_Find_average_overhead = find_flag;
116}
Note: See TracBrowser for help on using the repository browser.