source: rtems/bsps/mips/hurricane/clock/ckinit.c @ bb99cd0d

5
Last change on this file since bb99cd0d was bb99cd0d, checked in by Sebastian Huber <sebastian.huber@…>, on Dec 5, 2019 at 6:22:33 PM

clock: Simplify driver initialization

Use a system initialization handler instead of a legacy IO driver.

Update #3834.

  • Property mode set to 100644
File size: 4.7 KB
Line 
1/**
2 *  @file
3 * 
4 *  This file contains the clock driver initialization for the Hurricane BSP.
5 */
6
7/*
8 *  Author:     Craig Lebakken <craigl@transition.com>
9 *
10 *  COPYRIGHT (c) 1996 by Transition Networks Inc.
11 *
12 *  To anyone who acknowledges that this file is provided "AS IS"
13 *  without any express or implied warranty:
14 *      permission to use, copy, modify, and distribute this file
15 *      for any purpose is hereby granted without fee, provided that
16 *      the above copyright notice and this notice appears in all
17 *      copies, and that the name of Transition Networks not be used in
18 *      advertising or publicity pertaining to distribution of the
19 *      software without specific, written prior permission.
20 *      Transition Networks makes no representations about the suitability
21 *      of this software for any purpose.
22 *
23 *  Derived from c/src/lib/libbsp/no_cpu/no_bsp/clock/ckinit.c
24 *
25 *  COPYRIGHT (c) 1989-2012.
26 *  On-Line Applications Research Corporation (OAR).
27 *
28 *  The license and distribution terms for this file may be
29 *  found in the file LICENSE in this distribution or at
30 *  http://www.rtems.org/license/LICENSE.
31 */
32
33/*
34 *  Rather than deleting this, it is commented out to (hopefully) help
35 *  the submitter send updates.
36 *
37 *  static char _sccsid[] = "@(#)ckinit.c 08/20/96     1.3\n";
38 */
39
40
41#include <stdlib.h>
42
43#include <rtems.h>
44#include <bsp.h>
45#include <bsp/irq.h>
46#include <rtems/clockdrv.h>
47
48extern uint32_t bsp_clicks_per_microsecond;
49
50#define EXT_INT1    0x800  /* external interrupt 5 */
51
52#include "clock.h"
53
54rtems_isr USC_isr(void *unused);
55
56void reset_wdt(void);
57void enable_wdi(void);
58void init_hbt(void);
59void enable_hbi(void);
60void disable_hbi(void);
61
62static void Clock_exit(void);
63rtems_isr Clock_isr(rtems_vector_number vector);
64rtems_isr User_Clock_isr(rtems_vector_number vector);
65void Install_clock(rtems_isr_entry clock_isr);
66
67
68/*
69 *  The interrupt vector number associated with the clock tick device
70 *  driver.
71 */
72
73#define CLOCK_VECTOR_MASK    EXT_INT1
74#define CLOCK_VECTOR         MIPS_INTERRUPT_BASE + 0x3
75
76/*
77 *  Clock_driver_ticks is a monotonically increasing counter of the
78 *  number of clock ticks since the driver was initialized.
79 */
80
81volatile uint32_t Clock_driver_ticks;
82
83/*
84 *  Clock_isrs is the number of clock ISRs until the next invocation of
85 *  the RTEMS clock tick routine.  The clock tick device driver
86 *  gets an interrupt once a millisecond and counts down until the
87 *  length of time between the user configured microseconds per tick
88 *  has passed.
89 */
90
91uint32_t Clock_isrs;              /* ISRs until next tick */
92
93/*
94 *  The previous ISR on this clock tick interrupt vector.
95 */
96
97rtems_isr_entry  Old_ticker;
98
99static uint32_t mips_timer_rate = 0;
100
101/*
102 *  Isr Handler
103 */
104
105rtems_isr Clock_isr(
106  rtems_vector_number vector
107)
108{
109/*
110 * bump the number of clock driver ticks since initialization
111 *
112 * determine if it is time to announce the passing of tick as configured
113 * to RTEMS through the rtems_clock_tick directive
114 *
115 * perform any timer dependent tasks
116 */
117
118  reset_wdt();    /* Reset hardware watchdog timer */
119
120  Clock_driver_ticks += 1;
121
122  rtems_clock_tick();
123}
124
125/* User callback shell (set from Clock_Control) */
126static void (*user_callback)(void);
127
128rtems_isr User_Clock_isr(
129  rtems_vector_number vector
130)
131{
132   if (user_callback)
133      user_callback();
134}
135
136/*
137 *  Install_clock
138 *
139 *  Install a clock tick handleR and reprograms the chip.  This
140 *  is used to initially establish the clock tick.
141 */
142
143void Install_clock(
144  rtems_isr_entry clock_isr
145)
146{
147  /*
148  *  Initialize the clock tick device driver variables
149  */
150
151  Clock_driver_ticks = 0;
152  Clock_isrs = rtems_configuration_get_milliseconds_per_tick();
153
154  mips_timer_rate = rtems_configuration_get_microseconds_per_tick() *
155           bsp_clicks_per_microsecond;
156
157  /*
158  *  Hardware specific initialize goes here
159  */
160
161  /* Set up USC heartbeat timer to generate interrupts */
162  disable_hbi();      /* Disable heartbeat interrupt in USC */
163
164  /* Install interrupt handler */
165  rtems_interrupt_handler_install( 
166    CLOCK_VECTOR,
167    "clock",
168    0,
169    USC_isr,
170    NULL
171  );
172
173  init_hbt();        /* Initialize heartbeat timer */
174
175  reset_wdt();      /* Reset watchdog timer */
176
177  enable_wdi();      /* Enable watchdog interrupt in USC */
178
179  enable_hbi();      /* Enable heartbeat interrupt in USC */
180
181              /* Enable USC interrupt in MIPS processor */
182  mips_enable_in_interrupt_mask(CLOCK_VECTOR_MASK);
183
184  /*
185  *  Schedule the clock cleanup routine to execute if the application exits.
186  */
187
188  atexit( Clock_exit );
189}
190
191/*
192 *  Clean up before the application exits
193 */
194
195void Clock_exit( void )
196{
197  /* mips: turn off the timer interrupts */
198  mips_disable_in_interrupt_mask(~CLOCK_VECTOR_MASK);
199}
200
201void _Clock_Initialize( void )
202{
203  Install_clock( Clock_isr );
204}
Note: See TracBrowser for help on using the repository browser.