summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/m68k/uC5282/clock/clock.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--c/src/lib/libbsp/m68k/uC5282/clock/clock.c68
1 files changed, 68 insertions, 0 deletions
diff --git a/c/src/lib/libbsp/m68k/uC5282/clock/clock.c b/c/src/lib/libbsp/m68k/uC5282/clock/clock.c
new file mode 100644
index 0000000000..8b10dbfd28
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/uC5282/clock/clock.c
@@ -0,0 +1,68 @@
+/*
+ * Use the last periodic interval timer (PIT3) as the system clock.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include <bsp.h>
+#include <mcf5282/mcf5282.h>
+
+/*
+ * Use INTC0 base
+ */
+#define CLOCK_VECTOR (64+58)
+
+/*
+ * Periodic interval timer interrupt handler
+ */
+#define Clock_driver_support_at_tick() \
+ do { \
+ MCF5282_PIT3_PCSR |= MCF5282_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
+ */
+#define Clock_driver_support_shutdown_hardware() \
+ do { \
+ MCF5282_PIT3_PCSR &= ~MCF5282_PIT_PCSR_EN; \
+ } while(0)
+
+/*
+ * Set up the clock hardware
+ *
+ * Prescale so that it counts in microseconds
+ * System clock frequency better be 2**n (1<=n<=16) MHz!
+ */
+#define Clock_driver_support_initialize_hardware() \
+ do { \
+ int level; \
+ int preScaleCode = -2; \
+ int preScaleDivisor = get_CPU_clock_speed() / 1000000; \
+ while (preScaleDivisor) { \
+ preScaleDivisor >>= 1; \
+ preScaleCode++; \
+ } \
+ MCF5282_INTC0_ICR58 = MCF5282_INTC_ICR_IL(PIT3_IRQ_LEVEL) | \
+ MCF5282_INTC_ICR_IP(PIT3_IRQ_PRIORITY); \
+ rtems_interrupt_disable( level ); \
+ MCF5282_INTC0_IMRH &= ~MCF5282_INTC_IMRH_INT58; \
+ MCF5282_PIT3_PCSR &= ~MCF5282_PIT_PCSR_EN; \
+ rtems_interrupt_enable( level ); \
+ MCF5282_PIT3_PMR = BSP_Configuration.microseconds_per_tick - 1; \
+ MCF5282_PIT3_PCSR = MCF5282_PIT_PCSR_PRE(preScaleCode) | \
+ MCF5282_PIT_PCSR_PIE | \
+ MCF5282_PIT_PCSR_RLD | \
+ MCF5282_PIT_PCSR_EN; \
+ } while (0)
+
+#include "../../../shared/clockdrv_shell.c"