mirror of
https://gitlab.rtems.org/rtems/rtos/rtems.git
synced 2025-12-08 00:23:14 +00:00
added haleakala BSP contributed by Michael Hamel
This commit is contained in:
@@ -1,7 +1,12 @@
|
|||||||
|
2008-07-14 Thomas Doerfler <Thomas.Doerfler@embedded-brains.de>
|
||||||
|
|
||||||
|
* make/custom/haleakala.cfg:
|
||||||
|
added PPC405 haleakala BSP contributed by Michael Hamel
|
||||||
|
|
||||||
2008-07-09 Thomas Doerfler <Thomas.Doerfler@embedded-brains.de>
|
2008-07-09 Thomas Doerfler <Thomas.Doerfler@embedded-brains.de>
|
||||||
|
|
||||||
* aclocal/bsp-alias.m4, aclocal/check-bsps.m4,
|
* aclocal/bsp-alias.m4, aclocal/check-bsps.m4,
|
||||||
make/custom/m5484FireEngine.cfg:
|
* make/custom/m5484FireEngine.cfg:
|
||||||
added pgh360 BSP variant
|
added pgh360 BSP variant
|
||||||
added m5484FireEngine BSP
|
added m5484FireEngine BSP
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
2008-07-14 Thomas Doefler <Thomas.Doerfler@embedded-brains.de>
|
||||||
|
* haleakala: added new BSP
|
||||||
|
|
||||||
2008-07-11 Sebastian Huber <sebastian.huber@embedded-brains.de>
|
2008-07-11 Sebastian Huber <sebastian.huber@embedded-brains.de>
|
||||||
|
|
||||||
* ep1a/startup/bspstart.c, mvme3100/startup/bspstart.c,
|
* ep1a/startup/bspstart.c, mvme3100/startup/bspstart.c,
|
||||||
|
|||||||
@@ -8,6 +8,8 @@ AC_DEFUN([RTEMS_CHECK_BSPDIR],
|
|||||||
AC_CONFIG_SUBDIRS([gen5200]);;
|
AC_CONFIG_SUBDIRS([gen5200]);;
|
||||||
gen83xx )
|
gen83xx )
|
||||||
AC_CONFIG_SUBDIRS([gen83xx]);;
|
AC_CONFIG_SUBDIRS([gen83xx]);;
|
||||||
|
haleakala )
|
||||||
|
AC_CONFIG_SUBDIRS([haleakala]);;
|
||||||
mbx8xx )
|
mbx8xx )
|
||||||
AC_CONFIG_SUBDIRS([mbx8xx]);;
|
AC_CONFIG_SUBDIRS([mbx8xx]);;
|
||||||
motorola_powerpc )
|
motorola_powerpc )
|
||||||
|
|||||||
@@ -18,11 +18,7 @@
|
|||||||
\*===============================================================*/
|
\*===============================================================*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
<<<<<<< bspstart.c
|
|
||||||
* $Id$
|
* $Id$
|
||||||
=======
|
|
||||||
* $Id$
|
|
||||||
>>>>>>> 1.11
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <bsp.h>
|
#include <bsp.h>
|
||||||
|
|||||||
13
c/src/lib/libbsp/powerpc/haleakala/ChangeLog
Normal file
13
c/src/lib/libbsp/powerpc/haleakala/ChangeLog
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
2008-07-14 Thomas Doerfler <thomas.doerfler@embedded-brains.de>
|
||||||
|
|
||||||
|
* README, bsp_specs, INSTALL, bsp_specs.dl, configure.ac,
|
||||||
|
* Makefile.am, preinstall.am, dlentry/dlentry.S,
|
||||||
|
* include/bsp.h, include/coverhd.h, include/tm27.h
|
||||||
|
* irq/irq.c, irq/irq.h, irq/irq_init.c,
|
||||||
|
* startup/bspclean.c, startup/bspstart.c, startup/linkcmds:
|
||||||
|
|
||||||
|
Added BSP contributed by Michael Hamel
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
1
c/src/lib/libbsp/powerpc/haleakala/INSTALL
Normal file
1
c/src/lib/libbsp/powerpc/haleakala/INSTALL
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<to be filled in >
|
||||||
96
c/src/lib/libbsp/powerpc/haleakala/Makefile.am
Normal file
96
c/src/lib/libbsp/powerpc/haleakala/Makefile.am
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
##
|
||||||
|
## $Id$
|
||||||
|
##
|
||||||
|
|
||||||
|
ACLOCAL_AMFLAGS = -I ../../../../aclocal
|
||||||
|
|
||||||
|
include $(top_srcdir)/../../../../automake/compile.am
|
||||||
|
include $(top_srcdir)/../../bsp.am
|
||||||
|
|
||||||
|
dist_project_lib_DATA = bsp_specs
|
||||||
|
|
||||||
|
include_HEADERS = include/bsp.h
|
||||||
|
include_HEADERS += include/tm27.h
|
||||||
|
|
||||||
|
nodist_include_HEADERS = include/bspopts.h
|
||||||
|
DISTCLEANFILES = include/bspopts.h
|
||||||
|
|
||||||
|
noinst_PROGRAMS =
|
||||||
|
|
||||||
|
include_bspdir = $(includedir)/bsp
|
||||||
|
|
||||||
|
include_HEADERS += include/coverhd.h
|
||||||
|
|
||||||
|
EXTRA_DIST = ../../powerpc/shared/start/rtems_crti.S
|
||||||
|
rtems_crti.$(OBJEXT): ../../powerpc/shared/start/rtems_crti.S
|
||||||
|
$(CPPASCOMPILE) -o $@ -c $<
|
||||||
|
project_lib_DATA = rtems_crti.$(OBJEXT)
|
||||||
|
|
||||||
|
dist_project_lib_DATA += startup/linkcmds
|
||||||
|
|
||||||
|
|
||||||
|
noinst_PROGRAMS += startup.rel
|
||||||
|
startup_rel_SOURCES = startup/bspclean.c ../../shared/bsplibc.c \
|
||||||
|
../../shared/bsppost.c startup/bspstart.c ../../shared/bootcard.c \
|
||||||
|
../../shared/sbrk.c startup/setvec.c \
|
||||||
|
../../shared/gnatinstallhandler.c
|
||||||
|
startup_rel_CPPFLAGS = $(AM_CPPFLAGS)
|
||||||
|
startup_rel_LDFLAGS = $(RTEMS_RELLDFLAGS)
|
||||||
|
|
||||||
|
|
||||||
|
noinst_PROGRAMS += dlentry.rel
|
||||||
|
dlentry_rel_SOURCES = dlentry/dlentry.S
|
||||||
|
dlentry_rel_CPPFLAGS = $(AM_CPPFLAGS)
|
||||||
|
dlentry_rel_LDFLAGS = $(RTEMS_RELLDFLAGS)
|
||||||
|
|
||||||
|
include_bsp_HEADERS = ../../powerpc/shared/console/uart.h
|
||||||
|
include_bsp_HEADERS += ../../powerpc/shared/console/consoleIo.h
|
||||||
|
|
||||||
|
noinst_PROGRAMS += console.rel
|
||||||
|
console_rel_SOURCES = ../../powerpc/shared/console/uart.c \
|
||||||
|
../../powerpc/shared/console/console.c
|
||||||
|
console_rel_CPPFLAGS = $(AM_CPPFLAGS)
|
||||||
|
console_rel_LDFLAGS = $(RTEMS_RELLDFLAGS)
|
||||||
|
|
||||||
|
include_bsp_HEADERS += irq/irq.h \
|
||||||
|
../../../libcpu/@RTEMS_CPU@/@exceptions@/bspsupport/vectors.h \
|
||||||
|
../../../libcpu/@RTEMS_CPU@/@exceptions@/bspsupport/irq_supp.h \
|
||||||
|
../../../libcpu/@RTEMS_CPU@/@exceptions@/bspsupport/ppc_exc_bspsupp.h
|
||||||
|
|
||||||
|
noinst_PROGRAMS += irq.rel
|
||||||
|
irq_rel_SOURCES = irq/irq_init.c irq/irq.c
|
||||||
|
irq_rel_CPPFLAGS = $(AM_CPPFLAGS)
|
||||||
|
irq_rel_LDFLAGS = $(RTEMS_RELLDFLAGS)
|
||||||
|
|
||||||
|
|
||||||
|
if HAS_NETWORKING
|
||||||
|
network_CPPFLAGS = -D__INSIDE_RTEMS_BSD_TCPIP_STACK__
|
||||||
|
noinst_PROGRAMS += network.rel
|
||||||
|
network_rel_SOURCES = network/network.c
|
||||||
|
network_rel_CPPFLAGS = $(AM_CPPFLAGS) $(network_CPPFLAGS)
|
||||||
|
network_rel_LDFLAGS = $(RTEMS_RELLDFLAGS)
|
||||||
|
endif
|
||||||
|
|
||||||
|
|
||||||
|
noinst_LIBRARIES = libbsp.a
|
||||||
|
libbsp_a_SOURCES =
|
||||||
|
|
||||||
|
libbsp_a_LIBADD = startup.rel dlentry.rel console.rel irq.rel
|
||||||
|
|
||||||
|
if HAS_NETWORKING
|
||||||
|
libbsp_a_LIBADD += network.rel
|
||||||
|
endif
|
||||||
|
|
||||||
|
libbsp_a_LIBADD += ../../../libcpu/@RTEMS_CPU@/@exceptions@/rtems-cpu.rel \
|
||||||
|
../../../libcpu/@RTEMS_CPU@/@exceptions@/raw_exception.rel \
|
||||||
|
../../../libcpu/@RTEMS_CPU@/@exceptions@/exc_bspsupport.rel \
|
||||||
|
../../../libcpu/@RTEMS_CPU@/@exceptions@/irq_bspsupport.rel \
|
||||||
|
../../../libcpu/@RTEMS_CPU@/shared/cpuIdent.rel \
|
||||||
|
../../../libcpu/@RTEMS_CPU@/ppc403/clock.rel \
|
||||||
|
../../../libcpu/@RTEMS_CPU@/ppc403/timer.rel
|
||||||
|
|
||||||
|
|
||||||
|
EXTRA_DIST += times
|
||||||
|
|
||||||
|
include $(srcdir)/preinstall.am
|
||||||
|
include $(top_srcdir)/../../../../automake/local.am
|
||||||
55
c/src/lib/libbsp/powerpc/haleakala/README
Normal file
55
c/src/lib/libbsp/powerpc/haleakala/README
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
#
|
||||||
|
# $Id$
|
||||||
|
#
|
||||||
|
|
||||||
|
# Adapted from Virtex BSP
|
||||||
|
|
||||||
|
BSP NAME: Haleakala
|
||||||
|
BOARD: AMCC/UDTech Haleakala 405Exr eval board
|
||||||
|
BUS: N/A
|
||||||
|
CPU FAMILY: ppc
|
||||||
|
CPU: PowerPC 405EXr
|
||||||
|
COPROCESSORS: N/A
|
||||||
|
MODE: 32 bit mode
|
||||||
|
|
||||||
|
DEBUG MONITOR:
|
||||||
|
|
||||||
|
PERIPHERALS
|
||||||
|
===========
|
||||||
|
TIMERS: 405EXr internal
|
||||||
|
SERIAL PORTS: 405EXr internal
|
||||||
|
REAL-TIME CLOCK: DS1338
|
||||||
|
DMA: 405EXr internal
|
||||||
|
VIDEO: none
|
||||||
|
SCSI: none
|
||||||
|
NETWORKING: 405EXr internal
|
||||||
|
|
||||||
|
DRIVER INFORMATION
|
||||||
|
==================
|
||||||
|
CLOCK DRIVER: PPC Decrementer
|
||||||
|
IOSUPP DRIVER: N/A
|
||||||
|
SHMSUPP: N/A
|
||||||
|
TIMER DRIVER: N/A
|
||||||
|
TTY DRIVER: shared
|
||||||
|
|
||||||
|
STDIO
|
||||||
|
=====
|
||||||
|
PORT: Console port 0
|
||||||
|
ELECTRICAL: RS-232
|
||||||
|
BAUD: 9600-115200
|
||||||
|
BITS PER CHARACTER: 8
|
||||||
|
PARITY: None
|
||||||
|
STOP BITS: 1
|
||||||
|
|
||||||
|
Notes
|
||||||
|
=====
|
||||||
|
|
||||||
|
Board description
|
||||||
|
-----------------
|
||||||
|
clock rate: 400 MHz
|
||||||
|
ROM: 64MByte FLASH
|
||||||
|
RAM: 256MByte DDR DRAM
|
||||||
|
|
||||||
|
|
||||||
|
Porting
|
||||||
|
-------
|
||||||
13
c/src/lib/libbsp/powerpc/haleakala/bsp_specs
Normal file
13
c/src/lib/libbsp/powerpc/haleakala/bsp_specs
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
%rename endfile old_endfile
|
||||||
|
%rename startfile old_startfile
|
||||||
|
%rename link old_link
|
||||||
|
|
||||||
|
*startfile:
|
||||||
|
%{!qrtems: %(old_startfile)} %{!nostdlib: %{qrtems: ecrti%O%s rtems_crti%O%s crtbegin.o%s}}
|
||||||
|
|
||||||
|
*endfile:
|
||||||
|
%{!qrtems: %(old_endfile)} %{qrtems: crtend.o%s ecrtn.o%s}
|
||||||
|
|
||||||
|
*link:
|
||||||
|
%{!qrtems: %(old_link)} %{qrtems: -dc -dp -u __vectors -u download_entry -N }
|
||||||
|
|
||||||
23
c/src/lib/libbsp/powerpc/haleakala/bsp_specs.dl
Normal file
23
c/src/lib/libbsp/powerpc/haleakala/bsp_specs.dl
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
%rename cpp old_cpp
|
||||||
|
%rename lib old_lib
|
||||||
|
%rename endfile old_endfile
|
||||||
|
%rename startfile old_startfile
|
||||||
|
%rename link old_link
|
||||||
|
|
||||||
|
*cpp:
|
||||||
|
%(old_cpp) %{qrtems: -D__embedded__} -Asystem(embedded)
|
||||||
|
|
||||||
|
*lib:
|
||||||
|
%{!qrtems: %(old_lib)} %{qrtems: ecrti%O%s --start-group \
|
||||||
|
%{!qrtems_debug: -lrtemsall} %{qrtems_debug: -lrtemsall_g} \
|
||||||
|
-lc -lgcc --end-group \
|
||||||
|
%{!qnolinkcmds: -T linkcmds%s}}
|
||||||
|
|
||||||
|
*startfile:
|
||||||
|
%{!qrtems: %(old_startfile)} %{qrtems: \
|
||||||
|
%{!qrtems_debug: } \
|
||||||
|
%{qrtems_debug: }}
|
||||||
|
|
||||||
|
*link:
|
||||||
|
%{!qrtems: %(old_link)} %{qrtems: -dc -dp -u __vectors -u download_entry -N }
|
||||||
|
|
||||||
40
c/src/lib/libbsp/powerpc/haleakala/configure.ac
Normal file
40
c/src/lib/libbsp/powerpc/haleakala/configure.ac
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
dnl Process this file with autoconf to produce a configure script.
|
||||||
|
dnl
|
||||||
|
dnl $Id$
|
||||||
|
|
||||||
|
AC_PREREQ(2.59)
|
||||||
|
AC_INIT([rtems-c-src-lib-libbsp-powerpc-haleakala],[_RTEMS_VERSION],[rtems-bugs@rtems.com])
|
||||||
|
AC_CONFIG_SRCDIR([bsp_specs])
|
||||||
|
RTEMS_TOP(../../../../../..)
|
||||||
|
|
||||||
|
RTEMS_CANONICAL_TARGET_CPU
|
||||||
|
AM_INIT_AUTOMAKE([no-define nostdinc foreign 1.9])
|
||||||
|
RTEMS_BSP_CONFIGURE
|
||||||
|
|
||||||
|
RTEMS_PROG_CC_FOR_TARGET([-ansi -fasm])
|
||||||
|
RTEMS_CANONICALIZE_TOOLS
|
||||||
|
RTEMS_PROG_CCAS
|
||||||
|
|
||||||
|
RTEMS_CHECK_NETWORKING
|
||||||
|
|
||||||
|
AM_CONDITIONAL(HAS_NETWORKING,test "$HAS_NETWORKING" = "yes")
|
||||||
|
|
||||||
|
RTEMS_BSPOPTS_SET([PPC_USE_SPRG],[*],[1])
|
||||||
|
RTEMS_BSPOPTS_HELP([PPC_USE_SPRG],
|
||||||
|
[If defined, then the PowerPC specific code in RTEMS will use some
|
||||||
|
of the special purpose registers to slightly optimize interrupt
|
||||||
|
response time. The use of these registers can conflict with
|
||||||
|
other tools like debuggers.])
|
||||||
|
|
||||||
|
RTEMS_BSPOPTS_SET([PPC_VECTOR_FILE_BASE],[*],[0x0100])
|
||||||
|
RTEMS_BSPOPTS_HELP([PPC_VECTOR_FILE_BASE],
|
||||||
|
[This defines the base address of the exception table.
|
||||||
|
NOTE: Vectors are actually at 0xFFF00000 but file starts at offset.])
|
||||||
|
|
||||||
|
|
||||||
|
# Explicitly list all Makefiles here
|
||||||
|
AC_CONFIG_FILES([Makefile])
|
||||||
|
|
||||||
|
RTEMS_PPC_EXCEPTIONS
|
||||||
|
|
||||||
|
AC_OUTPUT
|
||||||
245
c/src/lib/libbsp/powerpc/haleakala/dlentry/dlentry.S
Normal file
245
c/src/lib/libbsp/powerpc/haleakala/dlentry/dlentry.S
Normal file
@@ -0,0 +1,245 @@
|
|||||||
|
/* dlentry.s
|
||||||
|
*
|
||||||
|
* This file contains the entry code for RTEMS programs starting
|
||||||
|
* after download to RAM
|
||||||
|
*
|
||||||
|
* Author: Thomas Doerfler <td@imd.m.isar.de>
|
||||||
|
* IMD Ingenieurbuero fuer Microcomputertechnik
|
||||||
|
*
|
||||||
|
* COPYRIGHT (c) 1998 by IMD
|
||||||
|
*
|
||||||
|
* Changes from IMD are covered by the original distributions terms.
|
||||||
|
* This file has been derived from the papyrus BSP:
|
||||||
|
*
|
||||||
|
* This file contains the entry veneer for RTEMS programs
|
||||||
|
* downloaded to Papyrus.
|
||||||
|
*
|
||||||
|
* Author: Andrew Bray <andy@i-cubed.co.uk>
|
||||||
|
*
|
||||||
|
* COPYRIGHT (c) 1995 by i-cubed ltd.
|
||||||
|
*
|
||||||
|
* To anyone who acknowledges that this file is provided "AS IS"
|
||||||
|
* without any express or implied warranty:
|
||||||
|
* permission to use, copy, modify, and distribute this file
|
||||||
|
* for any purpose is hereby granted without fee, provided that
|
||||||
|
* the above copyright notice and this notice appears in all
|
||||||
|
* copies, and that the name of i-cubed limited not be used in
|
||||||
|
* advertising or publicity pertaining to distribution of the
|
||||||
|
* software without specific, written prior permission.
|
||||||
|
* i-cubed limited makes no representations about the suitability
|
||||||
|
* of this software for any purpose.
|
||||||
|
*
|
||||||
|
* $Id$
|
||||||
|
*
|
||||||
|
* derived from "helas403/dlentry.S":
|
||||||
|
*
|
||||||
|
* Further changes to derive for the PPC405CR/GP/GPr/EX/EXr
|
||||||
|
* by Michael Hamel ADInstruments Ltd 2008
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Id: dlentry.S,v 1.2 2000/08/02 16:30:57 joel Exp
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <rtems/asm.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The virtex ELF link scripts support three special sections:
|
||||||
|
* .entry The actual entry point
|
||||||
|
* .vectors The section containing the interrupt entry veneers.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Downloaded code loads the vectors separately to 0x00000100,
|
||||||
|
* so .entry can be over 256 bytes.
|
||||||
|
*
|
||||||
|
* The other sections are linked in the following order:
|
||||||
|
* .entry
|
||||||
|
* .text
|
||||||
|
* .data
|
||||||
|
* .bss
|
||||||
|
* see linker command file for section placement
|
||||||
|
*
|
||||||
|
* The initial stack is set to stack.end
|
||||||
|
*
|
||||||
|
* All the entry veneer has to do is to clear the BSS.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* GDB likes to have debugging information for the entry veneer.
|
||||||
|
* Here was some DWARF information. IMD removed it, because we
|
||||||
|
* could not check, whether it was still correct. Sorry.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
.section .entry
|
||||||
|
|
||||||
|
PUBLIC_VAR (start)
|
||||||
|
PUBLIC_VAR (download_entry)
|
||||||
|
PUBLIC_VAR (__rtems_entry_point)
|
||||||
|
|
||||||
|
SYM(start):
|
||||||
|
SYM(download_entry):
|
||||||
|
SYM(__rtems_entry_point):
|
||||||
|
|
||||||
|
.extern SYM (boot_card)
|
||||||
|
|
||||||
|
bl .startup /* First word is branch to reset_entry */
|
||||||
|
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
* Parameters from linker
|
||||||
|
*--------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
base_addr:
|
||||||
|
toc_pointer:
|
||||||
|
.long s.got
|
||||||
|
bss_length:
|
||||||
|
.long bss.size
|
||||||
|
bss_addr:
|
||||||
|
.long bss.start
|
||||||
|
sbss_length:
|
||||||
|
.long sbss.size
|
||||||
|
sbss_addr:
|
||||||
|
.long sbss.start
|
||||||
|
stack_top:
|
||||||
|
.long stack.end
|
||||||
|
PUBLIC_VAR (text_addr)
|
||||||
|
text_addr:
|
||||||
|
.long text.start
|
||||||
|
PUBLIC_VAR (text_length)
|
||||||
|
text_length:
|
||||||
|
.long text.size
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
* Reset_entry.
|
||||||
|
*--------------------------------------------------------------------------*/
|
||||||
|
.startup:
|
||||||
|
/* Get entrypoint address in R1 so we can find linker variables */
|
||||||
|
mflr r1
|
||||||
|
|
||||||
|
/* Initialise procesor registers generally */
|
||||||
|
bl init405
|
||||||
|
|
||||||
|
/* Clear .bss and .sbss */
|
||||||
|
bl bssclr
|
||||||
|
|
||||||
|
/*-------------------------------------------------------------------
|
||||||
|
* C_setup.
|
||||||
|
*------------------------------------------------------------------*/
|
||||||
|
lwz r1,stack_top - base_addr(r1) /* Now set R1 to stack_top */
|
||||||
|
addi r1,r1,-56-4 /* start stack at text_addr - 56 */
|
||||||
|
li r3,0
|
||||||
|
stw r3, 0(r1) /* Clear stack chain */
|
||||||
|
stw r3, 4(r1)
|
||||||
|
stw r3, 8(r1)
|
||||||
|
stw r3, 12(r1)
|
||||||
|
|
||||||
|
bl __eabi /* Initialise EABI: sets up r2 & r13 */
|
||||||
|
|
||||||
|
lis r5,environ@ha
|
||||||
|
la r5,environ@l(r5) /* environp */
|
||||||
|
li r4, 0 /* argv */
|
||||||
|
li r3, 0 /* argc */
|
||||||
|
|
||||||
|
b SYM (boot_card) /* call the first C routine */
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
* bssclr.
|
||||||
|
*--------------------------------------------------------------------------*/
|
||||||
|
bssclr: lwz r2,bss_addr-base_addr(r1) /* start of bss set by loader */
|
||||||
|
lwz r3,bss_length-base_addr(r1) /* bss length */
|
||||||
|
srwi. r3,r3,2 /* div 4 to get # of words */
|
||||||
|
li r0,0
|
||||||
|
beq dosbss /* no bss */
|
||||||
|
mtctr r3 /* set ctr reg */
|
||||||
|
subi r2,r2,4
|
||||||
|
clear_bss: stwu r0,4(r2)
|
||||||
|
bdnz clear_bss /* decrement counter and loop */
|
||||||
|
|
||||||
|
dosbss: lwz r2,sbss_addr-base_addr(r1) /* start of sbss set by loader */
|
||||||
|
lwz r3,sbss_length-base_addr(r1) /* sbss length */
|
||||||
|
slwi. r3,r3,2 /* div 4 to get # of words */
|
||||||
|
subi r2,r2,4
|
||||||
|
beqlr /* no sbss */
|
||||||
|
mtctr r3 /* set ctr reg */
|
||||||
|
clear_sbss: stwu r0,4(r2)
|
||||||
|
bdnz clear_sbss /* decrement counter and loop */
|
||||||
|
|
||||||
|
blr /* return */
|
||||||
|
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------
|
||||||
|
* Generic 405 register setup
|
||||||
|
*--------------------------------------------------------------------------*/
|
||||||
|
init405:
|
||||||
|
li r0, 0
|
||||||
|
mtmsr r0
|
||||||
|
mticcr r0
|
||||||
|
mtdccr r0
|
||||||
|
|
||||||
|
li r3,0x7FFC # 405EX-specific
|
||||||
|
mtsgr r3 # Clear guarded mode on all storage except PCIe region
|
||||||
|
|
||||||
|
mtsler r0 # Storage is all big-endian
|
||||||
|
mtsu0r r0 # and uncompressed
|
||||||
|
|
||||||
|
iccci r3,0 # Invalidate the instruction cache
|
||||||
|
li r3,1 # Enable F800 0000 to FFFF FFFF
|
||||||
|
oris r3,r3,0xC000 # Enable 0000 0000 to 0FFF FFFF
|
||||||
|
mticcr r3
|
||||||
|
isync
|
||||||
|
|
||||||
|
li r3,0
|
||||||
|
li r4,256 # 405 has 128 or 256 32-byte lines: do 256
|
||||||
|
mtctr r4 # set loop ctr
|
||||||
|
dcloop: dccci 0,r3 # invalidate line
|
||||||
|
addi r3,r3,0x20 # bump to next line
|
||||||
|
bdnz dcloop
|
||||||
|
mtdcwr r0 # Select write-back caching
|
||||||
|
lis r3,0xC000 # Enable 0000 0000 to 0FFF FFFF
|
||||||
|
# mtdccr r3 # Enable data cache
|
||||||
|
|
||||||
|
mtevpr r0
|
||||||
|
mtesr r0
|
||||||
|
mtxer r0
|
||||||
|
|
||||||
|
lwarx r3,r0,r0 # get some data/set resv bit
|
||||||
|
stwcx. r3,r0,r0 # store out and clear resv bit
|
||||||
|
|
||||||
|
lis r3,0xDEAD
|
||||||
|
ori r3,r3,0xBEEF # Make distintive uninitialised value
|
||||||
|
mr r4, r3
|
||||||
|
mr r5, r3
|
||||||
|
mr r6, r3
|
||||||
|
mr r7, r3
|
||||||
|
mr r8, r3
|
||||||
|
mr r9, r3
|
||||||
|
mr r10, r3
|
||||||
|
mr r11, r3
|
||||||
|
mr r12, r3
|
||||||
|
mr r13, r3
|
||||||
|
mr r14, r3
|
||||||
|
mr r15, r3
|
||||||
|
mr r16, r3
|
||||||
|
mr r17, r3
|
||||||
|
mr r18, r3
|
||||||
|
mr r19, r3
|
||||||
|
mr r20, r3
|
||||||
|
mr r21, r3
|
||||||
|
mr r22, r3
|
||||||
|
mr r23, r3
|
||||||
|
mr r24, r3
|
||||||
|
mr r25, r3
|
||||||
|
mr r26, r3
|
||||||
|
mr r27, r3
|
||||||
|
mr r28, r3
|
||||||
|
mr r29, r3
|
||||||
|
mr r30, r3
|
||||||
|
mr r31, r3
|
||||||
|
|
||||||
|
blr
|
||||||
|
|
||||||
|
.L_text_e:
|
||||||
|
|
||||||
|
.comm environ,4,4
|
||||||
103
c/src/lib/libbsp/powerpc/haleakala/include/bsp.h
Normal file
103
c/src/lib/libbsp/powerpc/haleakala/include/bsp.h
Normal file
@@ -0,0 +1,103 @@
|
|||||||
|
/* bsp.h
|
||||||
|
*
|
||||||
|
* Generic 405EX bsp.h
|
||||||
|
* derived from virtex/include/bsp.h
|
||||||
|
* by Michael Hamel ADInstruments Ltd 2008
|
||||||
|
*
|
||||||
|
* derived from helas403/include/bsp.h:
|
||||||
|
* Id: bsp.h,v 1.4 2001/06/18 17:01:48 joel Exp
|
||||||
|
* Author: Thomas Doerfler <td@imd.m.isar.de>
|
||||||
|
* IMD Ingenieurbuero fuer Microcomputertechnik
|
||||||
|
*
|
||||||
|
* COPYRIGHT (c) 1998 by IMD
|
||||||
|
*
|
||||||
|
* Changes from IMD are covered by the original distributions terms.
|
||||||
|
* This file has been derived from the papyrus BSP.
|
||||||
|
*
|
||||||
|
* Author: Andrew Bray <andy@i-cubed.co.uk>
|
||||||
|
*
|
||||||
|
* COPYRIGHT (c) 1995 by i-cubed ltd.
|
||||||
|
*
|
||||||
|
* To anyone who acknowledges that this file is provided "AS IS"
|
||||||
|
* without any express or implied warranty:
|
||||||
|
* permission to use, copy, modify, and distribute this file
|
||||||
|
* for any purpose is hereby granted without fee, provided that
|
||||||
|
* the above copyright notice and this notice appears in all
|
||||||
|
* copies, and that the name of i-cubed limited not be used in
|
||||||
|
* advertising or publicity pertaining to distribution of the
|
||||||
|
* software without specific, written prior permission.
|
||||||
|
* i-cubed limited makes no representations about the suitability
|
||||||
|
* of this software for any purpose.
|
||||||
|
*
|
||||||
|
* Derived from c/src/lib/libbsp/no_cpu/no_bsp/include/bsp.h
|
||||||
|
*
|
||||||
|
* COPYRIGHT (c) 1989-1999.
|
||||||
|
* On-Line Applications Research Corporation (OAR).
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Id$
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _BSP_H
|
||||||
|
#define _BSP_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <bspopts.h>
|
||||||
|
|
||||||
|
#ifdef ASM
|
||||||
|
|
||||||
|
/* Definition of where to store registers in alignment handler */
|
||||||
|
#define ALIGN_REGS 0x0140
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#include <rtems.h>
|
||||||
|
#include <rtems/console.h>
|
||||||
|
#include <rtems/clockdrv.h>
|
||||||
|
#include <libcpu/io.h>
|
||||||
|
#include <rtems/console.h>
|
||||||
|
#include <rtems/iosupp.h>
|
||||||
|
#include <bsp/irq.h>
|
||||||
|
#include <bsp/vectors.h>
|
||||||
|
|
||||||
|
/* Network Defines */
|
||||||
|
#define RTEMS_BSP_NETWORK_DRIVER_NAME "eth0"
|
||||||
|
|
||||||
|
struct rtems_bsdnet_ifconfig;
|
||||||
|
int rtems_emac_driver_attach(struct rtems_bsdnet_ifconfig* config, int attaching);
|
||||||
|
#define RTEMS_BSP_NETWORK_DRIVER_ATTACH rtems_emac_driver_attach
|
||||||
|
|
||||||
|
/* Definitions for the shared console/UART driver */
|
||||||
|
#define CONFIGURE_NUMBER_OF_TERMIOS_PORTS 2
|
||||||
|
|
||||||
|
#define BSP_UART_IOBASE_COM1 0xEF600200 /* PPC405EX */
|
||||||
|
#define BSP_UART_IOBASE_COM2 0xEF600300
|
||||||
|
|
||||||
|
#define BSP_CONSOLE_PORT BSP_UART_COM1 /* console */
|
||||||
|
|
||||||
|
#define BSP_UART_BAUD_BASE (11059200 / 16) /* Kilauea ext clock, max speed */
|
||||||
|
|
||||||
|
/* functions */
|
||||||
|
|
||||||
|
rtems_isr_entry set_vector( /* returns old vector */
|
||||||
|
rtems_isr_entry handler, /* isr routine */
|
||||||
|
rtems_vector_number vector, /* vector number */
|
||||||
|
int type /* RTEMS or RAW intr */
|
||||||
|
);
|
||||||
|
|
||||||
|
#endif /* ASM */
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* BSP_H */
|
||||||
133
c/src/lib/libbsp/powerpc/haleakala/include/coverhd.h
Normal file
133
c/src/lib/libbsp/powerpc/haleakala/include/coverhd.h
Normal file
@@ -0,0 +1,133 @@
|
|||||||
|
/* coverhd.h
|
||||||
|
*
|
||||||
|
* This include file has defines to represent the overhead associated
|
||||||
|
* with calling a particular directive from C. These are used in the
|
||||||
|
* Timing Test Suite to ignore the overhead required to pass arguments
|
||||||
|
* to directives. On some CPUs and/or target boards, this overhead
|
||||||
|
* is significant and makes it difficult to distinguish internal
|
||||||
|
* RTEMS execution time from that used to call the directive.
|
||||||
|
* This file should be updated after running the C overhead timing
|
||||||
|
* test. Once this update has been performed, the RTEMS Time Test
|
||||||
|
* Suite should be rebuilt to account for these overhead times in the
|
||||||
|
* timing results.
|
||||||
|
*
|
||||||
|
* NOTE: If these are all zero, then the times reported include
|
||||||
|
* all calling overhead including passing of arguments.
|
||||||
|
*
|
||||||
|
* COPYRIGHT (c) 1989-1999.
|
||||||
|
* On-Line Applications Research Corporation (OAR).
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Updated for a 25MHz Papyrus by Andrew Bray <andy@i-cubed.co.uk>
|
||||||
|
*
|
||||||
|
* Units are 100ns.
|
||||||
|
*
|
||||||
|
* These numbers are of questionable use, as they are developed by calling
|
||||||
|
* the routine many times, thus getting its entry veneer into the (small)
|
||||||
|
* cache on the 403GA. This in general is not true of the RTEMS timing
|
||||||
|
* tests, which usually call a routine only once, thus having no cache loaded
|
||||||
|
* advantage.
|
||||||
|
*
|
||||||
|
* Whether the directive times are useful after deducting the function call
|
||||||
|
* overhead is also questionable. The user is more interested generally
|
||||||
|
* in the total cost of a directive, not the cost if the procedure call
|
||||||
|
* is inlined! (In general this is not true).
|
||||||
|
*
|
||||||
|
* Andrew Bray 18/08/1995
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __COVERHD_h
|
||||||
|
#define __COVERHD_h
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define CALLING_OVERHEAD_INITIALIZE_EXECUTIVE 1
|
||||||
|
#define CALLING_OVERHEAD_SHUTDOWN_EXECUTIVE 1
|
||||||
|
#define CALLING_OVERHEAD_TASK_CREATE 3
|
||||||
|
#define CALLING_OVERHEAD_TASK_IDENT 1
|
||||||
|
#define CALLING_OVERHEAD_TASK_START 1
|
||||||
|
#define CALLING_OVERHEAD_TASK_RESTART 1
|
||||||
|
#define CALLING_OVERHEAD_TASK_DELETE 1
|
||||||
|
#define CALLING_OVERHEAD_TASK_SUSPEND 1
|
||||||
|
#define CALLING_OVERHEAD_TASK_RESUME 1
|
||||||
|
#define CALLING_OVERHEAD_TASK_SET_PRIORITY 1
|
||||||
|
#define CALLING_OVERHEAD_TASK_MODE 1
|
||||||
|
#define CALLING_OVERHEAD_TASK_GET_NOTE 1
|
||||||
|
#define CALLING_OVERHEAD_TASK_SET_NOTE 1
|
||||||
|
#define CALLING_OVERHEAD_TASK_WAKE_WHEN 4
|
||||||
|
#define CALLING_OVERHEAD_TASK_WAKE_AFTER 1
|
||||||
|
#define CALLING_OVERHEAD_INTERRUPT_CATCH 1
|
||||||
|
#define CALLING_OVERHEAD_CLOCK_GET 4
|
||||||
|
#define CALLING_OVERHEAD_CLOCK_SET 3
|
||||||
|
#define CALLING_OVERHEAD_CLOCK_TICK 1
|
||||||
|
|
||||||
|
#define CALLING_OVERHEAD_TIMER_CREATE 1
|
||||||
|
#define CALLING_OVERHEAD_TIMER_IDENT 1
|
||||||
|
#define CALLING_OVERHEAD_TIMER_DELETE 1
|
||||||
|
#define CALLING_OVERHEAD_TIMER_FIRE_AFTER 2
|
||||||
|
#define CALLING_OVERHEAD_TIMER_FIRE_WHEN 5
|
||||||
|
#define CALLING_OVERHEAD_TIMER_RESET 1
|
||||||
|
#define CALLING_OVERHEAD_TIMER_CANCEL 1
|
||||||
|
#define CALLING_OVERHEAD_SEMAPHORE_CREATE 2
|
||||||
|
#define CALLING_OVERHEAD_SEMAPHORE_IDENT 1
|
||||||
|
#define CALLING_OVERHEAD_SEMAPHORE_DELETE 1
|
||||||
|
#define CALLING_OVERHEAD_SEMAPHORE_OBTAIN 1
|
||||||
|
#define CALLING_OVERHEAD_SEMAPHORE_RELEASE 1
|
||||||
|
#define CALLING_OVERHEAD_MESSAGE_QUEUE_CREATE 2
|
||||||
|
#define CALLING_OVERHEAD_MESSAGE_QUEUE_IDENT 1
|
||||||
|
#define CALLING_OVERHEAD_MESSAGE_QUEUE_DELETE 1
|
||||||
|
#define CALLING_OVERHEAD_MESSAGE_QUEUE_SEND 1
|
||||||
|
#define CALLING_OVERHEAD_MESSAGE_QUEUE_URGENT 1
|
||||||
|
#define CALLING_OVERHEAD_MESSAGE_QUEUE_BROADCAST 1
|
||||||
|
#define CALLING_OVERHEAD_MESSAGE_QUEUE_RECEIVE 2
|
||||||
|
#define CALLING_OVERHEAD_MESSAGE_QUEUE_FLUSH 1
|
||||||
|
|
||||||
|
#define CALLING_OVERHEAD_EVENT_SEND 1
|
||||||
|
#define CALLING_OVERHEAD_EVENT_RECEIVE 2
|
||||||
|
#define CALLING_OVERHEAD_SIGNAL_CATCH 1
|
||||||
|
#define CALLING_OVERHEAD_SIGNAL_SEND 1
|
||||||
|
#define CALLING_OVERHEAD_PARTITION_CREATE 3
|
||||||
|
#define CALLING_OVERHEAD_PARTITION_IDENT 1
|
||||||
|
#define CALLING_OVERHEAD_PARTITION_DELETE 1
|
||||||
|
#define CALLING_OVERHEAD_PARTITION_GET_BUFFER 1
|
||||||
|
#define CALLING_OVERHEAD_PARTITION_RETURN_BUFFER 1
|
||||||
|
#define CALLING_OVERHEAD_REGION_CREATE 3
|
||||||
|
#define CALLING_OVERHEAD_REGION_IDENT 1
|
||||||
|
#define CALLING_OVERHEAD_REGION_DELETE 1
|
||||||
|
#define CALLING_OVERHEAD_REGION_GET_SEGMENT 2
|
||||||
|
#define CALLING_OVERHEAD_REGION_RETURN_SEGMENT 1
|
||||||
|
#define CALLING_OVERHEAD_PORT_CREATE 2
|
||||||
|
#define CALLING_OVERHEAD_PORT_IDENT 1
|
||||||
|
#define CALLING_OVERHEAD_PORT_DELETE 1
|
||||||
|
#define CALLING_OVERHEAD_PORT_EXTERNAL_TO_INTERNAL 1
|
||||||
|
#define CALLING_OVERHEAD_PORT_INTERNAL_TO_EXTERNAL 2
|
||||||
|
|
||||||
|
#define CALLING_OVERHEAD_IO_INITIALIZE 2
|
||||||
|
#define CALLING_OVERHEAD_IO_OPEN 2
|
||||||
|
#define CALLING_OVERHEAD_IO_CLOSE 2
|
||||||
|
#define CALLING_OVERHEAD_IO_READ 2
|
||||||
|
#define CALLING_OVERHEAD_IO_WRITE 2
|
||||||
|
#define CALLING_OVERHEAD_IO_CONTROL 2
|
||||||
|
#define CALLING_OVERHEAD_FATAL_ERROR_OCCURRED 1
|
||||||
|
#define CALLING_OVERHEAD_RATE_MONOTONIC_CREATE 1
|
||||||
|
#define CALLING_OVERHEAD_RATE_MONOTONIC_IDENT 1
|
||||||
|
#define CALLING_OVERHEAD_RATE_MONOTONIC_DELETE 1
|
||||||
|
#define CALLING_OVERHEAD_RATE_MONOTONIC_CANCEL 1
|
||||||
|
#define CALLING_OVERHEAD_RATE_MONOTONIC_PERIOD 1
|
||||||
|
#define CALLING_OVERHEAD_MULTIPROCESSING_ANNOUNCE 1
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
32
c/src/lib/libbsp/powerpc/haleakala/include/tm27.h
Normal file
32
c/src/lib/libbsp/powerpc/haleakala/include/tm27.h
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
/*
|
||||||
|
* tm27.h
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _RTEMS_TMTEST27
|
||||||
|
#error "This is an RTEMS internal file you must not include directly."
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __tm27_h
|
||||||
|
#define __tm27_h
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Stuff for Time Test 27
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define MUST_WAIT_FOR_INTERRUPT 0
|
||||||
|
|
||||||
|
#define Install_tm27_vector( handler ) set_vector( (handler), PPC_IRQ_SCALL, 1 )
|
||||||
|
|
||||||
|
#define Cause_tm27_intr() asm volatile ("sc")
|
||||||
|
|
||||||
|
#define Clear_tm27_intr() /* empty */
|
||||||
|
|
||||||
|
#define Lower_tm27_intr() /* empty */
|
||||||
|
|
||||||
|
#endif
|
||||||
212
c/src/lib/libbsp/powerpc/haleakala/irq/irq.c
Normal file
212
c/src/lib/libbsp/powerpc/haleakala/irq/irq.c
Normal file
@@ -0,0 +1,212 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* The license and distribution terms for this file may be
|
||||||
|
* found in found in the file LICENSE in this distribution or at
|
||||||
|
* http://www.rtems.com/license/LICENSE.
|
||||||
|
*
|
||||||
|
* Middleware support for PPC405 by M.Hamel ADInstruments Ltd 2008
|
||||||
|
*
|
||||||
|
* $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <rtems.h>
|
||||||
|
#include <bsp.h>
|
||||||
|
#include <bsp/irq.h>
|
||||||
|
#include <bsp/irq_supp.h>
|
||||||
|
#include <libcpu/raw_exception.h>
|
||||||
|
#include <libcpu/powerpc-utility.h>
|
||||||
|
|
||||||
|
|
||||||
|
/* PPC405EX UIC numbers */
|
||||||
|
#define UIC_DCR_BASE 0xc0
|
||||||
|
#define UIC0_SR (UIC_DCR_BASE+0x0) /* UIC status */
|
||||||
|
#define UIC0_SRS (UIC_DCR_BASE+0x1) /* UIC status set */
|
||||||
|
#define UIC0_ER (UIC_DCR_BASE+0x2) /* UIC enable */
|
||||||
|
#define UIC0_CR (UIC_DCR_BASE+0x3) /* UIC critical */
|
||||||
|
#define UIC0_PR (UIC_DCR_BASE+0x4) /* UIC polarity */
|
||||||
|
#define UIC0_TR (UIC_DCR_BASE+0x5) /* UIC triggering */
|
||||||
|
#define UIC0_MSR (UIC_DCR_BASE+0x6) /* UIC masked status */
|
||||||
|
#define UIC0_VR (UIC_DCR_BASE+0x7) /* UIC vector */
|
||||||
|
#define UIC0_VCR (UIC_DCR_BASE+0x8) /* UIC vector configuration */
|
||||||
|
|
||||||
|
#define UIC1_SR (UIC_DCR_BASE+0x10) /* UIC status */
|
||||||
|
#define UIC1_SRS (UIC_DCR_BASE+0x11) /* UIC status set */
|
||||||
|
#define UIC1_ER (UIC_DCR_BASE+0x12) /* UIC enable */
|
||||||
|
#define UIC1_CR (UIC_DCR_BASE+0x13) /* UIC critical */
|
||||||
|
#define UIC1_PR (UIC_DCR_BASE+0x14) /* UIC polarity */
|
||||||
|
#define UIC1_TR (UIC_DCR_BASE+0x15) /* UIC triggering */
|
||||||
|
#define UIC1_MSR (UIC_DCR_BASE+0x16) /* UIC masked status */
|
||||||
|
#define UIC1_VR (UIC_DCR_BASE+0x17) /* UIC vector */
|
||||||
|
#define UIC1_VCR (UIC_DCR_BASE+0x18) /* UIC vector configuration */
|
||||||
|
|
||||||
|
#define UIC2_SR (UIC_DCR_BASE+0x20) /* UIC status */
|
||||||
|
#define UIC2_SRS (UIC_DCR_BASE+0x21) /* UIC status set */
|
||||||
|
#define UIC2_ER (UIC_DCR_BASE+0x22) /* UIC enable */
|
||||||
|
#define UIC2_CR (UIC_DCR_BASE+0x23) /* UIC critical */
|
||||||
|
#define UIC2_PR (UIC_DCR_BASE+0x24) /* UIC polarity */
|
||||||
|
#define UIC2_TR (UIC_DCR_BASE+0x25) /* UIC triggering */
|
||||||
|
#define UIC2_MSR (UIC_DCR_BASE+0x26) /* UIC masked status */
|
||||||
|
#define UIC2_VR (UIC_DCR_BASE+0x27) /* UIC vector */
|
||||||
|
#define UIC2_VCR (UIC_DCR_BASE+0x28) /* UIC vector configuration */
|
||||||
|
|
||||||
|
enum { kUICWords = 3 };
|
||||||
|
|
||||||
|
static rtems_irq_connect_data* rtems_hdl_tblP;
|
||||||
|
static rtems_irq_connect_data dflt_entry;
|
||||||
|
|
||||||
|
static uint32_t gEnabledInts[kUICWords]; /* 1-bits mean enabled */
|
||||||
|
static uint32_t gIntInhibited[kUICWords]; /* 1-bits disable, overriding gEnabledInts because the interrupt
|
||||||
|
is being processed in C_dispatch_irq_handler */
|
||||||
|
|
||||||
|
static inline int IsUICIRQ(const rtems_irq_number irqLine)
|
||||||
|
{
|
||||||
|
return (((int) irqLine <= BSP_UIC_IRQ_MAX_OFFSET) &&
|
||||||
|
((int) irqLine >= BSP_UIC_IRQ_LOWEST_OFFSET)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void WriteIState()
|
||||||
|
/* Write the gEnabledInts state masked by gIntInhibited to the hardware */
|
||||||
|
{
|
||||||
|
mtdcr(UIC0_ER, gEnabledInts[0] & ~gIntInhibited[0]);
|
||||||
|
mtdcr(UIC1_ER, gEnabledInts[1] & ~gIntInhibited[1]);
|
||||||
|
mtdcr(UIC2_ER, gEnabledInts[2] & ~gIntInhibited[2]);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
BSP_enable_irq_at_pic(const rtems_irq_number irq)
|
||||||
|
/* Enable an interrupt; this can be called from inside C_dispatch_irq_handler */
|
||||||
|
{
|
||||||
|
if (IsUICIRQ(irq)) {
|
||||||
|
/* Set relevant bit in the state, write state to the UIC */
|
||||||
|
gEnabledInts[irq>>5] |= (0x80000000 >> (irq & 0x1F));
|
||||||
|
WriteIState();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
BSP_disable_irq_at_pic(const rtems_irq_number irq)
|
||||||
|
/* Enable an interrupt; this can be called from inside C_dispatch_irq_handler */
|
||||||
|
{
|
||||||
|
if (IsUICIRQ(irq)) {
|
||||||
|
uint32_t oldState;
|
||||||
|
int iword = irq>>5;
|
||||||
|
uint32_t mask = (0x80000000 >> (irq & 0x1F));
|
||||||
|
|
||||||
|
oldState = gEnabledInts[iword] & mask;
|
||||||
|
gEnabledInts[iword] &= ~mask;
|
||||||
|
WriteIState();
|
||||||
|
return oldState ? 1 : 0;
|
||||||
|
} else
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
BSP_setup_the_pic(rtems_irq_global_settings* config)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
dflt_entry = config->defaultEntry;
|
||||||
|
rtems_hdl_tblP = config->irqHdlTbl;
|
||||||
|
for (i=0; i<kUICWords; i++)
|
||||||
|
gIntInhibited[i] = 0;
|
||||||
|
|
||||||
|
mtdcr (UIC2_ER, 0x00000000); /* disable all interrupts */
|
||||||
|
mtdcr (UIC2_CR, 0x00000000); /* Set Critical / Non Critical interrupts */
|
||||||
|
mtdcr (UIC2_PR, 0xf7ffffff); /* Set Interrupt Polarities */
|
||||||
|
mtdcr (UIC2_TR, 0x01e1fff8); /* Set Interrupt Trigger Levels */
|
||||||
|
mtdcr (UIC2_VR, 0x00000001); /* Set Vect base=0,INT31 Highest priority */
|
||||||
|
mtdcr (UIC2_SR, 0xffffffff); /* clear all interrupts */
|
||||||
|
|
||||||
|
mtdcr (UIC1_ER, 0x00000000); /* disable all interrupts */
|
||||||
|
mtdcr (UIC1_CR, 0x00000000); /* Set Critical / Non Critical interrupts */
|
||||||
|
mtdcr (UIC1_PR, 0xfffac785); /* Set Interrupt Polarities */
|
||||||
|
mtdcr (UIC1_TR, 0x001d0040); /* Set Interrupt Trigger Levels */
|
||||||
|
mtdcr (UIC1_VR, 0x00000001); /* Set Vect base=0,INT31 Highest priority */
|
||||||
|
mtdcr (UIC1_SR, 0xffffffff); /* clear all interrupts */
|
||||||
|
|
||||||
|
mtdcr (UIC0_ER, 0x0000000a); /* Disable all interrupts except cascade UIC0 and UIC1 */
|
||||||
|
mtdcr (UIC0_CR, 0x00000000); /* Set Critical / Non Critical interrupts */
|
||||||
|
mtdcr (UIC0_PR, 0xffbfefef); /* Set Interrupt Polarities */
|
||||||
|
mtdcr (UIC0_TR, 0x00007000); /* Set Interrupt Trigger Levels */
|
||||||
|
mtdcr (UIC0_VR, 0x00000001); /* Set Vect base=0,INT31 Highest priority */
|
||||||
|
mtdcr (UIC0_SR, 0xffffffff); /* clear all interrupts */
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* High level IRQ handler called from shared_raw_irq_code_entry; decode and
|
||||||
|
* dispatch. Note that this routine needs to be re-entrant
|
||||||
|
*
|
||||||
|
* No support for critical interrupts here yet
|
||||||
|
*/
|
||||||
|
|
||||||
|
int
|
||||||
|
C_dispatch_irq_handler( struct _BSP_Exception_frame* frame, unsigned int excNum )
|
||||||
|
{
|
||||||
|
if (excNum == ASM_EXT_VECTOR) {
|
||||||
|
uint32_t active[kUICWords];
|
||||||
|
|
||||||
|
/* Fetch the masked flags that tell us what external ints are active.
|
||||||
|
Likely to be only one, but we need to handle more than one,
|
||||||
|
OR the flags into gIntInhibited */
|
||||||
|
active[0] = mfdcr(UIC0_MSR);
|
||||||
|
active[1] = mfdcr(UIC1_MSR);
|
||||||
|
active[2] = mfdcr(UIC2_MSR);
|
||||||
|
gIntInhibited[0] |= active[0];
|
||||||
|
gIntInhibited[1] |= active[1];
|
||||||
|
gIntInhibited[2] |= active[2];
|
||||||
|
|
||||||
|
/* ...and update the hardware so the active interrupts are disabled */
|
||||||
|
WriteIState();
|
||||||
|
|
||||||
|
/* Loop, calling bsp_irq_dispatch_list for each active interrupt */
|
||||||
|
while ((active[0] | active[1] | active[2]) != 0) {
|
||||||
|
uint32_t index = -1;
|
||||||
|
uint32_t bit, bmask;
|
||||||
|
|
||||||
|
/* Find an active interrupt, searching 0..2, bit 0..bit 31 (IBM order) */
|
||||||
|
do {
|
||||||
|
index++;
|
||||||
|
asm volatile (" cntlzw %0, %1":"=r" (bit):"r" (active[index]));
|
||||||
|
} while (bit==32);
|
||||||
|
|
||||||
|
/* Call the matching handler */
|
||||||
|
bsp_irq_dispatch_list(rtems_hdl_tblP, (index*32)+bit, dflt_entry.hdl);
|
||||||
|
|
||||||
|
/* Write a 1-bit to the appropriate status register to clear it */
|
||||||
|
bmask = 0x80000000 >> bit;
|
||||||
|
switch (index) {
|
||||||
|
case 0: mtdcr(UIC0_SR, bmask); break;
|
||||||
|
case 1: mtdcr(UIC1_SR, bmask); break;
|
||||||
|
case 2: mtdcr(UIC2_SR, bmask); break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Clear in the active record and gIntInhibited */
|
||||||
|
active[index] &= ~bmask;
|
||||||
|
gIntInhibited[index] &= ~bmask;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Update the hardware again so the interrupts we have handled are unmasked */
|
||||||
|
WriteIState();
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
} else if (excNum == ASM_DEC_VECTOR) { /* 0x1000 remapped by C_dispatch_dec_handler_bookE */
|
||||||
|
bsp_irq_dispatch_list(rtems_hdl_tblP, BSP_PIT, dflt_entry.hdl);
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
} else if (excNum == ASM_BOOKE_FIT_VECTOR) { /* 0x1010 mapped to 0x13 by ppc_get_vector_addr */
|
||||||
|
bsp_irq_dispatch_list(rtems_hdl_tblP, BSP_FIT, dflt_entry.hdl);
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
} else if (excNum == ASM_BOOKE_WDOG_VECTOR) { /* 0x1020 mapped to 0x14 by ppc_get_vector_addr */
|
||||||
|
bsp_irq_dispatch_list(rtems_hdl_tblP, BSP_WDOG, dflt_entry.hdl);
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
} else
|
||||||
|
return -1; /* unhandled interrupt, panic time */
|
||||||
|
}
|
||||||
|
|
||||||
166
c/src/lib/libbsp/powerpc/haleakala/irq/irq.h
Normal file
166
c/src/lib/libbsp/powerpc/haleakala/irq/irq.h
Normal file
@@ -0,0 +1,166 @@
|
|||||||
|
/*===============================================================*\
|
||||||
|
| Project: RTEMS Haleakala BSP |
|
||||||
|
| by Michael Hamel ADInstruments Ltd 2008 |
|
||||||
|
+-----------------------------------------------------------------+
|
||||||
|
| 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. |
|
||||||
|
| |
|
||||||
|
\*===============================================================*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef Haleakala_IRQ_IRQ_H
|
||||||
|
#define Haleakala_IRQ_IRQ_H
|
||||||
|
|
||||||
|
/* Implemented for us in bsp_irq_dispatch_list */
|
||||||
|
#define BSP_SHARED_HANDLER_SUPPORT 1
|
||||||
|
|
||||||
|
#include <rtems/irq.h>
|
||||||
|
|
||||||
|
#ifndef ASM
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Define UIC interrupt numbers; IRQs that cause an external interrupt that needs further decode.
|
||||||
|
These are arbitrary but it makes things easier if they match the CPU interrupt numbers */
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
#define BSP_UIC_UART0_GP (BSP_UIC_IRQ_LOWEST_OFFSET + 0)
|
||||||
|
#define BSP_UIC_UART1 (BSP_UIC_IRQ_LOWEST_OFFSET + 1)
|
||||||
|
#define BSP_UIC_IIC0 (BSP_UIC_IRQ_LOWEST_OFFSET + 2)
|
||||||
|
#define BSP_UIC_ExtMaster (BSP_UIC_IRQ_LOWEST_OFFSET + 3)
|
||||||
|
#define BSP_UIC_PCI (BSP_UIC_IRQ_LOWEST_OFFSET + 4)
|
||||||
|
#define BSP_UIC_DMA0 (BSP_UIC_IRQ_LOWEST_OFFSET + 5)
|
||||||
|
#define BSP_UIC_DMA1 (BSP_UIC_IRQ_LOWEST_OFFSET + 6)
|
||||||
|
#define BSP_UIC_DMA2 (BSP_UIC_IRQ_LOWEST_OFFSET + 7)
|
||||||
|
#define BSP_UIC_DMA3 (BSP_UIC_IRQ_LOWEST_OFFSET + 8)
|
||||||
|
#define BSP_UIC_ENetWU (BSP_UIC_IRQ_LOWEST_OFFSET + 9)
|
||||||
|
#define BSP_UIC_MALSERR (BSP_UIC_IRQ_LOWEST_OFFSET + 10)
|
||||||
|
#define BSP_UIC_MALTXEOB (BSP_UIC_IRQ_LOWEST_OFFSET + 11)
|
||||||
|
#define BSP_UIC_MALRXEOB (BSP_UIC_IRQ_LOWEST_OFFSET + 12)
|
||||||
|
#define BSP_UIC_MALTXDE (BSP_UIC_IRQ_LOWEST_OFFSET + 13)
|
||||||
|
#define BSP_UIC_MALRXDE (BSP_UIC_IRQ_LOWEST_OFFSET + 14)
|
||||||
|
#define BSP_UIC_ENet (BSP_UIC_IRQ_LOWEST_OFFSET + 15)
|
||||||
|
#define BSP_UIC_PCISERR (BSP_UIC_IRQ_LOWEST_OFFSET + 16)
|
||||||
|
#define BSP_UIC_ECCERR (BSP_UIC_IRQ_LOWEST_OFFSET + 17)
|
||||||
|
#define BSP_UIC_PCIPower (BSP_UIC_IRQ_LOWEST_OFFSET + 18)
|
||||||
|
#define BSP_UIC_IRQ0 (BSP_UIC_IRQ_LOWEST_OFFSET + 25)
|
||||||
|
#define BSP_UIC_IRQ1 (BSP_UIC_IRQ_LOWEST_OFFSET + 26)
|
||||||
|
#define BSP_UIC_IRQ2 (BSP_UIC_IRQ_LOWEST_OFFSET + 27)
|
||||||
|
#define BSP_UIC_IRQ3 (BSP_UIC_IRQ_LOWEST_OFFSET + 28)
|
||||||
|
#define BSP_UIC_IRQ4 (BSP_UIC_IRQ_LOWEST_OFFSET + 29)
|
||||||
|
#define BSP_UIC_IRQ5 (BSP_UIC_IRQ_LOWEST_OFFSET + 30)
|
||||||
|
#define BSP_UIC_IRQ6 (BSP_UIC_IRQ_LOWEST_OFFSET + 31)
|
||||||
|
|
||||||
|
#define BSP_UIC_IRQ_NUMBER (32)
|
||||||
|
|
||||||
|
*/
|
||||||
|
/* PPC405EX interrupt vectors */
|
||||||
|
#define BSP_UIC_UART1 (BSP_UIC_IRQ_LOWEST_OFFSET + 1)
|
||||||
|
#define BSP_UIC_IIC0 (BSP_UIC_IRQ_LOWEST_OFFSET + 2)
|
||||||
|
#define BSP_UIC_EIPPKP_READY (BSP_UIC_IRQ_LOWEST_OFFSET + 3)
|
||||||
|
#define BSP_UIC_EIPPKP_TRNG (BSP_UIC_IRQ_LOWEST_OFFSET + 4)
|
||||||
|
#define BSP_UIC_EBM (BSP_UIC_IRQ_LOWEST_OFFSET + 5)
|
||||||
|
#define BSP_UIC_OPBtoPLB (BSP_UIC_IRQ_LOWEST_OFFSET + 6)
|
||||||
|
#define BSP_UIC_IIC1 (BSP_UIC_IRQ_LOWEST_OFFSET + 7)
|
||||||
|
#define BSP_UIC_SPI (BSP_UIC_IRQ_LOWEST_OFFSET + 8)
|
||||||
|
#define BSP_UIC_IRQ0 (BSP_UIC_IRQ_LOWEST_OFFSET + 9)
|
||||||
|
#define BSP_UIC_MALTXEOB (BSP_UIC_IRQ_LOWEST_OFFSET + 10)
|
||||||
|
#define BSP_UIC_MALRXEOB (BSP_UIC_IRQ_LOWEST_OFFSET + 11)
|
||||||
|
#define BSP_UIC_DMA0 (BSP_UIC_IRQ_LOWEST_OFFSET + 12)
|
||||||
|
#define BSP_UIC_DMA1 (BSP_UIC_IRQ_LOWEST_OFFSET + 13)
|
||||||
|
#define BSP_UIC_DMA2 (BSP_UIC_IRQ_LOWEST_OFFSET + 14)
|
||||||
|
#define BSP_UIC_DMA3 (BSP_UIC_IRQ_LOWEST_OFFSET + 15)
|
||||||
|
#define BSP_UIC_PCIe0AL (BSP_UIC_IRQ_LOWEST_OFFSET + 16)
|
||||||
|
#define BSP_UIC_PCIe0VPD (BSP_UIC_IRQ_LOWEST_OFFSET + 17)
|
||||||
|
#define BSP_UIC_PCIe0HRst (BSP_UIC_IRQ_LOWEST_OFFSET + 18)
|
||||||
|
#define BSP_UIC_EIPPKP_PKA (BSP_UIC_IRQ_LOWEST_OFFSET + 19)
|
||||||
|
#define BSP_UIC_PCIe0TCR (BSP_UIC_IRQ_LOWEST_OFFSET + 20)
|
||||||
|
#define BSP_UIC_PCIe0VCO (BSP_UIC_IRQ_LOWEST_OFFSET + 21)
|
||||||
|
#define BSP_UIC_EIPPKP_TRNG_AL (BSP_UIC_IRQ_LOWEST_OFFSET + 22)
|
||||||
|
#define BSP_UIC_EIP94 (BSP_UIC_IRQ_LOWEST_OFFSET + 23)
|
||||||
|
#define BSP_UIC_EMAC0 (BSP_UIC_IRQ_LOWEST_OFFSET + 24)
|
||||||
|
#define BSP_UIC_EMAC1 (BSP_UIC_IRQ_LOWEST_OFFSET + 25)
|
||||||
|
#define BSP_UIC_UART0 (BSP_UIC_IRQ_LOWEST_OFFSET + 26)
|
||||||
|
#define BSP_UIC_IRQ4 (BSP_UIC_IRQ_LOWEST_OFFSET + 27)
|
||||||
|
#define BSP_UIC_UIC2_STD (BSP_UIC_IRQ_LOWEST_OFFSET + 28)
|
||||||
|
#define BSP_UIC_UIC2_CRIT (BSP_UIC_IRQ_LOWEST_OFFSET + 29)
|
||||||
|
#define BSP_UIC_UIC1_STD (BSP_UIC_IRQ_LOWEST_OFFSET + 30)
|
||||||
|
#define BSP_UIC_UIC1_CRIT (BSP_UIC_IRQ_LOWEST_OFFSET + 31)
|
||||||
|
|
||||||
|
#define BSP_UIC1_IRQ_LOWEST_OFFSET (BSP_UIC_IRQ_LOWEST_OFFSET + 32)
|
||||||
|
#define BSP_UIC_MALSERR (BSP_UIC1_IRQ_LOWEST_OFFSET + 0)
|
||||||
|
#define BSP_UIC_MALTXDE (BSP_UIC1_IRQ_LOWEST_OFFSET + 1)
|
||||||
|
#define BSP_UIC_MALRXDE (BSP_UIC1_IRQ_LOWEST_OFFSET + 2)
|
||||||
|
#define BSP_UIC_PCIe0DCRErr (BSP_UIC1_IRQ_LOWEST_OFFSET + 3)
|
||||||
|
#define BSP_UIC_PCIe1DCRErr (BSP_UIC1_IRQ_LOWEST_OFFSET + 4)
|
||||||
|
#define BSP_UIC_ExtBus (BSP_UIC1_IRQ_LOWEST_OFFSET + 5)
|
||||||
|
#define BSP_UIC_NDFC (BSP_UIC1_IRQ_LOWEST_OFFSET + 6)
|
||||||
|
#define BSP_UIC_EIPKP_SLAVE (BSP_UIC1_IRQ_LOWEST_OFFSET + 7)
|
||||||
|
#define BSP_UIC_GPT_TIMER5 (BSP_UIC1_IRQ_LOWEST_OFFSET + 8)
|
||||||
|
#define BSP_UIC_GPT_TIMER6 (BSP_UIC1_IRQ_LOWEST_OFFSET + 9)
|
||||||
|
|
||||||
|
#define BSP_UIC_GPT_TIMER0 (BSP_UIC1_IRQ_LOWEST_OFFSET + 16)
|
||||||
|
#define BSP_UIC_GPT_TIMER1 (BSP_UIC1_IRQ_LOWEST_OFFSET + 17)
|
||||||
|
#define BSP_UIC_IRQ7 (BSP_UIC1_IRQ_LOWEST_OFFSET + 18)
|
||||||
|
#define BSP_UIC_IRQ8 (BSP_UIC1_IRQ_LOWEST_OFFSET + 19)
|
||||||
|
#define BSP_UIC_IRQ9 (BSP_UIC1_IRQ_LOWEST_OFFSET + 20)
|
||||||
|
#define BSP_UIC_GPT_TIMER2 (BSP_UIC1_IRQ_LOWEST_OFFSET + 21)
|
||||||
|
#define BSP_UIC_GPT_TIMER3 (BSP_UIC1_IRQ_LOWEST_OFFSET + 22)
|
||||||
|
#define BSP_UIC_GPT_TIMER4 (BSP_UIC1_IRQ_LOWEST_OFFSET + 23)
|
||||||
|
#define BSP_UIC_SERIAL_ROM (BSP_UIC1_IRQ_LOWEST_OFFSET + 24)
|
||||||
|
#define BSP_UIC_GPT_DEC (BSP_UIC1_IRQ_LOWEST_OFFSET + 25)
|
||||||
|
#define BSP_UIC_IRQ2 (BSP_UIC1_IRQ_LOWEST_OFFSET + 26)
|
||||||
|
#define BSP_UIC_IRQ5 (BSP_UIC1_IRQ_LOWEST_OFFSET + 27)
|
||||||
|
#define BSP_UIC_IRQ6 (BSP_UIC1_IRQ_LOWEST_OFFSET + 28)
|
||||||
|
#define BSP_UIC_EMAC0WU (BSP_UIC1_IRQ_LOWEST_OFFSET + 29)
|
||||||
|
#define BSP_UIC_IRQ1 (BSP_UIC1_IRQ_LOWEST_OFFSET + 30)
|
||||||
|
#define BSP_UIC_EMAC1WU (BSP_UIC1_IRQ_LOWEST_OFFSET + 31)
|
||||||
|
|
||||||
|
#define BSP_UIC2_IRQ_LOWEST_OFFSET (BSP_UIC_IRQ_LOWEST_OFFSET + 64)
|
||||||
|
#define BSP_UIC_PCIe0INTA (BSP_UIC2_IRQ_LOWEST_OFFSET + 0)
|
||||||
|
#define BSP_UIC_PCIe0INTB (BSP_UIC2_IRQ_LOWEST_OFFSET + 1)
|
||||||
|
#define BSP_UIC_PCIe0INTC (BSP_UIC2_IRQ_LOWEST_OFFSET + 2)
|
||||||
|
#define BSP_UIC_PCIe0INTD (BSP_UIC2_IRQ_LOWEST_OFFSET + 3)
|
||||||
|
#define BSP_UIC_IRQ3 (BSP_UIC2_IRQ_LOWEST_OFFSET + 4)
|
||||||
|
|
||||||
|
#define BSP_UIC_USBOTG (BSP_UIC2_IRQ_LOWEST_OFFSET + 30)
|
||||||
|
|
||||||
|
#define BSP_UIC_IRQ_NUMBER (95)
|
||||||
|
|
||||||
|
|
||||||
|
#define BSP_UIC_IRQ_LOWEST_OFFSET 0
|
||||||
|
#define BSP_UIC_IRQ_MAX_OFFSET (BSP_UIC_IRQ_LOWEST_OFFSET + BSP_UIC_IRQ_NUMBER - 1)
|
||||||
|
|
||||||
|
#define BSP_UART_COM1_IRQ BSP_UIC_UART0 /* Required by shared/console/uart.c */
|
||||||
|
#define BSP_UART_COM2_IRQ BSP_UIC_UART1
|
||||||
|
|
||||||
|
/* Define processor IRQ numbers; IRQs that are handled by the raw_exception vectors */
|
||||||
|
|
||||||
|
#define BSP_PIT BSP_PROCESSOR_IRQ_LOWEST_OFFSET /* Required by ppc403/clock.c */
|
||||||
|
#define BSP_FIT BSP_PROCESSOR_IRQ_LOWEST_OFFSET + 1
|
||||||
|
#define BSP_WDOG BSP_PROCESSOR_IRQ_LOWEST_OFFSET + 2
|
||||||
|
|
||||||
|
#define BSP_PROCESSOR_IRQ_NUMBER (3)
|
||||||
|
#define BSP_PROCESSOR_IRQ_LOWEST_OFFSET (BSP_UIC_IRQ_MAX_OFFSET + 1)
|
||||||
|
#define BSP_PROCESSOR_IRQ_MAX_OFFSET (BSP_PROCESSOR_IRQ_LOWEST_OFFSET + BSP_PROCESSOR_IRQ_NUMBER - 1)
|
||||||
|
|
||||||
|
/* Summary and totals */
|
||||||
|
|
||||||
|
#define BSP_IRQ_NUMBER (BSP_PROCESSOR_IRQ_MAX_OFFSET + 1)
|
||||||
|
#define BSP_LOWEST_OFFSET (BSP_UIC_IRQ_LOWEST_OFFSET)
|
||||||
|
#define BSP_MAX_OFFSET (BSP_IRQ_NUMBER - 1)
|
||||||
|
|
||||||
|
extern void BSP_rtems_irq_mng_init(unsigned cpuId); // Implemented in irq_init.c
|
||||||
|
#include <bsp/irq_supp.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif /* ASM */
|
||||||
|
|
||||||
|
#endif /* Haleakala_IRQ_IRQ_H */
|
||||||
89
c/src/lib/libbsp/powerpc/haleakala/irq/irq_init.c
Normal file
89
c/src/lib/libbsp/powerpc/haleakala/irq/irq_init.c
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
/*===============================================================*\
|
||||||
|
| Project: RTEMS Haleakala BSP |
|
||||||
|
| * by Michael Hamel ADInstruments Ltd 2008 |
|
||||||
|
+-----------------------------------------------------------------+
|
||||||
|
| 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. |
|
||||||
|
| |
|
||||||
|
+-----------------------------------------------------------------+
|
||||||
|
| this file contains the irq controller handler |
|
||||||
|
\*===============================================================*/
|
||||||
|
#include <libcpu/spr.h>
|
||||||
|
#include <bsp/irq.h>
|
||||||
|
#include <bsp.h>
|
||||||
|
#include <libcpu/raw_exception.h>
|
||||||
|
#include <rtems/bspIo.h>
|
||||||
|
#include <rtems/powerpc/powerpc.h>
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* default on/off function
|
||||||
|
*/
|
||||||
|
static void nop_func()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* default isOn function
|
||||||
|
*/
|
||||||
|
static int not_connected()
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static rtems_irq_connect_data rtemsIrq[BSP_IRQ_NUMBER];
|
||||||
|
static rtems_irq_global_settings initial_config;
|
||||||
|
static rtems_irq_connect_data defaultIrq = {
|
||||||
|
/* name, hdl , handle , on , off , isOn */
|
||||||
|
0, nop_func , NULL , nop_func , nop_func , not_connected
|
||||||
|
};
|
||||||
|
|
||||||
|
static rtems_irq_prio irqPrioTable[BSP_IRQ_NUMBER]={
|
||||||
|
/*
|
||||||
|
* Processor exceptions handled as interrupts
|
||||||
|
*/
|
||||||
|
0
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This code assumes the exceptions management setup has already
|
||||||
|
* been done. We just need to replace the exceptions that will
|
||||||
|
* be handled like interrupt. On mcp750/mpc750 and many PPC processors
|
||||||
|
* this means the decrementer exception and the external exception.
|
||||||
|
*/
|
||||||
|
|
||||||
|
void BSP_rtems_irq_mng_init(unsigned cpuId)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* re-init the rtemsIrq table
|
||||||
|
*/
|
||||||
|
for (i = 0; i < BSP_IRQ_NUMBER; i++) {
|
||||||
|
rtemsIrq[i] = defaultIrq;
|
||||||
|
rtemsIrq[i].name = i;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* Init initial Interrupt management config
|
||||||
|
*/
|
||||||
|
initial_config.irqNb = BSP_IRQ_NUMBER;
|
||||||
|
initial_config.defaultEntry = defaultIrq;
|
||||||
|
initial_config.irqHdlTbl = rtemsIrq;
|
||||||
|
initial_config.irqBase = BSP_LOWEST_OFFSET;
|
||||||
|
initial_config.irqPrioTbl = irqPrioTable;
|
||||||
|
|
||||||
|
if (!BSP_rtems_irq_mngt_set(&initial_config)) {
|
||||||
|
/*
|
||||||
|
* put something here that will show the failure...
|
||||||
|
*/
|
||||||
|
BSP_panic(
|
||||||
|
"Unable to initialize RTEMS interrupt management!!! System locked\n"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef TRACE_IRQ_INIT
|
||||||
|
printk("RTEMS IRQ management is now operational\n");
|
||||||
|
#endif
|
||||||
|
}
|
||||||
87
c/src/lib/libbsp/powerpc/haleakala/preinstall.am
Normal file
87
c/src/lib/libbsp/powerpc/haleakala/preinstall.am
Normal file
@@ -0,0 +1,87 @@
|
|||||||
|
## Automatically generated by ampolish3 - Do not edit
|
||||||
|
|
||||||
|
if AMPOLISH3
|
||||||
|
$(srcdir)/preinstall.am: Makefile.am
|
||||||
|
$(AMPOLISH3) $(srcdir)/Makefile.am > $(srcdir)/preinstall.am
|
||||||
|
endif
|
||||||
|
|
||||||
|
PREINSTALL_DIRS =
|
||||||
|
DISTCLEANFILES += $(PREINSTALL_DIRS)
|
||||||
|
|
||||||
|
all-local: $(TMPINSTALL_FILES)
|
||||||
|
|
||||||
|
TMPINSTALL_FILES =
|
||||||
|
CLEANFILES = $(TMPINSTALL_FILES)
|
||||||
|
|
||||||
|
all-am: $(PREINSTALL_FILES)
|
||||||
|
|
||||||
|
PREINSTALL_FILES =
|
||||||
|
CLEANFILES += $(PREINSTALL_FILES)
|
||||||
|
|
||||||
|
$(PROJECT_LIB)/$(dirstamp):
|
||||||
|
@$(MKDIR_P) $(PROJECT_LIB)
|
||||||
|
@: > $(PROJECT_LIB)/$(dirstamp)
|
||||||
|
PREINSTALL_DIRS += $(PROJECT_LIB)/$(dirstamp)
|
||||||
|
|
||||||
|
$(PROJECT_INCLUDE)/$(dirstamp):
|
||||||
|
@$(MKDIR_P) $(PROJECT_INCLUDE)
|
||||||
|
@: > $(PROJECT_INCLUDE)/$(dirstamp)
|
||||||
|
PREINSTALL_DIRS += $(PROJECT_INCLUDE)/$(dirstamp)
|
||||||
|
|
||||||
|
$(PROJECT_LIB)/bsp_specs: bsp_specs $(PROJECT_LIB)/$(dirstamp)
|
||||||
|
$(INSTALL_DATA) $< $(PROJECT_LIB)/bsp_specs
|
||||||
|
PREINSTALL_FILES += $(PROJECT_LIB)/bsp_specs
|
||||||
|
|
||||||
|
$(PROJECT_INCLUDE)/bsp.h: include/bsp.h $(PROJECT_INCLUDE)/$(dirstamp)
|
||||||
|
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp.h
|
||||||
|
PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp.h
|
||||||
|
|
||||||
|
$(PROJECT_INCLUDE)/tm27.h: include/tm27.h $(PROJECT_INCLUDE)/$(dirstamp)
|
||||||
|
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/tm27.h
|
||||||
|
PREINSTALL_FILES += $(PROJECT_INCLUDE)/tm27.h
|
||||||
|
|
||||||
|
$(PROJECT_INCLUDE)/bspopts.h: include/bspopts.h $(PROJECT_INCLUDE)/$(dirstamp)
|
||||||
|
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bspopts.h
|
||||||
|
PREINSTALL_FILES += $(PROJECT_INCLUDE)/bspopts.h
|
||||||
|
|
||||||
|
$(PROJECT_INCLUDE)/bsp/$(dirstamp):
|
||||||
|
@$(MKDIR_P) $(PROJECT_INCLUDE)/bsp
|
||||||
|
@: > $(PROJECT_INCLUDE)/bsp/$(dirstamp)
|
||||||
|
PREINSTALL_DIRS += $(PROJECT_INCLUDE)/bsp/$(dirstamp)
|
||||||
|
|
||||||
|
$(PROJECT_INCLUDE)/coverhd.h: include/coverhd.h $(PROJECT_INCLUDE)/$(dirstamp)
|
||||||
|
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/coverhd.h
|
||||||
|
PREINSTALL_FILES += $(PROJECT_INCLUDE)/coverhd.h
|
||||||
|
|
||||||
|
$(PROJECT_LIB)/rtems_crti.$(OBJEXT): rtems_crti.$(OBJEXT) $(PROJECT_LIB)/$(dirstamp)
|
||||||
|
$(INSTALL_DATA) $< $(PROJECT_LIB)/rtems_crti.$(OBJEXT)
|
||||||
|
TMPINSTALL_FILES += $(PROJECT_LIB)/rtems_crti.$(OBJEXT)
|
||||||
|
|
||||||
|
$(PROJECT_LIB)/linkcmds: startup/linkcmds $(PROJECT_LIB)/$(dirstamp)
|
||||||
|
$(INSTALL_DATA) $< $(PROJECT_LIB)/linkcmds
|
||||||
|
PREINSTALL_FILES += $(PROJECT_LIB)/linkcmds
|
||||||
|
|
||||||
|
$(PROJECT_INCLUDE)/bsp/uart.h: ../../powerpc/shared/console/uart.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
|
||||||
|
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/uart.h
|
||||||
|
PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/uart.h
|
||||||
|
|
||||||
|
$(PROJECT_INCLUDE)/bsp/consoleIo.h: ../../powerpc/shared/console/consoleIo.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
|
||||||
|
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/consoleIo.h
|
||||||
|
PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/consoleIo.h
|
||||||
|
|
||||||
|
$(PROJECT_INCLUDE)/bsp/irq.h: irq/irq.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
|
||||||
|
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/irq.h
|
||||||
|
PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/irq.h
|
||||||
|
|
||||||
|
$(PROJECT_INCLUDE)/bsp/vectors.h: ../../../libcpu/@RTEMS_CPU@/@exceptions@/bspsupport/vectors.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
|
||||||
|
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/vectors.h
|
||||||
|
PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/vectors.h
|
||||||
|
|
||||||
|
$(PROJECT_INCLUDE)/bsp/irq_supp.h: ../../../libcpu/@RTEMS_CPU@/@exceptions@/bspsupport/irq_supp.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
|
||||||
|
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/irq_supp.h
|
||||||
|
PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/irq_supp.h
|
||||||
|
|
||||||
|
$(PROJECT_INCLUDE)/bsp/ppc_exc_bspsupp.h: ../../../libcpu/@RTEMS_CPU@/@exceptions@/bspsupport/ppc_exc_bspsupp.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
|
||||||
|
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/ppc_exc_bspsupp.h
|
||||||
|
PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/ppc_exc_bspsupp.h
|
||||||
|
|
||||||
43
c/src/lib/libbsp/powerpc/haleakala/startup/bspclean.c
Normal file
43
c/src/lib/libbsp/powerpc/haleakala/startup/bspclean.c
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
/* bsp_cleanup()
|
||||||
|
*
|
||||||
|
* This routine normally is part of start.s and usually returns
|
||||||
|
* control to a monitor.
|
||||||
|
*
|
||||||
|
* INPUT: NONE
|
||||||
|
*
|
||||||
|
* OUTPUT: NONE
|
||||||
|
*
|
||||||
|
* Author: Andrew Bray <andy@i-cubed.co.uk>
|
||||||
|
*
|
||||||
|
* COPYRIGHT (c) 1995 by i-cubed ltd.
|
||||||
|
*
|
||||||
|
* To anyone who acknowledges that this file is provided "AS IS"
|
||||||
|
* without any express or implied warranty:
|
||||||
|
* permission to use, copy, modify, and distribute this file
|
||||||
|
* for any purpose is hereby granted without fee, provided that
|
||||||
|
* the above copyright notice and this notice appears in all
|
||||||
|
* copies, and that the name of i-cubed limited not be used in
|
||||||
|
* advertising or publicity pertaining to distribution of the
|
||||||
|
* software without specific, written prior permission.
|
||||||
|
* i-cubed limited makes no representations about the suitability
|
||||||
|
* of this software for any purpose.
|
||||||
|
*
|
||||||
|
* Derived from c/src/lib/libbsp/no_cpu/no_bsp/startup/bspclean.c:
|
||||||
|
*
|
||||||
|
* COPYRIGHT (c) 1989-1999.
|
||||||
|
* On-Line Applications Research Corporation (OAR).
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <rtems.h>
|
||||||
|
#include <bsp.h>
|
||||||
|
|
||||||
|
void bsp_cleanup( void )
|
||||||
|
{
|
||||||
|
rtems_fatal_error_occurred(0);
|
||||||
|
}
|
||||||
315
c/src/lib/libbsp/powerpc/haleakala/startup/bspstart.c
Normal file
315
c/src/lib/libbsp/powerpc/haleakala/startup/bspstart.c
Normal file
@@ -0,0 +1,315 @@
|
|||||||
|
/* bsp_start()
|
||||||
|
*
|
||||||
|
* This routine starts the application. It includes application,
|
||||||
|
* board, and monitor specific initialization and configuration.
|
||||||
|
* The generic CPU dependent initialization has been performed
|
||||||
|
* before this routine is invoked.
|
||||||
|
*
|
||||||
|
* INPUT: NONE
|
||||||
|
*
|
||||||
|
* OUTPUT: NONE
|
||||||
|
*
|
||||||
|
* Author: Thomas Doerfler <td@imd.m.isar.de>
|
||||||
|
* IMD Ingenieurbuero fuer Microcomputertechnik
|
||||||
|
*
|
||||||
|
* COPYRIGHT (c) 1998 by IMD
|
||||||
|
*
|
||||||
|
* Changes from IMD are covered by the original distributions terms.
|
||||||
|
* This file has been derived from the papyrus BSP:
|
||||||
|
*
|
||||||
|
* Author: Andrew Bray <andy@i-cubed.co.uk>
|
||||||
|
*
|
||||||
|
* COPYRIGHT (c) 1995 by i-cubed ltd.
|
||||||
|
*
|
||||||
|
* To anyone who acknowledges that this file is provided "AS IS"
|
||||||
|
* without any express or implied warranty:
|
||||||
|
* permission to use, copy, modify, and distribute this file
|
||||||
|
* for any purpose is hereby granted without fee, provided that
|
||||||
|
* the above copyright notice and this notice appears in all
|
||||||
|
* copies, and that the name of i-cubed limited not be used in
|
||||||
|
* advertising or publicity pertaining to distribution of the
|
||||||
|
* software without specific, written prior permission.
|
||||||
|
* i-cubed limited makes no representations about the suitability
|
||||||
|
* of this software for any purpose.
|
||||||
|
*
|
||||||
|
* Modifications for spooling console driver and control of memory layout
|
||||||
|
* with linker command file by
|
||||||
|
* Thomas Doerfler <td@imd.m.isar.de>
|
||||||
|
* for these modifications:
|
||||||
|
* COPYRIGHT (c) 1997 by IMD, Puchheim, Germany.
|
||||||
|
*
|
||||||
|
* To anyone who acknowledges that this file is provided "AS IS"
|
||||||
|
* without any express or implied warranty:
|
||||||
|
* permission to use, copy, modify, and distribute this file
|
||||||
|
* for any purpose is hereby granted without fee, provided that
|
||||||
|
* the above copyright notice and this notice appears in all
|
||||||
|
* copies. IMD makes no representations about the suitability
|
||||||
|
* of this software for any purpose.
|
||||||
|
*
|
||||||
|
* Derived from c/src/lib/libbsp/no_cpu/no_bsp/startup/bspstart.c:
|
||||||
|
*
|
||||||
|
* COPYRIGHT (c) 1989, 1990, 1991, 1992, 1993, 1994.
|
||||||
|
* On-Line Applications Research Corporation (OAR).
|
||||||
|
*
|
||||||
|
* Modifications for PPC405GP by Dennis Ehlin
|
||||||
|
*
|
||||||
|
* Further modified for the PPC405EX Haleakala board by
|
||||||
|
* Michael Hamel ADInstruments Ltd May 2008
|
||||||
|
*
|
||||||
|
* $Id$
|
||||||
|
*/
|
||||||
|
#include <string.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
|
||||||
|
#include <bsp.h>
|
||||||
|
#include <bsp/uart.h>
|
||||||
|
#include <rtems/libio.h>
|
||||||
|
#include <rtems/libcsupport.h>
|
||||||
|
#include <bsp/irq.h>
|
||||||
|
#include <rtems/bspIo.h>
|
||||||
|
#include <libcpu/cpuIdent.h>
|
||||||
|
#include <libcpu/spr.h>
|
||||||
|
#include <rtems/powerpc/powerpc.h>
|
||||||
|
#include <ppc4xx/ppc405gp.h>
|
||||||
|
#include <ppc4xx/ppc405ex.h>
|
||||||
|
|
||||||
|
SPR_RW(SPRG0)
|
||||||
|
SPR_RW(SPRG1)
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Driver configuration parameters
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Expected by clock.c */
|
||||||
|
uint32_t bsp_clicks_per_usec;
|
||||||
|
boolean bsp_timer_internal_clock; /* TRUE, when timer runs with CPU clk */
|
||||||
|
uint32_t bsp_timer_least_valid;
|
||||||
|
uint32_t bsp_timer_average_overhead;
|
||||||
|
|
||||||
|
|
||||||
|
/* Initialize whatever libc we are using
|
||||||
|
* called from postdriver hook
|
||||||
|
*/
|
||||||
|
|
||||||
|
void bsp_postdriver_hook(void);
|
||||||
|
void bsp_libc_init( void *, uint32_t, int );
|
||||||
|
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* bsp_predriver_hook
|
||||||
|
*
|
||||||
|
* Before drivers are setup.
|
||||||
|
*/
|
||||||
|
|
||||||
|
void bsp_predriver_hook(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Function: bsp_pretasking_hook
|
||||||
|
* Created: 95/03/10
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* BSP pretasking hook. Called just before drivers are initialized.
|
||||||
|
* Used to setup libc and install any BSP extensions.
|
||||||
|
*
|
||||||
|
* NOTES:
|
||||||
|
* Must not use libc (to do io) from here, since drivers are
|
||||||
|
* not yet initialized.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
extern uint8_t _RAMEnd; /* Defined in linkcmds */
|
||||||
|
|
||||||
|
void bsp_pretasking_hook(void)
|
||||||
|
/* Initialise libc with the address and size of the heap, which runs
|
||||||
|
from the end of the RTEMS workspace to the top of RAM */
|
||||||
|
{
|
||||||
|
uint32_t heap_start;
|
||||||
|
|
||||||
|
heap_start = ( (uint32_t)Configuration.work_space_start +
|
||||||
|
rtems_configuration_get_work_space_size() );
|
||||||
|
|
||||||
|
bsp_libc_init((void *)heap_start, (uint32_t)(&_RAMEnd) - heap_start, 0);
|
||||||
|
|
||||||
|
#ifdef RTEMS_DEBUG
|
||||||
|
rtems_debug_enable( RTEMS_DEBUG_ALL_MASK );
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/*-------------------- Haleakala-specific UART setup -------------------------*/
|
||||||
|
|
||||||
|
static void
|
||||||
|
EarlyUARTInit(int baudRate)
|
||||||
|
{
|
||||||
|
uint8_t* up = (uint8_t*)(BSP_UART_IOBASE_COM1);
|
||||||
|
int divider = BSP_UART_BAUD_BASE / baudRate;
|
||||||
|
up[LCR] = DLAB; /* Access DLM/DLL */
|
||||||
|
up[DLL] = divider & 0x0FF;
|
||||||
|
up[DLM] = divider >> 8;
|
||||||
|
up[LCR] = CHR_8_BITS;
|
||||||
|
up[MCR] = DTR | RTS;
|
||||||
|
up[FCR] = FIFO_EN | XMIT_RESET | RCV_RESET;
|
||||||
|
up[THR] = '+';
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
InitUARTClock()
|
||||||
|
{
|
||||||
|
uint32_t reg;
|
||||||
|
mfsdr(SDR0_UART0,reg);
|
||||||
|
reg &= ~0x008000FF;
|
||||||
|
reg |= 0x00800001; /* Ext clock, div 1 */
|
||||||
|
mtsdr(SDR0_UART0,reg);
|
||||||
|
}
|
||||||
|
|
||||||
|
void GPIO_AlternateSelect(int bitnum, int source)
|
||||||
|
/* PPC405EX: select a GPIO function for the specified pin */
|
||||||
|
{
|
||||||
|
int shift;
|
||||||
|
unsigned long value, mask;
|
||||||
|
GPIORegisters* gpioPtr = (GPIORegisters*)(GPIOAddress);
|
||||||
|
|
||||||
|
shift = (31 - bitnum) & 0xF;
|
||||||
|
value = (source & 3) << (shift*2);
|
||||||
|
mask = 3 << (shift*2);
|
||||||
|
if (bitnum <= 15) {
|
||||||
|
gpioPtr->OSRL = (gpioPtr->OSRL & ~mask) | value;
|
||||||
|
gpioPtr->TSRL = (gpioPtr->TSRL & ~mask) | value;
|
||||||
|
} else {
|
||||||
|
gpioPtr->OSRH = (gpioPtr->OSRH & ~mask) | value;
|
||||||
|
gpioPtr->TSRH = (gpioPtr->TSRH & ~mask) | value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Init_FPGA()
|
||||||
|
{
|
||||||
|
/* Have to write to the FPGA to enable the UART drivers */
|
||||||
|
/* Have to enable CS2 as an output in GPIO to get the FPGA working */
|
||||||
|
mtebc(EBC0_B2CR,0xF0018000); /* Set up CS2 at 0xF0000000 */
|
||||||
|
mtebc(EBC0_B2AP,0x9400C800);
|
||||||
|
GPIO_AlternateSelect(9,1); /* GPIO9 = PerCS2 */
|
||||||
|
{
|
||||||
|
unsigned long *fpgaPtr = (unsigned long*)(0xF0000000);
|
||||||
|
unsigned long n;
|
||||||
|
n = *(fpgaPtr);
|
||||||
|
n &= ~0x00100; /* User LEDs on */
|
||||||
|
n |= 0x30000; /* UART 0 and 1 transcievers on! */
|
||||||
|
*fpgaPtr = n;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*===================================================================*/
|
||||||
|
|
||||||
|
static void
|
||||||
|
DirectUARTWrite(const char c)
|
||||||
|
{
|
||||||
|
uint8_t* up = (uint8_t*)(BSP_UART_IOBASE_COM1);
|
||||||
|
while ((up[LSR] & THRE) == 0) { ; }
|
||||||
|
up[THR] = c;
|
||||||
|
if (c=='\n')
|
||||||
|
DirectUARTWrite('\r');
|
||||||
|
}
|
||||||
|
|
||||||
|
/* We will provide our own printk output function as it may get used early */
|
||||||
|
BSP_output_char_function_type BSP_output_char = DirectUARTWrite;
|
||||||
|
|
||||||
|
|
||||||
|
/*===================================================================*/
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* bsp_start
|
||||||
|
*
|
||||||
|
* This routine does the bulk of the system initialization.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
void bsp_start( void )
|
||||||
|
{
|
||||||
|
extern unsigned long *intrStackPtr;
|
||||||
|
register unsigned char* intrStack;
|
||||||
|
ppc_cpu_id_t myCpu;
|
||||||
|
ppc_cpu_revision_t myCpuRevision;
|
||||||
|
|
||||||
|
/* Get the UART clock initialized first in case we call printk */
|
||||||
|
|
||||||
|
InitUARTClock();
|
||||||
|
Init_FPGA();
|
||||||
|
EarlyUARTInit(115200);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Get CPU identification dynamically. Note that the get_ppc_cpu_type()
|
||||||
|
* function store the result in global variables
|
||||||
|
* so that it can be used later...
|
||||||
|
*/
|
||||||
|
myCpu = get_ppc_cpu_type();
|
||||||
|
myCpuRevision = get_ppc_cpu_revision();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* initialize the device driver parameters
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Set globals visible to clock.c */
|
||||||
|
bsp_clicks_per_usec = 400; /* timebase register ticks/microsecond = CPU Clk in MHz */
|
||||||
|
bsp_timer_internal_clock = TRUE;
|
||||||
|
bsp_timer_average_overhead = 2;
|
||||||
|
bsp_timer_least_valid = 3;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Initialize some SPRG registers related to irq handling
|
||||||
|
*/
|
||||||
|
|
||||||
|
intrStack = (((unsigned char*)&intrStackPtr) - PPC_MINIMUM_STACK_FRAME_SIZE);
|
||||||
|
_write_SPRG1((unsigned int)intrStack);
|
||||||
|
/* signal them that we have fixed PR288 - eventually, this should go away */
|
||||||
|
/*
|
||||||
|
* Initialize default raw exception handlers.
|
||||||
|
*/
|
||||||
|
initialize_exceptions();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Install our own set of exception vectors
|
||||||
|
*/
|
||||||
|
BSP_rtems_irq_mng_init(0);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Allocate the memory for the RTEMS Work Space. This can come from
|
||||||
|
* a variety of places: hard coded address, malloc'ed from outside
|
||||||
|
* RTEMS world (e.g. simulator or primitive memory manager), or (as
|
||||||
|
* typically done by stock BSPs) by subtracting the required amount
|
||||||
|
* of work space from the last physical address on the CPU board.
|
||||||
|
*/
|
||||||
|
/* In this case we allocate space at an address defined in linkcmds
|
||||||
|
which points to a block above the stack and below the heap */
|
||||||
|
{
|
||||||
|
extern uint8_t _WorkspaceStart;
|
||||||
|
Configuration.work_space_start = &_WorkspaceStart;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void BSP_ask_for_reset(void)
|
||||||
|
{
|
||||||
|
printk("system stopped, press RESET");
|
||||||
|
while(1) {};
|
||||||
|
}
|
||||||
|
|
||||||
|
void BSP_panic(char *s)
|
||||||
|
{
|
||||||
|
printk("%s PANIC %s\n",_RTEMS_version, s);
|
||||||
|
BSP_ask_for_reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
void _BSP_Fatal_error(unsigned int v)
|
||||||
|
{
|
||||||
|
printk("%s PANIC ERROR %x\n",_RTEMS_version, v);
|
||||||
|
BSP_ask_for_reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
255
c/src/lib/libbsp/powerpc/haleakala/startup/linkcmds
Normal file
255
c/src/lib/libbsp/powerpc/haleakala/startup/linkcmds
Normal file
@@ -0,0 +1,255 @@
|
|||||||
|
/*
|
||||||
|
* This file contains directives for the GNU linker which are specific
|
||||||
|
* to the 405GP/EX
|
||||||
|
* This file is intended to be used together with dlentry.s
|
||||||
|
* it will generate downloadable code
|
||||||
|
*
|
||||||
|
* Modifications for gen405 by Dennis Ehlin
|
||||||
|
* Modifications for virtex by Keith, Greg, and Bob
|
||||||
|
* Modifications for 405GP/EX by Michael Hamel
|
||||||
|
*
|
||||||
|
* $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
OUTPUT_FORMAT("elf32-powerpc", "elf32-powerpc", "elf32-powerpc")
|
||||||
|
OUTPUT_ARCH(powerpc)
|
||||||
|
ENTRY(download_entry)
|
||||||
|
|
||||||
|
kIntrStackSize = 16K;
|
||||||
|
kMainStackSize = 64K;
|
||||||
|
|
||||||
|
MEMORY {
|
||||||
|
RAM : ORIGIN = 0, LENGTH = 256M
|
||||||
|
/*FLASH : ORIGIN = 0xFFE00000, LENGTH = 16M*/
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
SECTIONS
|
||||||
|
{
|
||||||
|
/* First 16K is occupied by exception vectors and anything else we want to put there */
|
||||||
|
.text 0x4000:
|
||||||
|
{
|
||||||
|
text.start = . ;
|
||||||
|
*(.entry)
|
||||||
|
*(.entry2)
|
||||||
|
*(.text*)
|
||||||
|
*(.rodata*)
|
||||||
|
*(.rodata1)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Special FreeBSD sysctl sections.
|
||||||
|
*/
|
||||||
|
. = ALIGN (16);
|
||||||
|
__start_set_sysctl_set = .;
|
||||||
|
*(set_sysctl_*);
|
||||||
|
__stop_set_sysctl_set = ABSOLUTE(.);
|
||||||
|
*(set_domain_*);
|
||||||
|
*(set_pseudo_*);
|
||||||
|
|
||||||
|
/* C++ constructors/destructors */
|
||||||
|
*(.gnu.linkonce.t*)
|
||||||
|
|
||||||
|
/* Initialization and finalization code.
|
||||||
|
*
|
||||||
|
* Various files can provide initialization and finalization functions.
|
||||||
|
* The bodies of these functions are in .init and .fini sections. We
|
||||||
|
* accumulate the bodies here, and prepend function prologues from
|
||||||
|
* ecrti.o and function epilogues from ecrtn.o. ecrti.o must be linked
|
||||||
|
* first; ecrtn.o must be linked last. Because these are wildcards, it
|
||||||
|
* doesn't matter if the user does not actually link against ecrti.o and
|
||||||
|
* ecrtn.o; the linker won't look for a file to match a wildcard. The
|
||||||
|
* wildcard also means that it doesn't matter which directory ecrti.o
|
||||||
|
* and ecrtn.o are in.
|
||||||
|
*/
|
||||||
|
PROVIDE (_init = .);
|
||||||
|
*ecrti.o(.init)
|
||||||
|
*(.init)
|
||||||
|
*ecrtn.o(.init)
|
||||||
|
|
||||||
|
PROVIDE (_fini = .);
|
||||||
|
*ecrti.o(.fini)
|
||||||
|
*(.fini)
|
||||||
|
*ecrtn.o(.init)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* C++ constructors and destructors for static objects.
|
||||||
|
* PowerPC EABI does not use crtstuff yet, so we build "old-style"
|
||||||
|
* constructor and destructor lists that begin with the list lenght
|
||||||
|
* end terminate with a NULL entry.
|
||||||
|
*/
|
||||||
|
|
||||||
|
PROVIDE (__CTOR_LIST__ = .);
|
||||||
|
*crtbegin.o(.ctors)
|
||||||
|
*(.ctors)
|
||||||
|
*crtend.o(.ctors)
|
||||||
|
LONG(0)
|
||||||
|
PROVIDE (__CTOR_END__ = .);
|
||||||
|
|
||||||
|
PROVIDE (__DTOR_LIST__ = .);
|
||||||
|
*crtbegin.o(.dtors)
|
||||||
|
*(.dtors)
|
||||||
|
*crtend.o(.dtors)
|
||||||
|
LONG(0)
|
||||||
|
PROVIDE (__DTOR_END__ = .);
|
||||||
|
|
||||||
|
/* Exception frame info */
|
||||||
|
*(.eh_frame)
|
||||||
|
/* Miscellaneous read-only data */
|
||||||
|
_rodata_start = . ;
|
||||||
|
*(.gnu.linkonce.r*)
|
||||||
|
*(.lit)
|
||||||
|
*(.shdata)
|
||||||
|
*(.rodata)
|
||||||
|
*(.rodata1)
|
||||||
|
*(.descriptors)
|
||||||
|
*(rom_ver)
|
||||||
|
_erodata = .;
|
||||||
|
|
||||||
|
PROVIDE (__EXCEPT_START__ = .);
|
||||||
|
*(.gcc_except_table*)
|
||||||
|
PROVIDE (__EXCEPT_END__ = .);
|
||||||
|
__GOT_START__ = .;
|
||||||
|
s.got = .;
|
||||||
|
*(.got.plt)
|
||||||
|
*(.got)
|
||||||
|
*(.got1)
|
||||||
|
PROVIDE (__GOT2_START__ = .);
|
||||||
|
PROVIDE (_GOT2_START_ = .);
|
||||||
|
*(.got2)
|
||||||
|
PROVIDE (__GOT2_END__ = .);
|
||||||
|
PROVIDE (_GOT2_END_ = .);
|
||||||
|
|
||||||
|
PROVIDE (__FIXUP_START__ = .);
|
||||||
|
PROVIDE (_FIXUP_START_ = .);
|
||||||
|
*(.fixup)
|
||||||
|
PROVIDE (_FIXUP_END_ = .);
|
||||||
|
PROVIDE (__FIXUP_END__ = .);
|
||||||
|
|
||||||
|
|
||||||
|
/* Various possible names for the end of the .text section */
|
||||||
|
etext = ALIGN(0x10);
|
||||||
|
_etext = .;
|
||||||
|
|
||||||
|
*(.lit)
|
||||||
|
*(.shdata)
|
||||||
|
_endtext = ALIGN(0x10);
|
||||||
|
text.end = .;
|
||||||
|
text.size = text.end - text.start;
|
||||||
|
} >RAM
|
||||||
|
|
||||||
|
text.size = text.end - text.start;
|
||||||
|
|
||||||
|
.jcr : { KEEP (*(.jcr)) } >RAM
|
||||||
|
|
||||||
|
.rel.dyn : {
|
||||||
|
*(.rel.init)
|
||||||
|
*(.rel.text .rel.text.* .rel.gnu.linkonce.t.*)
|
||||||
|
*(.rel.fini)
|
||||||
|
*(.rel.rodata .rel.rodata.* .rel.gnu.linkonce.r.*)
|
||||||
|
*(.rel.data.rel.ro* .rel.gnu.linkonce.d.rel.ro.*)
|
||||||
|
*(.rel.data .rel.data.* .rel.gnu.linkonce.d.*)
|
||||||
|
*(.rel.tdata .rel.tdata.* .rel.gnu.linkonce.td.*)
|
||||||
|
*(.rel.tbss .rel.tbss.* .rel.gnu.linkonce.tb.*)
|
||||||
|
*(.rel.ctors)
|
||||||
|
*(.rel.dtors)
|
||||||
|
*(.rel.got)
|
||||||
|
*(.rel.sdata .rel.sdata.* .rel.gnu.linkonce.s.*)
|
||||||
|
*(.rel.sbss .rel.sbss.* .rel.gnu.linkonce.sb.*)
|
||||||
|
*(.rel.sdata2 .rel.sdata2.* .rel.gnu.linkonce.s2.*)
|
||||||
|
*(.rel.sbss2 .rel.sbss2.* .rel.gnu.linkonce.sb2.*)
|
||||||
|
*(.rel.bss .rel.bss.* .rel.gnu.linkonce.b.*)
|
||||||
|
} >RAM
|
||||||
|
.rela.dyn : {
|
||||||
|
*(.rela.init)
|
||||||
|
*(.rela.text .rela.text.* .rela.gnu.linkonce.t.*)
|
||||||
|
*(.rela.fini)
|
||||||
|
*(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*)
|
||||||
|
*(.rela.data .rela.data.* .rela.gnu.linkonce.d.*)
|
||||||
|
*(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*)
|
||||||
|
*(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*)
|
||||||
|
*(.rela.ctors)
|
||||||
|
*(.rela.dtors)
|
||||||
|
*(.rela.got)
|
||||||
|
*(.rela.got1)
|
||||||
|
*(.rela.got2)
|
||||||
|
*(.rela.sdata .rela.sdata.* .rela.gnu.linkonce.s.*)
|
||||||
|
*(.rela.sbss .rela.sbss.* .rela.gnu.linkonce.sb.*)
|
||||||
|
*(.rela.sdata2 .rela.sdata2.* .rela.gnu.linkonce.s2.*)
|
||||||
|
*(.rela.sbss2 .rela.sbss2.* .rela.gnu.linkonce.sb2.*)
|
||||||
|
*(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*)
|
||||||
|
} >RAM
|
||||||
|
|
||||||
|
|
||||||
|
/* Initialised large data */
|
||||||
|
.data ( . ) :
|
||||||
|
{
|
||||||
|
. = ALIGN (4);
|
||||||
|
data.start = .;
|
||||||
|
*(.data)
|
||||||
|
*(.data1)
|
||||||
|
*(.data.* .gnu.linkonce.d.*)
|
||||||
|
data.end = .;
|
||||||
|
} > RAM
|
||||||
|
|
||||||
|
/* Initialised small data addressed as offsets from r13 */
|
||||||
|
.sdata : {
|
||||||
|
. = ALIGN (4);
|
||||||
|
PROVIDE (__SDATA_START__ = .);
|
||||||
|
sdata.start = .;
|
||||||
|
*(.sdata*)
|
||||||
|
*(.gnu.linkonce.s.*)
|
||||||
|
sdata.end = .;
|
||||||
|
} > RAM
|
||||||
|
|
||||||
|
/* Zeroed small data addressed as offsets from r13 */
|
||||||
|
.sbss : {
|
||||||
|
. = ALIGN (4);
|
||||||
|
PROVIDE(__SBSS_START__ = .);
|
||||||
|
sbss.start = .;
|
||||||
|
*(.sbss*)
|
||||||
|
*(.gnu.linkonce.sb.*);
|
||||||
|
sbss.end = .;
|
||||||
|
} > RAM
|
||||||
|
PROVIDE(__SBSS_END__ = .);
|
||||||
|
|
||||||
|
/* Zeroed large data */
|
||||||
|
.bss : {
|
||||||
|
. = ALIGN (4);
|
||||||
|
bss.start = .;
|
||||||
|
*(.bss .bss* .gnu.linkonce.b*)
|
||||||
|
. = ALIGN(4);
|
||||||
|
bss.end = .;
|
||||||
|
} > RAM
|
||||||
|
|
||||||
|
bss.size = bss.end - bss.start;
|
||||||
|
sbss.size = sbss.end - sbss.start;
|
||||||
|
|
||||||
|
/* Interrupt stack: align to a cache-line boundary */
|
||||||
|
IntrStack_start = ALIGN(0x20);
|
||||||
|
. += kIntrStackSize;
|
||||||
|
intrStack = .;
|
||||||
|
PROVIDE(intrStackPtr = intrStack);
|
||||||
|
|
||||||
|
/* Main stack: align to a cache-line boundary */
|
||||||
|
stack.start = ALIGN(0x20);
|
||||||
|
. += kMainStackSize;
|
||||||
|
stack.end = .;
|
||||||
|
|
||||||
|
/* RTEMS workspace: size specified by application */
|
||||||
|
_WorkspaceStart = ALIGN(0x20);
|
||||||
|
|
||||||
|
/* Heap: from end of the workspace to _RAMEnd */
|
||||||
|
_RAMEnd = ORIGIN(RAM) + LENGTH(RAM);
|
||||||
|
|
||||||
|
/* Debugging information */
|
||||||
|
.line 0 : { *(.line) }
|
||||||
|
.debug 0 : { *(.debug) }
|
||||||
|
.debug_sfnames 0 : { *(.debug_sfnames) }
|
||||||
|
.debug_srcinfo 0 : { *(.debug_srcinfo) }
|
||||||
|
.debug_pubnames 0 : { *(.debug_pubnames) }
|
||||||
|
.debug_aranges 0 : { *(.debug_aranges) }
|
||||||
|
.debug_aregion 0 : { *(.debug_aregion) }
|
||||||
|
.debug_macinfo 0 : { *(.debug_macinfo) }
|
||||||
|
.stab 0 : { *(.stab) }
|
||||||
|
.stabstr 0 : { *(.stabstr) }
|
||||||
|
}
|
||||||
@@ -74,9 +74,7 @@ static struct uart_data uart_data[2] = {
|
|||||||
static inline unsigned char
|
static inline unsigned char
|
||||||
uread(int uart, unsigned int reg)
|
uread(int uart, unsigned int reg)
|
||||||
{
|
{
|
||||||
|
|
||||||
return in_8((unsigned char*)(uart_data[uart].ioBase + reg));
|
return in_8((unsigned char*)(uart_data[uart].ioBase + reg));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
|
|||||||
@@ -1,3 +1,13 @@
|
|||||||
|
2008-07-14 Thomas Doerfler <thomas.doerfler@embedded-brains.de>
|
||||||
|
|
||||||
|
* Makefile.am, new-exceptions/raw_exception.c,
|
||||||
|
* new-exceptions/bspsupport/irq.c, ppc403/clock/clock_4xx.c,
|
||||||
|
* ppc403/include/ppc405ex.h, ppc403/include/ppc405gp.h,
|
||||||
|
* ppc403/timer/timer.c, rtems/powerpc/powerpc.h,
|
||||||
|
* shared/include/cpuIdent.c, shared/include/cpuIdent.h,
|
||||||
|
* shared/include/powerpc-utility.h:
|
||||||
|
Added support for PPC405EX (contributed by Michael Hamel)
|
||||||
|
|
||||||
2008-07-11 Sebastian Huber <sebastian.huber@embedded-brains.de>
|
2008-07-11 Sebastian Huber <sebastian.huber@embedded-brains.de>
|
||||||
|
|
||||||
* Makefile.am: Install powerpc-utility.h.
|
* Makefile.am: Install powerpc-utility.h.
|
||||||
@@ -15,13 +25,14 @@
|
|||||||
ppc_exc_vector_base for CPUs with IVPR register.
|
ppc_exc_vector_base for CPUs with IVPR register.
|
||||||
|
|
||||||
* new-exceptions/bspsupport/ppc_exc.S,
|
* new-exceptions/bspsupport/ppc_exc.S,
|
||||||
new-exceptions/bspsupport/ppc_exc_asm_macros.h,
|
* new-exceptions/bspsupport/ppc_exc_asm_macros.h,
|
||||||
new-exceptions/bspsupport/ppc_exc_bspsupp.h,
|
* new-exceptions/bspsupport/ppc_exc_bspsupp.h,
|
||||||
new-exceptions/bspsupport/ppc_exc_hdl.c,
|
* new-exceptions/bspsupport/ppc_exc_hdl.c,
|
||||||
new-exceptions/bspsupport/vectors.h,
|
* new-exceptions/bspsupport/vectors.h,
|
||||||
new-exceptions/bspsupport/vectors_init.c: Conistent code layout in most
|
* new-exceptions/bspsupport/vectors_init.c:
|
||||||
assember code sections and usage of defines for registers. Usage of
|
Conistent code layout in most assember code sections and usage of
|
||||||
standard header files to avoid multiple definitions.
|
defines for registers. Usage of standard header files to avoid
|
||||||
|
multiple definitions.
|
||||||
|
|
||||||
Optimized exception code: Removed many branches and exploit branch
|
Optimized exception code: Removed many branches and exploit branch
|
||||||
prediction for asynchronous exceptions, moved common wrap code into
|
prediction for asynchronous exceptions, moved common wrap code into
|
||||||
|
|||||||
@@ -126,8 +126,19 @@ ppc403_tty_drv_rel_CPPFLAGS = $(AM_CPPFLAGS)
|
|||||||
ppc403_tty_drv_rel_LDFLAGS = $(RTEMS_RELLDFLAGS)
|
ppc403_tty_drv_rel_LDFLAGS = $(RTEMS_RELLDFLAGS)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
endif
|
endif # ppc403
|
||||||
|
|
||||||
|
if ppc405
|
||||||
|
|
||||||
|
## ppc4xx/include
|
||||||
|
include_ppc4xxdir = $(includedir)/ppc4xx
|
||||||
|
include_ppc4xx_HEADERS = ppc403/include/ppc405gp.h \
|
||||||
|
ppc403/include/ppc405ex.h
|
||||||
|
|
||||||
|
endif # ppc405
|
||||||
|
|
||||||
|
|
||||||
|
## mpc5xx
|
||||||
EXTRA_DIST += mpc5xx/README
|
EXTRA_DIST += mpc5xx/README
|
||||||
if mpc5xx
|
if mpc5xx
|
||||||
include_mpc5xxdir = $(includedir)/mpc5xx
|
include_mpc5xxdir = $(includedir)/mpc5xx
|
||||||
@@ -341,6 +352,7 @@ mpc8260_timer_rel_LDFLAGS = $(RTEMS_RELLDFLAGS)
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
if mpc83xx
|
if mpc83xx
|
||||||
|
|
||||||
include_mpc83xxdir = $(includedir)/mpc83xx
|
include_mpc83xxdir = $(includedir)/mpc83xx
|
||||||
include_mpc83xx_HEADERS = mpc83xx/include/mpc83xx.h
|
include_mpc83xx_HEADERS = mpc83xx/include/mpc83xx.h
|
||||||
include_mpc83xx_HEADERS += mpc83xx/network/tsec.h
|
include_mpc83xx_HEADERS += mpc83xx/network/tsec.h
|
||||||
|
|||||||
@@ -38,6 +38,7 @@ static rtems_irq_connect_data* rtems_hdl_tbl;
|
|||||||
|
|
||||||
|
|
||||||
SPR_RW(BOOKE_TSR)
|
SPR_RW(BOOKE_TSR)
|
||||||
|
SPR_RW(PPC405_TSR)
|
||||||
|
|
||||||
/* legacy mode for bookE DEC exception;
|
/* legacy mode for bookE DEC exception;
|
||||||
* to avoid the double layer of function calls
|
* to avoid the double layer of function calls
|
||||||
@@ -52,7 +53,11 @@ int C_dispatch_dec_handler_bookE (BSP_Exception_frame *frame, unsigned int excNu
|
|||||||
/* clear interrupt; we must do this
|
/* clear interrupt; we must do this
|
||||||
* before C_dispatch_irq_handler()
|
* before C_dispatch_irq_handler()
|
||||||
* re-enables MSR_EE.
|
* re-enables MSR_EE.
|
||||||
|
* Note that PPC405 uses a different SPR# for TSR
|
||||||
*/
|
*/
|
||||||
|
if ( ppc_cpu_is_bookE()==PPC_BOOKE_405)
|
||||||
|
_write_PPC405_TSR( BOOKE_TSR_DIS );
|
||||||
|
else
|
||||||
_write_BOOKE_TSR( BOOKE_TSR_DIS );
|
_write_BOOKE_TSR( BOOKE_TSR_DIS );
|
||||||
return C_dispatch_irq_handler(frame, ASM_DEC_VECTOR);
|
return C_dispatch_irq_handler(frame, ASM_DEC_VECTOR);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -162,7 +162,8 @@ static const cat_ini_t mpc_5xx_vector_categories[LAST_VALID_EXC + 1] = {
|
|||||||
|
|
||||||
static const cat_ini_t ppc_405_vector_categories[LAST_VALID_EXC + 1] = {
|
static const cat_ini_t ppc_405_vector_categories[LAST_VALID_EXC + 1] = {
|
||||||
[ ASM_EXT_VECTOR ] = PPC_EXC_CLASSIC | PPC_EXC_ASYNC,
|
[ ASM_EXT_VECTOR ] = PPC_EXC_CLASSIC | PPC_EXC_ASYNC,
|
||||||
[ ASM_BOOKE_DEC_VECTOR ] = PPC_EXC_CLASSIC | PPC_EXC_ASYNC,
|
[ ASM_BOOKE_DEC_VECTOR ] = PPC_EXC_CLASSIC | PPC_EXC_ASYNC, /* PIT */
|
||||||
|
[ ASM_BOOKE_FIT_VECTOR ] = PPC_EXC_CLASSIC | PPC_EXC_ASYNC, /* FIT */
|
||||||
|
|
||||||
[ ASM_PROT_VECTOR ] = PPC_EXC_CLASSIC,
|
[ ASM_PROT_VECTOR ] = PPC_EXC_CLASSIC,
|
||||||
[ ASM_ISI_VECTOR ] = PPC_EXC_CLASSIC,
|
[ ASM_ISI_VECTOR ] = PPC_EXC_CLASSIC,
|
||||||
@@ -371,6 +372,8 @@ ppc_raw_exception_category rval = PPC_EXC_INVALID;
|
|||||||
rval = mpc_860_vector_categories[vector];
|
rval = mpc_860_vector_categories[vector];
|
||||||
break;
|
break;
|
||||||
case PPC_405:
|
case PPC_405:
|
||||||
|
case PPC_405GP:
|
||||||
|
case PPC_405EX:
|
||||||
rval = ppc_405_vector_categories[vector];
|
rval = ppc_405_vector_categories[vector];
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
|||||||
251
c/src/lib/libcpu/powerpc/ppc403/clock/clock_4xx.c
Normal file
251
c/src/lib/libcpu/powerpc/ppc403/clock/clock_4xx.c
Normal file
@@ -0,0 +1,251 @@
|
|||||||
|
/* clock.c
|
||||||
|
*
|
||||||
|
* This routine initializes the interval timer on the
|
||||||
|
* PowerPC 405 CPU. The tick frequency is specified by the bsp.
|
||||||
|
*
|
||||||
|
* Author: Andrew Bray <andy@i-cubed.co.uk>
|
||||||
|
*
|
||||||
|
* COPYRIGHT (c) 1995 by i-cubed ltd.
|
||||||
|
*
|
||||||
|
* To anyone who acknowledges that this file is provided "AS IS"
|
||||||
|
* without any express or implied warranty:
|
||||||
|
* permission to use, copy, modify, and distribute this file
|
||||||
|
* for any purpose is hereby granted without fee, provided that
|
||||||
|
* the above copyright notice and this notice appears in all
|
||||||
|
* copies, and that the name of i-cubed limited not be used in
|
||||||
|
* advertising or publicity pertaining to distribution of the
|
||||||
|
* software without specific, written prior permission.
|
||||||
|
* i-cubed limited makes no representations about the suitability
|
||||||
|
* of this software for any purpose.
|
||||||
|
*
|
||||||
|
* Derived from c/src/lib/libcpu/hppa1.1/clock/clock.c:
|
||||||
|
*
|
||||||
|
* Modifications for deriving timer clock from cpu system clock by
|
||||||
|
* Thomas Doerfler <td@imd.m.isar.de>
|
||||||
|
* for these modifications:
|
||||||
|
* COPYRIGHT (c) 1997 by IMD, Puchheim, Germany.
|
||||||
|
*
|
||||||
|
* COPYRIGHT (c) 1989-2007.
|
||||||
|
* On-Line Applications Research Corporation (OAR).
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* Modifications for PPC405GP by Dennis Ehlin
|
||||||
|
*
|
||||||
|
* Further modifications for PPC405GP/EX by Michael Hamel
|
||||||
|
*
|
||||||
|
* $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <rtems.h>
|
||||||
|
#include <rtems/clockdrv.h>
|
||||||
|
#include <rtems/libio.h>
|
||||||
|
#include <stdlib.h> /* for atexit() */
|
||||||
|
#include <rtems/bspIo.h>
|
||||||
|
#include <ppc405common.h>
|
||||||
|
#include <libcpu/cpuIdent.h>
|
||||||
|
#include <bsp/irq.h>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* PPC405GP */
|
||||||
|
#define CPC0_CR1 0xB2
|
||||||
|
#define CR1_CETE 0x00800000
|
||||||
|
|
||||||
|
/* PPC405EX */
|
||||||
|
#define SDR0_C405 0x180
|
||||||
|
#define SDR_CETE 0x02000000
|
||||||
|
|
||||||
|
volatile uint32_t Clock_driver_ticks;
|
||||||
|
static uint32_t pit_value, tick_time;
|
||||||
|
|
||||||
|
void Clock_exit( void );
|
||||||
|
|
||||||
|
rtems_isr_entry set_vector( /* returns old vector */
|
||||||
|
rtems_isr_entry handler, /* isr routine */
|
||||||
|
rtems_vector_number vector, /* vector number */
|
||||||
|
int type /* RTEMS or RAW intr */
|
||||||
|
);
|
||||||
|
|
||||||
|
/* Defined in bspstart.c */
|
||||||
|
extern uint32_t bsp_clicks_per_usec;
|
||||||
|
extern boolean bsp_timer_internal_clock;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* These are set by clock driver during its init
|
||||||
|
*/
|
||||||
|
|
||||||
|
rtems_device_major_number rtems_clock_major = ~0;
|
||||||
|
rtems_device_minor_number rtems_clock_minor;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ISR Handler
|
||||||
|
*/
|
||||||
|
|
||||||
|
void Clock_isr(void* handle)
|
||||||
|
{
|
||||||
|
Clock_driver_ticks++;
|
||||||
|
rtems_clock_tick();
|
||||||
|
}
|
||||||
|
|
||||||
|
int ClockIsOn(const rtems_irq_connect_data* unused)
|
||||||
|
{
|
||||||
|
return ((mfspr(TCR) & PIE) != 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ClockOff(const rtems_irq_connect_data* unused)
|
||||||
|
{
|
||||||
|
register uint32_t r;
|
||||||
|
|
||||||
|
r = mfspr(TCR);
|
||||||
|
mtspr(TCR, r & ~(PIE | ARE) );
|
||||||
|
}
|
||||||
|
|
||||||
|
void ClockOn(const rtems_irq_connect_data* unused)
|
||||||
|
{
|
||||||
|
uint32_t iocr, r;
|
||||||
|
ppc_cpu_id_t cpu;
|
||||||
|
Clock_driver_ticks = 0;
|
||||||
|
|
||||||
|
cpu = get_ppc_cpu_type();
|
||||||
|
if (cpu==PPC_405GP) {
|
||||||
|
iocr = mfdcr(CPC0_CR1);
|
||||||
|
if (bsp_timer_internal_clock) iocr &= ~CR1_CETE ;/* timer clocked from system clock */
|
||||||
|
else iocr |= CR1_CETE; /* select external timer clock */
|
||||||
|
mtdcr(CPC0_CR1,iocr);
|
||||||
|
} else if (cpu==PPC_405EX) {
|
||||||
|
mfsdr(SDR0_C405,iocr);
|
||||||
|
if (bsp_timer_internal_clock) iocr &= ~SDR_CETE ;/* timer clocked from system clock */
|
||||||
|
else iocr |= SDR_CETE; /* select external timer clock */
|
||||||
|
mtsdr(SDR0_C405,iocr);
|
||||||
|
} else {
|
||||||
|
printk("clock.c:unrecognised CPU");
|
||||||
|
rtems_fatal_error_occurred(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
pit_value = rtems_configuration_get_microseconds_per_tick() * bsp_clicks_per_usec;
|
||||||
|
mtspr(PIT,pit_value);
|
||||||
|
|
||||||
|
tick_time = mfspr(TBL) + pit_value;
|
||||||
|
r = mfspr(TCR);
|
||||||
|
mtspr(TCR, r | PIE | ARE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void Install_clock(void (*clock_isr)(void *))
|
||||||
|
{
|
||||||
|
|
||||||
|
/*
|
||||||
|
* initialize the interval here
|
||||||
|
* First tick is set to right amount of time in the future
|
||||||
|
* Future ticks will be incremented over last value set
|
||||||
|
* in order to provide consistent clicks in the face of
|
||||||
|
* interrupt overhead
|
||||||
|
*/
|
||||||
|
|
||||||
|
rtems_irq_connect_data clockIrqConnData;
|
||||||
|
|
||||||
|
Clock_driver_ticks = 0;
|
||||||
|
clockIrqConnData.on = ClockOn;
|
||||||
|
clockIrqConnData.off = ClockOff;
|
||||||
|
clockIrqConnData.isOn = ClockIsOn;
|
||||||
|
clockIrqConnData.name = BSP_PIT;
|
||||||
|
clockIrqConnData.hdl = clock_isr;
|
||||||
|
if ( ! BSP_install_rtems_irq_handler (&clockIrqConnData)) {
|
||||||
|
printk("Unable to connect Clock Irq handler\n");
|
||||||
|
rtems_fatal_error_occurred(1);
|
||||||
|
}
|
||||||
|
atexit(Clock_exit);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ReInstall_clock(void (*new_clock_isr)(void *))
|
||||||
|
{
|
||||||
|
uint32_t isrlevel = 0;
|
||||||
|
rtems_irq_connect_data clockIrqConnData;
|
||||||
|
|
||||||
|
rtems_interrupt_disable(isrlevel);
|
||||||
|
clockIrqConnData.name = BSP_PIT;
|
||||||
|
if ( ! BSP_get_current_rtems_irq_handler(&clockIrqConnData)) {
|
||||||
|
printk("Unable to stop system clock\n");
|
||||||
|
rtems_fatal_error_occurred(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
BSP_remove_rtems_irq_handler (&clockIrqConnData);
|
||||||
|
clockIrqConnData.on = ClockOn;
|
||||||
|
clockIrqConnData.off = ClockOff;
|
||||||
|
clockIrqConnData.isOn = ClockIsOn;
|
||||||
|
clockIrqConnData.name = BSP_PIT;
|
||||||
|
clockIrqConnData.hdl = new_clock_isr;
|
||||||
|
if (!BSP_install_rtems_irq_handler (&clockIrqConnData)) {
|
||||||
|
printk("Unable to connect Clock Irq handler\n");
|
||||||
|
rtems_fatal_error_occurred(1);
|
||||||
|
}
|
||||||
|
rtems_interrupt_enable(isrlevel);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Called via atexit()
|
||||||
|
* Remove the clock interrupt handler by setting handler to NULL
|
||||||
|
*
|
||||||
|
* This will not work on the 405GP because
|
||||||
|
* when bit's are set in TCR they can only be unset by a reset
|
||||||
|
*/
|
||||||
|
|
||||||
|
void Clock_exit(void)
|
||||||
|
{
|
||||||
|
rtems_irq_connect_data clockIrqConnData;
|
||||||
|
|
||||||
|
clockIrqConnData.name = BSP_PIT;
|
||||||
|
if (!BSP_get_current_rtems_irq_handler(&clockIrqConnData)) {
|
||||||
|
printk("Unable to stop system clock\n");
|
||||||
|
rtems_fatal_error_occurred(1);
|
||||||
|
}
|
||||||
|
BSP_remove_rtems_irq_handler (&clockIrqConnData);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
rtems_device_driver Clock_initialize(
|
||||||
|
rtems_device_major_number major,
|
||||||
|
rtems_device_minor_number minor,
|
||||||
|
void *pargp
|
||||||
|
)
|
||||||
|
{
|
||||||
|
Install_clock( Clock_isr );
|
||||||
|
|
||||||
|
/*
|
||||||
|
* make major/minor avail to others such as shared memory driver
|
||||||
|
*/
|
||||||
|
rtems_clock_major = major;
|
||||||
|
rtems_clock_minor = minor;
|
||||||
|
|
||||||
|
return RTEMS_SUCCESSFUL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
rtems_device_driver Clock_control(
|
||||||
|
rtems_device_major_number major,
|
||||||
|
rtems_device_minor_number minor,
|
||||||
|
void *pargp
|
||||||
|
)
|
||||||
|
{
|
||||||
|
rtems_libio_ioctl_args_t* args = pargp;
|
||||||
|
|
||||||
|
if (args!=NULL) {
|
||||||
|
/*
|
||||||
|
* This is hokey, but until we get a defined interface
|
||||||
|
* to do this, it will just be this simple...
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (args->command == rtems_build_name('I', 'S', 'R', ' '))
|
||||||
|
Clock_isr(NULL);
|
||||||
|
else if (args->command == rtems_build_name('N', 'E', 'W', ' '))
|
||||||
|
ReInstall_clock(args->buffer);
|
||||||
|
}
|
||||||
|
return RTEMS_SUCCESSFUL;
|
||||||
|
}
|
||||||
158
c/src/lib/libcpu/powerpc/ppc403/include/ppc405ex.h
Normal file
158
c/src/lib/libcpu/powerpc/ppc403/include/ppc405ex.h
Normal file
@@ -0,0 +1,158 @@
|
|||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
Constants for manipulating system registers of PPC 405EX in C
|
||||||
|
|
||||||
|
Michael Hamel ADInstruments May 2008
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <libcpu/powerpc-utility.h>
|
||||||
|
/* Indirect access to Clocking/Power-On registers */
|
||||||
|
#define CPR0_DCR_BASE 0x0C
|
||||||
|
#define cprcfga (CPR0_DCR_BASE+0x0)
|
||||||
|
#define cprcfgd (CPR0_DCR_BASE+0x1)
|
||||||
|
|
||||||
|
#define mtcpr(reg, d) \
|
||||||
|
do { \
|
||||||
|
PPC_SET_DEVICE_CONTROL_REGISTER(cprcfga,reg); \
|
||||||
|
PPC_SET_DEVICE_CONTROL_REGISTER(cprcfgd,d); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define mfcpr(reg, d) \
|
||||||
|
do { \
|
||||||
|
PPC_SET_DEVICE_CONTROL_REGISTER(cprcfga,reg); \
|
||||||
|
d = PPC_DEVICE_CONTROL_REGISTER(cprcfgd); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
|
||||||
|
/* Indirect access to System registers */
|
||||||
|
#define SDR_DCR_BASE 0x0E
|
||||||
|
#define sdrcfga (SDR_DCR_BASE+0x0)
|
||||||
|
#define sdrcfgd (SDR_DCR_BASE+0x1)
|
||||||
|
|
||||||
|
#define mtsdr(reg, d) \
|
||||||
|
do { \
|
||||||
|
PPC_SET_DEVICE_CONTROL_REGISTER(sdrcfga,reg); \
|
||||||
|
PPC_SET_DEVICE_CONTROL_REGISTER(sdrcfgd,d); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define mfsdr(reg, d) \
|
||||||
|
do { \
|
||||||
|
PPC_SET_DEVICE_CONTROL_REGISTER(sdrcfga,reg); \
|
||||||
|
d = PPC_DEVICE_CONTROL_REGISTER(sdrcfgd); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/* Indirect access to EBC registers */
|
||||||
|
#define EBC_DCR_BASE 0x12
|
||||||
|
#define ebccfga (EBC_DCR_BASE+0x0)
|
||||||
|
#define ebccfgd (EBC_DCR_BASE+0x1)
|
||||||
|
|
||||||
|
#define mtebc(reg, d) \
|
||||||
|
do { \
|
||||||
|
PPC_SET_DEVICE_CONTROL_REGISTER(ebccfga,reg); \
|
||||||
|
PPC_SET_DEVICE_CONTROL_REGISTER(ebccfgd,d); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define mfebc(reg, d) \
|
||||||
|
do { \
|
||||||
|
PPC_SET_DEVICE_CONTROL_REGISTER(ebccfga,reg); \
|
||||||
|
d = PPC_DEVICE_CONTROL_REGISTER(ebccfgd); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/* EBC DCRs */
|
||||||
|
enum {
|
||||||
|
/*
|
||||||
|
EBC0_B0CR = 0,
|
||||||
|
EBC0_B1CR = 1,
|
||||||
|
EBC0_B2CR = 2,
|
||||||
|
EBC0_B3CR = 3,
|
||||||
|
EBC0_B0AP = 0x10,
|
||||||
|
EBC0_B1AP = 0x11,
|
||||||
|
EBC0_B2AP = 0x12,
|
||||||
|
EBC0_B3AP = 0x13,
|
||||||
|
EBC0_BEAR = 0x20,
|
||||||
|
EBC0_BESR = 0x21,
|
||||||
|
EBC0_CFG = 0x23,
|
||||||
|
*/
|
||||||
|
EBC0_CID = 0x24
|
||||||
|
};
|
||||||
|
|
||||||
|
enum {
|
||||||
|
SDR0_UART0 = 0x120,
|
||||||
|
SDR0_UART1 = 0x121,
|
||||||
|
SDR0_C405 = 0x180,
|
||||||
|
SDR0_MALTBL = 0x280,
|
||||||
|
SDR0_MALRBL = 0x2A0,
|
||||||
|
SDR0_MALTBS = 0x2C0,
|
||||||
|
SDR0_MALRBS = 0x2E0
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* Memory-mapped registers */
|
||||||
|
|
||||||
|
|
||||||
|
/*======================= Ethernet =================== */
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct EthernetRegisters_EX {
|
||||||
|
uint32_t mode0;
|
||||||
|
uint32_t mode1;
|
||||||
|
uint32_t xmtMode0;
|
||||||
|
uint32_t xmtMode1;
|
||||||
|
uint32_t rcvMode;
|
||||||
|
uint32_t intStatus;
|
||||||
|
uint32_t intEnable;
|
||||||
|
uint32_t addrHi;
|
||||||
|
uint32_t addrLo;
|
||||||
|
uint32_t VLANTPID;
|
||||||
|
uint32_t VLANTCI;
|
||||||
|
uint32_t pauseTimer;
|
||||||
|
uint32_t multicastAddr[2];
|
||||||
|
uint32_t multicastMask[2];
|
||||||
|
uint32_t unused[4];
|
||||||
|
uint32_t lastSrcLo;
|
||||||
|
uint32_t lastSrcHi;
|
||||||
|
uint32_t IPGap;
|
||||||
|
uint32_t STAcontrol;
|
||||||
|
uint32_t xmtReqThreshold;
|
||||||
|
uint32_t rcvWatermark;
|
||||||
|
uint32_t bytesXmtd;
|
||||||
|
uint32_t bytesRcvd;
|
||||||
|
uint32_t unused2;
|
||||||
|
uint32_t revID;
|
||||||
|
uint32_t unused3[2];
|
||||||
|
uint32_t indivHash[8];
|
||||||
|
uint32_t groupHash[8];
|
||||||
|
uint32_t xmtPause;
|
||||||
|
} EthernetRegisters_EX;
|
||||||
|
|
||||||
|
enum {
|
||||||
|
EMAC0Address = 0xEF600900,
|
||||||
|
EMAC1Address = 0xEF600A00
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct GPIORegisters {
|
||||||
|
uint32_t OR;
|
||||||
|
uint32_t GPIO_TCR; /* Note that TCR is defined as a DCR name */
|
||||||
|
uint32_t OSRL;
|
||||||
|
uint32_t OSRH;
|
||||||
|
uint32_t TSRL;
|
||||||
|
uint32_t TSRH;
|
||||||
|
uint32_t ODR;
|
||||||
|
uint32_t IR;
|
||||||
|
uint32_t RR1;
|
||||||
|
uint32_t RR2;
|
||||||
|
uint32_t RR3;
|
||||||
|
uint32_t unknown;
|
||||||
|
uint32_t ISR1L;
|
||||||
|
uint32_t ISR1H;
|
||||||
|
uint32_t ISR2L;
|
||||||
|
uint32_t ISR2H;
|
||||||
|
uint32_t ISR3L;
|
||||||
|
uint32_t ISR3H;
|
||||||
|
} GPIORegisters;
|
||||||
|
|
||||||
|
enum { GPIOAddress = 0xEF600800 };
|
||||||
|
|
||||||
146
c/src/lib/libcpu/powerpc/ppc403/include/ppc405gp.h
Normal file
146
c/src/lib/libcpu/powerpc/ppc403/include/ppc405gp.h
Normal file
@@ -0,0 +1,146 @@
|
|||||||
|
|
||||||
|
|
||||||
|
/* SDRAM DCRs */
|
||||||
|
enum {
|
||||||
|
SDRAM0_BESR0 = 0,
|
||||||
|
SDRAM0_BESR1 = 8,
|
||||||
|
SDRAM0_BEAR = 0x10,
|
||||||
|
SDRAM0_CFG = 0x20,
|
||||||
|
SDRAM0_STATUS = 0x24,
|
||||||
|
SDRAM0_RTR = 0x30,
|
||||||
|
SDRAM0_PMIT = 0x34,
|
||||||
|
SDRAM0_TR = 0x80
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* EBC DCRs */
|
||||||
|
enum {
|
||||||
|
EBC0_B0CR = 0,
|
||||||
|
EBC0_B1CR = 1,
|
||||||
|
EBC0_B2CR = 2,
|
||||||
|
EBC0_B3CR = 3,
|
||||||
|
EBC0_B4CR = 4,
|
||||||
|
EBC0_B5CR = 5,
|
||||||
|
EBC0_B6CR = 6,
|
||||||
|
EBC0_B7CR = 7,
|
||||||
|
EBC0_B0AP = 0x10,
|
||||||
|
EBC0_B1AP = 0x11,
|
||||||
|
EBC0_B2AP = 0x12,
|
||||||
|
EBC0_B3AP = 0x13,
|
||||||
|
EBC0_B4AP = 0x14,
|
||||||
|
EBC0_B5AP = 0x15,
|
||||||
|
EBC0_B6AP = 0x16,
|
||||||
|
EBC0_B7AP = 0x17,
|
||||||
|
EBC0_BEAR = 0x20,
|
||||||
|
EBC0_BESR0 = 0x21,
|
||||||
|
EBC0_BESR1 = 0x22,
|
||||||
|
EBC0_CFG = 0x23
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Memory-mapped registers */
|
||||||
|
|
||||||
|
typedef struct EthernetRegisters_GP {
|
||||||
|
uint32_t mode0;
|
||||||
|
uint32_t mode1;
|
||||||
|
uint32_t xmtMode0;
|
||||||
|
uint32_t xmtMode1;
|
||||||
|
uint32_t rcvMode;
|
||||||
|
uint32_t intStatus;
|
||||||
|
uint32_t intEnable;
|
||||||
|
uint32_t addrHi;
|
||||||
|
uint32_t addrLo;
|
||||||
|
uint32_t VLANTPID;
|
||||||
|
uint32_t VLANTCI;
|
||||||
|
uint32_t pauseTimer;
|
||||||
|
uint32_t indivHash[4];
|
||||||
|
uint32_t groupHash[4];
|
||||||
|
uint32_t lastSrcLo;
|
||||||
|
uint32_t lastSrcHi;
|
||||||
|
uint32_t IPGap;
|
||||||
|
uint32_t STAcontrol;
|
||||||
|
uint32_t xmtReqThreshold;
|
||||||
|
uint32_t rcvWatermark;
|
||||||
|
uint32_t bytesXmtd;
|
||||||
|
uint32_t bytesRcvd;
|
||||||
|
} EthernetRegisters_GP;
|
||||||
|
|
||||||
|
enum { EMACAddress = 0xEF600800 };
|
||||||
|
|
||||||
|
enum {
|
||||||
|
// Mode 0 bits
|
||||||
|
kEMACRxIdle = 0x80000000,
|
||||||
|
kEMACTxIdle = 0x40000000,
|
||||||
|
kEMACSoftRst = 0x20000000,
|
||||||
|
kEMACTxEnable = 0x10000000,
|
||||||
|
kEMACRxEnable = 0x08000000,
|
||||||
|
|
||||||
|
// Mode 1 bits
|
||||||
|
kEMACFullDuplex = 0x80000000,
|
||||||
|
kEMACIgnoreSQE = 0x01000000,
|
||||||
|
kEMAC100MBbps = 0x00400000,
|
||||||
|
kEMAC4KRxFIFO = 0x00300000,
|
||||||
|
kEMAC2KTxFIFO = 0x00080000,
|
||||||
|
kEMACTx0Multi = 0x00008000,
|
||||||
|
kEMACTxDependent= 0x00014000,
|
||||||
|
|
||||||
|
// Tx mode bits
|
||||||
|
kEMACNewPacket0 = 0x80000000,
|
||||||
|
kEMACNewPacket1 = 0x40000000,
|
||||||
|
|
||||||
|
// Receive mode bits
|
||||||
|
kEMACStripPadding = 0x80000000,
|
||||||
|
kEMACStripFCS = 0x40000000,
|
||||||
|
kEMACRcvRunts = 0x20000000,
|
||||||
|
kEMACRcvFCSErrs = 0x10000000,
|
||||||
|
kEMACRcvOversize = 0x08000000,
|
||||||
|
kEMACPromiscRcv = 0x01000000,
|
||||||
|
kEMACPromMultRcv = 0x00800000,
|
||||||
|
kEMACIndivRcv = 0x00400000,
|
||||||
|
kEMACHashRcv = 0x00200000,
|
||||||
|
kEMACBrcastRcv = 0x00100000,
|
||||||
|
kEMACMultcastRcv = 0x00080000,
|
||||||
|
|
||||||
|
// Buffer descriptor control bits
|
||||||
|
kMALTxReady = 0x8000,
|
||||||
|
kMALRxEmpty = 0x8000,
|
||||||
|
kMALWrap = 0x4000,
|
||||||
|
kMALContinuous = 0x2000,
|
||||||
|
kMALLast = 0x1000,
|
||||||
|
kMALRxFirst = 0x0800,
|
||||||
|
kMALInterrupt = 0x0400,
|
||||||
|
|
||||||
|
// EMAC Tx descriptor bits sent
|
||||||
|
kEMACGenFCS = 0x200,
|
||||||
|
kEMACGenPad = 0x100,
|
||||||
|
kEMACInsSrcAddr = 0x080,
|
||||||
|
kEMACRepSrcAddr = 0x040,
|
||||||
|
kEMACInsVLAN = 0x020,
|
||||||
|
kEMACRepVLAN = 0x010,
|
||||||
|
|
||||||
|
// EMAC TX descriptor bits returned
|
||||||
|
kEMACErrMask = 0x3FF,
|
||||||
|
kEMACFCSWrong = 0x200,
|
||||||
|
kEMACBadPrev = 0x100,
|
||||||
|
kEMACLostCarrier = 0x080,
|
||||||
|
kEMACDeferred = 0x040,
|
||||||
|
kEMACCollFail = 0x020,
|
||||||
|
kEMACLateColl = 0x010,
|
||||||
|
kEMACMultColl = 0x008,
|
||||||
|
kEMACOneColl = 0x004,
|
||||||
|
kEMACUnderrun = 0x002,
|
||||||
|
kEMACSQEFail = 0x001,
|
||||||
|
|
||||||
|
// EMAC Rx descriptor bits returned
|
||||||
|
kEMACOverrun = 0x200,
|
||||||
|
kEMACPausePkt = 0x100,
|
||||||
|
kEMACBadPkt = 0x080,
|
||||||
|
kEMACRuntPkt = 0x040,
|
||||||
|
kEMACShortEvt = 0x020,
|
||||||
|
kEMACAlignErr = 0x010,
|
||||||
|
kEMACBadFCS = 0x008,
|
||||||
|
kEMACPktLong = 0x004,
|
||||||
|
kEMACPktOOR = 0x002,
|
||||||
|
kEMACPktIRL = 0x001
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
/* timer.c
|
/* timer.c
|
||||||
*
|
*
|
||||||
* This file manages the interval timer on the PowerPC 403*.
|
* This file manages the interval timer on the PowerPC 405.
|
||||||
* We shall use the bottom 32 bits of the timebase register,
|
* We shall use the bottom 32 bits of the timebase register,
|
||||||
*
|
*
|
||||||
* NOTE: It is important that the timer start/stop overhead be
|
* NOTE: It is important that the timer start/stop overhead be
|
||||||
@@ -32,75 +32,39 @@
|
|||||||
*
|
*
|
||||||
* Modifications for PPC405GP by Dennis Ehlin
|
* Modifications for PPC405GP by Dennis Ehlin
|
||||||
*
|
*
|
||||||
|
* Further mods for PPC405EX/EXr by Michael Hamel
|
||||||
|
*
|
||||||
* $Id$
|
* $Id$
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <rtems.h>
|
#include <rtems.h>
|
||||||
|
#include <libcpu/powerpc-utility.h>
|
||||||
|
|
||||||
static volatile uint32_t Timer_starting;
|
extern uint32_t bsp_timer_least_valid;
|
||||||
static rtems_boolean Timer_driver_Find_average_overhead;
|
extern uint32_t bsp_timer_average_overhead;
|
||||||
|
|
||||||
/*
|
static volatile uint32_t startedAt;
|
||||||
* This is so small that this code will be reproduced where needed.
|
static rtems_boolean subtractOverhead;
|
||||||
*/
|
|
||||||
static inline uint32_t get_itimer(void)
|
|
||||||
{
|
|
||||||
uint32_t ret;
|
|
||||||
|
|
||||||
#ifndef ppc405
|
|
||||||
asm volatile ("mfspr %0, 0x3dd" : "=r" ((ret))); /* TBLO */
|
|
||||||
#else /* ppc405 */
|
|
||||||
/* asm volatile ("mfspr %0, 0x3dd" : "=r" ((ret))); TBLO */
|
|
||||||
|
|
||||||
asm volatile ("mfspr %0, 0x10c" : "=r" ((ret))); /* 405GP TBL */
|
|
||||||
#endif /* ppc405 */
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Timer_initialize()
|
void Timer_initialize()
|
||||||
{
|
{
|
||||||
uint32_t iocr;
|
/* We are going to rely on clock.c to sort out where the clock comes from */
|
||||||
|
startedAt = ppc_time_base();
|
||||||
#ifndef ppc405
|
|
||||||
asm volatile ("mfdcr %0, 0xa0" : "=r" (iocr)); /* IOCR */
|
|
||||||
iocr &= ~4;
|
|
||||||
iocr |= 4; /* Select external timer clock */
|
|
||||||
asm volatile ("mtdcr 0xa0, %0" : "=r" (iocr) : "0" (iocr)); /* IOCR */
|
|
||||||
#else /* ppc405 */
|
|
||||||
asm volatile ("mfdcr %0, 0x0b2" : "=r" (iocr)); /*405GP CPC0_CR1 */
|
|
||||||
/* asm volatile ("mfdcr %0, 0xa0" : "=r" (iocr)); IOCR */
|
|
||||||
|
|
||||||
/* iocr |= 0x800000; select external timer clock CETE*/
|
|
||||||
iocr &= ~0x800000; /* timer clocked from system clock CETE*/
|
|
||||||
|
|
||||||
asm volatile ("mtdcr 0x0b2, %0" : "=r" (iocr) : "0" (iocr)); /* 405GP CPC0_CR1 */
|
|
||||||
/* asm volatile ("mtdcr 0xa0, %0" : "=r" (iocr) : "0" (iocr)); IOCR */
|
|
||||||
#endif /* ppc405 */
|
|
||||||
|
|
||||||
Timer_starting = get_itimer();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int Read_timer()
|
int Read_timer()
|
||||||
{
|
{
|
||||||
uint32_t clicks;
|
uint32_t clicks, total;
|
||||||
uint32_t total;
|
|
||||||
extern uint32_t bsp_timer_least_valid;
|
|
||||||
extern uint32_t bsp_timer_average_overhead;
|
|
||||||
|
|
||||||
clicks = get_itimer();
|
clicks = ppc_time_base();
|
||||||
|
total = clicks - startedAt;
|
||||||
total = clicks - Timer_starting;
|
if ( ! subtractOverhead )
|
||||||
|
|
||||||
if ( Timer_driver_Find_average_overhead == 1 )
|
|
||||||
return total; /* in XXX microsecond units */
|
return total; /* in XXX microsecond units */
|
||||||
|
else if ( total < bsp_timer_least_valid )
|
||||||
else {
|
|
||||||
if ( total < bsp_timer_least_valid )
|
|
||||||
return 0; /* below timer resolution */
|
return 0; /* below timer resolution */
|
||||||
|
else
|
||||||
return (total - bsp_timer_average_overhead);
|
return (total - bsp_timer_average_overhead);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
rtems_status_code Empty_function( void )
|
rtems_status_code Empty_function( void )
|
||||||
@@ -108,9 +72,7 @@ rtems_status_code Empty_function( void )
|
|||||||
return RTEMS_SUCCESSFUL;
|
return RTEMS_SUCCESSFUL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Set_find_average_overhead(
|
void Set_find_average_overhead( rtems_boolean find_flag)
|
||||||
rtems_boolean find_flag
|
|
||||||
)
|
|
||||||
{
|
{
|
||||||
Timer_driver_Find_average_overhead = find_flag;
|
subtractOverhead = find_flag;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -45,6 +45,10 @@ $(PROJECT_INCLUDE)/libcpu/$(dirstamp):
|
|||||||
@: > $(PROJECT_INCLUDE)/libcpu/$(dirstamp)
|
@: > $(PROJECT_INCLUDE)/libcpu/$(dirstamp)
|
||||||
PREINSTALL_DIRS += $(PROJECT_INCLUDE)/libcpu/$(dirstamp)
|
PREINSTALL_DIRS += $(PROJECT_INCLUDE)/libcpu/$(dirstamp)
|
||||||
|
|
||||||
|
$(PROJECT_INCLUDE)/libcpu/powerpc-utility.h: shared/include/powerpc-utility.h $(PROJECT_INCLUDE)/libcpu/$(dirstamp)
|
||||||
|
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/libcpu/powerpc-utility.h
|
||||||
|
PREINSTALL_FILES += $(PROJECT_INCLUDE)/libcpu/powerpc-utility.h
|
||||||
|
|
||||||
if !mpc5xx
|
if !mpc5xx
|
||||||
$(PROJECT_INCLUDE)/libcpu/raw_exception.h: new-exceptions/raw_exception.h $(PROJECT_INCLUDE)/libcpu/$(dirstamp)
|
$(PROJECT_INCLUDE)/libcpu/raw_exception.h: new-exceptions/raw_exception.h $(PROJECT_INCLUDE)/libcpu/$(dirstamp)
|
||||||
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/libcpu/raw_exception.h
|
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/libcpu/raw_exception.h
|
||||||
@@ -93,7 +97,21 @@ $(PROJECT_INCLUDE)/tty_drv.h: ppc403/tty_drv/tty_drv.h $(PROJECT_INCLUDE)/$(dirs
|
|||||||
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/tty_drv.h
|
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/tty_drv.h
|
||||||
PREINSTALL_FILES += $(PROJECT_INCLUDE)/tty_drv.h
|
PREINSTALL_FILES += $(PROJECT_INCLUDE)/tty_drv.h
|
||||||
endif
|
endif
|
||||||
endif
|
endif # ppc403
|
||||||
|
if ppc405
|
||||||
|
$(PROJECT_INCLUDE)/ppc4xx/$(dirstamp):
|
||||||
|
@$(MKDIR_P) $(PROJECT_INCLUDE)/ppc4xx
|
||||||
|
@: > $(PROJECT_INCLUDE)/ppc4xx/$(dirstamp)
|
||||||
|
PREINSTALL_DIRS += $(PROJECT_INCLUDE)/ppc4xx/$(dirstamp)
|
||||||
|
|
||||||
|
$(PROJECT_INCLUDE)/ppc4xx/ppc405gp.h: ppc403/include/ppc405gp.h $(PROJECT_INCLUDE)/ppc4xx/$(dirstamp)
|
||||||
|
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/ppc4xx/ppc405gp.h
|
||||||
|
PREINSTALL_FILES += $(PROJECT_INCLUDE)/ppc4xx/ppc405gp.h
|
||||||
|
|
||||||
|
$(PROJECT_INCLUDE)/ppc4xx/ppc405ex.h: ppc403/include/ppc405ex.h $(PROJECT_INCLUDE)/ppc4xx/$(dirstamp)
|
||||||
|
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/ppc4xx/ppc405ex.h
|
||||||
|
PREINSTALL_FILES += $(PROJECT_INCLUDE)/ppc4xx/ppc405ex.h
|
||||||
|
endif # ppc405
|
||||||
if mpc5xx
|
if mpc5xx
|
||||||
$(PROJECT_INCLUDE)/mpc5xx/$(dirstamp):
|
$(PROJECT_INCLUDE)/mpc5xx/$(dirstamp):
|
||||||
@$(MKDIR_P) $(PROJECT_INCLUDE)/mpc5xx
|
@$(MKDIR_P) $(PROJECT_INCLUDE)/mpc5xx
|
||||||
|
|||||||
@@ -115,6 +115,17 @@ extern "C" {
|
|||||||
#define PPC_HAS_EXCEPTION_PREFIX 0
|
#define PPC_HAS_EXCEPTION_PREFIX 0
|
||||||
#define PPC_HAS_EVPR 1
|
#define PPC_HAS_EVPR 1
|
||||||
|
|
||||||
|
#elif defined (ppc405)
|
||||||
|
|
||||||
|
#define PPC_CACHE_ALIGNMENT 32
|
||||||
|
#define PPC_HAS_RI 0
|
||||||
|
#define PPC_HAS_RFCI 1
|
||||||
|
#define PPC_USE_MULTIPLE 1
|
||||||
|
#define PPC_I_CACHE 16384
|
||||||
|
#define PPC_D_CACHE 16384 /* except GP/CR */
|
||||||
|
#define PPC_HAS_EXCEPTION_PREFIX 0
|
||||||
|
#define PPC_HAS_EVPR 1
|
||||||
|
|
||||||
#elif defined(mpc555)
|
#elif defined(mpc555)
|
||||||
|
|
||||||
/* Copied from mpc505 */
|
/* Copied from mpc505 */
|
||||||
|
|||||||
@@ -31,6 +31,8 @@ char *get_ppc_cpu_type_name(ppc_cpu_id_t cpu)
|
|||||||
{
|
{
|
||||||
switch (cpu) {
|
switch (cpu) {
|
||||||
case PPC_405: return "PPC405";
|
case PPC_405: return "PPC405";
|
||||||
|
case PPC_405GP: return "PPC405GP";
|
||||||
|
case PPC_405EX: return "PPC405EX";
|
||||||
case PPC_601: return "MPC601";
|
case PPC_601: return "MPC601";
|
||||||
case PPC_5XX: return "MPC5XX";
|
case PPC_5XX: return "MPC5XX";
|
||||||
case PPC_603: return "MPC603";
|
case PPC_603: return "MPC603";
|
||||||
@@ -69,6 +71,8 @@ ppc_cpu_id_t get_ppc_cpu_type()
|
|||||||
|
|
||||||
switch (pvr) {
|
switch (pvr) {
|
||||||
case PPC_405:
|
case PPC_405:
|
||||||
|
case PPC_405GP:
|
||||||
|
case PPC_405EX:
|
||||||
case PPC_601:
|
case PPC_601:
|
||||||
case PPC_5XX:
|
case PPC_5XX:
|
||||||
case PPC_603:
|
case PPC_603:
|
||||||
@@ -128,6 +132,8 @@ ppc_cpu_id_t get_ppc_cpu_type()
|
|||||||
|
|
||||||
switch ( current_ppc_cpu ) {
|
switch ( current_ppc_cpu ) {
|
||||||
case PPC_405:
|
case PPC_405:
|
||||||
|
case PPC_405GP:
|
||||||
|
case PPC_405EX:
|
||||||
current_ppc_features.is_bookE = PPC_BOOKE_405;
|
current_ppc_features.is_bookE = PPC_BOOKE_405;
|
||||||
break;
|
break;
|
||||||
case PPC_8540:
|
case PPC_8540:
|
||||||
|
|||||||
@@ -32,6 +32,11 @@ typedef enum
|
|||||||
PPC_604r = 0xA,
|
PPC_604r = 0xA,
|
||||||
PPC_7400 = 0xC,
|
PPC_7400 = 0xC,
|
||||||
PPC_405 = 0x2001,
|
PPC_405 = 0x2001,
|
||||||
|
PPC_405EX = 0x1291, /* + 405EXr */
|
||||||
|
PPC_405GP = 0x4011, /* + 405CR */
|
||||||
|
PPC_405GPr = 0x5091,
|
||||||
|
PPC_405EZ = 0x4151,
|
||||||
|
PPC_405EP = 0x5121,
|
||||||
PPC_7455 = 0x8001, /* Kate Feng */
|
PPC_7455 = 0x8001, /* Kate Feng */
|
||||||
PPC_7457 = 0x8002,
|
PPC_7457 = 0x8002,
|
||||||
PPC_620 = 0x16,
|
PPC_620 = 0x16,
|
||||||
|
|||||||
@@ -15,6 +15,9 @@
|
|||||||
* Germany
|
* Germany
|
||||||
* rtems@embedded-brains.de
|
* rtems@embedded-brains.de
|
||||||
*
|
*
|
||||||
|
* access function for Device Control Registers inspired by "ppc405common.h"
|
||||||
|
* from Michael Hamel ADInstruments May 2008
|
||||||
|
*
|
||||||
* The license and distribution terms for this file may be found in the file
|
* 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.
|
* LICENSE in this distribution or at http://www.rtems.com/license/LICENSE.
|
||||||
*/
|
*/
|
||||||
@@ -189,6 +192,7 @@ static inline void ppc_write_word( uint32_t value, volatile void *dest)
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static inline void *ppc_stack_pointer()
|
static inline void *ppc_stack_pointer()
|
||||||
{
|
{
|
||||||
void *sp;
|
void *sp;
|
||||||
@@ -301,6 +305,8 @@ static inline void ppc_set_decrementer_register( uint32_t dec)
|
|||||||
PPC_Set_decrementer( dec);
|
PPC_Set_decrementer( dec);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define PPC_STRINGOF(x) #x
|
||||||
|
|
||||||
/* Do not use the following macros. Use the inline functions instead. */
|
/* Do not use the following macros. Use the inline functions instead. */
|
||||||
|
|
||||||
#define PPC_INTERNAL_MACRO_RETURN_SPECIAL_PURPOSE_REGISTER( spr) \
|
#define PPC_INTERNAL_MACRO_RETURN_SPECIAL_PURPOSE_REGISTER( spr) \
|
||||||
@@ -324,6 +330,20 @@ static inline void ppc_set_decrementer_register( uint32_t dec)
|
|||||||
#define PPC_INTERNAL_MACRO_SET_SPECIAL_PURPOSE_REGISTER_EXPAND( spr, val) \
|
#define PPC_INTERNAL_MACRO_SET_SPECIAL_PURPOSE_REGISTER_EXPAND( spr, val) \
|
||||||
PPC_INTERNAL_MACRO_SET_SPECIAL_PURPOSE_REGISTER( spr, val)
|
PPC_INTERNAL_MACRO_SET_SPECIAL_PURPOSE_REGISTER( spr, val)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* PPC4xx have Device Control Registers...
|
||||||
|
*/
|
||||||
|
#define PPC_DEVICE_CONTROL_REGISTER(dcr) \
|
||||||
|
({uint32_t val;asm volatile ("mfspr %0," PPC_STRINGOF(dcr) \
|
||||||
|
: "=r" (val)); val;})
|
||||||
|
|
||||||
|
#define PPC_SET_DEVICE_CONTROL_REGISTER(dcr,val) \
|
||||||
|
do { \
|
||||||
|
asm volatile ("mtspr " PPC_STRINGOF(dcr)",%0" \
|
||||||
|
:: "r" (val)); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
|
||||||
static inline uint32_t ppc_special_purpose_register_0()
|
static inline uint32_t ppc_special_purpose_register_0()
|
||||||
{
|
{
|
||||||
PPC_INTERNAL_MACRO_RETURN_SPECIAL_PURPOSE_REGISTER_EXPAND( SPRG0);
|
PPC_INTERNAL_MACRO_RETURN_SPECIAL_PURPOSE_REGISTER_EXPAND( SPRG0);
|
||||||
|
|||||||
@@ -126,6 +126,10 @@ $(PROJECT_INCLUDE)/rtems/tar.h: include/rtems/tar.h $(PROJECT_INCLUDE)/rtems/$(d
|
|||||||
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/tar.h
|
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/tar.h
|
||||||
PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/tar.h
|
PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/tar.h
|
||||||
|
|
||||||
|
$(PROJECT_INCLUDE)/rtems/status-checks.h: include/rtems/status-checks.h $(PROJECT_INCLUDE)/rtems/$(dirstamp)
|
||||||
|
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/status-checks.h
|
||||||
|
PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/status-checks.h
|
||||||
|
|
||||||
$(PROJECT_INCLUDE)/rtems/endian.h: include/rtems/endian.h $(PROJECT_INCLUDE)/rtems/$(dirstamp)
|
$(PROJECT_INCLUDE)/rtems/endian.h: include/rtems/endian.h $(PROJECT_INCLUDE)/rtems/$(dirstamp)
|
||||||
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/endian.h
|
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/endian.h
|
||||||
PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/endian.h
|
PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/endian.h
|
||||||
@@ -134,6 +138,10 @@ $(PROJECT_INCLUDE)/rtems/irq.h: include/rtems/irq.h $(PROJECT_INCLUDE)/rtems/$(d
|
|||||||
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/irq.h
|
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/irq.h
|
||||||
PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/irq.h
|
PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/irq.h
|
||||||
|
|
||||||
|
$(PROJECT_INCLUDE)/rtems/irq-extension.h: include/rtems/irq-extension.h $(PROJECT_INCLUDE)/rtems/$(dirstamp)
|
||||||
|
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/irq-extension.h
|
||||||
|
PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/irq-extension.h
|
||||||
|
|
||||||
$(PROJECT_INCLUDE)/rtems/imfs.h: libfs/src/imfs/imfs.h $(PROJECT_INCLUDE)/rtems/$(dirstamp)
|
$(PROJECT_INCLUDE)/rtems/imfs.h: libfs/src/imfs/imfs.h $(PROJECT_INCLUDE)/rtems/$(dirstamp)
|
||||||
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/imfs.h
|
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/imfs.h
|
||||||
PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/imfs.h
|
PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/imfs.h
|
||||||
|
|||||||
@@ -1,3 +1,8 @@
|
|||||||
|
2008-07-14 Thomas Doerfler <thomas.doerfler@embedded-brains.de>
|
||||||
|
* rtems/powerpc/registers.h:
|
||||||
|
|
||||||
|
Added PPC405EX support contributed by Michael Hamel
|
||||||
|
|
||||||
2008-07-10 Sebastian Huber <sebastian.huber@embedded-brains.de>
|
2008-07-10 Sebastian Huber <sebastian.huber@embedded-brains.de>
|
||||||
|
|
||||||
* rtems/asm.h: Added defines for save and restore registers and
|
* rtems/asm.h: Added defines for save and restore registers and
|
||||||
|
|||||||
@@ -292,12 +292,14 @@ lidate */
|
|||||||
|
|
||||||
#define BOOKE_DECAR 54
|
#define BOOKE_DECAR 54
|
||||||
|
|
||||||
|
#define PPC405_TSR 0x3D8
|
||||||
#define BOOKE_TSR 336
|
#define BOOKE_TSR 336
|
||||||
#define BOOKE_TSR_ENW (1<<31)
|
#define BOOKE_TSR_ENW (1<<31)
|
||||||
#define BOOKE_TSR_WIS (1<<30)
|
#define BOOKE_TSR_WIS (1<<30)
|
||||||
#define BOOKE_TSR_DIS (1<<27)
|
#define BOOKE_TSR_DIS (1<<27)
|
||||||
#define BOOKE_TSR_FIS (1<<26)
|
#define BOOKE_TSR_FIS (1<<26)
|
||||||
|
|
||||||
|
#define PPC405_TCR 0x3DA
|
||||||
#define BOOKE_TCR 340
|
#define BOOKE_TCR 340
|
||||||
#define BOOKE_TCR_WP(x) (((x)&3)<<30)
|
#define BOOKE_TCR_WP(x) (((x)&3)<<30)
|
||||||
#define BOOKE_TCR_WRC(x) (((x)&3)<<28)
|
#define BOOKE_TCR_WRC(x) (((x)&3)<<28)
|
||||||
|
|||||||
30
make/custom/haleakala.cfg
Normal file
30
make/custom/haleakala.cfg
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
#
|
||||||
|
# Config file for a PowerPC 405 based card
|
||||||
|
# mhamel
|
||||||
|
#
|
||||||
|
|
||||||
|
include $(RTEMS_ROOT)/make/custom/default.cfg
|
||||||
|
|
||||||
|
RTEMS_CPU=powerpc
|
||||||
|
RTEMS_CPU_MODEL=ppc405
|
||||||
|
|
||||||
|
# This is the actual bsp directory used during the build process.
|
||||||
|
RTEMS_BSP_FAMILY=haleakala
|
||||||
|
|
||||||
|
# This contains the compiler options necessary to select the CPU model
|
||||||
|
# and (hopefully) optimize for it.
|
||||||
|
#
|
||||||
|
CPU_CFLAGS = -mcpu=405 -Dppc405
|
||||||
|
|
||||||
|
# optimize flag: typically -0, could use -O4 or -fast
|
||||||
|
# -O4 is ok for RTEMS
|
||||||
|
# NOTE: some level of -O may be actually required by inline assembler
|
||||||
|
CFLAGS_OPTIMIZE_V = -O1 -g
|
||||||
|
|
||||||
|
# No start file
|
||||||
|
START_BASE=
|
||||||
|
|
||||||
|
define bsp-post-link
|
||||||
|
$(default-bsp-post-link)
|
||||||
|
$(OBJCOPY) -O srec $(basename $@).exe $(basename $@)$(DOWNEXT)
|
||||||
|
endef
|
||||||
Reference in New Issue
Block a user