summaryrefslogtreecommitdiffstats
path: root/c/src
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>2000-10-18 18:33:47 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>2000-10-18 18:33:47 +0000
commitf2442183383a7ad70f2a6bc5e8f25e200fa0f54a (patch)
tree3c8ffe7a34dd86363dca28e7f7b810badf65b5ef /c/src
parent2000-10-18 Sergei Organov <osv@javad.ru> (diff)
downloadrtems-f2442183383a7ad70f2a6bc5e8f25e200fa0f54a.tar.bz2
2000-10-18 Sergei Organov <osv@javad.ru>
* Added full support for MPC505. * mpc505/ictrl: New directory. * configure.in, mpc505/Makefile.am: Modified to reflect ictrl addition. * mpc505/ictrl/.cvsignore, mpc505/ictrl/Makefile.am, mpc505/ictrl/ictrl.c, mpc505/ictrl/ictrl.h: New files. * mpc505/timer/timer.c: Use <rtems.h>, not "rtems.h". * mpc505/vectors/Makefile.am: alignment exception handler now included. * mpc505/vectors/vectors.S: Now use constants for exception numbers. * old_exception_processing/ppc_offs.h: New file. * old_exception_processing/Makefile.am: Account for ppc_offs.h. * old_exception_processing/cpu.h: Make Nest and Disable levels volatile. * old_exception_processing/cpu_asm.S: Offsets moved to ppc_offs.h.
Diffstat (limited to 'c/src')
-rw-r--r--c/src/lib/libcpu/powerpc/mpc505/ictrl/.cvsignore2
-rw-r--r--c/src/lib/libcpu/powerpc/mpc505/ictrl/Makefile.am39
-rw-r--r--c/src/lib/libcpu/powerpc/mpc505/ictrl/ictrl.c68
-rw-r--r--c/src/lib/libcpu/powerpc/mpc505/ictrl/ictrl.h75
4 files changed, 184 insertions, 0 deletions
diff --git a/c/src/lib/libcpu/powerpc/mpc505/ictrl/.cvsignore b/c/src/lib/libcpu/powerpc/mpc505/ictrl/.cvsignore
new file mode 100644
index 0000000000..282522db03
--- /dev/null
+++ b/c/src/lib/libcpu/powerpc/mpc505/ictrl/.cvsignore
@@ -0,0 +1,2 @@
+Makefile
+Makefile.in
diff --git a/c/src/lib/libcpu/powerpc/mpc505/ictrl/Makefile.am b/c/src/lib/libcpu/powerpc/mpc505/ictrl/Makefile.am
new file mode 100644
index 0000000000..2c60b11cc9
--- /dev/null
+++ b/c/src/lib/libcpu/powerpc/mpc505/ictrl/Makefile.am
@@ -0,0 +1,39 @@
+##
+## $Id$
+##
+
+AUTOMAKE_OPTIONS = foreign 1.4
+
+PGM = $(ARCH)/ictrl.rel
+
+C_FILES = ictrl.c
+
+H_FILES = ictrl.h
+
+ictrl_rel_OBJECTS = $(C_FILES:%.c=$(ARCH)/%.o)
+
+include $(RTEMS_ROOT)/make/custom/@RTEMS_BSP@.cfg
+include $(top_srcdir)/../../../../../automake/compile.am
+include $(top_srcdir)/../../../../../automake/lib.am
+
+$(PROJECT_INCLUDE):
+ $(mkinstalldirs) $@
+$(PROJECT_INCLUDE)/%.h: %.h
+ $(INSTALL_DATA) $< $@
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+$(PGM): $(ictrl_rel_OBJECTS)
+ $(make-rel)
+
+TMPINSTALL_FILES += $(PROJECT_INCLUDE) $(PROJECT_INCLUDE)/ictrl.h
+
+all-local: $(ARCH) $(ictrl_rel_OBJECTS) $(PGM) $(TMPINSTALL_FILES)
+
+.PRECIOUS: $(PGM)
+
+EXTRA_DIST = ictrl.c ictrl.h
+
+include $(top_srcdir)/../../../../../automake/local.am
diff --git a/c/src/lib/libcpu/powerpc/mpc505/ictrl/ictrl.c b/c/src/lib/libcpu/powerpc/mpc505/ictrl/ictrl.c
new file mode 100644
index 0000000000..9590e5ba1a
--- /dev/null
+++ b/c/src/lib/libcpu/powerpc/mpc505/ictrl/ictrl.c
@@ -0,0 +1,68 @@
+/*
+ * mpc505/509 external interrupt controller management.
+ */
+
+#include "ictrl.h"
+
+#include <rtems.h>
+#include <rtems/score/ppc.h>
+
+/*
+ * Internal routines.
+ */
+
+static unsigned long volatile *const IRQAND =
+ (unsigned long volatile *const)0x8007EFA4;
+
+static void nullHandler()
+{
+}
+
+/* Interrupt dispatch table. */
+static ExtIsrHandler extIrqHandlers[NUM_IRQS] =
+{
+ nullHandler,
+ nullHandler,
+ nullHandler,
+ nullHandler,
+ nullHandler,
+ nullHandler,
+ nullHandler
+};
+
+
+/* RTEMS external interrupt handler. Calls installed external interrupt
+ handlers for every pending external interrupt in turn. */
+static rtems_isr extIsr_( rtems_vector_number i )
+{
+#define BIT_NUMBER(val, bit) \
+ asm volatile ( "cntlzw %0, %1; srawi %0, %0, 1": "=r" (bit) : "r" (val) );
+
+ int bit;
+ (void)i;
+
+ BIT_NUMBER(*IRQAND & IMASK_ALL, bit);
+ while ( bit < NUM_IRQS ) {
+ extIrqHandlers[bit]();
+ BIT_NUMBER(*IRQAND & IMASK_ALL, bit);
+ }
+}
+
+/*
+ * Public routines
+ */
+
+void extIrqSetHandler(ExtInt interrupt,ExtIsrHandler handler)
+{
+ extIrqHandlers[interrupt] = handler;
+}
+
+void extIsrInit( void )
+{
+ int i = 0;
+
+ extIrqDisable(IMASK_ALL);
+ for( i = 0; i < NUM_IRQS; i++)
+ extIrqHandlers[i] = nullHandler;
+ set_vector(extIsr_,PPC_IRQ_EXTERNAL,1);
+}
diff --git a/c/src/lib/libcpu/powerpc/mpc505/ictrl/ictrl.h b/c/src/lib/libcpu/powerpc/mpc505/ictrl/ictrl.h
new file mode 100644
index 0000000000..303ece825d
--- /dev/null
+++ b/c/src/lib/libcpu/powerpc/mpc505/ictrl/ictrl.h
@@ -0,0 +1,75 @@
+#ifndef _ICTRL_H
+#define _ICTRL_H
+
+/*
+ * mpc505/509 external interrupt controller management.
+ *
+ * FIXME: should be somehow merged into general RTEMS interrupt
+ * management code.
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define _SIU_IRQENABLE ((unsigned long volatile *const)0x8007EFA8)
+#define _SIU_IRQPEND ((unsigned long volatile *const)0x8007EFA0)
+
+/* Interrupt masks. */
+enum {
+ IMASK_EXT0 = 0x80000000,
+ IMASK_EXT1 = 0x20000000,
+ IMASK_EXT2 = 0x08000000,
+ IMASK_EXT3 = 0x02000000,
+ IMASK_EXT4 = 0x00800000,
+ IMASK_EXT5 = 0x00200000,
+ IMASK_EXT6 = 0x00080000,
+ IMASK_ALL = IMASK_EXT0 | IMASK_EXT1 | IMASK_EXT2 | IMASK_EXT3 |
+ IMASK_EXT4 | IMASK_EXT5 | IMASK_EXT6
+};
+
+/* Interrupt numbers. */
+typedef enum {
+ IRQ_EXT0,
+ IRQ_EXT1,
+ IRQ_EXT2,
+ IRQ_EXT3,
+ IRQ_EXT4,
+ IRQ_EXT5,
+ IRQ_EXT6,
+ NUM_IRQS
+} ExtInt;
+
+/* Type of external interrupt handlers */
+typedef void (*ExtIsrHandler) (void);
+
+/* Initialization. Must be called once after RTEMS interrupts sybsystem
+ is initiailized. 'predriver_hook' is one of such places. */
+extern void extIsrInit( void );
+
+/* Set interrupt handler 'handler' for external interrupt number
+ 'interrupt'. */
+extern void extIrqSetHandler(ExtInt interrupt, ExtIsrHandler handler);
+
+/* Check is external interrupt 'irq' (IMASK_XXXX) is pended. */
+#define extIrqIsSet(irq) \
+ (*_SIU_IRQPEND & (irq))
+
+/* Enable external interrupt 'irq' (IMASK_XXXX) processing. */
+#define extIrqEnable(irq) \
+ (*_SIU_IRQENABLE |= (irq))
+
+/* Disable external interrupt 'irq' (IMASK_XXXX) processing. */
+#define extIrqDisable(irq) \
+ (*_SIU_IRQENABLE &= ~(irq))
+
+/* Check if external interrupt 'irq' (IMASK_XXXX) processing is
+ enabled. */
+#define extIrqGetEnable \
+ (*_SIU_IRQENABLE)
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _ICTRL_H */