OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [rtems-20020807/] [c/] [src/] [lib/] [libcpu/] [sh/] [sh7045/] [clock/] [ckinit.c] - Blame information for rev 1765

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1026 ivang
/*
2
 *  This file contains the clock driver the Hitachi SH 704X
3
 *
4
 *  Authors: Ralf Corsepius (corsepiu@faw.uni-ulm.de) and
5
 *           Bernd Becker (becker@faw.uni-ulm.de)
6
 *
7
 *  COPYRIGHT (c) 1997-1998, FAW Ulm, Germany
8
 *
9
 *  This program is distributed in the hope that it will be useful,
10
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
11
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12
 *
13
 *
14
 *  COPYRIGHT (c) 1998.
15
 *  On-Line Applications Research Corporation (OAR).
16
 *
17
 *      Modified to reflect registers of sh7045 processor:
18
 *      John M. Mills (jmills@tga.com)
19
 *      TGA Technologies, Inc.
20
 *      100 Pinnacle Way, Suite 140
21
 *      Norcross, GA 30071 U.S.A.
22
 *      August, 1999
23
 *
24
 *      This modified file may be copied and distributed in accordance
25
 *      the above-referenced license. It is provided for critique and
26
 *      developmental purposes without any warranty nor representation
27
 *      by the authors or by TGA Technologies.
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.OARcorp.com/rtems/license.html.
32
 *
33
 *  ckinit.c,v 1.4 2001/10/12 21:00:52 joel Exp
34
 */
35
 
36
#include <rtems.h>
37
 
38
#include <stdlib.h>
39
 
40
#include <rtems/libio.h>
41
#include <rtems/score/sh_io.h>
42
#include <rtems/score/sh.h>
43
#include <rtems/score/ispsh7045.h>
44
#include <rtems/score/iosh7045.h>
45
 
46
#define _MTU_COUNTER0_MICROSECOND (Clock_MHZ/16)
47
 
48
#ifndef CLOCKPRIO
49
#define CLOCKPRIO 10
50
#endif
51
 
52
#define MTU0_STARTMASK  0xfe
53
#define MTU0_SYNCMASK   0xfe
54
#define MTU0_MODEMASK   0xc0
55
#define MTU0_TCRMASK    0x22 /* bit 7 also used, vs 703x */
56
#define MTU0_STAT_MASK  0xc0
57
#define MTU0_IRQMASK    0xfe
58
#define MTU0_TIERMASK   0x01
59
#define IPRC_MTU0_MASK  0xff0f
60
#define MTU0_TIORVAL    0x08
61
 
62
/*
63
 *  The interrupt vector number associated with the clock tick device
64
 *  driver.
65
 */
66
 
67
#define CLOCK_VECTOR MTUA0_ISP_V
68
 
69
/*
70
 *  Clock_driver_ticks is a monotonically increasing counter of the
71
 *  number of clock ticks since the driver was initialized.
72
 */
73
 
74
volatile rtems_unsigned32 Clock_driver_ticks;
75
 
76
static void Clock_exit( void );
77
static rtems_isr Clock_isr( rtems_vector_number vector );
78
static rtems_unsigned32 Clock_MHZ ;
79
 
80
/*
81
 *  Clock_isrs is the number of clock ISRs until the next invocation of
82
 *  the RTEMS clock tick routine.  The clock tick device driver
83
 *  gets an interrupt once a millisecond and counts down until the
84
 *  length of time between the user configured microseconds per tick
85
 *  has passed.
86
 */
87
 
88
rtems_unsigned32 Clock_isrs;              /* ISRs until next tick */
89
static rtems_unsigned32 Clock_isrs_const;        /* only calculated once */
90
 
91
/*
92
 * These are set by clock driver during its init
93
 */
94
 
95
rtems_device_major_number rtems_clock_major = ~0;
96
rtems_device_minor_number rtems_clock_minor;
97
 
98
/*
99
 *  The previous ISR on this clock tick interrupt vector.
100
 */
101
 
102
rtems_isr_entry  Old_ticker;
103
 
104
/*
105
 *  Isr Handler
106
 */
107
 
108
rtems_isr Clock_isr(
109
  rtems_vector_number vector
110
)
111
{
112
  /*
113
   * bump the number of clock driver ticks since initialization
114
   *
115
 
116
   * determine if it is time to announce the passing of tick as configured
117
   * to RTEMS through the rtems_clock_tick directive
118
   *
119
   * perform any timer dependent tasks
120
   */
121
  unsigned8 temp;
122
 
123
  /* reset the flags of the status register */
124
  temp = read8( MTU_TSR0) & MTU0_STAT_MASK;
125
  write8( temp, MTU_TSR0);
126
 
127
  Clock_driver_ticks++ ;
128
 
129
  if( Clock_isrs == 1)
130
    {
131
      rtems_clock_tick();
132
      Clock_isrs = Clock_isrs_const;
133
    }
134
  else
135
    {
136
      Clock_isrs-- ;
137
    }
138
}
139
 
140
/*
141
 *  Install_clock
142
 *
143
 *  Install a clock tick handler and reprograms the chip.  This
144
 *  is used to initially establish the clock tick.
145
 */
146
 
