source: rtems/c/src/lib/libbsp/m68k/mvme162/clock/ckinit.c @ 629e12a

4.104.114.84.9
Last change on this file since 629e12a was 629e12a, checked in by Ralf Corsepius <ralf.corsepius@…>, on Mar 31, 2004 at 4:38:35 AM

2004-03-31 Ralf Corsepius <ralf_corsepius@…>

  • clock/ckinit.c, startup/bspstart.c, timer/timer.c: Convert to using c99 fixed size types.
  • Property mode set to 100644
File size: 3.5 KB
Line 
1/*  Clock_init()
2 *
3 *  This routine initializes the Tick Timer 2 on the MVME162 board.
4 *  The tick frequency is 1 millisecond.
5 *
6 *  Input parameters:  NONE
7 *
8 *  Output parameters:  NONE
9 *
10 *  COPYRIGHT (c) 1989-1999.
11 *  On-Line Applications Research Corporation (OAR).
12 *
13 *  The license and distribution terms for this file may be
14 *  found in the file LICENSE in this distribution or at
15 *  http://www.rtems.com/license/LICENSE.
16 *
17 *  Modifications of respective RTEMS file: COPYRIGHT (c) 1994.
18 *  EISCAT Scientific Association. M.Savitski
19 *
20 *  This material is a part of the MVME162 Board Support Package
21 *  for the RTEMS executive. Its licensing policies are those of the
22 *  RTEMS above.
23 *
24 *  $Id$
25 */
26
27#include <stdlib.h>
28
29#include <bsp.h>
30#include <rtems/libio.h>
31
32#define MS_COUNT          1000            /* T2's countdown constant (1 ms) */
33#define CLOCK_INT_LEVEL   6               /* T2's interrupt level */
34
35uint32_t         Clock_isrs;                  /* ISRs until next tick */
36volatile uint32_t         Clock_driver_ticks; /* ticks since initialization */
37rtems_isr_entry  Old_ticker;
38
39void Clock_exit( void );
40 
41#define CLOCK_VECTOR (VBR0 * 0x10 + 0x9)
42/*
43 * These are set by clock driver during its init
44 */
45 
46rtems_device_major_number rtems_clock_major = ~0;
47rtems_device_minor_number rtems_clock_minor;
48 
49
50/*
51 *  ISR Handler
52 */
53
54rtems_isr Clock_isr(rtems_vector_number vector)
55{
56  Clock_driver_ticks += 1;
57  lcsr->timer_cnt_2 = 0;            /* clear counter */
58  lcsr->intr_clear |= 0x02000000;
59
60  if ( Clock_isrs == 1 ) {
61    rtems_clock_tick();
62    Clock_isrs = BSP_Configuration.microseconds_per_tick / 1000;
63  }
64  else 
65    Clock_isrs -= 1;
66}
67
68void Install_clock(rtems_isr_entry clock_isr )
69{
70
71  Clock_driver_ticks = 0;
72  Clock_isrs = BSP_Configuration.microseconds_per_tick / 1000;
73
74  Old_ticker = (rtems_isr_entry) set_vector( clock_isr, CLOCK_VECTOR, 1 );
75  lcsr->vector_base |= MASK_INT;   /* unmask VMEchip2 interrupts */
76  lcsr->to_ctl = 0xE7;             /* prescaler to 1 MHz (see Appendix A1) */
77  lcsr->timer_cmp_2 = MS_COUNT;
78  lcsr->timer_cnt_2 = 0;           /* clear counter */
79  lcsr->board_ctl |= 0x700;        /* increment, reset-on-compare, and */
80                                   /*   clear-overflow-cnt */
81
82  lcsr->intr_level[0] |= CLOCK_INT_LEVEL * 0x10;      /* set int level */
83  lcsr->intr_ena |= 0x02000000;       /* enable tick timer 2 interrupt */
84
85  atexit( Clock_exit );
86}
87
88void Clock_exit( void )
89{
90/* Dummy for now. See other m68k BSP's for code examples */
91}
92
93rtems_device_driver Clock_initialize(
94  rtems_device_major_number major,
95  rtems_device_minor_number minor,
96  void *pargp
97)
98{
99  Install_clock( Clock_isr );
100 
101  /*
102   * make major/minor avail to others such as shared memory driver
103   */
104 
105  rtems_clock_major = major;
106  rtems_clock_minor = minor;
107 
108  return RTEMS_SUCCESSFUL;
109}
110 
111rtems_device_driver Clock_control(
112  rtems_device_major_number major,
113  rtems_device_minor_number minor,
114  void *pargp
115)
116{
117    uint32_t         isrlevel;
118    rtems_libio_ioctl_args_t *args = pargp;
119 
120    if (args == 0)
121        goto done;
122 
123    /*
124     * This is hokey, but until we get a defined interface
125     * to do this, it will just be this simple...
126     */
127 
128    if (args->command == rtems_build_name('I', 'S', 'R', ' '))
129    {
130        Clock_isr(CLOCK_VECTOR);
131    }
132    else if (args->command == rtems_build_name('N', 'E', 'W', ' '))
133    {
134      rtems_interrupt_disable( isrlevel );
135       (void) set_vector( args->buffer, CLOCK_VECTOR, 1 );
136      rtems_interrupt_enable( isrlevel );
137    }
138 
139done:
140    return RTEMS_SUCCESSFUL;
141}
142
Note: See TracBrowser for help on using the repository browser.