source: rtems/c/src/lib/libbsp/m68k/mcf5225x/clock/clock.c @ fe32208

4.104.115
Last change on this file since fe32208 was fe32208, checked in by Joel Sherrill <joel.sherrill@…>, on 04/05/10 at 17:06:57

2010-04-05 Thomas Znidar <t.znidar@…>

  • ChangeLog?, Makefile.am, README, bsp_specs, configure.ac, gdb-init, preinstall.am, clock/clock.c, console/console.c, console/debugio.c, include/bsp.h, include/tm27.h, make/custom/mcf5225x.cfg, start/start.S, startup/bspclean.c, startup/bspstart.c, startup/init5225x.c, startup/linkcmds, timer/timer.c: New files.
  • Property mode set to 100644
File size: 2.4 KB
Line 
1/*
2 * Use the last periodic interval timer (PIT2) as the system clock.
3 *
4 *  $Id$
5 */
6
7#include <rtems.h>
8#include <bsp.h>
9
10/*
11 * Use INTC0 base
12 */
13#define CLOCK_VECTOR (64+56)
14
15static uint32_t s_pcntrAtTick = 0;
16static uint32_t s_nanoScale = 0;
17
18/*
19 * Provide nanosecond extension
20 * Interrupts are disabled when this is called
21 */
22static uint32_t bsp_clock_nanoseconds_since_last_tick(void)
23{
24    return MCF_PIT1_PCSR & MCF_PIT_PCSR_PIF ? (s_pcntrAtTick + (MCF_PIT1_PMR - MCF_PIT1_PCNTR)) * s_nanoScale : (s_pcntrAtTick - MCF_PIT1_PCNTR) * s_nanoScale;
25}
26
27#define Clock_driver_nanoseconds_since_last_tick bsp_clock_nanoseconds_since_last_tick
28
29/*
30 * Periodic interval timer interrupt handler
31 */
32#define Clock_driver_support_at_tick()             \
33    do {                                           \
34        s_pcntrAtTick = MCF_PIT1_PCNTR;            \
35        MCF_PIT1_PCSR |= MCF_PIT_PCSR_PIF;         \
36    } while (0)                                    \
37
38/*
39 * Attach clock interrupt handler
40 */
41#define Clock_driver_support_install_isr( _new, _old )             \
42    do {                                                           \
43        _old = (rtems_isr_entry)set_vector(_new, CLOCK_VECTOR, 1); \
44    } while(0)
45
46/*
47 * Turn off the clock
48 */
49static void Clock_driver_support_shutdown_hardware(void)
50{
51  MCF_PIT1_PCSR &= ~MCF_PIT_PCSR_EN;
52}
53
54/*
55 * Set up the clock hardware
56 *
57 * We need to have 1 interrupt every BSP_Configuration.microseconds_per_tick
58 */
59static void Clock_driver_support_initialize_hardware(void)
60{
61  int level;
62  uint32_t pmr;
63  uint32_t preScaleCode = 0;
64  uint32_t clk = bsp_get_CPU_clock_speed() >> 1;
65  uint32_t tps = 1000000 / Configuration.microseconds_per_tick;
66
67  while (preScaleCode < 15) {
68    pmr = (clk >> preScaleCode) / tps;
69    if (pmr < (1 << 15))
70      break;
71    preScaleCode++;
72  }
73  s_nanoScale = 1000000000 / (clk >> preScaleCode);
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  s_pcntrAtTick = MCF_PIT1_PCNTR;
88}
89
90#include "../../../shared/clockdrv_shell.h"
Note: See TracBrowser for help on using the repository browser.