summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2013-12-05 17:26:41 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2013-12-16 15:15:42 +0100
commit8d2920119b6e14691fc978d8fccd7b0900dcb23f (patch)
tree342931096319ddd2c7bd23b0a0cdb9d8fdbbc3a9
parentbsp/genmcf548x: Add interrupt extension support (diff)
downloadrtems-8d2920119b6e14691fc978d8fccd7b0900dcb23f.tar.bz2
bsp/genmcf548x: Add initial values for INTC_ICRn
According to the manual the application must use unique and non-overlapping level and priority definitions for enabled interrupts.
-rw-r--r--c/src/lib/libbsp/m68k/genmcf548x/Makefile.am1
-rw-r--r--c/src/lib/libbsp/m68k/genmcf548x/clock/clock.c2
-rw-r--r--c/src/lib/libbsp/m68k/genmcf548x/console/console.c8
-rw-r--r--c/src/lib/libbsp/m68k/genmcf548x/include/bsp.h20
-rw-r--r--c/src/lib/libbsp/m68k/genmcf548x/irq/intc-icr-init-values.c29
-rw-r--r--c/src/lib/libbsp/m68k/genmcf548x/network/network.c4
-rw-r--r--c/src/lib/libbsp/m68k/genmcf548x/startup/init548x.c10
7 files changed, 41 insertions, 33 deletions
diff --git a/c/src/lib/libbsp/m68k/genmcf548x/Makefile.am b/c/src/lib/libbsp/m68k/genmcf548x/Makefile.am
index 64e768210c..8350d8006e 100644
--- a/c/src/lib/libbsp/m68k/genmcf548x/Makefile.am
+++ b/c/src/lib/libbsp/m68k/genmcf548x/Makefile.am
@@ -55,6 +55,7 @@ libbsp_a_SOURCES += ../../shared/src/irq-legacy.c
libbsp_a_SOURCES += ../../shared/src/irq-server.c
libbsp_a_SOURCES += ../../shared/src/irq-shell.c
libbsp_a_SOURCES += irq/irq.c
+libbsp_a_SOURCES += irq/intc-icr-init-values.c
if HAS_NETWORKING
network_CPPFLAGS = -D__INSIDE_RTEMS_BSD_TCPIP_STACK__
diff --git a/c/src/lib/libbsp/m68k/genmcf548x/clock/clock.c b/c/src/lib/libbsp/m68k/genmcf548x/clock/clock.c
index a563169de7..eda0a9c9fc 100644
--- a/c/src/lib/libbsp/m68k/genmcf548x/clock/clock.c
+++ b/c/src/lib/libbsp/m68k/genmcf548x/clock/clock.c
@@ -90,8 +90,6 @@
#define Clock_driver_support_initialize_hardware() \
do { \
int level; \
- MCF548X_INTC_ICR54 = MCF548X_INTC_ICRn_IL(SLT0_IRQ_LEVEL) | \
- MCF548X_INTC_ICRn_IP(SLT0_IRQ_PRIORITY); \
rtems_interrupt_disable( level ); \
MCF548X_INTC_IMRH &= ~(MCF548X_INTC_IMRH_INT_MASK54); \
rtems_interrupt_enable( level ); \
diff --git a/c/src/lib/libbsp/m68k/genmcf548x/console/console.c b/c/src/lib/libbsp/m68k/genmcf548x/console/console.c
index 5e85e208b9..3c8b28cdb6 100644
--- a/c/src/lib/libbsp/m68k/genmcf548x/console/console.c
+++ b/c/src/lib/libbsp/m68k/genmcf548x/console/console.c
@@ -487,26 +487,18 @@ IntUartInitialize(void)
rtems_interrupt_disable(level);
switch(chan) {
case 0:
- MCF548X_INTC_ICR35 = MCF548X_INTC_ICRn_IL(PSC0_IRQ_LEVEL) |
- MCF548X_INTC_ICRn_IP(PSC0_IRQ_PRIORITY);
MCF548X_INTC_IMRH &= ~(MCF548X_INTC_IMRH_INT_MASK35);
break;
case 1:
- MCF548X_INTC_ICR34 = MCF548X_INTC_ICRn_IL(PSC1_IRQ_LEVEL) |
- MCF548X_INTC_ICRn_IP(PSC1_IRQ_PRIORITY);
MCF548X_INTC_IMRH &= ~(MCF548X_INTC_IMRH_INT_MASK34);
break;
case 2:
- MCF548X_INTC_ICR33 = MCF548X_INTC_ICRn_IL(PSC2_IRQ_LEVEL) |
- MCF548X_INTC_ICRn_IP(PSC2_IRQ_PRIORITY);
MCF548X_INTC_IMRH &= ~(MCF548X_INTC_IMRH_INT_MASK33);
break;
case 3:
- MCF548X_INTC_ICR32 = MCF548X_INTC_ICRn_IL(PSC3_IRQ_LEVEL) |
- MCF548X_INTC_ICRn_IP(PSC3_IRQ_PRIORITY);
MCF548X_INTC_IMRH &= ~(MCF548X_INTC_IMRH_INT_MASK32);
break;
}
diff --git a/c/src/lib/libbsp/m68k/genmcf548x/include/bsp.h b/c/src/lib/libbsp/m68k/genmcf548x/include/bsp.h
index 9f16d9d54f..5d8ba6f6a6 100644
--- a/c/src/lib/libbsp/m68k/genmcf548x/include/bsp.h
+++ b/c/src/lib/libbsp/m68k/genmcf548x/include/bsp.h
@@ -86,24 +86,8 @@ rtems_isr_entry set_vector(
int type
);
-/*
- * Interrupt assignments
- * Highest-priority listed first
- */
-#define SLT0_IRQ_LEVEL 4
-#define SLT0_IRQ_PRIORITY 0
-
-#define PSC0_IRQ_LEVEL 3
-#define PSC0_IRQ_PRIORITY 7
-#define PSC1_IRQ_LEVEL 3
-#define PSC1_IRQ_PRIORITY 6
-#define PSC2_IRQ_LEVEL 3
-#define PSC2_IRQ_PRIORITY 5
-#define PSC3_IRQ_LEVEL 3
-#define PSC3_IRQ_PRIORITY 4
-
-#define FEC_IRQ_LEVEL 2
-#define FEC_IRQ_PRIORITY 3
+/* Initial values for the interrupt level and priority registers (INTC_ICRn) */
+extern const uint8_t mcf548x_intc_icr_init_values[64];
/*
* Network driver configuration
diff --git a/c/src/lib/libbsp/m68k/genmcf548x/irq/intc-icr-init-values.c b/c/src/lib/libbsp/m68k/genmcf548x/irq/intc-icr-init-values.c
new file mode 100644
index 0000000000..4c4ef65a20
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/genmcf548x/irq/intc-icr-init-values.c
@@ -0,0 +1,29 @@
+/*
+ * Copyright (c) 2013 embedded brains GmbH. All rights reserved.
+ *
+ * embedded brains GmbH
+ * Dornierstr. 4
+ * 82178 Puchheim
+ * Germany
+ * <rtems@embedded-brains.de>
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ */
+
+#include <bsp.h>
+#include <bsp/irq.h>
+
+#define ICR(lvl, prio) (MCF548X_INTC_ICRn_IL(lvl) | MCF548X_INTC_ICRn_IP(prio))
+
+const uint8_t mcf548x_intc_icr_init_values[64] = {
+ [MCF548X_IRQ_SLT0] = ICR(4, 7),
+ [MCF548X_IRQ_SLT1] = ICR(4, 6),
+ [MCF548X_IRQ_PSC0] = ICR(3, 7),
+ [MCF548X_IRQ_PSC1] = ICR(3, 6),
+ [MCF548X_IRQ_PSC2] = ICR(3, 5),
+ [MCF548X_IRQ_PSC3] = ICR(3, 4),
+ [MCF548X_IRQ_FEC0] = ICR(2, 7),
+ [MCF548X_IRQ_FEC1] = ICR(2, 6)
+};
diff --git a/c/src/lib/libbsp/m68k/genmcf548x/network/network.c b/c/src/lib/libbsp/m68k/genmcf548x/network/network.c
index 3f5e6d3b7b..8296f23ec1 100644
--- a/c/src/lib/libbsp/m68k/genmcf548x/network/network.c
+++ b/c/src/lib/libbsp/m68k/genmcf548x/network/network.c
@@ -1288,10 +1288,6 @@ static void mcf548x_fec_init(void *arg)
rtems_panic ("Can't attach MFC54xx FEX interrupt handler\n");
}
- MCF548X_INTC_ICRn(MCF548X_FEC_IRQ_VECTOR(chan) % 64) =
- MCF548X_INTC_ICRn_IL(FEC_IRQ_LEVEL) |
- MCF548X_INTC_ICRn_IP(FEC_IRQ_PRIORITY);
-
MCF548X_INTC_IMRH &= ~(1 << (MCF548X_FEC_IRQ_VECTOR(chan) % 32));
MCF548X_FEC_EIMR(chan) = FEC_INTR_MASK_USED;
diff --git a/c/src/lib/libbsp/m68k/genmcf548x/startup/init548x.c b/c/src/lib/libbsp/m68k/genmcf548x/startup/init548x.c
index 3a9d002cf3..1221df4041 100644
--- a/c/src/lib/libbsp/m68k/genmcf548x/startup/init548x.c
+++ b/c/src/lib/libbsp/m68k/genmcf548x/startup/init548x.c
@@ -77,7 +77,9 @@ void mcf548x_init(void);
void mcf548x_init(void)
- {
+{
+ size_t i;
+
#if defined(HAS_LOW_LEVEL_INIT)
/* set XLB arbiter timeouts */
MCF548X_XLB_ADRTO = 0x00000100;
@@ -108,6 +110,12 @@ void mcf548x_init(void)
/* Zero uninitialized data */
memset(bsp_section_bss_begin, 0, (size_t) bsp_section_bss_size);
+
+ for (i = 8; i < RTEMS_ARRAY_SIZE(mcf548x_intc_icr_init_values); ++i) {
+ volatile uint8_t *icr = &MCF548X_INTC_ICR0;
+
+ icr[i] = mcf548x_intc_icr_init_values[i];
+ }
}
/********************************************************************/
#if defined(HAS_LOW_LEVEL_INIT)