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.
This commit is contained in:
Sebastian Huber
2013-12-05 17:26:41 +01:00
parent 5df9bf6e8a
commit 8d2920119b
7 changed files with 41 additions and 33 deletions

View File

@@ -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-server.c
libbsp_a_SOURCES += ../../shared/src/irq-shell.c libbsp_a_SOURCES += ../../shared/src/irq-shell.c
libbsp_a_SOURCES += irq/irq.c libbsp_a_SOURCES += irq/irq.c
libbsp_a_SOURCES += irq/intc-icr-init-values.c
if HAS_NETWORKING if HAS_NETWORKING
network_CPPFLAGS = -D__INSIDE_RTEMS_BSD_TCPIP_STACK__ network_CPPFLAGS = -D__INSIDE_RTEMS_BSD_TCPIP_STACK__

View File

@@ -90,8 +90,6 @@
#define Clock_driver_support_initialize_hardware() \ #define Clock_driver_support_initialize_hardware() \
do { \ do { \
int level; \ int level; \
MCF548X_INTC_ICR54 = MCF548X_INTC_ICRn_IL(SLT0_IRQ_LEVEL) | \
MCF548X_INTC_ICRn_IP(SLT0_IRQ_PRIORITY); \
rtems_interrupt_disable( level ); \ rtems_interrupt_disable( level ); \
MCF548X_INTC_IMRH &= ~(MCF548X_INTC_IMRH_INT_MASK54); \ MCF548X_INTC_IMRH &= ~(MCF548X_INTC_IMRH_INT_MASK54); \
rtems_interrupt_enable( level ); \ rtems_interrupt_enable( level ); \

View File

@@ -487,26 +487,18 @@ IntUartInitialize(void)
rtems_interrupt_disable(level); rtems_interrupt_disable(level);
switch(chan) { switch(chan) {
case 0: 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); MCF548X_INTC_IMRH &= ~(MCF548X_INTC_IMRH_INT_MASK35);
break; break;
case 1: 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); MCF548X_INTC_IMRH &= ~(MCF548X_INTC_IMRH_INT_MASK34);
break; break;
case 2: 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); MCF548X_INTC_IMRH &= ~(MCF548X_INTC_IMRH_INT_MASK33);
break; break;
case 3: 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); MCF548X_INTC_IMRH &= ~(MCF548X_INTC_IMRH_INT_MASK32);
break; break;
} }

View File

@@ -86,24 +86,8 @@ rtems_isr_entry set_vector(
int type int type
); );
/* /* Initial values for the interrupt level and priority registers (INTC_ICRn) */
* Interrupt assignments extern const uint8_t mcf548x_intc_icr_init_values[64];
* 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
/* /*
* Network driver configuration * Network driver configuration

View File

@@ -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)
};

View File

@@ -1288,10 +1288,6 @@ static void mcf548x_fec_init(void *arg)
rtems_panic ("Can't attach MFC54xx FEX interrupt handler\n"); 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_INTC_IMRH &= ~(1 << (MCF548X_FEC_IRQ_VECTOR(chan) % 32));
MCF548X_FEC_EIMR(chan) = FEC_INTR_MASK_USED; MCF548X_FEC_EIMR(chan) = FEC_INTR_MASK_USED;

View File

@@ -77,7 +77,9 @@ void mcf548x_init(void);
void mcf548x_init(void) void mcf548x_init(void)
{ {
size_t i;
#if defined(HAS_LOW_LEVEL_INIT) #if defined(HAS_LOW_LEVEL_INIT)
/* set XLB arbiter timeouts */ /* set XLB arbiter timeouts */
MCF548X_XLB_ADRTO = 0x00000100; MCF548X_XLB_ADRTO = 0x00000100;
@@ -108,6 +110,12 @@ void mcf548x_init(void)
/* Zero uninitialized data */ /* Zero uninitialized data */
memset(bsp_section_bss_begin, 0, (size_t) bsp_section_bss_size); 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) #if defined(HAS_LOW_LEVEL_INIT)