source: rtems/bsps/m68k/mcf52235/clock/clock.c

Last change on this file was 1eed6f8, checked in by Sebastian Huber <sebastian.huber@…>, on 03/23/23 at 15:53:30

bsps: Avoid unused argument in clock interrupt

Pass the parameter of the clock interrupt handler to
Clock_driver_support_at_tick() and Clock_driver_timecounter_tick(). This makes
it possible to use the interrupt handler argument in clock drivers.

Use the interrupt handler provided by Clock_driver_support_install_isr() to
avoid local delarations of Clock_isr().

Update #4862.

  • Property mode set to 100644
File size: 2.2 KB
Line 
1/*
2 * Use the last periodic interval timer (PIT2) as the system clock.
3 */
4
5#include <rtems.h>
6#include <rtems/timecounter.h>
7#include <bsp.h>
8
9/*
10 * Use INTC0 base
11 */
12#define CLOCK_VECTOR (64+56)
13
14static rtems_timecounter_simple mcf52235_tc;
15
16static uint32_t mcf52235_tc_get(rtems_timecounter_simple *tc)
17{
18  return MCF_PIT1_PCNTR;
19}
20
21static bool mcf52235_tc_is_pending(rtems_timecounter_simple *tc)
22{
23  return (MCF_PIT1_PCSR & MCF_PIT_PCSR_PIF) != 0;
24}
25
26static uint32_t mcf52235_tc_get_timecount(struct timecounter *tc)
27{
28  return rtems_timecounter_simple_downcounter_get(
29    tc,
30    mcf52235_tc_get,
31    mcf52235_tc_is_pending
32  );
33}
34
35static void mcf52235_tc_at_tick(rtems_timecounter_simple *tc)
36{
37  MCF_PIT1_PCSR |= MCF_PIT_PCSR_PIF;
38}
39
40static void mcf52235_tc_tick(void)
41{
42  rtems_timecounter_simple_downcounter_tick(
43    &mcf52235_tc,
44    mcf52235_tc_get,
45    mcf52235_tc_at_tick
46  );
47}
48
49/*
50 * Attach clock interrupt handler
51 */
52#define Clock_driver_support_install_isr( _new ) \
53  set_vector(_new, CLOCK_VECTOR, 1)
54
55/*
56 * Set up the clock hardware
57 *
58 * We need to have 1 interrupt every rtems_configuration_get_microseconds_per_tick()
59 */
60static void Clock_driver_support_initialize_hardware(void)
61{
62  int level;
63  uint32_t pmr;
64  uint32_t preScaleCode = 0;
65  uint32_t clk = bsp_get_CPU_clock_speed() >> 1;
66  uint32_t tps = 1000000 / rtems_configuration_get_microseconds_per_tick();
67
68  while (preScaleCode < 15) {
69    pmr = (clk >> preScaleCode) / tps;
70    if (pmr < (1 << 15))
71      break;
72    preScaleCode++;
73  }
74
75  MCF_INTC0_ICR56 = MCF_INTC_ICR_IL(PIT3_IRQ_LEVEL) |
76    MCF_INTC_ICR_IP(PIT3_IRQ_PRIORITY);
77  rtems_interrupt_disable(level);
78  MCF_INTC0_IMRH &= ~MCF_INTC_IMRH_MASK56;
79  MCF_PIT1_PCSR &= ~MCF_PIT_PCSR_EN;
80  rtems_interrupt_enable(level);
81
82  MCF_PIT1_PCSR = MCF_PIT_PCSR_PRE(preScaleCode) |
83    MCF_PIT_PCSR_OVW | MCF_PIT_PCSR_PIE | MCF_PIT_PCSR_RLD;
84  MCF_PIT1_PMR = pmr;
85  MCF_PIT1_PCSR = MCF_PIT_PCSR_PRE(preScaleCode) |
86    MCF_PIT_PCSR_PIE | MCF_PIT_PCSR_RLD | MCF_PIT_PCSR_EN;
87
88  rtems_timecounter_simple_install(
89    &mcf52235_tc,
90    clk >> preScaleCode,
91    pmr,
92    mcf52235_tc_get_timecount
93  );
94}
95
96#define Clock_driver_timecounter_tick(arg) mcf52235_tc_tick()
97
98#include "../../../shared/dev/clock/clockimpl.h"
Note: See TracBrowser for help on using the repository browser.