source: rtems/c/src/lib/libbsp/powerpc/gen5200/slicetimer/slicetimer.c @ 20cacf5c

Last change on this file since 20cacf5c was a877cc8e, checked in by Ralf Corsepius <ralf.corsepius@…>, on 10/17/06 at 02:46:07

Convert to utf-8.

  • Property mode set to 100644
File size: 11.8 KB
Line 
1/*===============================================================*\
2| Project: RTEMS generic MPC5200 BSP                              |
3+-----------------------------------------------------------------+
4| Partially based on the code references which are named below.   |
5| Adaptions, modifications, enhancements and any recent parts of  |
6| the code are:                                                   |
7|                    Copyright (c) 2005                           |
8|                    Embedded Brains GmbH                         |
9|                    Obere Lagerstr. 30                           |
10|                    D-82178 Puchheim                             |
11|                    Germany                                      |
12|                    rtems@embedded-brains.de                     |
13+-----------------------------------------------------------------+
14| The license and distribution terms for this file may be         |
15| found in the file LICENSE in this distribution or at            |
16|                                                                 |
17| http://www.rtems.com/license/LICENSE.                           |
18|                                                                 |
19+-----------------------------------------------------------------+
20| this file contains functions to implement a slice timer         |
21\*===============================================================*/
22/***********************************************************************/
23/*                                                                     */
24/*   Module:       slicetimer.c                                        */
25/*   Date:         07/17/2003                                          */
26/*   Purpose:      RTEMS MPC5x00 slicetimer driver                     */
27/*                                                                     */
28/*---------------------------------------------------------------------*/
29/*                                                                     */
30/*   Description:  MPC5x00 slice timer routines for cyclic short time  */
31/*                 trigger                                             */
32/*                                                                     */
33/*---------------------------------------------------------------------*/
34/*                                                                     */
35/*   Code                                                              */
36/*   References:   Clock driver for PPC403                             */
37/*   Module:       clock.c                                             */
38/*   Project:      RTEMS 4.6.0pre1 / PPC403 BSP                        */
39/*   Version       1.16                                                */
40/*   Date:         2002/11/01                                          */
41/*   Author(s) / Copyright(s):                                         */
42/*                                                                     */
43/*   Author: Jay Monkman (jmonkman@frasca.com)                         */
44/*   Copyright (C) 1998 by Frasca International, Inc.                  */
45/*                                                                     */
46/*   Derived from c/src/lib/libcpu/ppc/ppc403/clock/clock.c:           */
47/*                                                                     */
48/*   Author: Andrew Bray <andy@i-cubed.co.uk>                          */
49/*                                                                     */
50/*   COPYRIGHT (c) 1995 by i-cubed ltd.                                */
51/*                                                                     */
52/*   To anyone who acknowledges that this file is provided "AS IS"     */
53/*   without any express or implied warranty:                          */
54/*      permission to use, copy, modify, and distribute this file      */
55/*      for any purpose is hereby granted without fee, provided that   */
56/*      the above copyright notice and this notice appears in all      */
57/*      copies, and that the name of i-cubed limited not be used in    */
58/*      advertising or publicity pertaining to distribution of the     */
59/*      software without specific, written prior permission.           */
60/*      i-cubed limited makes no representations about the suitability */
61/*      of this software for any purpose.                              */
62/*                                                                     */
63/*   Derived from c/src/lib/libcpu/hppa1.1/clock/clock.c:              */
64/*                                                                     */
65/*   Modifications for deriving timer clock from cpu system clock by   */
66/*              Thomas Doerfler <td@imd.m.isar.de>                     */
67/*   for these modifications:                                          */
68/*   COPYRIGHT (c) 1997 by IMD, Puchheim, Germany.                     */
69/*                                                                     */
70/*   COPYRIGHT (c) 1989-1999.                                          */
71/*   On-Line Applications Research Corporation (OAR).                  */
72/*                                                                     */
73/*   The license and distribution terms for this file may be           */
74/*   found in the file LICENSE in this distribution or at              */
75/*   http://www.OARcorp.com/rtems/license.html.                        */
76/*                                                                     */
77/*   Modifications for PPC405GP by Dennis Ehlin                        */
78/*---------------------------------------------------------------------*/
79/*                                                                     */
80/*   Partially based on the code references which are named above.     */
81/*   Adaptions, modifications, enhancements and any recent parts of    */
82/*   the code are under the right of                                   */
83/*                                                                     */
84/*         IPR Engineering, Dachauer Straße 38, D-80335 MÃŒnchen        */
85/*                        Copyright(C) 2003                            */
86/*                                                                     */
87/*---------------------------------------------------------------------*/
88/*                                                                     */
89/*   IPR Engineering makes no representation or warranties with        */
90/*   respect to the performance of this computer program, and          */
91/*   specifically disclaims any responsibility for any damages,        */
92/*   special or consequential, connected with the use of this program. */
93/*                                                                     */
94/*---------------------------------------------------------------------*/
95/*                                                                     */
96/*   Version history:  1.0                                             */
97/*                                                                     */
98/***********************************************************************/
99
100#include <bsp.h>
101#include <rtems/bspIo.h>
102#include "../irq/irq.h"
103
104#include <rtems.h>
105#include <rtems/clockdrv.h>
106#include <rtems/libio.h>
107
108#include "../irq/irq.h"
109#include "../include/mpc5200.h"
110#include "../slicetimer/slicetimer.h"
111#include <stdio.h>
112
113uint32_t value0 = 0;
114uint32_t value1 = 0;
115
116/*
117 *  ISR Handlers
118 */
119void mpc5200_slt_isr(uint32_t slt_no)
120  {
121  uint32_t status;
122  struct mpc5200_slt *slt = (struct mpc5200_slt *)(&mpc5200.slt[slt_no]);
123
124  status = slt->tsr;
125
126  if(status & SLT_TSR_ST)
127    {
128
129    slt->tsr |= SLT_TSR_ST;
130
131    /*if(slt_no == SLT0)
132        slt0_user_defined_handler */
133
134    /*if(slt_no == SLT1)
135        slt1_user_defined_handler */
136
137    }
138
139  }
140
141
142rtems_isr mpc5200_slt0_isr(rtems_irq_hdl_param unused)
143  {
144
145  mpc5200_slt_isr(SLT0);
146
147  }
148
149
150rtems_isr mpc5200_slt1_isr(rtems_irq_hdl_param unused)
151  {
152
153  mpc5200_slt_isr(SLT1);
154
155  }
156
157
158/*
159 *  Initialize MPC5x00 slt
160 */
161void mpc5200_init_slt(uint32_t slt_no)
162  {
163  struct mpc5200_slt *slt = (struct mpc5200_slt *)(&mpc5200.slt[slt_no]);
164
165  slt->tsr    = SLT_TSR_ST;
166  slt->cntrl  = SLT_CNTRL_RW;
167
168  }
169
170
171/*
172 *  Set MPC5x00 slt counter
173 */
174void mpc5200_set_slt_count(uint32_t slt_no)
175  {
176  struct mpc5200_slt *slt = (struct mpc5200_slt *)(&mpc5200.slt[slt_no]);
177
178  if(slt_no == SLT0)
179    /* Calculate counter value 24 bit (must be greater than 255) => IPB_Clock=33MHz -> Int. every 7,75us - 508ms */
180    if((SLT_TSR_COUNT(SLT0_INT_FREQUENCY) > 0xFF) && (SLT_TSR_COUNT(SLT0_INT_FREQUENCY) < 0x1000000))
181      slt->tcr = SLT_TSR_COUNT(SLT0_INT_FREQUENCY);
182
183  if(slt_no == SLT1)
184    /* Calculate counter value 24 bit (must be greater than 255) => IPB_Clock=33MHz -> Int. every 7,75us - 508ms */
185    if((SLT_TSR_COUNT(SLT1_INT_FREQUENCY) > 0xFF) && (SLT_TSR_COUNT(SLT1_INT_FREQUENCY) < 0x1000000))
186      slt->tcr = SLT_TSR_COUNT(SLT1_INT_FREQUENCY);
187
188  }
189
190
191/*
192 *  Enable MPC5x00 slt interrupt
193 */
194void mpc5200_enable_slt_int(uint32_t slt_no)
195  {
196  struct mpc5200_slt *slt = (struct mpc5200_slt *)(&mpc5200.slt[slt_no]);
197
198  slt->cntrl  |= SLT_CNTRL_TIMEN | SLT_CNTRL_INTEN;
199
200  }
201
202
203/*
204 *  Disable MPC5x00 slt interrupt
205 */
206void mpc5200_disable_slt_int(uint32_t slt_no)
207  {
208  struct mpc5200_slt *slt = (struct mpc5200_slt *)(&mpc5200.slt[slt_no]);
209
210  slt->cntrl &= ~(SLT_CNTRL_TIMEN | SLT_CNTRL_INTEN);
211
212  }
213
214
215/*
216 *  Check MPC5x00 slt status
217 */
218uint32_t mpc5200_check_slt_status(uint32_t slt_no)
219  {
220  struct mpc5200_slt *slt = (struct mpc5200_slt *)(&mpc5200.slt[slt_no]);
221
222  if(((slt->cntrl) & (SLT_CNTRL_TIMEN | SLT_CNTRL_INTEN)) == (SLT_CNTRL_TIMEN | SLT_CNTRL_INTEN))
223    return 1;
224  else
225    return 0;
226
227  }
228
229/*
230 *  switch MPC5x00 slt on
231 */
232void sltOn(const rtems_irq_connect_data* irq)
233  {
234  uint32_t slt_no = 0;
235
236  if((irq->name) == BSP_SIU_IRQ_SL_TIMER0)
237    slt_no = 0;
238
239  if((irq->name) == BSP_SIU_IRQ_SL_TIMER1)
240    slt_no = 1;
241
242  mpc5200_set_slt_count((uint32_t)slt_no);
243  mpc5200_enable_slt_int((uint32_t)slt_no);
244
245  }
246
247/*
248 *  switch MPC5x00 slt off
249 */
250void sltOff(const rtems_irq_connect_data* irq)
251  {
252  uint32_t slt_no = 0;
253
254  if((irq->name) == BSP_SIU_IRQ_SL_TIMER0)
255    slt_no = 0;
256
257  if((irq->name) == BSP_SIU_IRQ_SL_TIMER1)
258    slt_no = 1;
259
260  mpc5200_disable_slt_int((uint32_t)slt_no);
261
262  }
263
264/*
265 *  get status of MPC5x00 slt
266 */
267int sltIsOn(const rtems_irq_connect_data* irq)
268  {
269  uint32_t slt_no = 0;
270
271  if((irq->name) == BSP_SIU_IRQ_SL_TIMER0)
272    slt_no = 0;
273
274  if((irq->name) == BSP_SIU_IRQ_SL_TIMER1)
275    slt_no = 1;
276
277  if(mpc5200_check_slt_status(slt_no))
278    return 1;
279  else
280    return 0;
281  }
282
283/*
284 *  MPC5x00 slt0 irq connect data
285 */
286static rtems_irq_connect_data slt0_IrqData =
287  {
288  BSP_SIU_IRQ_SL_TIMER0,
289  mpc5200_slt0_isr,
290  (rtems_irq_hdl_param) NULL,
291  (rtems_irq_enable)sltOn,
292  (rtems_irq_disable)sltOff,
293  (rtems_irq_is_enabled)sltIsOn
294  };
295
296/*
297 *  MPC5x00 slt1 irq connect data
298 */
299static rtems_irq_connect_data slt1_IrqData =
300  {
301  BSP_SIU_IRQ_SL_TIMER1,
302  mpc5200_slt1_isr,
303  (rtems_irq_hdl_param) NULL,
304  (rtems_irq_enable)sltOn,
305  (rtems_irq_disable)sltOff,
306  (rtems_irq_is_enabled)sltIsOn
307  };
308
309/*
310 *  call MPC5x00 slt install routines
311 */
312void Install_slt(rtems_device_minor_number slt_no)
313  {
314
315  mpc5200_init_slt((uint32_t)slt_no);
316  mpc5200_set_slt_count((uint32_t)slt_no);
317
318  }
319
320/*
321 *  MPC5x00 slt device driver initialize
322 */
323rtems_device_driver slt_initialize
324  (
325  rtems_device_major_number major,
326  rtems_device_minor_number minor,
327  void *pargp
328  )
329  {
330
331  /* force minor according to definitions in bsp.h */
332  if(USE_SLICETIMER_0)
333    {
334
335    Install_slt(0);
336
337    if(!BSP_install_rtems_irq_handler(&slt0_IrqData))
338      {
339
340      printk("Unable to connect PSC Irq handler\n");
341      rtems_fatal_error_occurred(1);
342
343      }
344
345    }
346
347  if(USE_SLICETIMER_1)
348    {
349
350    Install_slt(1);
351
352    if(!BSP_install_rtems_irq_handler(&slt1_IrqData))
353      {
354
355      printk("Unable to connect PSC Irq handler\n");
356      rtems_fatal_error_occurred(1);
357
358      }
359
360    }
361
362  return RTEMS_SUCCESSFUL;
363
364  }
365
Note: See TracBrowser for help on using the repository browser.