summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/m68k/mcf5329/clock/clock.c
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>2008-06-20 14:58:34 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>2008-06-20 14:58:34 +0000
commit6b56ec3327a541aa711116d8bb37e22ede976dd6 (patch)
tree4a2655f3db869a052e17923f76ee3207c7b7f7d6 /c/src/lib/libbsp/m68k/mcf5329/clock/clock.c
parent2008-06-19 Matthew Riek <matthew.riek@ibiscomputer.com.au> (diff)
downloadrtems-6b56ec3327a541aa711116d8bb37e22ede976dd6.tar.bz2
2008-06-20 Matthew Riek <matthew.riek@ibiscomputer.com.au>
* ChangeLog, Makefile.am, README, bsp_specs, configure.ac, gdb-init, preinstall.am, clock/clock.c, console/console.c, include/bsp.h, include/bspopts.h.in, include/coverhd.h, include/tm27.h, network/network.c, start/start.S, startup/bspclean.c, startup/bspstart.c, startup/cfinit.c, startup/init5329.c, startup/linkcmds, startup/linkcmdsflash, timer/timer.c: New files.
Diffstat (limited to 'c/src/lib/libbsp/m68k/mcf5329/clock/clock.c')
-rw-r--r--c/src/lib/libbsp/m68k/mcf5329/clock/clock.c98
1 files changed, 98 insertions, 0 deletions
diff --git a/c/src/lib/libbsp/m68k/mcf5329/clock/clock.c b/c/src/lib/libbsp/m68k/mcf5329/clock/clock.c
new file mode 100644
index 0000000000..ecb1c7e875
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mcf5329/clock/clock.c
@@ -0,0 +1,98 @@
+
+/*
+ * Use the last periodic interval timer (PIT2) as the system clock.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include <bsp.h>
+
+/*
+ * Use INTC1 base
+ */
+#define CLOCK_VECTOR (128+46)
+
+static uint32_t s_pcntrAtTick = 0;
+static uint32_t s_nanoScale = 0;
+
+/*
+ * Provide nanosecond extension
+ */
+static uint32_t bsp_clock_nanoseconds_since_last_tick(void)
+{
+ uint32_t i;
+
+ if (MCF_PIT3_PCSR & MCF_PIT_PCSR_PIF) {
+ i = s_pcntrAtTick + (MCF_PIT3_PMR - MCF_PIT3_PCNTR);
+ } else {
+ i = s_pcntrAtTick - MCF_PIT3_PCNTR;
+ }
+ return i * s_nanoScale;
+}
+
+#define Clock_driver_nanoseconds_since_last_tick bsp_clock_nanoseconds_since_last_tick
+
+/*
+ * Periodic interval timer interrupt handler
+ */
+#define Clock_driver_support_at_tick() \
+ do { \
+ s_pcntrAtTick = MCF_PIT3_PCNTR; \
+ MCF_PIT3_PCSR |= MCF_PIT_PCSR_PIF; \
+ } while (0) \
+
+
+/*
+ * Attach clock interrupt handler
+ */
+#define Clock_driver_support_install_isr( _new, _old ) \
+ do { \
+ _old = (rtems_isr_entry)set_vector(_new, CLOCK_VECTOR, 1); \
+ } while(0)
+
+/*
+ * Turn off the clock
+ */
+static void Clock_driver_support_shutdown_hardware()
+{
+ MCF_PIT3_PCSR &= ~MCF_PIT_PCSR_EN;
+}
+
+/*
+ * Set up the clock hardware
+ *
+ * We need to have 1 interrupt every BSP_Configuration.microseconds_per_tick
+ */
+static void Clock_driver_support_initialize_hardware()
+{
+ int level;
+ uint32_t pmr;
+ uint32_t preScaleCode = 0;
+ uint32_t clk = bsp_get_BUS_clock_speed();
+ uint32_t tps = 1000000 / Configuration.microseconds_per_tick;
+
+ while (preScaleCode < 15) {
+ pmr = (clk >> preScaleCode) / tps;
+ if (pmr < (1 << 15))
+ break;
+ preScaleCode++;
+ }
+ s_nanoScale = 1000000000 / (clk >> preScaleCode);
+
+ MCF_INTC1_ICR46 = MCF_INTC_ICR_IL(PIT3_IRQ_LEVEL);
+
+ rtems_interrupt_disable(level);
+ MCF_INTC1_IMRH &= ~MCF_INTC_IMRH_INT_MASK46;
+ MCF_PIT3_PCSR &= ~MCF_PIT_PCSR_EN;
+ rtems_interrupt_enable(level);
+
+ MCF_PIT3_PCSR = MCF_PIT_PCSR_PRE(preScaleCode) |
+ MCF_PIT_PCSR_OVW | MCF_PIT_PCSR_PIE | MCF_PIT_PCSR_RLD;
+ MCF_PIT3_PMR = pmr;
+ MCF_PIT3_PCSR = MCF_PIT_PCSR_PRE(preScaleCode) |
+ MCF_PIT_PCSR_PIE | MCF_PIT_PCSR_RLD | MCF_PIT_PCSR_EN;
+ s_pcntrAtTick = MCF_PIT3_PCNTR;
+}
+
+#include "../../../shared/clockdrv_shell.c"