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.
This commit is contained in:
Joel Sherrill
2000-10-18 18:33:47 +00:00
parent a982e0c639
commit f244218338
4 changed files with 184 additions and 0 deletions

View File

@@ -0,0 +1,2 @@
Makefile
Makefile.in

View File

@@ -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

View File

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

View File

@@ -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 */