147
void Install_clock(
148
  rtems_isr_entry clock_isr
149
)
150
{
151
  unsigned8 temp8 = 0;
152
  unsigned32 factor = 1000000;
153
 
154
 
155
  /*
156
   *  Initialize the clock tick device driver variables
157
   */
158
 
159
  Clock_driver_ticks = 0;
160
  Clock_isrs_const = rtems_configuration_get_microseconds_per_tick() / 10000;
161
  Clock_isrs = Clock_isrs_const;
162
 
163
  factor /= rtems_configuration_get_microseconds_per_tick(); /* minimalization of integer division error */
164
  Clock_MHZ = rtems_cpu_configuration_get_clicks_per_second() / factor ;
165
 
166
  rtems_interrupt_catch( Clock_isr, CLOCK_VECTOR, &Old_ticker );
167
 
168
  /*
169
   *  Hardware specific initialize goes here
170
   */
171
 
172
  /* stop Timer 0 */
173
  temp8 = read8( MTU_TSTR) & MTU0_STARTMASK;
174
  write8( temp8, MTU_TSTR);
175
 
176
  /* set initial counter value to 0 */
177
  write16( 0, MTU_TCNT0);
178
 
179
  /* Timer 0 runs independent */
180
  temp8 = read8( MTU_TSYR) & MTU0_SYNCMASK;
181
  write8( temp8, MTU_TSYR);
182
 
183
  /* Timer 0 normal mode */
184
  temp8 = read8( MTU_TMDR0) & MTU0_MODEMASK;
185
  write8( temp8, MTU_TMDR0);
186
 
187
  /* TCNT is cleared by GRA ; internal clock /16 */
188
  write8( MTU0_TCRMASK , MTU_TCR0);
189
 
190
  /* use GRA without I/O - pins  */
191
  write8( MTU0_TIORVAL, MTU_TIORL0);
192
 
193
  /* reset flags of the status register */
194
  temp8 = read8( MTU_TSR0) & MTU0_STAT_MASK;
195
  write8( temp8, MTU_TSR0);
196
 
197
  /* Irq if is equal GRA */
198
  temp8 = read8( MTU_TIER0) | MTU0_TIERMASK;
199
  write8( temp8, MTU_TIER0);
200
 
201
  /* set interrupt priority */
202
  if( sh_set_irq_priority( CLOCK_VECTOR, CLOCKPRIO ) != RTEMS_SUCCESSFUL)
203
    rtems_fatal_error_occurred( RTEMS_NOT_CONFIGURED);
204
 
205
  /* set counter limits */
206
  write16( _MTU_COUNTER0_MICROSECOND, MTU_GR0A);
207
 
208
  /* start counter */
209
  temp8 = read8( MTU_TSTR) |~MTU0_STARTMASK;
210
  write8( temp8, MTU_TSTR);
211
 
212
  /*
213
   *  Schedule the clock cleanup routine to execute if the application exits.
214
   */
215
 
216
  atexit( Clock_exit );
217
}
218
 
219
/*
220
 *  Clean up before the application exits
221
 */
222
 
223
void Clock_exit( void )
224
{
225
  unsigned8 temp8 = 0;
226
 
227
  /* turn off the timer interrupts */
228
  /* set interrupt priority to 0 */
229
  if( sh_set_irq_priority( CLOCK_VECTOR, 0 ) != RTEMS_SUCCESSFUL)
230
    rtems_fatal_error_occurred( RTEMS_UNSATISFIED);
231
 
232
/*
233
 *   temp16 = read16( MTU_TIER0) & IPRC_MTU0_IRQMASK;
234
 *   write16( temp16, MTU_TIER0);
235
 */
236
 
237
  /* stop counter */
238
  temp8 = read8( MTU_TSTR) & MTU0_STARTMASK;
239
  write8( temp8, MTU_TSTR);
240
 
241
  /* old vector shall not be installed */
242
}
243
 
244
/*
245
 *  Clock_initialize
246
 *
247
 *  Device driver entry point for clock tick driver initialization.
248
 */
249
 
250
rtems_device_driver Clock_initialize(
251
  rtems_device_major_number major,
252
  rtems_device_minor_number minor,
253
  void *pargp
254
)
255
{
256
  Install_clock( Clock_isr );
257
 
258
  /*
259
   * make major/minor avail to others such as shared memory driver
260
   */
261
 
262
  rtems_clock_major = major;
263
  rtems_clock_minor = minor;
264
 
265
  return RTEMS_SUCCESSFUL;
266
}
267
 
268
rtems_device_driver Clock_control(
269
  rtems_device_major_number major,
270
  rtems_device_minor_number minor,
271
  void *pargp
272
)
273
{
274
  rtems_unsigned32 isrlevel;
275
  rtems_libio_ioctl_args_t *args = pargp;
276
 
277
  if (args != 0)
278
    {
279
      /*
280
       * This is hokey, but until we get a defined interface
281
       * to do this, it will just be this simple...
282
       */
283
 
284
      if (args->command == rtems_build_name('I', 'S', 'R', ' '))
285
        {
286
          Clock_isr(CLOCK_VECTOR);
287
        }
288
      else if (args->command == rtems_build_name('N', 'E', 'W', ' '))
289
        {
290
          rtems_isr_entry       ignored ;
291
          rtems_interrupt_disable( isrlevel );
292
          rtems_interrupt_catch( args->buffer, CLOCK_VECTOR, &ignored );
293
 
294
          rtems_interrupt_enable( isrlevel );
295
        }
296
    }
297
  return RTEMS_SUCCESSFUL;
298
}

powered by: WebSVN 2.1.0

© copyright 1999-2025 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.