source: rtems/bsps/shared/dev/clock/clockimpl.h @ 0288536

5
Last change on this file since 0288536 was 0288536, checked in by Sebastian Huber <sebastian.huber@…>, on 11/09/18 at 08:40:45

bsps: Include missing header files

Update #3598.

  • Property mode set to 100644
File size: 5.4 KB
RevLine 
[0c0181d]1/**
[98eb7e78]2 * @file
[b7f2060]3 *
[98eb7e78]4 * @ingroup bsp_clock
5 *
6 * @brief Clock Tick Device Driver Shell
[0c0181d]7 */
8
9/*
[3532ff91]10 *  COPYRIGHT (c) 1989-2014.
[b94554f]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
[c499856]15 *  http://www.rtems.org/license/LICENSE.
[b94554f]16 */
17
18#include <stdlib.h>
19
20#include <bsp.h>
[3532ff91]21#include <rtems/clockdrv.h>
[48fed9a]22#include <rtems/score/percpu.h>
[90d8567]23#include <rtems/score/smpimpl.h>
[0288536]24#include <rtems/score/timecounter.h>
25#include <rtems/score/thread.h>
[b61d5cac]26#include <rtems/score/watchdogimpl.h>
[b94554f]27
[75acd9e]28#ifdef Clock_driver_nanoseconds_since_last_tick
29#error "Update driver to use the timecounter instead of nanoseconds extension"
30#endif
31
[98eb7e78]32/**
33 * @defgroup bsp_clock Clock Support
34 *
[296c74e6]35 * @ingroup bsp_shared
[98eb7e78]36 *
37 * @brief Clock support
38 *
39 */
[b7f2060]40#if CLOCK_DRIVER_USE_FAST_IDLE && CLOCK_DRIVER_ISRS_PER_TICK
[7632906]41#error "Fast Idle PLUS n ISRs per tick is not supported"
[b94554f]42#endif
43
[f3b29236]44/**
45 * @brief Do nothing by default.
46 */
47#ifndef Clock_driver_support_install_isr
48  #define Clock_driver_support_install_isr(isr)
49#endif
50
[98eb7e78]51/**
52 * @brief This method is rarely used so default it.
[b94554f]53 */
54#ifndef Clock_driver_support_find_timer
[f1e8903]55  #define Clock_driver_support_find_timer()
[b94554f]56#endif
57
[76ac1ee3]58/**
59 * @brief Do nothing by default.
60 */
61#ifndef Clock_driver_support_at_tick
62  #define Clock_driver_support_at_tick()
63#endif
64
[90d8567]65/**
66 * @brief Do nothing by default.
67 */
68#ifndef Clock_driver_support_set_interrupt_affinity
69  #define Clock_driver_support_set_interrupt_affinity(online_processors)
70#endif
71
[75acd9e]72/*
73 * A specialized clock driver may use for example rtems_timecounter_tick_simple()
74 * instead of the default.
75 */
76#ifndef Clock_driver_timecounter_tick
[b61d5cac]77static void Clock_driver_timecounter_tick( void )
78{
79#if defined(CLOCK_DRIVER_USE_DUMMY_TIMECOUNTER)
80  rtems_clock_tick();
81#elif defined(RTEMS_SMP) && defined(CLOCK_DRIVER_USE_ONLY_BOOT_PROCESSOR)
82  uint32_t cpu_count = _SMP_Get_processor_count();
83  uint32_t cpu_index;
84
85  for ( cpu_index = 0 ; cpu_index < cpu_count ; ++cpu_index ) {
86    Per_CPU_Control *cpu;
87
88    cpu = _Per_CPU_Get_by_index( cpu_index );
89
90    if ( _Per_CPU_Is_boot_processor( cpu ) ) {
91      rtems_timecounter_tick();
[76d1198]92    } else if ( _Processor_mask_Is_set( _SMP_Get_online_processors(), cpu_index ) ) {
[b61d5cac]93      _Watchdog_Tick( cpu );
94    }
95  }
96#else
97  rtems_timecounter_tick();
98#endif
99}
[75acd9e]100#endif
101
[98eb7e78]102/**
103 * @brief ISRs until next clock tick
[b94554f]104 */
[d473dc0]105#if CLOCK_DRIVER_ISRS_PER_TICK
[f1e8903]106  volatile uint32_t  Clock_driver_isrs;
[b94554f]107#endif
108
[98eb7e78]109/**
110 * @brief Clock ticks since initialization
[b94554f]111 */
[6083017]112volatile uint32_t    Clock_driver_ticks;
[b94554f]113
[30be024a]114#ifdef Clock_driver_support_shutdown_hardware
[7ee59313]115#error "Clock_driver_support_shutdown_hardware() is no longer supported"
[30be024a]116#endif
[b94554f]117
[98eb7e78]118/**
119 *  @brief Clock_isr
[b94554f]120 *
121 *  This is the clock tick interrupt handler.
122 *
[98eb7e78]123 *  @param vector Vector number.
[b94554f]124 */
[314fab55]125#if defined(BSP_FEATURE_IRQ_EXTENSION) || \
126    (CPU_SIMPLE_VECTORED_INTERRUPTS != TRUE)
[56c6888]127void Clock_isr(void *arg);
[37f938d7]128void Clock_isr(void *arg)
[0c0181d]129{
[b7f2060]130#else
[0c0181d]131rtems_isr Clock_isr(rtems_vector_number vector);
[b94554f]132rtems_isr Clock_isr(
133  rtems_vector_number vector
134)
135{
[0c0181d]136#endif
[b94554f]137  /*
138   *  Accurate count of ISRs
139   */
140  Clock_driver_ticks += 1;
141
[b7f2060]142  #if CLOCK_DRIVER_USE_FAST_IDLE
[75acd9e]143    {
144      struct timecounter *tc = _Timecounter;
145      uint64_t us_per_tick = rtems_configuration_get_microseconds_per_tick();
146      uint32_t interval = (uint32_t)
147        ((tc->tc_frequency * us_per_tick) / 1000000);
148
149      Clock_driver_timecounter_tick();
150
[729cf694]151      if (!rtems_configuration_is_smp_enabled()) {
152        while (
[1f5bee3]153          _Thread_Heir == _Thread_Executing && _Thread_Executing->is_idle
[729cf694]154        ) {
155          ISR_lock_Context lock_context;
156
157          _Timecounter_Acquire(&lock_context);
158          _Timecounter_Tick_simple(
159            interval,
160            (*tc->tc_get_timecount)(tc),
161            &lock_context
162          );
163        }
[75acd9e]164      }
[f1e8903]165
[75acd9e]166      Clock_driver_support_at_tick();
167    }
[f1e8903]168  #else
169    /*
170     *  Do the hardware specific per-tick action.
171     *
172     *  The counter/timer may or may not be set to automatically reload.
173     */
174    Clock_driver_support_at_tick();
175
[b7f2060]176    #if CLOCK_DRIVER_ISRS_PER_TICK
[f1e8903]177      /*
178       *  The driver is multiple ISRs per clock tick.
179       */
180      if ( !Clock_driver_isrs ) {
[75acd9e]181        Clock_driver_timecounter_tick();
[f1e8903]182
183        Clock_driver_isrs = CLOCK_DRIVER_ISRS_PER_TICK;
184      }
185      Clock_driver_isrs--;
186    #else
187      /*
188       *  The driver is one ISR per clock tick.
189       */
[75acd9e]190      Clock_driver_timecounter_tick();
[f1e8903]191    #endif
192  #endif
[b94554f]193}
194
[98eb7e78]195/**
196 * @brief Clock_initialize
[b94554f]197 *
[98eb7e78]198 * This routine initializes the clock driver.
[b94554f]199 *
[98eb7e78]200 * @param[in] major Clock device major number.
201 * @param[in] minor Clock device minor number.
202 * @param[in] parg  Pointer to optional device driver arguments
[b94554f]203 *
[98eb7e78]204 * @retval rtems_device_driver status code
[b94554f]205 */
206rtems_device_driver Clock_initialize(
207  rtems_device_major_number major,
208  rtems_device_minor_number minor,
209  void *pargp
210)
211{
[6083017]212  Clock_driver_ticks = 0;
213
214  /*
215   *  Find timer -- some BSPs search buses for hardware timer
216   */
217  Clock_driver_support_find_timer();
218
219  /*
220   *  Install vector
221   */
[f3b29236]222  Clock_driver_support_install_isr( Clock_isr );
[6083017]223
[90d8567]224  #ifdef RTEMS_SMP
[76d1198]225    Clock_driver_support_set_interrupt_affinity(
226      _SMP_Get_online_processors()
227    );
[90d8567]228  #endif
229
[6083017]230  /*
231   *  Now initialize the hardware that is the source of the tick ISR.
232   */
233  Clock_driver_support_initialize_hardware();
234
[b94554f]235  /*
236   *  If we are counting ISRs per tick, then initialize the counter.
237   */
[b7f2060]238  #if CLOCK_DRIVER_ISRS_PER_TICK
[3109857c]239    Clock_driver_isrs = CLOCK_DRIVER_ISRS_PER_TICK_VALUE;
[f1e8903]240  #endif
[b94554f]241
242  return RTEMS_SUCCESSFUL;
243}
Note: See TracBrowser for help on using the repository browser.