source: rtems/c/src/lib/libbsp/i960/rxgen960/clock/ckinit.c @ eb7f0f22

4.104.114.84.95
Last change on this file since eb7f0f22 was 702c5f5, checked in by Joel Sherrill <joel.sherrill@…>, on 10/27/99 at 15:29:18

The rxgen960 BSP and i960 RPM support was submitted by Mark Bronson
<mark@…> of RAMIX.

  • Property mode set to 100644
File size: 4.4 KB
Line 
1/*  Clock_init()
2 *
3 *  This routine initializes the i960RP onboard timer
4 *  The tick frequency is 1 millisecond; assuming 33MHz core
5 *
6 *  Input parameters:  NONE
7 *
8 *  Output parameters:  NONE
9 *
10 *  COPYRIGHT (c) 1989-1997.
11 *  RAMiX Inc 1999
12 *  On-Line Applications Research Corporation (OAR).
13 *  Copyright assigned to U.S. Government, 1994.
14 *
15 *  The license and distribution terms for this file may in
16 *  the file LICENSE in this distribution or at
17 *  http://www.OARcorp.com/rtems/license.html.
18 *
19 *  $Id$
20 */
21
22#include <stdlib.h>
23
24#include <bsp.h>
25#include <i960RP.h>
26#include <rtems/libio.h>
27
28#define CLOCK_VECTOR 0x92
29
30rtems_unsigned32 Clock_isrs;              /* ISRs until next tick */
31rtems_unsigned32 Reload_Clock_isrs;
32
33i960_isr_entry   Old_ticker;
34rtems_unsigned32 Clock_driver_ticks;
35                                          /* ticks since initialization */
36unsigned int clock_isr_global[16];  /* place to store global regs */
37
38void Clock_exit( void );
39 
40/*
41 * These are set by clock driver during its init
42 */
43 
44rtems_device_major_number rtems_clock_major = ~0;
45rtems_device_minor_number rtems_clock_minor;
46
47/* this is later in the file to avoid it being inlined */
48rtems_isr Clock_isr( rtems_vector_number vector );
49
50void Install_clock(
51  rtems_isr_entry clock_isr
52)
53{
54  volatile unsigned int *tmr0 = (unsigned int *) TMR0_ADDR;
55  volatile unsigned int *trr0 = (unsigned int *) TRR0_ADDR;
56  volatile unsigned int *tcr0 = (unsigned int *) TCR0_ADDR;
57  volatile unsigned int *icon = (unsigned int *) ICON_ADDR;
58  volatile unsigned int *imap2 = (unsigned int *) IMAP2_ADDR;
59  volatile unsigned int *ipnd = (unsigned int *) IPND_ADDR;
60  volatile unsigned int *imsk = (unsigned int *) IMSK_ADDR;
61  void clockHandler();
62
63
64  Clock_driver_ticks = 0;
65  Reload_Clock_isrs = BSP_Configuration.microseconds_per_tick / 1000;
66  Clock_isrs = Reload_Clock_isrs;
67
68/* Not for our case
69  if ( BSP_Configuration.ticks_per_timeslice ) {
70     *icon = 0x6000;
71
72    Old_ticker = set_vector( (((unsigned int) clock_isr) | 0x2), CLOCK_VECTOR, 1 );
73*/
74    #define BUS_CLOCK_1 0
75    #define TMR_WRITE_CNTL 8
76    #define TMR_AUTO_RELOAD 4
77    #define TMR_ENABLE 2
78    #define TMR_TERM_CNT_STAT 1
79
80    Old_ticker = set_vector( (((unsigned int) clock_isr) | 0x2), CLOCK_VECTOR, 1 );
81/*
82    *(unsigned int *)(CLOCK_VECTOR >>2) = (unsigned int )clockHandler;
83*/
84
85    /* initialize the i960RP timer 0 here */
86   
87    /* set the timer countdown (Assume 33MHz operation) */
88    *trr0 = 30 * BSP_Configuration.microseconds_per_tick ;
89    *tcr0 = 30 * BSP_Configuration.microseconds_per_tick ;
90/*
91kkprintf("Load the timers with %x\n", 30 * BSP_Configuration.microseconds_per_tick / Reload_Clock_isrs);
92*/
93 
94    *tmr0 = BUS_CLOCK_1 | TMR_AUTO_RELOAD | TMR_ENABLE;
95/* Unmask the interrupts */
96        *ipnd &= ~(1 << 12);
97        *imsk |= 1 << 12;
98
99}
100
101void Clock_exit()
102{
103  volatile unsigned int *tmr0 = (unsigned int *) TMR0_ADDR;
104
105  if ( BSP_Configuration.ticks_per_timeslice ) {
106    /* shut down the timer */
107    *tmr0 = *tmr0 & ~TMR_ENABLE;
108
109    i960_mask_intr( 12 );
110    /* do not restore old vector */
111  }
112}
113
114rtems_device_driver Clock_initialize(
115  rtems_device_major_number major,
116  rtems_device_minor_number minor,
117  void *pargp
118)
119{
120  Install_clock( Clock_isr );
121 
122  atexit( Clock_exit );
123
124  /*
125   * make major/minor avail to others such as shared memory driver
126   */
127 
128  rtems_clock_major = major;
129  rtems_clock_minor = minor;
130 
131  return RTEMS_SUCCESSFUL;
132}
133 
134rtems_device_driver Clock_control(
135  rtems_device_major_number major,
136  rtems_device_minor_number minor,
137  void *pargp
138)
139{
140    rtems_unsigned32 isrlevel;
141    rtems_libio_ioctl_args_t *args = pargp;
142 
143    if (args == 0)
144        goto done;
145 
146    /*
147     * This is hokey, but until we get a defined interface
148     * to do this, it will just be this simple...
149     */
150 
151    if (args->command == rtems_build_name('I', 'S', 'R', ' '))
152    {
153        Clock_isr(CLOCK_VECTOR);
154    }
155    else if (args->command == rtems_build_name('N', 'E', 'W', ' '))
156    {
157      rtems_interrupt_disable( isrlevel );
158       (void) set_tmr_vector( args->buffer, CLOCK_VECTOR, 0 );
159      rtems_interrupt_enable( isrlevel );
160    }
161 
162done:
163    return RTEMS_SUCCESSFUL;
164}
165
166rtems_isr Clock_isr(
167  rtems_vector_number vector
168)
169{
170  /* enable_tracing(); */
171#ifdef NOTMB
172  if ( Clock_isrs == 1 ) {
173    rtems_clock_tick();
174    Clock_isrs = Reload_Clock_isrs;
175  }
176  else
177  {
178    Clock_isrs -= 1;
179  }
180#else
181*(int *)(0xfed00000) += 1;
182    rtems_clock_tick();
183#endif
184
185  i960_clear_intr( 12 );
186}
187
Note: See TracBrowser for help on using the repository browser.