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

Last change on this file was 7ee59313, checked in by Sebastian Huber <sebastian.huber@…>, on Jun 1, 2018 at 5:11:12 AM

Remove Clock_driver_support_shutdown_hardware()

The aim of this clock driver hook was to stop clock tick interrupts at
some late point in the exit() procedure.

The use of atexit() pulls in malloc() which pulls in errno. It is
incompatible with the intention of the
CONFIGURE_DISABLE_NEWLIB_REENTRANCY configuration option.

The exit() function must be called from thread context, so accompanied
clock tick interrupts should cause no harm. On the contrary, someone
may assume a normal operating system operation, e.g. working timeouts.

Remove the Clock_driver_support_shutdown_hardware() clock driver hook.

Close #3436.

  • 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() mcf52235_tc_tick()
97
98#include "../../../shared/dev/clock/clockimpl.h"
Note: See TracBrowser for help on using the repository browser.