mirror of
https://gitlab.rtems.org/rtems/rtos/rtems.git
synced 2026-09-22 19:11:44 +08:00
committed by
Gedare Bloom
parent
f6a8a77f0e
commit
f39e173c47
@@ -4,8 +4,6 @@ AC_DEFUN([RTEMS_CHECK_BSPDIR],
|
||||
case "$1" in
|
||||
csb350 )
|
||||
AC_CONFIG_SUBDIRS([csb350]);;
|
||||
genmongoosev )
|
||||
AC_CONFIG_SUBDIRS([genmongoosev]);;
|
||||
hurricane )
|
||||
AC_CONFIG_SUBDIRS([hurricane]);;
|
||||
jmr3904 )
|
||||
|
||||
@@ -1,85 +0,0 @@
|
||||
ACLOCAL_AMFLAGS = -I ../../../../aclocal
|
||||
|
||||
include $(top_srcdir)/../../../../automake/compile.am
|
||||
|
||||
include_bspdir = $(includedir)/bsp
|
||||
|
||||
dist_project_lib_DATA = bsp_specs
|
||||
|
||||
include_HEADERS = include/bsp.h
|
||||
include_HEADERS += include/tm27.h
|
||||
include_bsp_HEADERS = start/regs.h
|
||||
#isr
|
||||
include_bsp_HEADERS += ../../shared/include/irq-generic.h
|
||||
include_bsp_HEADERS += ../../shared/include/irq-info.h
|
||||
include_bsp_HEADERS += include/irq.h
|
||||
|
||||
nodist_include_HEADERS = include/bspopts.h
|
||||
nodist_include_bsp_HEADERS = ../../shared/include/bootcard.h
|
||||
nodist_include_bsp_HEADERS += include/lr33000.h
|
||||
nodist_include_bsp_HEADERS += include/lr333x0.h
|
||||
nodist_include_bsp_HEADERS += include/mongoose-v.h
|
||||
nodist_include_bsp_HEADERS += include/r3000.h
|
||||
nodist_include_bsp_HEADERS += console/mg5uart.h
|
||||
DISTCLEANFILES = include/bspopts.h
|
||||
noinst_PROGRAMS =
|
||||
|
||||
nodist_include_HEADERS += ../../shared/include/coverhd.h
|
||||
|
||||
noinst_LIBRARIES = libbspstart.a
|
||||
libbspstart_a_SOURCES = start/start.S
|
||||
libbspstart_a_SOURCES += start/regs.h
|
||||
libbspstart_a_SOURCES += start/mg5.h
|
||||
project_lib_DATA = start.$(OBJEXT)
|
||||
|
||||
dist_project_lib_DATA += startup/linkcmds
|
||||
|
||||
noinst_LIBRARIES += libbsp.a
|
||||
libbsp_a_SOURCES =
|
||||
|
||||
# startup
|
||||
libbsp_a_SOURCES += ../../shared/bspclean.c
|
||||
libbsp_a_SOURCES += ../../shared/bsppredriverhook.c
|
||||
libbsp_a_SOURCES += ../../shared/bsplibc.c
|
||||
libbsp_a_SOURCES += ../../shared/bsppost.c
|
||||
libbsp_a_SOURCES += startup/bspstart.c
|
||||
libbsp_a_SOURCES += ../../shared/bootcard.c
|
||||
libbsp_a_SOURCES += ../../shared/sbrk.c
|
||||
libbsp_a_SOURCES += ../../shared/bspgetworkarea.c
|
||||
# clock
|
||||
libbsp_a_SOURCES += clock/clockdrv.c
|
||||
libbsp_a_SOURCES += ../../shared/clockdrv_shell.h
|
||||
# console
|
||||
libbsp_a_SOURCES += console/conscfg.c
|
||||
libbsp_a_SOURCES += console/mg5uart.c
|
||||
libbsp_a_SOURCES += ../../shared/console.c
|
||||
libbsp_a_SOURCES += ../../shared/console_select.c
|
||||
libbsp_a_SOURCES += ../../shared/console_control.c
|
||||
libbsp_a_SOURCES += ../../shared/console_read.c
|
||||
libbsp_a_SOURCES += ../../shared/console_write.c
|
||||
# timer
|
||||
libbsp_a_SOURCES += timer/timer.c
|
||||
#isr
|
||||
libbsp_a_SOURCES += ../../shared/src/irq-generic.c
|
||||
libbsp_a_SOURCES += ../../shared/src/irq-legacy.c
|
||||
libbsp_a_SOURCES += ../../shared/src/irq-info.c
|
||||
libbsp_a_SOURCES += ../../shared/src/irq-shell.c
|
||||
libbsp_a_SOURCES += ../../shared/src/irq-server.c
|
||||
libbsp_a_SOURCES += ../shared/irq/vectorexceptions.c
|
||||
libbsp_a_SOURCES += ../shared/irq/irq.c
|
||||
libbsp_a_SOURCES += irq/vectorisrs.c
|
||||
libbsp_a_SOURCES += ../shared/irq/interruptmask.c
|
||||
|
||||
gdbstub_CPPFLAGS = -I$(srcdir)/../../mips/shared/gdbstub
|
||||
noinst_PROGRAMS += gdbstub.rel
|
||||
gdbstub_rel_SOURCES = ../../mips/shared/gdbstub/mips-stub.c
|
||||
gdbstub_rel_SOURCES += startup/gdb-support.c
|
||||
gdbstub_rel_SOURCES += ../../shared/gdbstub/rtems-stub-glue.c
|
||||
gdbstub_rel_CPPFLAGS = $(AM_CPPFLAGS) $(gdbstub_CPPFLAGS)
|
||||
gdbstub_rel_LDFLAGS = $(RTEMS_RELLDFLAGS)
|
||||
|
||||
libbsp_a_LIBADD = ../../../libcpu/@RTEMS_CPU@/shared/cache.rel
|
||||
libbsp_a_LIBADD += ../../../libcpu/@RTEMS_CPU@/shared/interrupts.rel
|
||||
|
||||
include $(srcdir)/preinstall.am
|
||||
include $(top_srcdir)/../../../../automake/local.am
|
||||
@@ -1,225 +0,0 @@
|
||||
BSP supporting the on-CPU capabilities of the Synova Mongoose-V.
|
||||
The Synova Mongoose-V is a radiation hardened derivative of the
|
||||
LSI 33K with on-CPU peripherals.
|
||||
|
||||
This BSP assumes that basic HW initialization is performed by PMON.
|
||||
|
||||
Status
|
||||
======
|
||||
Per-task floating point enable/disable is supported for both immediate
|
||||
and deferred FPU context swaps.
|
||||
|
||||
Interrupt Levels are adapted reasonably well to the MIPS interrupt
|
||||
model. Bit 0 of the int level is a global enable/disable, corresponding
|
||||
to bit 0 of the processor's SR register. Bits 1 thru 6 are configured
|
||||
as masks for the Int0 thru Int5 interrupts. The 2 software interrupt
|
||||
bits are always enabled by default. Each task maintains its own
|
||||
Interrupt Level setting, reconfiguring the SR register's interrupt bits
|
||||
whenever scheduled in. The software ints, though not addressable via
|
||||
the various Interrupt Level functions, are maintained on a per-task
|
||||
basis, so if software manipulates them directly, things should behave as
|
||||
expected. At the time of these udpates, the Interrupt Level was only 8
|
||||
bits, and completely supporting the global enable, software ints and the
|
||||
hardware ints would require 9 bits. When more than 8 bits are
|
||||
available, there is no reason the software interrupts could not be added
|
||||
to the Interrupt Level.
|
||||
|
||||
While supporting the Int0 thru Int5 bits in this way doesn't seem
|
||||
wonderfully useful, it does increase the level of compliance with the
|
||||
RTEMS spec.
|
||||
|
||||
Interrupt Level 0 corresponds to interrupts globally enabled, software
|
||||
ints enabled and Int0 thru Int5 enabled. If values other than 0 are
|
||||
supplied, they should be formulated to impose the desired bitmask.
|
||||
Interrupt priority is not a strong concept on this bsp, it is provided
|
||||
only by the order in which interrupts are checked.
|
||||
|
||||
If during the vectoring of an interrupt, others arrive, they will all be
|
||||
processed in accordance with their ordering in SR & the peripheral
|
||||
register. For example, if while we're vectoring Int4, Int3 and Int5 are
|
||||
asserted, Int3 will be serviced before Int5. The peripheral interrupts
|
||||
are individually vectored as a consequence of Int5 being asserted,
|
||||
however Int5 is not itself vectored. Within the set of peripheral
|
||||
interrupts, bit 0 is vectored first, 31 is last.
|
||||
|
||||
Interrupts are not nested for MIPS1 or MIPS3 processors, but are
|
||||
processed serially as possible. On an unloaded 50 task RTEMS program,
|
||||
runnning on a 12mhz MIPS1 processor, worst-case latencies of 100us were
|
||||
observed, the average being down at 60us or below.
|
||||
|
||||
|
||||
These features are principally a consequence of fixes and tweaks to the
|
||||
MIPS1 and MIPS3 processor support, and should be equally effective on
|
||||
both levels of MIPS processors for any of their bsp's.
|
||||
|
||||
Address Map
|
||||
===========
|
||||
This is the generic address map of the Mongoose-V prototyping board
|
||||
this BSP was tested on.
|
||||
|
||||
0x8000_0000 - 0x8FFF_FFFF - RAM (KSEG0 cached)
|
||||
0xA000_0000 - 0xAFFF_FFFF - RAM (KSEG1, same memory uncached)
|
||||
0xBFC0_0000 - 0xBFFF_FFFF - EEPROM
|
||||
0xFFFE_xxxx - on-CPU peripherals
|
||||
|
||||
This is the hardware address map of the board used as it was
|
||||
actually populated.
|
||||
|
||||
0x8000_0000 - 0x83FF_FFFF - 32 MB RAM (KSEG0 cached)
|
||||
0xA000_0000 - 0xA3FF_FFFF - 32 MB RAM (KSEG1, same memory uncached)
|
||||
0xBFC0_0000 - 0xBFDF_FFFF - 2 MB EEPROM
|
||||
0xFFFE_xxxx - on-CPU peripherals
|
||||
|
||||
This is the organization of the EEPROM when fully populated. Since
|
||||
the board used to develop this BSP only had the first bank of EEPROM
|
||||
populated, only the first program image area was used.
|
||||
|
||||
0xBFC0_0000 - 0xBFC3_FFFF - PMON
|
||||
0xBFC4_0000 - 0xBFC4_FFFF - reserved for boot loader
|
||||
0xBFC5_0000 - 0xBFDF_FFFF - reserved for program 1 image
|
||||
0xBFE0_0000 - 0xBFFF_FFFF - reserved for program 2 image
|
||||
|
||||
The Mongoose-V on this board is at 12 Mhz.
|
||||
|
||||
Downloading
|
||||
===========
|
||||
|
||||
On the breadboard, a locally hacked PMON waits for a space to be pressed
|
||||
while the board is reset/powered up. If found, the PMON console is
|
||||
entered, else PMON jumps to the EEPROM address above, presuming a user
|
||||
program is located there.
|
||||
|
||||
The default output of an RTEMS link is an image linked to run from
|
||||
0x80020000. It is suitable for copying to S3 records or can be burned
|
||||
to ROMs in whatever manner the user desires. If you want to locate the
|
||||
image into ROM at some other address, use mips-rtems-objcopy to shift
|
||||
the LMA.
|
||||
|
||||
Operation
|
||||
=========
|
||||
|
||||
A small relocator is supplied in the bsp startup code which copies the
|
||||
image down to RAM for execution before doing any other initialization.
|
||||
This locator code is location independent, and will do nothing if the
|
||||
image is already located at its run location. The LMA and VMA are both
|
||||
controlled via the bsp's link script. The above behavior is produced by
|
||||
using the default script. If this is not desirable, something like the
|
||||
following may be added to the user's RTEMS link statement to override
|
||||
the default linkcmds with a user-supplied version;
|
||||
|
||||
-qnolinkcmds -Wl,-T -Wl,mips-rtems-linkcmds-eprom
|
||||
|
||||
this causes the file ./mips-rtems-linkcmds-eprom to override the default
|
||||
linkcmds.
|
||||
|
||||
Before relocating the RTEMS image, the bsp startup routine attempts to
|
||||
configure the processor into a rational state. During this process,
|
||||
status characters are emitted at 19200N81 on UART port 0.
|
||||
|
||||
The default link script simply places the image at 0x8002000 with
|
||||
LMA=VMA, which is conviently located in RAM on our board. You should
|
||||
probably consider creating your own linkcmds, putting things where you
|
||||
want and supply it as above.
|
||||
|
||||
The Mongoose V has a somewhat restricted cache configuration model; you
|
||||
can only flush it if the code which does so executes within noncached
|
||||
memory, in our case, code in kseg1. If you do so from elsewhere the
|
||||
code will appear to lock up, this is caused by the cache clearing
|
||||
routine making the instruction fetch always return 0, or nop- leaving
|
||||
the processor in an endless loop. The default start.S code detects if
|
||||
its booting from outside kseg1, it which case it disables the cache
|
||||
flush code. This means you cannot flush the cache with the bsp's
|
||||
functions if you boot your program from outside kseg1. A more subtle
|
||||
issue is the bsp keeps a pointer to the location in kseg1 where the
|
||||
bsp's cache flush code resides. This is advantageous because you can
|
||||
relocate the system anywhere and still control the cache, but might
|
||||
cause trouble if the boot image becomes inaccessible. If this is
|
||||
possible, you should probably consider rolling your own cache control &
|
||||
disabling the bsp's.
|
||||
|
||||
As stated above, if you boot from outside kseg1, the bsp disables the
|
||||
cache flush routines. This is not desirable in the long run because the
|
||||
Mongoose V remote debugger stub assumes it can flush caches when exiting
|
||||
an exception so it might not be able to update code/data properly,
|
||||
though it should still nominally function. However, if you're not using
|
||||
the remote debugger & don't care about flushing caches, then everything
|
||||
should run just fine.
|
||||
|
||||
Our approach has to been locate ROM in kseg1, link the code for VMA in
|
||||
RAM and relocate the LMA up into kseg1 ROM. Since the start.S code is
|
||||
position-independent, it will relocate the entire app down to the VMA
|
||||
region before starting things up with everything in its proper place.
|
||||
The cache clear code runs before relocation, so executes from ROM &
|
||||
things work.
|
||||
|
||||
You can prevent including the default start.S by adding;
|
||||
|
||||
-qnostartfile
|
||||
|
||||
to the link command line in addition to the "nolinkcmds" options above.
|
||||
Be sure to supply your replacement start.o.
|
||||
|
||||
|
||||
|
||||
Questions
|
||||
=========
|
||||
|
||||
Why can I send characters slowly to a Mongoose V, but get framing errors
|
||||
when sending them fast?
|
||||
|
||||
- The MongooseV chip seems to <require> that all incoming data have 2
|
||||
stop bits. When typing on a serial terminal, this is not an issue
|
||||
because the idle state of an RS232 line looks just like a stop bit-
|
||||
but when streaming in data, such pacing is required. The manual does
|
||||
not indicate anything along these lines, instead, we suspect a
|
||||
somewhat faulty UART design.
|
||||
|
||||
|
||||
Debugging
|
||||
=========
|
||||
|
||||
After getting Joel's initial port of the gdb stub to the Mongoose bsp, I
|
||||
worked up & tested this stub on our R3000 board. It seems to work OK.
|
||||
Our MIPS has 2 serial ports, the first being dedicated to the console, I
|
||||
chose to arrange the 2nd one for the remote gdb protocol. While this
|
||||
solution is somewhat specific to our board & bsp, I think the technique
|
||||
is quite generalizable.
|
||||
|
||||
The following is a code snippet to be included in the user program;
|
||||
|
||||
/***********************************************/
|
||||
|
||||
extern int mg5rdbgOpenGDBuart(int);
|
||||
extern void mg5rdbgCloseGDBuart(void);
|
||||
|
||||
|
||||
void setupgdb(void)
|
||||
{
|
||||
printf("Configuring remote GDB stub...\n");
|
||||
|
||||
/* initialize remote gdb support */
|
||||
if( mg5rdbgOpenGDBuart(-1) != RTEMS_SUCCESSFUL )
|
||||
{
|
||||
printf("Remote GDB stub is disabled.\n\n");
|
||||
}
|
||||
}
|
||||
|
||||
/***********************************************/
|
||||
|
||||
It allows the program to decide if it wants gdb to be ready to pick up
|
||||
exceptions or not. The 2 extern functions are located in the MongooseV
|
||||
bsp inside gdb-support.c. They configure & initialize the 2nd serial
|
||||
port & invoke the vector initialization routine located in cpu_asm.
|
||||
Note, we call directly down into the MongooseV UART driver- its quite
|
||||
unfriendly to TERMIO. I chose this approach because I wanted to
|
||||
minimize dependence on the I/O subsystems because they might be in a
|
||||
state just short of collapsing if the program had done something bad to
|
||||
cause the exception.
|
||||
|
||||
If user code leaves the 2nd port alone, then things will work out OK.
|
||||
|
||||
Greg Menke
|
||||
2/27/2002
|
||||
|
||||
============================================================================
|
||||
|
||||
@@ -1,15 +0,0 @@
|
||||
%rename endfile old_endfile
|
||||
%rename startfile old_startfile
|
||||
%rename link old_link
|
||||
|
||||
*startfile:
|
||||
%{!qrtems: %(old_startfile)} \
|
||||
%{!nostdlib: \
|
||||
%{qrtems: %{!qnostartfile: start.o%s -e _start} crti.o%s crtbegin.o%s}}
|
||||
|
||||
*link:
|
||||
%(old_link) %{qrtems: -dc -dp -N}
|
||||
|
||||
*endfile:
|
||||
%{!qrtems: %(old_endfile)} %{qrtems: crtend.o%s crtn.o%s}
|
||||
|
||||
@@ -1,59 +0,0 @@
|
||||
/**
|
||||
* @file
|
||||
*
|
||||
* Instantiate the clock driver shell for the Mongoose-V's on-CPU timer.
|
||||
*/
|
||||
|
||||
/*
|
||||
* COPYRIGHT (c) 1989-2012.
|
||||
* 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.org/license/LICENSE.
|
||||
*/
|
||||
|
||||
#include <rtems.h>
|
||||
#include <bsp/irq.h>
|
||||
#include <bsp.h>
|
||||
|
||||
#if defined(USE_TIMER2_FOR_CLOCK)
|
||||
#define CLOCK_BASE MONGOOSEV_TIMER2_BASE
|
||||
#define CLOCK_VECTOR MONGOOSEV_IRQ_TIMER2
|
||||
#else
|
||||
#define CLOCK_BASE MONGOOSEV_TIMER1_BASE
|
||||
#define CLOCK_VECTOR MONGOOSEV_IRQ_TIMER1
|
||||
#endif
|
||||
|
||||
/* reset Timeout (TO) bit */
|
||||
|
||||
#define Clock_driver_support_at_tick() \
|
||||
do { \
|
||||
MONGOOSEV_WRITE_REGISTER( CLOCK_BASE, MONGOOSEV_TIMER_CONTROL_REGISTER, \
|
||||
(MONGOOSEV_TIMER_CONTROL_COUNTER_ENABLE | MONGOOSEV_TIMER_CONTROL_INTERRUPT_ENABLE)); \
|
||||
} while(0)
|
||||
|
||||
#define Clock_driver_support_install_isr( _new, _old ) \
|
||||
do { \
|
||||
rtems_interrupt_handler_install( \
|
||||
CLOCK_VECTOR, \
|
||||
"clock", \
|
||||
0, \
|
||||
_new, \
|
||||
NULL \
|
||||
); \
|
||||
} while(0)
|
||||
|
||||
#define Clock_driver_support_initialize_hardware() \
|
||||
do { \
|
||||
uint32_t _clicks = CPU_CLOCK_RATE_MHZ * rtems_configuration_get_microseconds_per_tick(); \
|
||||
MONGOOSEV_WRITE_REGISTER( CLOCK_BASE, MONGOOSEV_TIMER_INITIAL_COUNTER_REGISTER, _clicks ); \
|
||||
Clock_driver_support_at_tick(); \
|
||||
} while(0)
|
||||
|
||||
#define Clock_driver_support_shutdown_hardware() \
|
||||
MONGOOSEV_WRITE_REGISTER( CLOCK_BASE, MONGOOSEV_TIMER_CONTROL_REGISTER, 0 )
|
||||
|
||||
#define CLOCK_DRIVER_USE_DUMMY_TIMECOUNTER
|
||||
|
||||
#include "../../../shared/clockdrv_shell.h"
|
||||
@@ -1,21 +0,0 @@
|
||||
## Process this file with autoconf to produce a configure script.
|
||||
|
||||
AC_PREREQ([2.69])
|
||||
AC_INIT([rtems-c-src-lib-libbsp-mips-genmongoosev],[_RTEMS_VERSION],[https://devel.rtems.org/newticket])
|
||||
AC_CONFIG_SRCDIR([bsp_specs])
|
||||
RTEMS_TOP(../../../../../..)
|
||||
|
||||
RTEMS_CANONICAL_TARGET_CPU
|
||||
AM_INIT_AUTOMAKE([no-define nostdinc foreign 1.12.2])
|
||||
|
||||
RTEMS_BSP_CONFIGURE
|
||||
|
||||
RTEMS_PROG_CC_FOR_TARGET
|
||||
RTEMS_CANONICALIZE_TOOLS
|
||||
RTEMS_PROG_CCAS
|
||||
|
||||
RTEMS_BSP_CLEANUP_OPTIONS(0, 0)
|
||||
|
||||
# Explicitly list all Makefiles here
|
||||
AC_CONFIG_FILES([Makefile])
|
||||
AC_OUTPUT
|
||||
@@ -1,101 +0,0 @@
|
||||
Configuration Table Use
|
||||
=======================
|
||||
|
||||
sDeviceName
|
||||
|
||||
The name of this device.
|
||||
|
||||
deviceType
|
||||
|
||||
This field must be SERIAL_MG5UART.
|
||||
|
||||
pDeviceFns
|
||||
|
||||
The device interface control table. This may be:
|
||||
+ mg5uart_fns for interrupt driven IO
|
||||
+ mg5uart_fns_polled for polled IO
|
||||
|
||||
deviceProbe
|
||||
|
||||
This is the address of the routine which probes to see if the device
|
||||
is present.
|
||||
|
||||
pDeviceFlow
|
||||
|
||||
This field is ignored as hardware flow control is not currently supported.
|
||||
|
||||
ulMargin
|
||||
|
||||
This is currently unused.
|
||||
|
||||
ulHysteresis
|
||||
|
||||
This is currently unused.
|
||||
|
||||
pDeviceParams
|
||||
|
||||
This is set to the default settings.
|
||||
|
||||
ulCtrlPort1
|
||||
|
||||
This field is the address of the command register shared by both ports.
|
||||
|
||||
ulCtrlPort2
|
||||
|
||||
This field is the address of the port being used.
|
||||
|
||||
ulDataPort
|
||||
|
||||
This field is set to MG5UART_PORTA or MG5UART_PORTB.
|
||||
|
||||
getRegister
|
||||
setRegister
|
||||
|
||||
These do NOT follow standard conventions and are ignored.
|
||||
The register address routines are hard-coded as this is
|
||||
an on-CPU part and assumed to provide a 32-bit wide interface.
|
||||
|
||||
getData
|
||||
|
||||
This is address of the RX buffer register.
|
||||
|
||||
setData
|
||||
|
||||
This is address of the TX buffer register.
|
||||
|
||||
ulClock
|
||||
|
||||
baudRate Clock
|
||||
|
||||
ulIntVector
|
||||
|
||||
This is the interrupt vector number associated with this chip.
|
||||
|
||||
Example:
|
||||
|
||||
#if (CONSOLE_USE_INTERRUPTS)
|
||||
#define MG5UART_FUNCTIONS &mg5uart_fns
|
||||
#else
|
||||
#define MG5UART_FUNCTIONS &mg5uart_fns_polled
|
||||
#endif
|
||||
|
||||
{
|
||||
"/dev/com0", /* sDeviceName */
|
||||
SERIAL_MG5UART, /* deviceType */
|
||||
MG5UART_FUNCTIONS, /* pDeviceFns */
|
||||
NULL, /* deviceProbe, assume it is there */
|
||||
NULL, /* pDeviceFlow */
|
||||
16, /* ulMargin */
|
||||
8, /* ulHysteresis */
|
||||
(void *) NULL, /* NULL */ /* pDeviceParams */
|
||||
MONGOOSEV_PERIPHERAL_COMMAND_REGISTER, /* ulCtrlPort1 */
|
||||
MONGOOSEV_UART0_BASE, /* ulCtrlPort2 */
|
||||
MG5UART_UART0, /* ulDataPort */
|
||||
mg5uart_get_register, /* getRegister */
|
||||
mg5uart_set_register, /* setRegister */
|
||||
NULL, /* unused */ /* getData */
|
||||
NULL, /* unused */ /* setData */
|
||||
12000000, /* ulClock */
|
||||
MONGOOSEV_IRQ_UART0_RX_FRAME_ERROR /* ulIntVector -- base for port */
|
||||
}
|
||||
|
||||
@@ -1,93 +0,0 @@
|
||||
/**
|
||||
* @file
|
||||
*
|
||||
* This file contains the libchip configuration information
|
||||
* to instantiate the libchip driver for the on-CPU DUART
|
||||
* and any other serial ports in the system.
|
||||
*/
|
||||
|
||||
/*
|
||||
* COPYRIGHT (c) 1989-2012.
|
||||
* 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.org/license/LICENSE.
|
||||
*/
|
||||
|
||||
#include <unistd.h> /* write */
|
||||
|
||||
#include <bsp.h>
|
||||
#include <bsp/irq.h>
|
||||
|
||||
#include <libchip/serial.h>
|
||||
#include <bsp/mg5uart.h>
|
||||
|
||||
/* #define CONSOLE_USE_INTERRUPTS */
|
||||
|
||||
#ifdef CONSOLE_USE_INTERRUPTS
|
||||
#define MG5UART_FUNCTIONS &mg5uart_fns
|
||||
#else
|
||||
#define MG5UART_FUNCTIONS &mg5uart_fns_polled
|
||||
#endif
|
||||
|
||||
console_tbl Console_Configuration_Ports[] = {
|
||||
{
|
||||
"/dev/com0", /* sDeviceName */
|
||||
SERIAL_MG5UART, /* deviceType */
|
||||
MG5UART_FUNCTIONS, /* pDeviceFns */
|
||||
NULL, /* deviceProbe, assume it is there */
|
||||
NULL, /* pDeviceFlow */
|
||||
16, /* ulMargin */
|
||||
8, /* ulHysteresis */
|
||||
(void *) NULL, /* NULL */ /* pDeviceParams */
|
||||
MONGOOSEV_PERIPHERAL_COMMAND_REGISTER, /* ulCtrlPort1 */
|
||||
MONGOOSEV_UART0_BASE, /* ulCtrlPort2 */
|
||||
MG5UART_UART0, /* ulDataPort */
|
||||
NULL, /* getRegister */
|
||||
NULL, /* setRegister */
|
||||
NULL, /* unused */ /* getData */
|
||||
NULL, /* unused */ /* setData */
|
||||
CLOCK_RATE, /* ulClock */
|
||||
MONGOOSEV_IRQ_UART0_RX_FRAME_ERROR /* ulIntVector -- base for port */
|
||||
},
|
||||
{
|
||||
"/dev/com1", /* sDeviceName */
|
||||
SERIAL_MG5UART, /* deviceType */
|
||||
MG5UART_FUNCTIONS, /* pDeviceFns */
|
||||
NULL, /* deviceProbe, assume it is there */
|
||||
NULL, /* pDeviceFlow */
|
||||
16, /* ulMargin */
|
||||
8, /* ulHysteresis */
|
||||
(void *) NULL, /* NULL */ /* pDeviceParams */
|
||||
MONGOOSEV_PERIPHERAL_COMMAND_REGISTER, /* ulCtrlPort1 */
|
||||
MONGOOSEV_UART1_BASE, /* ulCtrlPort2 */
|
||||
MG5UART_UART1, /* ulDataPort */
|
||||
NULL, /* getRegister */
|
||||
NULL, /* setRegister */
|
||||
NULL, /* unused */ /* getData */
|
||||
NULL, /* unused */ /* setData */
|
||||
CLOCK_RATE, /* ulClock */
|
||||
MONGOOSEV_IRQ_UART1_RX_FRAME_ERROR /* ulIntVector -- base for port */
|
||||
},
|
||||
};
|
||||
|
||||
/*
|
||||
* Declare some information used by the console driver
|
||||
*/
|
||||
|
||||
#define NUM_CONSOLE_PORTS \
|
||||
(sizeof(Console_Configuration_Ports)/sizeof(console_tbl))
|
||||
|
||||
unsigned long Console_Configuration_Count = NUM_CONSOLE_PORTS;
|
||||
|
||||
/*
|
||||
* printk() support that simply routes printk to stderr
|
||||
*/
|
||||
|
||||
#include <rtems/bspIo.h>
|
||||
|
||||
static void GENMG5_output_char(char c) { write( 2, &c, 1 ); }
|
||||
|
||||
BSP_output_char_function_type BSP_output_char = GENMG5_output_char;
|
||||
BSP_polling_getchar_function_type BSP_poll_char = NULL;
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,97 +0,0 @@
|
||||
/*
|
||||
* 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.org/license/LICENSE.
|
||||
*/
|
||||
|
||||
#ifndef _MG5UART_H_
|
||||
#define _MG5UART_H_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*
|
||||
* This is the ASCII for "MG5U" which should be unique enough to
|
||||
* distinguish this type of serial device from others.
|
||||
*/
|
||||
|
||||
#define SERIAL_MG5UART 0x474D5535
|
||||
|
||||
#define MG5UART_UART0 0
|
||||
#define MG5UART_UART1 1
|
||||
|
||||
/*
|
||||
* These are just used in the interface between this driver and
|
||||
* the read/write register routines when accessing the first
|
||||
* control port. They are indices of registers from the bases.
|
||||
*/
|
||||
|
||||
/* shared registers from peripheral base (i.e. from ulCtrlPort1) */
|
||||
/*
|
||||
#define MG5UART_COMMAND_REGISTER 0
|
||||
#define MG5UART_STATUS_REGISTER 1
|
||||
#define MG5UART_INTERRUPT_CAUSE_REGISTER 2
|
||||
#define MG5UART_INTERRUPT_MASK_REGISTER 3
|
||||
*/
|
||||
|
||||
#define MG5UART_COMMAND_REGISTER 0
|
||||
#define MG5UART_STATUS_REGISTER 0x04
|
||||
#define MG5UART_INTERRUPT_CAUSE_REGISTER 0x08
|
||||
#define MG5UART_INTERRUPT_MASK_REGISTER 0x0C
|
||||
|
||||
/* port specific registers from uart base (i.e. from ulCtrlPort2) */
|
||||
#define MG5UART_RX_BUFFER 0
|
||||
#define MG5UART_TX_BUFFER 4
|
||||
#define MG5UART_BAUD_RATE 8
|
||||
|
||||
/*
|
||||
* Interrupt mask values
|
||||
*/
|
||||
|
||||
#define MG5UART_ENABLE_ALL_EXCEPT_TX MONGOOSEV_UART_ALL_RX_STATUS_BITS
|
||||
|
||||
/* all rx ints on, but only tx ready. no need to also int on tx empty */
|
||||
#define MG5UART_ENABLE_ALL (MONGOOSEV_UART_ALL_STATUS_BITS & ~MONGOOSEV_UART_TX_EMPTY)
|
||||
|
||||
#define MG5UART_DISABLE_ALL 0x0000
|
||||
|
||||
/*
|
||||
* Assume vectors are sequential.
|
||||
*/
|
||||
|
||||
#define MG5UART_IRQ_RX_FRAME_ERROR 0
|
||||
#define MG5UART_IRQ_RX_OVERRUN_ERROR 1
|
||||
#define MG5UART_IRQ_TX_EMPTY 2
|
||||
#define MG5UART_IRQ_TX_READY 3
|
||||
#define MG5UART_IRQ_RX_READY 4
|
||||
/*
|
||||
* Driver function table
|
||||
*/
|
||||
|
||||
extern const console_fns mg5uart_fns;
|
||||
extern const console_fns mg5uart_fns_polled;
|
||||
|
||||
/*
|
||||
* Default register access routines
|
||||
*/
|
||||
|
||||
uint32_t mg5uart_get_register( /* registers are on 32-bit boundaries */
|
||||
uintptr_t ulCtrlPort, /* and accessed as word */
|
||||
uint32_t ucRegNum
|
||||
);
|
||||
|
||||
void mg5uart_set_register(
|
||||
uintptr_t ulCtrlPort,
|
||||
uint32_t ucRegNum,
|
||||
uint32_t ucData
|
||||
);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _MG5UART_H_ */
|
||||
@@ -1,58 +0,0 @@
|
||||
/*
|
||||
* This file contains a typical set of register access routines which may be
|
||||
* used with the mg5uart chip if accesses to the chip are as follows:
|
||||
*
|
||||
* + registers are accessed as uint32_t 's
|
||||
* + registers are only u32-aligned (no address gaps)
|
||||
*
|
||||
* COPYRIGHT (c) 1989-2001.
|
||||
* 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.org/license/LICENSE.
|
||||
*/
|
||||
|
||||
#include <rtems.h>
|
||||
|
||||
#ifndef _MG5UART_MULTIPLIER
|
||||
#define _MG5UART_MULTIPLIER 1
|
||||
#define _MG5UART_NAME(_X) _X
|
||||
#define _MG5UART_TYPE uint32_t
|
||||
#endif
|
||||
|
||||
#define CALCULATE_REGISTER_ADDRESS( _base, _reg ) \
|
||||
(_MG5UART_TYPE *)((_base) + ((_reg) * _MG5UART_MULTIPLIER ))
|
||||
|
||||
/*
|
||||
* MG5UART Get Register Routine
|
||||
*/
|
||||
|
||||
uint8_t _MG5UART_NAME(mg5uart_get_register)(
|
||||
uint32_t ulCtrlPort,
|
||||
uint8_t ucRegNum
|
||||
)
|
||||
{
|
||||
_MG5UART_TYPE *port;
|
||||
|
||||
port = CALCULATE_REGISTER_ADDRESS( ulCtrlPort, ucRegNum );
|
||||
|
||||
return *port;
|
||||
}
|
||||
|
||||
/*
|
||||
* MG5UART Set Register Routine
|
||||
*/
|
||||
|
||||
void _MG5UART_NAME(mg5uart_set_register)(
|
||||
uint32_t ulCtrlPort,
|
||||
uint8_t ucRegNum,
|
||||
uint8_t ucData
|
||||
)
|
||||
{
|
||||
_MG5UART_TYPE *port;
|
||||
|
||||
port = CALCULATE_REGISTER_ADDRESS( ulCtrlPort, ucRegNum );
|
||||
|
||||
*port = ucData;
|
||||
}
|
||||
@@ -1,73 +0,0 @@
|
||||
/**
|
||||
* @file
|
||||
*
|
||||
* This include file contains some definitions specific to a board
|
||||
* based upon the generic capabilities of a Mongoose-V.
|
||||
*/
|
||||
|
||||
/*
|
||||
* COPYRIGHT (c) 1989-2012.
|
||||
* 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.org/license/LICENSE.
|
||||
*/
|
||||
|
||||
#ifndef LIBBSP_MIPS_GENMONGOOSEV_BSP_H
|
||||
#define LIBBSP_MIPS_GENMONGOOSEV_BSP_H
|
||||
|
||||
#include <bspopts.h>
|
||||
#include <bsp/default-initial-extension.h>
|
||||
|
||||
#include <rtems.h>
|
||||
#include <rtems/iosupp.h>
|
||||
#include <rtems/console.h>
|
||||
#include <rtems/clockdrv.h>
|
||||
#include <bsp/mongoose-v.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define BSP_FEATURE_IRQ_EXTENSION
|
||||
#define BSP_SHARED_HANDLER_SUPPORT 1
|
||||
|
||||
#ifndef CPU_CLOCK_RATE
|
||||
#define CLOCK_RATE 12000000
|
||||
#endif
|
||||
|
||||
#define CPU_CLOCK_RATE_HZ CLOCK_RATE
|
||||
#define CPU_CLOCK_RATE_MHZ (CLOCK_RATE/1000000)
|
||||
|
||||
/*
|
||||
* Useful defines set here so we can avoid duplicating them all over
|
||||
* creation.
|
||||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
* assertSoftwareInt defined in vectorisrs.c the prototype is here so
|
||||
* userspace code can get to it directly.
|
||||
* */
|
||||
|
||||
extern void assertSoftwareInterrupt(uint32_t);
|
||||
|
||||
#define CLOCK_VECTOR MONGOOSEV_IRQ_TIMER1
|
||||
|
||||
/* from start.S */
|
||||
extern void promCopyIcacheFlush(void);
|
||||
extern void promCopyDcacheFlush(void);
|
||||
|
||||
/*
|
||||
* Called from user programs wanting to use the GDB stub.
|
||||
*/
|
||||
void mg5rdbgCloseGDBuart(void);
|
||||
int mg5rdbgOpenGDBuart(int);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,95 +0,0 @@
|
||||
/**
|
||||
* @file
|
||||
*
|
||||
* @ingroup bsp_interrupt
|
||||
*
|
||||
* @brief interrupt definitions.
|
||||
*/
|
||||
|
||||
/*
|
||||
* COPYRIGHT (c) 1989-2012.
|
||||
* 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.org/license/LICENSE.
|
||||
*/
|
||||
|
||||
#ifndef LIBBSP_MIPS_MONGOOSEV_IRQ_H
|
||||
#define LIBBSP_MIPS_MONGOOSEV_IRQ_H
|
||||
|
||||
#ifndef ASM
|
||||
#include <rtems.h>
|
||||
#include <rtems/irq.h>
|
||||
#include <rtems/irq-extension.h>
|
||||
#include <rtems/score/mips.h>
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @addtogroup bsp_interrupt
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
|
||||
/*
|
||||
* Interrupt Vector Numbers
|
||||
*
|
||||
* NOTE: IRQ INT5 is logical or of peripheral cause register
|
||||
* per p. 5-22 of Mongoose-V manual.
|
||||
*/
|
||||
|
||||
#define BSP_INTERRUPT_VECTOR_MIN 0
|
||||
#define MONGOOSEV_IRQ_INT0 MIPS_INTERRUPT_BASE+0
|
||||
#define MONGOOSEV_IRQ_TIMER1 MONGOOSEV_IRQ_INT0
|
||||
#define MONGOOSEV_IRQ_INT1 MIPS_INTERRUPT_BASE+1
|
||||
#define MONGOOSEV_IRQ_TIMER2 MONGOOSEV_IRQ_INT1
|
||||
#define MONGOOSEV_IRQ_INT2 MIPS_INTERRUPT_BASE+2
|
||||
#define MONGOOSEV_IRQ_INT3 MIPS_INTERRUPT_BASE+3
|
||||
#define MONGOOSEV_IRQ_FPU MONGOOSEV_IRQ_INT3
|
||||
|
||||
#define MONGOOSEV_IRQ_INT4 MIPS_INTERRUPT_BASE+4
|
||||
|
||||
/* MONGOOSEV_IRQ_INT5 indicates that a peripheral caused the IRQ. */
|
||||
#define MONGOOSEV_IRQ_PERIPHERAL_BASE MIPS_INTERRUPT_BASE+5
|
||||
#define MONGOOSEV_IRQ_XINT0 MONGOOSEV_IRQ_PERIPHERAL_BASE + 0
|
||||
#define MONGOOSEV_IRQ_XINT1 MONGOOSEV_IRQ_PERIPHERAL_BASE + 1
|
||||
#define MONGOOSEV_IRQ_XINT2 MONGOOSEV_IRQ_PERIPHERAL_BASE + 2
|
||||
#define MONGOOSEV_IRQ_XINT3 MONGOOSEV_IRQ_PERIPHERAL_BASE + 3
|
||||
#define MONGOOSEV_IRQ_XINT4 MONGOOSEV_IRQ_PERIPHERAL_BASE + 4
|
||||
#define MONGOOSEV_IRQ_XINT5 MONGOOSEV_IRQ_PERIPHERAL_BASE + 5
|
||||
#define MONGOOSEV_IRQ_XINT6 MONGOOSEV_IRQ_PERIPHERAL_BASE + 6
|
||||
#define MONGOOSEV_IRQ_XINT7 MONGOOSEV_IRQ_PERIPHERAL_BASE + 7
|
||||
#define MONGOOSEV_IRQ_XINT8 MONGOOSEV_IRQ_PERIPHERAL_BASE + 8
|
||||
#define MONGOOSEV_IRQ_XINT9 MONGOOSEV_IRQ_PERIPHERAL_BASE + 9
|
||||
#define MONGOOSEV_IRQ_RESERVED_BIT_10 MONGOOSEV_IRQ_PERIPHERAL_BASE + 10
|
||||
#define MONGOOSEV_IRQ_UART0_RX_FRAME_ERROR MONGOOSEV_IRQ_PERIPHERAL_BASE + 11
|
||||
#define MONGOOSEV_IRQ_UART0_RX_OVERRUN_ERROR MONGOOSEV_IRQ_PERIPHERAL_BASE + 12
|
||||
#define MONGOOSEV_IRQ_UART0_TX_EMPTY MONGOOSEV_IRQ_PERIPHERAL_BASE + 13
|
||||
#define MONGOOSEV_IRQ_UART0_TX_READY MONGOOSEV_IRQ_PERIPHERAL_BASE + 14
|
||||
#define MONGOOSEV_IRQ_UART0_RX_READY MONGOOSEV_IRQ_PERIPHERAL_BASE + 15
|
||||
#define MONGOOSEV_IRQ_RESERVED_BIT_16 MONGOOSEV_IRQ_PERIPHERAL_BASE + 16
|
||||
#define MONGOOSEV_IRQ_UART1_RX_FRAME_ERROR MONGOOSEV_IRQ_PERIPHERAL_BASE + 17
|
||||
#define MONGOOSEV_IRQ_UART1_RX_OVERRUN_ERROR MONGOOSEV_IRQ_PERIPHERAL_BASE + 18
|
||||
#define MONGOOSEV_IRQ_UART1_TX_EMPTY MONGOOSEV_IRQ_PERIPHERAL_BASE + 19
|
||||
#define MONGOOSEV_IRQ_UART1_TX_READY MONGOOSEV_IRQ_PERIPHERAL_BASE + 20
|
||||
#define MONGOOSEV_IRQ_UART1_RX_READY MONGOOSEV_IRQ_PERIPHERAL_BASE + 21
|
||||
#define MONGOOSEV_IRQ_READ_ACCESS_VIOLATION MONGOOSEV_IRQ_PERIPHERAL_BASE + 22
|
||||
#define MONGOOSEV_IRQ_WRITE_ACCESS_VIOLATION MONGOOSEV_IRQ_PERIPHERAL_BASE + 23
|
||||
#define MONGOOSEV_IRQ_RESERVED_24 MONGOOSEV_IRQ_PERIPHERAL_BASE + 24
|
||||
#define MONGOOSEV_IRQ_RESERVED_25 MONGOOSEV_IRQ_PERIPHERAL_BASE + 25
|
||||
#define MONGOOSEV_IRQ_RESERVED_26 MONGOOSEV_IRQ_PERIPHERAL_BASE + 26
|
||||
#define MONGOOSEV_IRQ_RESERVED_27 MONGOOSEV_IRQ_PERIPHERAL_BASE + 27
|
||||
#define MONGOOSEV_IRQ_RESERVED_28 MONGOOSEV_IRQ_PERIPHERAL_BASE + 28
|
||||
#define MONGOOSEV_IRQ_RESERVED_29 MONGOOSEV_IRQ_PERIPHERAL_BASE + 29
|
||||
#define MONGOOSEV_IRQ_UNCORRECTABLE_ERROR MONGOOSEV_IRQ_PERIPHERAL_BASE + 30
|
||||
#define MONGOOSEV_IRQ_CORRECTABLE_ERROR MONGOOSEV_IRQ_PERIPHERAL_BASE + 31
|
||||
|
||||
#define MONGOOSEV_IRQ_SOFTWARE_1 MIPS_INTERRUPT_BASE+37
|
||||
#define MONGOOSEV_IRQ_SOFTWARE_2 MIPS_INTERRUPT_BASE+38
|
||||
#define MONGOOSEV_MAXIMUM_VECTORS MIPS_INTERRUPT_BASE+39
|
||||
|
||||
#define BSP_INTERRUPT_VECTOR_MAX MONGOOSEV_MAXIMUM_VECTORS
|
||||
|
||||
/** @} */
|
||||
|
||||
#endif /* LIBBSP_MIPS_MONGOOSEV_IRQ_H */
|
||||
@@ -1,99 +0,0 @@
|
||||
/* lr33000.h - LSI LR33000 CPU header */
|
||||
|
||||
|
||||
/*
|
||||
modification history
|
||||
--------------------
|
||||
01c,22sep92,rrr added support for c++
|
||||
01b,20apr92,ajm added CR_DCAS for ethernet support
|
||||
01a,10feb92,ajm written for FCS
|
||||
*/
|
||||
|
||||
#ifndef __INClr33000h
|
||||
#define __INClr33000h
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#ifdef _ASMLANGUAGE
|
||||
#define C0_DCIC $7 /* cache control */
|
||||
#define C0_BPC $3 /* breakpoint on instr */
|
||||
#define C0_BDA $5 /* breakpoint on data */
|
||||
#endif /* _ASMLANGUAGE */
|
||||
|
||||
#define DEBUG_VECT 0x00000040
|
||||
#define K0_DEBUG_VECT (K0BASE+DEBUG_VECT)
|
||||
#define K1_DEBUG_VECT (K1BASE+DEBUG_VECT)
|
||||
|
||||
/* definitions for Debug and Cache Invalidate control (DCIC) register bits */
|
||||
#define DCIC_TR 0x80000000 /* Trap enable */
|
||||
#define DCIC_UD 0x40000000 /* User debug enable */
|
||||
#define DCIC_KD 0x20000000 /* Kernel debug enable */
|
||||
#define DCIC_TE 0x10000000 /* Trace enable */
|
||||
#define DCIC_DW 0x08000000 /* Enable data breakpoints on write */
|
||||
#define DCIC_DR 0x04000000 /* Enable data breakpoints on read */
|
||||
#define DCIC_DAE 0x02000000 /* Enable data addresss breakpoints */
|
||||
#define DCIC_PCE 0x01000000 /* Enable instruction breakpoints */
|
||||
#define DCIC_DE 0x00800000 /* Debug enable */
|
||||
#define DCIC_DL 0x00008000 /* Data cache line invalidate */
|
||||
#define DCIC_IL 0x00004000 /* Instruction cache line invalidate */
|
||||
#define DCIC_D 0x00002000 /* Data cache invalidate enable */
|
||||
#define DCIC_I 0x00001000 /* Instr. cache invalidate enable */
|
||||
#define DCIC_T 0x00000020 /* Trace, set by CPU */
|
||||
#define DCIC_W 0x00000010 /* Write reference, set by CPU */
|
||||
#define DCIC_R 0x00000008 /* Read reference, set by CPU */
|
||||
#define DCIC_DA 0x00000004 /* Data address, set by CPU */
|
||||
#define DCIC_PC 0x00000002 /* Program counter, set by CPU */
|
||||
#define DCIC_DB 0x00000001 /* Debug, set by CPU */
|
||||
|
||||
/* Define counter/timer register addresses */
|
||||
#define M_TIC1 0xfffe0000 /* timer 1 initial count */
|
||||
#define M_TC1 0xfffe0004 /* timer 1 control */
|
||||
#define M_TIC2 0xfffe0008 /* timer 2 initial count */
|
||||
#define M_TC2 0xfffe000c /* timer 2 control */
|
||||
#define M_RTIC 0xfffe0010 /* refresh timer */
|
||||
#define M_CFGREG 0xfffe0020 /* configuration reg */
|
||||
|
||||
/* Definitions for counter/timer control register bits */
|
||||
#define TC_CE 0x00000004 /* count enable */
|
||||
#define TC_IE 0x00000002 /* interrupt enable (1 == enable) */
|
||||
#define TC_INT 0x00000001 /* interrupt acknowlege (0 == ack) */
|
||||
#define TCNT_MASK 0x00ffffff /* 24 bit timer mask */
|
||||
|
||||
/* Definitions for Configuration register bits */
|
||||
#define CR_ICDISABLE 0x00800000 /* Instruction cache disable */
|
||||
#define CR_DCDISABLE 0x00400000 /* Data cache disable */
|
||||
#define CR_IBLK_2 0x00000000 /* Instruction cache block size */
|
||||
#define CR_IBLK_4 0x00100000 /* Instruction cache block size */
|
||||
#define CR_IBLK_8 0x00200000 /* Instruction cache block size */
|
||||
#define CR_IBLK_16 0x00300000 /* Instruction cache block size */
|
||||
#define CR_IBLKMSK 0x00300000 /* Instruction cache block size */
|
||||
#define CR_DBLK_2 0x00000000 /* Data cache block size */
|
||||
#define CR_DBLK_4 0x00040000 /* Data cache block size */
|
||||
#define CR_DBLK_8 0x00080000 /* Data cache block size */
|
||||
#define CR_DBLK_16 0x000c0000 /* Data cache block size */
|
||||
#define CR_DBLKMSK 0x000c0000 /* Data cache block size */
|
||||
#define CR_IODIS 0x00020000 /* Disable DRDY for I/O addresses */
|
||||
#define CR_IOWAITSHFT 13 /* I/O wait states */
|
||||
#define CR_PDIS 0x00001000 /* Disable DRDY for PROM addresses */
|
||||
#define CR_PWAITSHFT 8 /* PROM wait states */
|
||||
#define CR_DCAS 0x00000080 /* Define # cycles of DCAS */
|
||||
#define CR_DPEN 0x00000040 /* Enable parity check for DRAM */
|
||||
#define CR_RDYGEN 0x00000020 /* Disable DRDY for DRAM addresses */
|
||||
#define CR_BLKFDIS 0x00000010 /* Disable DRAM block refill */
|
||||
#define CR_RFSHEN 0x00000008 /* Enable refresh generator */
|
||||
#define CR_RASPCHG 0x00000004 /* Define RAS precharge */
|
||||
#define CR_CASLNTH 0x00000002 /* Define CAS active time */
|
||||
#define CR_DRAMEN 0x00000001 /* Enable DRAM controller */
|
||||
#define CR_PWT(x) ((x) << 8) /* memory wait states */
|
||||
#define CR_IOWT(x) ((x) << 13) /* io wait states */
|
||||
|
||||
#define LR33000_DSIZE 0x400 /* Data cache = 1Kbytes */
|
||||
#define LR33000_ISIZE 0x2000 /* Instructrion cache = 8Kbytes */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __INClr33000h */
|
||||
@@ -1,180 +0,0 @@
|
||||
/* lr333x0.h - LSI LR333x0 CPU header */
|
||||
|
||||
|
||||
#ifndef __INClr333x0h
|
||||
#define __INClr333x0h
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#ifdef _ASMLANGUAGE
|
||||
#define C0_BPC $3 /* breakpoint on instr */
|
||||
#define C0_BDA $5 /* breakpoint on data */
|
||||
#define C0_TAR $6 /* target address register */
|
||||
#define C0_DCIC $7 /* cache control */
|
||||
#define C0_BDAM $9 /* breakpoint data addr mask */
|
||||
#define C0_BPCM $11 /* breakpoint instr addr mask */
|
||||
#else
|
||||
IMPORT int sysICsize; /* inst cache size defined in BSP */
|
||||
IMPORT int sysDCsize; /* data cache size defined in BSP */
|
||||
IMPORT BOOL sysICset0; /* inst cache set 0 present ? */
|
||||
#endif /* _ASMLANGUAGE */
|
||||
|
||||
#define DEBUG_VECT 0x00000040
|
||||
#define K0_DEBUG_VECT (K0BASE+DEBUG_VECT)
|
||||
#define K1_DEBUG_VECT (K1BASE+DEBUG_VECT)
|
||||
|
||||
/* Define register addresses */
|
||||
|
||||
#define M_TIC1 0xfffe0000 /* timer 1 initial count */
|
||||
#define M_TC1 0xfffe0004 /* timer 1 control */
|
||||
#define M_TIC2 0xfffe0008 /* timer 2 initial count */
|
||||
#define M_TC2 0xfffe000c /* timer 2 control */
|
||||
#define M_RTIC 0xfffe0010 /* refresh timer */
|
||||
#define M_SRAM 0xfffe0100 /* SRAM config reg */
|
||||
#define M_SPEC0 0xfffe0104
|
||||
#define M_SPEC1 0xfffe0108
|
||||
#define M_SPEC2 0xfffe010c
|
||||
#define M_SPEC3 0xfffe0110
|
||||
#define M_DRAM 0xfffe0120 /* DRAM configuration */
|
||||
#define M_BIU 0xfffe0130 /* BIU/cache configuration */
|
||||
|
||||
/* Definitions for Debug and Cache Invalidate control (DCIC) register bits */
|
||||
|
||||
#define DCIC_TR 0x80000000 /* Trap enable */
|
||||
#define DCIC_UD 0x40000000 /* User debug enable */
|
||||
#define DCIC_KD 0x20000000 /* Kernel debug enable */
|
||||
#define DCIC_TE 0x10000000 /* Trace enable */
|
||||
#define DCIC_DW 0x08000000 /* Enable data breakpoints on write */
|
||||
#define DCIC_DR 0x04000000 /* Enable data breakpoints on read */
|
||||
#define DCIC_DAE 0x02000000 /* Enable data addresss breakpoints */
|
||||
#define DCIC_PCE 0x01000000 /* Enable instruction breakpoints */
|
||||
#define DCIC_DE 0x00800000 /* Debug enable */
|
||||
#define DCIC_T 0x00000020 /* Trace, set by CPU */
|
||||
#define DCIC_W 0x00000010 /* Write reference, set by CPU */
|
||||
#define DCIC_R 0x00000008 /* Read reference, set by CPU */
|
||||
#define DCIC_DA 0x00000004 /* Data address, set by CPU */
|
||||
#define DCIC_PC 0x00000002 /* Program counter, set by CPU */
|
||||
#define DCIC_DB 0x00000001 /* Debug, set by CPU */
|
||||
|
||||
/* Definitions for counter/timer control register bits */
|
||||
|
||||
#define TC_CE 0x00000004 /* count enable */
|
||||
#define TC_IE 0x00000002 /* interrupt enable (1 == enable) */
|
||||
#define TC_INT 0x00000001 /* interrupt acknowlege (0 == ack) */
|
||||
|
||||
/* Definitions for Wait-state configuration register bits */
|
||||
|
||||
#define SPC_INHIBITSHFT 24 /* Inhibit shift count */
|
||||
#define SPC_EXTGNT 0x00800000 /* External data ready */
|
||||
#define SPC_16WIDE 0x00400000 /* 16-bit wide memory */
|
||||
#define SPC_8WIDE 0x00200000 /* 8-bit wide memory */
|
||||
#define SPC_PENA 0x00100000 /* Parity enable */
|
||||
#define SPC_CACHED 0x00080000 /* Cache data */
|
||||
#define SPC_CSDLY_3 0x00060000 /* Select delay, 3 cycles */
|
||||
#define SPC_CSDLY_2 0x00040000 /* Select delay, 2 cycles */
|
||||
#define SPC_CSDLY_1 0x00020000 /* Select delay, 1 cycles */
|
||||
#define SPC_CSDLY_0 0x00000000 /* Select delay, 0 cycles */
|
||||
#define SPC_BLKENA 0x00010000 /* Block enable */
|
||||
#define SPC_BLKWAIT_7 0x0000e000 /* Block delay, 7 cycles */
|
||||
#define SPC_BLKWAIT_6 0x0000c000 /* Block delay, 6 cycles */
|
||||
#define SPC_BLKWAIT_5 0x0000a000 /* Block delay, 5 cycles */
|
||||
#define SPC_BLKWAIT_4 0x00008000 /* Block delay, 4 cycles */
|
||||
#define SPC_BLKWAIT_3 0x00006000 /* Block delay, 3 cycles */
|
||||
#define SPC_BLKWAIT_2 0x00004000 /* Block delay, 2 cycles */
|
||||
#define SPC_BLKWAIT_1 0x00002000 /* Block delay, 1 cycles */
|
||||
#define SPC_BLKWAIT_0 0x00000000 /* Block delay, 0 cycles */
|
||||
#define SPC_RECSHFT 7 /* Recovery time shift count */
|
||||
#define SPC_WAITENA 0x00000040 /* Wait-state generator enable */
|
||||
#define SPC_WAITSHFT 0 /* Wait shift count */
|
||||
|
||||
/* Definitions for DRAM configuration register bits */
|
||||
|
||||
#define DRAM_DLP1 0x10000000 /* Data latch in phase 1 */
|
||||
#define DRAM_SYNC 0x08000000 /* Sunchronous DRAM mode */
|
||||
#define DRAM_SCFG 0x04000000 /* Synchronous Configuration mode */
|
||||
#define DRAM_DMARDY 0x02000000 /* DMA ready */
|
||||
#define DRAM_DMABLK_64 0x01400000 /* DMA block refill size, 64 words */
|
||||
#define DRAM_DMABLK_32 0x01000000 /* DMA block refill size, 32 words */
|
||||
#define DRAM_DMABLK_16 0x00c00000 /* DMA block refill size, 16 words */
|
||||
#define DRAM_DMABLK_8 0x00800000 /* DMA block refill size, 8 words */
|
||||
#define DRAM_DMABLK_4 0x00400000 /* DMA block refill size, 4 words */
|
||||
#define DRAM_DMABLK_2 0x00000000 /* DMA block refill size, 2 words */
|
||||
#define DRAM_DPTH_8 0x00300000 /* CAS ready depth, 8 per cycle */
|
||||
#define DRAM_DPTH_4 0x00200000 /* CAS ready depth, 4 per cycle */
|
||||
#define DRAM_DPTH_2 0x00100000 /* CAS ready depth, 2 per cycle */
|
||||
#define DRAM_DPTH_1 0x00000000 /* CAS ready depth, 1 per cycle */
|
||||
#define DRAM_RDYW 0x00080000 /* Ready Wait */
|
||||
#define DRAM_PGSZ_2K 0x00070000 /* Page size, 2K words */
|
||||
#define DRAM_PGSZ_1K 0x00060000 /* Page size, 1K words */
|
||||
#define DRAM_PGSZ_512 0x00050000 /* Page size, 512 words */
|
||||
#define DRAM_PGSZ_256 0x00040000 /* Page size, 256 words */
|
||||
#define DRAM_PGSZ_128 0x00030000 /* Page size, 128 words */
|
||||
#define DRAM_PGSZ_64 0x00020000 /* Page size, 64 words */
|
||||
#define DRAM_PGSZ_32 0x00010000 /* Page size, 32 words */
|
||||
#define DRAM_PGSZ_16 0x00000000 /* Page size, 16 words */
|
||||
#define DRAM_PGMW 0x00008000 /* Page mode write enable */
|
||||
#define DRAM_RFWE_0 0x00004000 /* Refresh write enable mode, bit 1 */
|
||||
#define DRAM_RFWE_1 0x00002000 /* Refresh write enable mode, bit 0 */
|
||||
#define DRAM_RFEN 0x00001000 /* Internal refresh enable */
|
||||
#define DRAM_RDYEN 0x00000800 /* Internal ready generation */
|
||||
#define DRAM_BFD 0x00000400 /* Block fetch disable */
|
||||
#define DRAM_PE 0x00000200 /* Parity checking enable */
|
||||
#define DRAM_RPC_3 0x00000180 /* RAS precharge, 3 */
|
||||
#define DRAM_RPC_2 0x00000100 /* RAS precharge, 2 */
|
||||
#define DRAM_RPC_1 0x00000080 /* RAS precharge, 1 */
|
||||
#define DRAM_RPC_0 0x00000000 /* RAS precharge, 0 */
|
||||
#define DRAM_RCD_3 0x00000060 /* RAS to CAS delay, 3 */
|
||||
#define DRAM_RCD_2 0x00000040 /* RAS to CAS delay, 2 */
|
||||
#define DRAM_RCD_1 0x00000020 /* RAS to CAS delay, 1 */
|
||||
#define DRAM_RCD_0 0x00000000 /* RAS to CAS delay, 0 */
|
||||
#define DRAM_CS 0x00000010 /* CAS short */
|
||||
#define DRAM_CL_8_5 0x0000000f /* CAS length, 8.5 cycles */
|
||||
#define DRAM_CL_7_5 0x0000000c /* CAS length, 7.5 cycles*/
|
||||
#define DRAM_CL_6_5 0x0000000a /* CAS length, 6.5 cycles */
|
||||
#define DRAM_CL_5_5 0x00000008 /* CAS length, 5.5 cycles */
|
||||
#define DRAM_CL_4_5 0x00000006 /* CAS length, 4.5 cycles */
|
||||
#define DRAM_CL_3_5 0x00000004 /* CAS length, 3.5 cycles*/
|
||||
#define DRAM_CL_2_5 0x00000002 /* CAS length, 2.5 cycles */
|
||||
#define DRAM_CL_1_5 0x00000000 /* CAS length, 1.5 cycles */
|
||||
#define DRAM_DCE 0x00000001 /* DRAM controller enable */
|
||||
|
||||
/* Definitions for BIU/cache configuration register bits */
|
||||
|
||||
#define BIU_NOSTR 0x00020000 /* no instruction streaming */
|
||||
#define BIU_LDSCH 0x00010000 /* enable load scheduling */
|
||||
#define BIU_BGNT 0x00008000 /* enable bus grant */
|
||||
#define BIU_NOPAD 0x00004000 /* no wait state */
|
||||
#define BIU_RDPRI 0x00002000 /* enable read priority */
|
||||
#define BIU_INTP 0x00001000 /* interrupt polarity */
|
||||
#define BIU_IS1 0x00000800 /* enable Inst cache, set 1 */
|
||||
#define BIU_IS0 0x00000400 /* enable Inst cache, set 0 */
|
||||
#define BIU_IBLKSZ_16 0x00000300 /* Inst cache fill sz = 16 words */
|
||||
#define BIU_IBLKSZ_8 0x00000200 /* Inst cache fill sz = 8 words */
|
||||
#define BIU_IBLKSZ_4 0x00000100 /* Inst cache fill sz = 4 words */
|
||||
#define BIU_IBLKSZ_2 0x00000000 /* Inst cache fill sz = 2 words */
|
||||
#define BIU_DS 0x00000080 /* enable Data cache */
|
||||
#define BIU_DBLKSZ_16 0x00000030 /* Data cache fill sz = 16 words */
|
||||
#define BIU_DBLKSZ_8 0x00000020 /* Data cache fill sz = 8 words */
|
||||
#define BIU_DBLKSZ_4 0x00000010 /* Data cache fill sz = 4 words */
|
||||
#define BIU_DBLKSZ_2 0x00000000 /* Data cache fill sz = 2 words */
|
||||
#define BIU_RAM 0x00000008 /* scratchpad RAM */
|
||||
#define BIU_TAG 0x00000004 /* tag test mode */
|
||||
#define BIU_INV 0x00000002 /* invalidate mode */
|
||||
#define BIU_LOCK 0x00000001 /* lock mode */
|
||||
|
||||
/* Definitions for cache sizes */
|
||||
|
||||
#define LR33300_IC_SIZE 0x1000 /* 33300 Inst cache = 4Kbytes */
|
||||
#define LR33310_IC_SIZE 0x1000 /* 33310 Inst cache = 4Kbytes */
|
||||
/* Note: each set is 4Kbytes! */
|
||||
|
||||
#define LR33300_DC_SIZE 0x800 /* 33300 Data cache = 2Kbytes */
|
||||
#define LR33310_DC_SIZE 0x1000 /* 33310 Data cache = 4Kbytes */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __INClr333x0h */
|
||||
@@ -1,306 +0,0 @@
|
||||
/**
|
||||
* @file
|
||||
*
|
||||
* MIPS Mongoose-V specific information
|
||||
*/
|
||||
|
||||
/*
|
||||
* COPYRIGHT (c) 1989-2012.
|
||||
* 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.org/license/LICENSE.
|
||||
*/
|
||||
|
||||
#ifndef __MONGOOSEV_h
|
||||
#define __MONGOOSEV_h
|
||||
|
||||
/*
|
||||
* Macros to assist in accessing memory mapped Mongoose registers
|
||||
*/
|
||||
|
||||
|
||||
#define MONGOOSEV_READ( _base ) \
|
||||
( *((volatile uint32_t*)(_base)) )
|
||||
|
||||
#define MONGOOSEV_WRITE( _base, _value ) \
|
||||
( *((volatile uint32_t*)(_base)) = (_value) )
|
||||
|
||||
#define MONGOOSEV_READ_REGISTER( _base, _register ) \
|
||||
( *((volatile uint32_t*)((_base) + (_register))) )
|
||||
|
||||
#define MONGOOSEV_WRITE_REGISTER( _base, _register, _value ) \
|
||||
( *((volatile uint32_t*)((_base) + (_register))) = (_value) )
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* Macros to read/write the Mongoose FPU control register.
|
||||
*/
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* BIU and DRAM Registers
|
||||
*/
|
||||
|
||||
#define MONGOOSEV_BIU_CACHE_CONFIGURATION_REGISTER 0xFFFE0130
|
||||
#define MONGOOSEV_DRAM_CONFIGURATION_REGISTER 0xFFFE0120
|
||||
#define MONGOOSEV_REFRESH_TIMER_INITIAL_COUNTER_REGISTER 0xFFFE0010
|
||||
#define MONGOOSEV_WAIT_STATE_CONFIGURATION_REGISTER_BASE 0xFFFE0100
|
||||
|
||||
/*
|
||||
* Peripheral Function Addresses
|
||||
*
|
||||
* NOTE: Status and Interrupt Cause use the same bits
|
||||
*/
|
||||
|
||||
#define MONGOOSEV_PERIPHERAL_COMMAND_REGISTER 0xFFFE0180
|
||||
#define MONGOOSEV_PERIPHERAL_STATUS_REGISTER 0xFFFE0184
|
||||
#define MONGOOSEV_PERIPHERAL_FUNCTION_INTERRUPT_CAUSE_REGISTER 0xFFFE0188
|
||||
#define MONGOOSEV_PERIPHERAL_FUNCTION_INTERRUPT_MASK_REGISTER 0xFFFE018C
|
||||
|
||||
#define MONGOOSEV_WATCHDOG 0xBE000000
|
||||
|
||||
/* UART Bits in Peripheral Command Register Bits (TX/RX tied together here) */
|
||||
#define MONGOOSEV_UART_CMD_RESET_BOTH_PORTS 0x0001
|
||||
#define MONGOOSEV_UART_CMD_LOOPBACK_CTSN 0x0002
|
||||
#define MONGOOSEV_UART_CMD_LOOPBACK_RXTX 0x0004
|
||||
|
||||
#define MONGOOSEV_UART_CMD_RX_ENABLE 0x001
|
||||
#define MONGOOSEV_UART_CMD_RX_DISABLE 0x000
|
||||
#define MONGOOSEV_UART_CMD_TX_ENABLE 0x002
|
||||
#define MONGOOSEV_UART_CMD_TX_DISABLE 0x000
|
||||
#define MONGOOSEV_UART_CMD_TX_READY 0x004
|
||||
#define MONGOOSEV_UART_CMD_PARITY_ENABLE 0x008
|
||||
#define MONGOOSEV_UART_CMD_PARITY_DISABLE 0x000
|
||||
#define MONGOOSEV_UART_CMD_PARITY_EVEN 0x010
|
||||
#define MONGOOSEV_UART_CMD_PARITY_ODD 0x000
|
||||
|
||||
#define MONGOOSEV_UART0_CMD_SHIFT 5
|
||||
#define MONGOOSEV_UART1_CMD_SHIFT 11
|
||||
|
||||
#define MONGOOSEV_UART_CMD_TX_ENABLE_0 \
|
||||
(MONGOOSEV_UART_CMD_TX_ENABLE << MONGOOSEV_UART0_CMD_SHIFT)
|
||||
#define MONGOOSEV_UART_CMD_RX_ENABLE_0 \
|
||||
(MONGOOSEV_UART_CMD_RX_ENABLE << MONGOOSEV_UART0_CMD_SHIFT)
|
||||
#define MONGOOSEV_UART_CMD_TX_READY_0 \
|
||||
(MONGOOSEV_UART_CMD_TX_READY << MONGOOSEV_UART0_CMD_SHIFT)
|
||||
#define MONGOOSEV_UART_CMD_PARITY_ENABLE_0 \
|
||||
(MONGOOSEV_UART_CMD_PARITY_ENABLE << MONGOOSEV_UART0_CMD_SHIFT)
|
||||
#define MONGOOSEV_UART_CMD_PARITY_DISABLE_0 \
|
||||
(MONGOOSEV_UART_CMD_PARITY_DISABLE << MONGOOSEV_UART0_CMD_SHIFT)
|
||||
#define MONGOOSEV_UART_CMD_PARITY_EVEN_0 \
|
||||
(MONGOOSEV_UART_CMD_PARITY_EVEN << MONGOOSEV_UART0_CMD_SHIFT)
|
||||
#define MONGOOSEV_UART_CMD_PARITY_ODD_0 \
|
||||
(MONGOOSEV_UART_CMD_PARITY_ODD << MONGOOSEV_UART0_CMD_SHIFT)
|
||||
|
||||
#define MONGOOSEV_UART_CMD_TX_ENABLE_1 \
|
||||
(MONGOOSEV_UART_CMD_TX_ENABLE << MONGOOSEV_UART1_CMD_SHIFT)
|
||||
#define MONGOOSEV_UART_CMD_RX_ENABLE_1 \
|
||||
(MONGOOSEV_UART_CMD_RX_ENABLE << MONGOOSEV_UART1_CMD_SHIFT)
|
||||
#define MONGOOSEV_UART_CMD_TX_READY_1 \
|
||||
(MONGOOSEV_UART_CMD_TX_READY << MONGOOSEV_UART1_CMD_SHIFT)
|
||||
#define MONGOOSEV_UART_CMD_PARITY_ENABLE_1 \
|
||||
(MONGOOSEV_UART_CMD_PARITY_ENABLE << MONGOOSEV_UART1_CMD_SHIFT)
|
||||
#define MONGOOSEV_UART_CMD_PARITY_DISABLE_1 \
|
||||
(MONGOOSEV_UART_CMD_PARITY_DISABLE << MONGOOSEV_UART1_CMD_SHIFT)
|
||||
#define MONGOOSEV_UART_CMD_PARITY_EVEN_1 \
|
||||
(MONGOOSEV_UART_CMD_PARITY_EVEN << MONGOOSEV_UART1_CMD_SHIFT)
|
||||
#define MONGOOSEV_UART_CMD_PARITY_ODD_1 \
|
||||
(MONGOOSEV_UART_CMD_PARITY_ODD << MONGOOSEV_UART1_CMD_SHIFT)
|
||||
|
||||
/* UART Bits in Peripheral Status and Interrupt Cause Register */
|
||||
#define MONGOOSEV_UART_RX_FRAME_ERROR 0x0001
|
||||
#define MONGOOSEV_UART_RX_OVERRUN_ERROR 0x0002
|
||||
#define MONGOOSEV_UART_TX_EMPTY 0x0004
|
||||
#define MONGOOSEV_UART_TX_READY 0x0008
|
||||
#define MONGOOSEV_UART_RX_READY 0x0010
|
||||
|
||||
#define MONGOOSEV_UART_ALL_RX_STATUS_BITS 0x0013
|
||||
#define MONGOOSEV_UART_ALL_STATUS_BITS 0x001F
|
||||
|
||||
/*
|
||||
* The Peripheral Interrupt Status, Cause, and Mask registers have the
|
||||
* same bit assignments although some revisions of the document have
|
||||
* the Cause and Status registers incorrect.
|
||||
*/
|
||||
|
||||
#define MONGOOSEV_UART0_IRQ_SHIFT 11
|
||||
#define MONGOOSEV_UART1_IRQ_SHIFT 17
|
||||
|
||||
#define MONGOOSEV_UART_FRAME_ERROR_0 \
|
||||
(MONGOOSEV_UART_FRAME_ERROR << MONGOOSEV_UART0_IRQ_SHIFT)
|
||||
#define MONGOOSEV_UART_RX_OVERRUN_ERROR_0 \
|
||||
(MONGOOSEV_UART_RX_OVERRUN_ERROR << MONGOOSEV_UART0_IRQ_SHIFT)
|
||||
#define MONGOOSEV_UART_TX_EMPTY_0 \
|
||||
(MONGOOSEV_UART_TX_EMPTY << MONGOOSEV_UART0_IRQ_SHIFT)
|
||||
#define MONGOOSEV_UART_TX_READY_0 \
|
||||
(MONGOOSEV_UART_TX_READY << MONGOOSEV_UART0_IRQ_SHIFT)
|
||||
#define MONGOOSEV_UART_RX_READY_0 \
|
||||
(MONGOOSEV_UART_RX_READY << MONGOOSEV_UART0_IRQ_SHIFT)
|
||||
|
||||
#define MONGOOSEV_UART_FRAME_ERROR_1 \
|
||||
(MONGOOSEV_UART_FRAME_ERROR << MONGOOSEV_UART1_IRQ_SHIFT)
|
||||
#define MONGOOSEV_UART_RX_OVERRUN_ERROR_1 \
|
||||
(MONGOOSEV_UART_RX_OVERRUN_ERROR << MONGOOSEV_UART1_IRQ_SHIFT)
|
||||
#define MONGOOSEV_UART_TX_EMPTY_1 \
|
||||
(MONGOOSEV_UART_TX_EMPTY << MONGOOSEV_UART1_IRQ_SHIFT)
|
||||
#define MONGOOSEV_UART_TX_READY_1 \
|
||||
(MONGOOSEV_UART_TX_READY << MONGOOSEV_UART1_IRQ_SHIFT)
|
||||
#define MONGOOSEV_UART_RX_READY_1 \
|
||||
(MONGOOSEV_UART_RX_READY << MONGOOSEV_UART1_IRQ_SHIFT)
|
||||
|
||||
/*
|
||||
* Bits in the Peripheral Interrupt Mask Register
|
||||
*/
|
||||
|
||||
/*
|
||||
** Interrupt Status/Cause/Mask register bits - from 31 to 0
|
||||
*/
|
||||
#define MONGOOSEV_EDAC_SERR_BIT 0x80000000
|
||||
#define MONGOOSEV_EDAC_MERR_BIT 0x40000000
|
||||
/* 29 - 24 reserved */
|
||||
#define MONGOOSEV_MAVN_WRITE_ACCESS 0x00800000
|
||||
#define MONGOOSEV_MAVN_READ_ACCESS 0x00400000
|
||||
#define MONGOOSEV_UART_1_RX_READY 0x00200000
|
||||
#define MONGOOSEV_UART_1_TX_READY 0x00100000
|
||||
#define MONGOOSEV_UART_1_TX_EMPTY 0x00080000
|
||||
#define MONGOOSEV_UART_1_RX_OVERRUN 0x00040000
|
||||
#define MONGOOSEV_UART_1_FRAME_ERROR 0x00020000
|
||||
#define MONGOOSEV_RESERVED_16 0x00010000
|
||||
#define MONGOOSEV_UART_0_RX_READY 0x00008000
|
||||
#define MONGOOSEV_UART_0_TX_READY 0x00004000
|
||||
#define MONGOOSEV_UART_0_TX_EMPTY 0x00002000
|
||||
#define MONGOOSEV_UART_0_RX_OVERRUN 0x00001000
|
||||
#define MONGOOSEV_UART_0_FRAME_ERROR 0x00000800
|
||||
#define MONGOOSEV_RESERVED_10 0x00000400
|
||||
#define MONGOOSEV_EXTERN_INT_9 0x00000200
|
||||
#define MONGOOSEV_EXTERN_INT_8 0x00000100
|
||||
#define MONGOOSEV_EXTERN_INT_7 0x00000080
|
||||
#define MONGOOSEV_EXTERN_INT_6 0x00000040
|
||||
#define MONGOOSEV_EXTERN_INT_5 0x00000020
|
||||
#define MONGOOSEV_EXTERN_INT_4 0x00000010
|
||||
#define MONGOOSEV_EXTERN_INT_3 0x00000008
|
||||
#define MONGOOSEV_EXTERN_INT_2 0x00000004
|
||||
#define MONGOOSEV_EXTERN_INT_1 0x00000002
|
||||
#define MONGOOSEV_EXTERN_INT_0 0x00000001
|
||||
|
||||
|
||||
/*
|
||||
** Peripheral Command bits (non-uart, those are defined above)
|
||||
*/
|
||||
#define MONGOOSEV_COMMAND_ENABLE_EDAC MONGOOSEV_EDAC_SERR_BIT
|
||||
#define MONGOOSEV_COMMAND_OVERRIDE_EDAC MONGOOSEV_EDAC_MERR_BIT
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* EDAC Registers
|
||||
*/
|
||||
|
||||
#define MONGOOSEV_EDAC_ERROR_ADDRESS_REGISTER 0xFFFE0190
|
||||
#define MONGOOSEV_EDAC_PARITY_TEST_MODE_REGISTER 0xFFFE0194
|
||||
|
||||
/*
|
||||
* MAVN Registers
|
||||
*/
|
||||
|
||||
#define MONGOOSEV_MAVN_TEST_REGISTER 0xFFFE01B4
|
||||
#define MONGOOSEV_MAVN_ACCESS_PRIVILEGE_REGISTER 0xFFFE01B8
|
||||
#define MONGOOSEV_MAVN_ACCESS_VIOLATION_REGISTER 0xFFFE01BC
|
||||
#define MONGOOSEV_MAVN_RANGE_0_REGISTER 0xFFFE01C0
|
||||
#define MONGOOSEV_MAVN_RANGE_1_REGISTER 0xFFFE01C4
|
||||
#define MONGOOSEV_MAVN_RANGE_2_REGISTER 0xFFFE01C8
|
||||
#define MONGOOSEV_MAVN_RANGE_3_REGISTER 0xFFFE01CC
|
||||
#define MONGOOSEV_MAVN_RANGE_4_REGISTER 0xFFFE01D0
|
||||
#define MONGOOSEV_MAVN_RANGE_5_REGISTER 0xFFFE01D4
|
||||
#define MONGOOSEV_MAVN_RANGE_6_REGISTER 0xFFFE01D8
|
||||
#define MONGOOSEV_MAVN_RANGE_7_REGISTER 0xFFFE01DC
|
||||
|
||||
/*
|
||||
* Timer Base Addresses, Offsets, and Values
|
||||
*/
|
||||
|
||||
#define MONGOOSEV_TIMER1_BASE 0xFFFE0000
|
||||
#define MONGOOSEV_TIMER2_BASE 0xFFFE0008
|
||||
|
||||
#define MONGOOSEV_TIMER_INITIAL_COUNTER_REGISTER 0
|
||||
#define MONGOOSEV_TIMER_CONTROL_REGISTER 4
|
||||
|
||||
/* Timer Control Register Constants */
|
||||
#define MONGOOSEV_TIMER_CONTROL_COUNTER_ENABLE 0x04
|
||||
#define MONGOOSEV_TIMER_CONTROL_INTERRUPT_ENABLE 0x02
|
||||
#define MONGOOSEV_TIMER_CONTROL_TIMEOUT 0x01
|
||||
|
||||
/*
|
||||
* UART Base Addresses and Offsets
|
||||
*
|
||||
* Many bits in the peripheral command register are UART related
|
||||
* and the bits are defined there.
|
||||
*/
|
||||
|
||||
#define MONGOOSEV_UART0_BASE 0xFFFE01E8
|
||||
#define MONGOOSEV_UART1_BASE 0xFFFE01F4
|
||||
|
||||
#define MONGOOSEV_RX_BUFFER 0
|
||||
#define MONGOOSEV_TX_BUFFER 4
|
||||
#define MONGOOSEV_BAUD_RATE 8
|
||||
|
||||
|
||||
/*
|
||||
* Status Register Bits
|
||||
*/
|
||||
|
||||
#define SR_CUMASK 0xf0000000 /* coproc usable bits */
|
||||
#define SR_CU3 0x80000000 /* Coprocessor 3 usable */
|
||||
#define SR_CU2 0x40000000 /* Coprocessor 2 usable */
|
||||
#define SR_CU1 0x20000000 /* Coprocessor 1 usable */
|
||||
#define SR_CU0 0x10000000 /* Coprocessor 0 usable */
|
||||
#define SR_BEV 0x00400000 /* use boot exception vectors */
|
||||
#define SR_TS 0x00200000 /* TLB shutdown */
|
||||
#define SR_PE 0x00100000 /* cache parity error */
|
||||
#define SR_CM 0x00080000 /* cache miss */
|
||||
#define SR_PZ 0x00040000 /* cache parity zero */
|
||||
#define SR_SWC 0x00020000 /* swap cache */
|
||||
#define SR_ISC 0x00010000 /* Isolate data cache */
|
||||
#define SR_IMASK 0x0000ff00 /* Interrupt mask */
|
||||
#define SR_IMASK8 0x00000000 /* mask level 8 */
|
||||
#define SR_IMASK7 0x00008000 /* mask level 7 */
|
||||
#define SR_IMASK6 0x0000c000 /* mask level 6 */
|
||||
#define SR_IMASK5 0x0000e000 /* mask level 5 */
|
||||
#define SR_IMASK4 0x0000f000 /* mask level 4 */
|
||||
#define SR_IMASK3 0x0000f800 /* mask level 3 */
|
||||
#define SR_IMASK2 0x0000fc00 /* mask level 2 */
|
||||
#define SR_IMASK1 0x0000fe00 /* mask level 1 */
|
||||
#define SR_IMASK0 0x0000ff00 /* mask level 0 */
|
||||
|
||||
#define SR_IBIT8 0x00008000 /* bit level 8 */
|
||||
#define SR_IBIT7 0x00004000 /* bit level 7 */
|
||||
#define SR_IBIT6 0x00002000 /* bit level 6 */
|
||||
#define SR_IBIT5 0x00001000 /* bit level 5 */
|
||||
#define SR_IBIT4 0x00000800 /* bit level 4 */
|
||||
#define SR_IBIT3 0x00000400 /* bit level 3 */
|
||||
#define SR_IBIT2 0x00000200 /* bit level 2 */
|
||||
#define SR_IBIT1 0x00000100 /* bit level 1 */
|
||||
|
||||
#define SR_KUO 0x00000020 /* old kernel/user, 0 => k, 1 => u */
|
||||
#define SR_IEO 0x00000010 /* old interrupt enable, 1 => enable */
|
||||
#define SR_KUP 0x00000008 /* prev kernel/user, 0 => k, 1 => u */
|
||||
#define SR_IEP 0x00000004 /* prev interrupt enable, 1 => enable */
|
||||
#define SR_KUC 0x00000002 /* cur kernel/user, 0 => k, 1 => u */
|
||||
#define SR_IEC 0x00000001 /* cur interrupt enable, 1 => enable */
|
||||
#define SR_KUMSK (SR_KUO|SR_IEO|SR_KUP|SR_IEP|SR_KUC|SR_IEC)
|
||||
|
||||
#define SR_IMASKSHIFT 8
|
||||
|
||||
|
||||
|
||||
#define MONGOOSEV_IC_SIZE 0x1000 /* instruction cache = 4Kbytes */
|
||||
#define MONGOOSEV_DC_SIZE 0x800 /* data cache 2Kbytes */
|
||||
|
||||
#endif
|
||||
@@ -1,229 +0,0 @@
|
||||
/* r3000.h - mips R3k architecture header file */
|
||||
|
||||
/*
|
||||
* Copyright 1985-1997 by MIPS Computer Systems, Inc.
|
||||
*/
|
||||
|
||||
/*
|
||||
modification history
|
||||
--------------------
|
||||
01k,17jan96,kkk made MINCACHE 512 (spr# 7556)
|
||||
01j,13jan96,kkk undid 01i.
|
||||
01i,18dec96,tam enabled FP exceptions via FP_TASK_STATUS (spr #7665).
|
||||
01h,13sep93,caf fixed K2SIZE (SPR #1880).
|
||||
01g,22sep92,rrr added support for c++
|
||||
01f,02jun92,ajm the 5.0.5 merge
|
||||
01e,26may92,rrr the tree shuffle
|
||||
01d,04oct91,rrr passed through the ansification filter
|
||||
-changed copyright notice
|
||||
01c,23jul91,ajm changed default fp status register to all exceptions
|
||||
off forcing the user to enable exceptions for signals
|
||||
Enable FPA interrupt to tasks
|
||||
01b,08jul91,ajm added SR_KUMSK for exception handling
|
||||
01a,21feb91,ajm written.
|
||||
*/
|
||||
|
||||
#ifndef __INCr3000h
|
||||
#define __INCr3000h
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Segment base addresses and sizes
|
||||
*/
|
||||
|
||||
#define K0BASE 0x80000000
|
||||
#define K0SIZE 0x20000000
|
||||
#define K1BASE 0xA0000000
|
||||
#define K1SIZE 0x20000000
|
||||
#define K2BASE 0xC0000000
|
||||
#define K2SIZE 0x40000000
|
||||
|
||||
/*
|
||||
* Exception vectors
|
||||
*/
|
||||
|
||||
#define UT_VEC K0BASE /* utlbmiss vector */
|
||||
#define E_VEC (K0BASE+0x80) /* exception vector */
|
||||
#define R_VEC (K1BASE+0x1fc00000) /* reset vector */
|
||||
|
||||
/*
|
||||
* Address conversion macros
|
||||
*/
|
||||
|
||||
#define K0_TO_K1(x) ((unsigned)(x)|0xA0000000) /* kseg0 to kseg1 */
|
||||
#define K1_TO_K0(x) ((unsigned)(x)&0x9FFFFFFF) /* kseg1 to kseg0 */
|
||||
#define K0_TO_PHYS(x) ((unsigned)(x)&0x1FFFFFFF) /* kseg0 to physical */
|
||||
#define K1_TO_PHYS(x) ((unsigned)(x)&0x1FFFFFFF) /* kseg1 to physical */
|
||||
#define PHYS_TO_K0(x) ((unsigned)(x)|0x80000000) /* physical to kseg0 */
|
||||
#define PHYS_TO_K1(x) ((unsigned)(x)|0xA0000000) /* physical to kseg1 */
|
||||
|
||||
/*
|
||||
* Address predicates
|
||||
*/
|
||||
|
||||
#define IS_KSEG0(x) ((unsigned)(x) >= K0BASE && (unsigned)(x) < K1BASE)
|
||||
#define IS_KSEG1(x) ((unsigned)(x) >= K1BASE && (unsigned)(x) < K2BASE)
|
||||
#define IS_KUSEG(x) ((unsigned)(x) < K0BASE)
|
||||
|
||||
/*
|
||||
* Cache size constants
|
||||
*/
|
||||
|
||||
#define MINCACHE +(1*512) /* leading plus for mas's benefit */
|
||||
#define MAXCACHE +(256*1024) /* leading plus for mas's benefit */
|
||||
|
||||
/*
|
||||
* Cause bit definitions
|
||||
*/
|
||||
|
||||
#define CAUSE_BD 0x80000000 /* Branch delay slot */
|
||||
#define CAUSE_CEMASK 0x30000000 /* coprocessor error */
|
||||
#define CAUSE_CESHIFT 28
|
||||
|
||||
#define CAUSE_IP8 0x00008000 /* External level 8 pending */
|
||||
#define CAUSE_IP7 0x00004000 /* External level 7 pending */
|
||||
#define CAUSE_IP6 0x00002000 /* External level 6 pending */
|
||||
#define CAUSE_IP5 0x00001000 /* External level 5 pending */
|
||||
#define CAUSE_IP4 0x00000800 /* External level 4 pending */
|
||||
#define CAUSE_IP3 0x00000400 /* External level 3 pending */
|
||||
#define CAUSE_SW2 0x00000200 /* Software level 2 pending */
|
||||
#define CAUSE_SW1 0x00000100 /* Software level 1 pending */
|
||||
|
||||
#define CAUSE_IPMASK 0x0000FF00 /* Pending interrupt mask */
|
||||
#define CAUSE_IPSHIFT 8
|
||||
|
||||
#define CAUSE_EXCMASK 0x0000003C /* Cause code bits */
|
||||
#define CAUSE_EXCSHIFT 2
|
||||
|
||||
/*
|
||||
* Status definition bits
|
||||
*/
|
||||
|
||||
#define SR_CUMASK 0xf0000000 /* coproc usable bits */
|
||||
#define SR_CU3 0x80000000 /* Coprocessor 3 usable */
|
||||
#define SR_CU2 0x40000000 /* Coprocessor 2 usable */
|
||||
#define SR_CU1 0x20000000 /* Coprocessor 1 usable */
|
||||
#define SR_CU0 0x10000000 /* Coprocessor 0 usable */
|
||||
#define SR_BEV 0x00400000 /* use boot exception vectors */
|
||||
#define SR_TS 0x00200000 /* TLB shutdown */
|
||||
#define SR_PE 0x00100000 /* cache parity error */
|
||||
#define SR_CM 0x00080000 /* cache miss */
|
||||
#define SR_PZ 0x00040000 /* cache parity zero */
|
||||
#define SR_SWC 0x00020000 /* swap cache */
|
||||
#define SR_ISC 0x00010000 /* Isolate data cache */
|
||||
#define SR_IMASK 0x0000ff00 /* Interrupt mask */
|
||||
#define SR_IMASK8 0x00000000 /* mask level 8 */
|
||||
#define SR_IMASK7 0x00008000 /* mask level 7 */
|
||||
#define SR_IMASK6 0x0000c000 /* mask level 6 */
|
||||
#define SR_IMASK5 0x0000e000 /* mask level 5 */
|
||||
#define SR_IMASK4 0x0000f000 /* mask level 4 */
|
||||
#define SR_IMASK3 0x0000f800 /* mask level 3 */
|
||||
#define SR_IMASK2 0x0000fc00 /* mask level 2 */
|
||||
#define SR_IMASK1 0x0000fe00 /* mask level 1 */
|
||||
#define SR_IMASK0 0x0000ff00 /* mask level 0 */
|
||||
|
||||
#define SR_IBIT8 0x00008000 /* bit level 8 */
|
||||
#define SR_IBIT7 0x00004000 /* bit level 7 */
|
||||
#define SR_IBIT6 0x00002000 /* bit level 6 */
|
||||
#define SR_IBIT5 0x00001000 /* bit level 5 */
|
||||
#define SR_IBIT4 0x00000800 /* bit level 4 */
|
||||
#define SR_IBIT3 0x00000400 /* bit level 3 */
|
||||
#define SR_IBIT2 0x00000200 /* bit level 2 */
|
||||
#define SR_IBIT1 0x00000100 /* bit level 1 */
|
||||
|
||||
#define SR_KUO 0x00000020 /* old kernel/user, 0 => k, 1 => u */
|
||||
#define SR_IEO 0x00000010 /* old interrupt enable, 1 => enable */
|
||||
#define SR_KUP 0x00000008 /* prev kernel/user, 0 => k, 1 => u */
|
||||
#define SR_IEP 0x00000004 /* prev interrupt enable, 1 => enable */
|
||||
#define SR_KUC 0x00000002 /* cur kernel/user, 0 => k, 1 => u */
|
||||
#define SR_IEC 0x00000001 /* cur interrupt enable, 1 => enable */
|
||||
#define SR_KUMSK (SR_KUO|SR_IEO|SR_KUP|SR_IEP|SR_KUC|SR_IEC)
|
||||
|
||||
#define SR_IMASKSHIFT 8
|
||||
|
||||
/*
|
||||
* fpa definitions
|
||||
*/
|
||||
|
||||
#define FP_ROUND 0x3 /* r3010 round mode mask */
|
||||
#define FP_STICKY 0x7c /* r3010 sticky bits mask */
|
||||
#define FP_ENABLE 0xf80 /* r3010 enable mode mask */
|
||||
#define FP_EXC 0x3f000 /* r3010 exception mask */
|
||||
|
||||
#define FP_ROUND_N 0x0 /* round to nearest */
|
||||
#define FP_ROUND_Z 0x1 /* round to zero */
|
||||
#define FP_ROUND_P 0x2 /* round to + infinity */
|
||||
#define FP_ROUND_M 0x3 /* round to - infinity */
|
||||
|
||||
#define FP_STICKY_I 0x4 /* sticky inexact operation */
|
||||
#define FP_STICKY_U 0x8 /* sticky underflow */
|
||||
#define FP_STICKY_O 0x10 /* sticky overflow */
|
||||
#define FP_STICKY_Z 0x20 /* sticky divide by zero */
|
||||
#define FP_STICKY_V 0x40 /* sticky invalid operation */
|
||||
|
||||
#define FP_ENABLE_I 0x80 /* enable inexact operation */
|
||||
#define FP_ENABLE_U 0x100 /* enable underflow exc */
|
||||
#define FP_ENABLE_O 0x200 /* enable overflow exc */
|
||||
#define FP_ENABLE_Z 0x400 /* enable divide by zero exc */
|
||||
#define FP_ENABLE_V 0x800 /* enable invalid operation exc */
|
||||
|
||||
#define FP_EXC_I 0x1000 /* inexact operation */
|
||||
#define FP_EXC_U 0x2000 /* underflow */
|
||||
#define FP_EXC_O 0x4000 /* overflow */
|
||||
#define FP_EXC_Z 0x8000 /* divide by zero */
|
||||
#define FP_EXC_V 0x10000 /* invalid operation */
|
||||
#define FP_EXC_E 0x20000 /* unimplemented operation */
|
||||
|
||||
#define FP_COND 0x800000 /* condition bit */
|
||||
|
||||
#define FP_EXC_SHIFT 12
|
||||
#define FP_ENABLE_SHIFT 7
|
||||
#define FP_EXC_MASK (FP_EXC_I|FP_EXC_U|FP_EXC_O|FP_EXC_Z|FP_EXC_V|FP_EXC_E)
|
||||
#define FP_ENABLE_MASK (FP_ENABLE_I|FP_ENABLE_U|FP_ENABLE_O|FP_ENABLE_Z| \
|
||||
FP_ENABLE_V)
|
||||
#define FP_TASK_STATUS 0x0 /* all FP exceptions are disabled
|
||||
(see fppAlib.s and spr #7665) */
|
||||
|
||||
/*
|
||||
* tlb definitions
|
||||
*/
|
||||
|
||||
#define TLB_ENTRIES 64
|
||||
#define TLBLO_PFNMASK 0xfffff000
|
||||
#define TLBLO_PFNSHIFT 12
|
||||
#define TLBLO_N 0x800 /* non-cacheable */
|
||||
#define TLBLO_D 0x400 /* writeable */
|
||||
#define TLBLO_V 0x200 /* valid bit */
|
||||
#define TLBHI_VPNMASK 0xfffff000
|
||||
#define TLBHI_VPNSHIFT 12
|
||||
#define TLBHI_PIDMASK 0xfc0
|
||||
#define TLBHI_PIDSHIFT 6
|
||||
#define TLBHI_NPID 64
|
||||
#define TLBINX_PROBE 0x80000000
|
||||
#define TLBINX_INXMASK 0x00003f00
|
||||
#define TLBINX_INXSHIFT 8
|
||||
#define TLBRAND_RANDMASK 0x00003f00
|
||||
#define TLBRAND_RANDSHIFT 8
|
||||
#define TLBCTXT_BASEMASK 0xffe00000
|
||||
#define TLBCTXT_BASESHIFT 21
|
||||
#define TLBCTXT_VPNMASK 0x001ffffc
|
||||
#define TLBCTXT_VPNSHIFT 2
|
||||
|
||||
/*
|
||||
* Coprocessor 0 operations
|
||||
*/
|
||||
|
||||
#define C0_READI 0x1 /* read ITLB entry addressed by C0_INDEX */
|
||||
#define C0_WRITEI 0x2 /* write ITLB entry addressed by C0_INDEX */
|
||||
#define C0_WRITER 0x6 /* write ITLB entry addressed by C0_RAND */
|
||||
#define C0_PROBE 0x8 /* probe for ITLB entry addressed by TLBHI */
|
||||
#define C0_RFE 0x10 /* restore for exception */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __INCr3000h */
|
||||
@@ -1,36 +0,0 @@
|
||||
/**
|
||||
* @file
|
||||
*/
|
||||
|
||||
/*
|
||||
* The license and distribution terms for this file may be
|
||||
* found in the file LICENSE in this distribution or at
|
||||
* http://www.rtems.org/license/LICENSE.
|
||||
*/
|
||||
|
||||
#ifndef _RTEMS_TMTEST27
|
||||
#error "This is an RTEMS internal file you must not include directly."
|
||||
#endif
|
||||
|
||||
#ifndef __tm27_h
|
||||
#define __tm27_h
|
||||
|
||||
/*
|
||||
* Define the interrupt mechanism for Time Test 27
|
||||
*/
|
||||
|
||||
#include <bsp/irq.h>
|
||||
|
||||
#define MUST_WAIT_FOR_INTERRUPT 1
|
||||
|
||||
#define Install_tm27_vector( handler ) \
|
||||
rtems_interrupt_handler_install( \
|
||||
MONGOOSEV_IRQ_SOFTWARE_1, "benchmark", 0, \
|
||||
(rtems_interrupt_handler)handler, NULL );
|
||||
|
||||
#define Cause_tm27_intr() assertSoftwareInterrupt(0);
|
||||
|
||||
#define Clear_tm27_intr() /* empty */
|
||||
#define Lower_tm27_intr() /* empty */
|
||||
|
||||
#endif
|
||||
@@ -1,257 +0,0 @@
|
||||
/**
|
||||
* @file
|
||||
*
|
||||
* ISR Vectoring support for the Synova Mongoose-V.
|
||||
*/
|
||||
|
||||
/*
|
||||
* COPYRIGHT (c) 1989-2012.
|
||||
* 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.org/license/LICENSE.
|
||||
*/
|
||||
|
||||
#include <rtems.h>
|
||||
#include <stdlib.h>
|
||||
#include <bsp/mongoose-v.h>
|
||||
|
||||
#include <rtems/mips/iregdef.h>
|
||||
#include <rtems/mips/idtcpu.h>
|
||||
#include <rtems/irq.h>
|
||||
#include <bsp/irq.h>
|
||||
#include <bsp/irq-generic.h>
|
||||
|
||||
#include <rtems/bspIo.h> /* for printk */
|
||||
|
||||
int mips_default_isr( int vector );
|
||||
int assertSoftwareInterrupt( uint32_t n );
|
||||
void mips_vector_isr_handlers( CPU_Interrupt_frame *frame );
|
||||
|
||||
int mips_default_isr( int vector )
|
||||
{
|
||||
unsigned int sr, sr2;
|
||||
unsigned int cause;
|
||||
|
||||
mips_get_sr( sr );
|
||||
mips_get_cause( cause );
|
||||
|
||||
sr2 = sr & ~0xffff;
|
||||
mips_set_sr(sr2);
|
||||
|
||||
printk( "Unhandled isr exception: vector 0x%02x, cause 0x%08X, sr 0x%08X\n", vector, cause, sr );
|
||||
rtems_fatal_error_occurred(1);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* userspace routine to assert either software interrupt */
|
||||
|
||||
int assertSoftwareInterrupt( uint32_t n )
|
||||
{
|
||||
if( n<2 )
|
||||
{
|
||||
uint32_t c;
|
||||
|
||||
mips_get_cause(c);
|
||||
c = ((n+1) << CAUSE_IPSHIFT);
|
||||
mips_set_cause(c);
|
||||
|
||||
return n;
|
||||
}
|
||||
else return -1;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Instrumentation tweaks for isr timing measurement, turning them off
|
||||
* via this #if will remove the code entirely from the RTEMS kernel.
|
||||
*/
|
||||
|
||||
#if 0
|
||||
#define SET_ISR_FLAG( offset ) *((uint32_t*)(0x8001e000+offset)) = 1;
|
||||
#define CLR_ISR_FLAG( offset ) *((uint32_t*)(0x8001e000+offset)) = 0;
|
||||
#else
|
||||
#define SET_ISR_FLAG( offset )
|
||||
#define CLR_ISR_FLAG( offset )
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
static volatile uint32_t _ivcause, _ivsr;
|
||||
|
||||
|
||||
static uint32_t READ_CAUSE(void)
|
||||
{
|
||||
mips_get_cause( _ivcause );
|
||||
_ivcause &= SR_IMASK; /* mask off everything other than the interrupt bits */
|
||||
|
||||
return ((_ivcause & (_ivsr & SR_IMASK)) >> CAUSE_IPSHIFT);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* This rather strangely coded routine enforces an interrupt priority
|
||||
* scheme. As it runs thru finding whichever interrupt caused it to get
|
||||
* here, it test for other interrupts arriving in the meantime (maybe it
|
||||
* occured while the vector code is executing for instance). Each new
|
||||
* interrupt will be served in order of its priority. In an effort to
|
||||
* minimize overhead, the cause register is only fetched after an
|
||||
* interrupt is serviced. Because of the intvect goto's, this routine
|
||||
* will only exit when all interrupts have been serviced and no more
|
||||
* have arrived, this improves interrupt latency at the cost of
|
||||
* increasing scheduling jitter; though scheduling jitter should only
|
||||
* become apparent in high interrupt load conditions.
|
||||
*/
|
||||
void mips_vector_isr_handlers( CPU_Interrupt_frame *frame )
|
||||
{
|
||||
uint32_t cshifted;
|
||||
|
||||
/* mips_get_sr( sr ); */
|
||||
_ivsr = frame->c0_sr;
|
||||
|
||||
cshifted = READ_CAUSE();
|
||||
|
||||
intvect:
|
||||
|
||||
if( cshifted & 0x3 )
|
||||
{
|
||||
/* making the software interrupt the highest priority is kind of
|
||||
* stupid, but it makes the bit testing lots easier. On the other
|
||||
* hand, these ints are infrequently used and the testing overhead
|
||||
* is minimal. Who knows, high-priority software ints might be
|
||||
* handy in some situation.
|
||||
*/
|
||||
|
||||
/* unset both software int cause bits */
|
||||
mips_set_cause( _ivcause & ~(3 << CAUSE_IPSHIFT) );
|
||||
|
||||
if ( cshifted & 0x01 ) /* SW[0] */
|
||||
{
|
||||
bsp_interrupt_handler_dispatch( MONGOOSEV_IRQ_SOFTWARE_1 );
|
||||
}
|
||||
if ( cshifted & 0x02 ) /* SW[1] */
|
||||
{
|
||||
bsp_interrupt_handler_dispatch( MONGOOSEV_IRQ_SOFTWARE_2 );
|
||||
}
|
||||
cshifted = READ_CAUSE();
|
||||
}
|
||||
|
||||
|
||||
if ( cshifted & 0x04 ) /* IP[0] ==> INT0 == TIMER1 */
|
||||
{
|
||||
SET_ISR_FLAG( 0x4 );
|
||||
bsp_interrupt_handler_dispatch( MONGOOSEV_IRQ_TIMER1 );
|
||||
CLR_ISR_FLAG( 0x4 );
|
||||
if( (cshifted = READ_CAUSE()) & 0x3 ) goto intvect;
|
||||
}
|
||||
|
||||
if ( cshifted & 0x08 ) /* IP[1] ==> INT1 == TIMER2*/
|
||||
{
|
||||
SET_ISR_FLAG( 0x8 );
|
||||
bsp_interrupt_handler_dispatch( MONGOOSEV_IRQ_TIMER2 );
|
||||
CLR_ISR_FLAG( 0x8 );
|
||||
if( (cshifted = READ_CAUSE()) & 0x7 ) goto intvect;
|
||||
}
|
||||
|
||||
if ( cshifted & 0x10 ) /* IP[2] ==> INT2 */
|
||||
{
|
||||
SET_ISR_FLAG( 0x10 );
|
||||
bsp_interrupt_handler_dispatch( MONGOOSEV_IRQ_INT2 );
|
||||
CLR_ISR_FLAG( 0x10 );
|
||||
if( (cshifted = READ_CAUSE()) & 0xf ) goto intvect;
|
||||
}
|
||||
|
||||
if ( cshifted & 0x20 ) /* IP[3] ==> INT3 == FPU interrupt */
|
||||
{
|
||||
SET_ISR_FLAG( 0x20 );
|
||||
bsp_interrupt_handler_dispatch( MONGOOSEV_IRQ_INT3 );
|
||||
CLR_ISR_FLAG( 0x20 );
|
||||
if( (cshifted = READ_CAUSE()) & 0x1f ) goto intvect;
|
||||
}
|
||||
|
||||
if ( cshifted & 0x40 ) /* IP[4] ==> INT4, external interrupt */
|
||||
{
|
||||
SET_ISR_FLAG( 0x40 );
|
||||
bsp_interrupt_handler_dispatch( MONGOOSEV_IRQ_INT4 );
|
||||
CLR_ISR_FLAG( 0x40 );
|
||||
if( (cshifted = READ_CAUSE()) & 0x3f ) goto intvect;
|
||||
}
|
||||
|
||||
if ( cshifted & 0x80 ) /* IP[5] ==> INT5, peripheral interrupt */
|
||||
{
|
||||
uint32_t bit;
|
||||
uint32_t pf_icr, pf_mask, pf_reset = 0;
|
||||
uint32_t i, m;
|
||||
|
||||
pf_icr = MONGOOSEV_READ( MONGOOSEV_PERIPHERAL_FUNCTION_INTERRUPT_CAUSE_REGISTER );
|
||||
|
||||
/*
|
||||
for (bit=0, pf_mask = 1; bit < 32; bit++, pf_mask <<= 1 )
|
||||
{
|
||||
if ( pf_icr & pf_mask )
|
||||
{
|
||||
SET_ISR_FLAG( 0x80 + (bit*4) );
|
||||
bsp_interrupt_handler_dispatch( MONGOOSEV_IRQ_PERIPHERAL_BASE + bit );
|
||||
CLR_ISR_FLAG( 0x80 + (bit*4) );
|
||||
pf_reset |= pf_mask;
|
||||
if( (cshifted = READ_CAUSE()) & 0xff ) break;
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
/*
|
||||
* iterate thru 32 bits in 4 chunks of 8 bits each. This lets us
|
||||
* quickly get past unasserted interrupts instead of flogging our
|
||||
* way thru a full 32 bits. pf_mask shifts left 8 bits at a time
|
||||
* to serve as a interrupt cause test mask.
|
||||
*/
|
||||
for( bit=0, pf_mask = 0xff; (bit < 32 && pf_icr); (bit+=8, pf_mask <<= 8) )
|
||||
{
|
||||
if ( pf_icr & pf_mask )
|
||||
{
|
||||
/* one or more of the 8 bits we're testing is high */
|
||||
|
||||
m = (1 << bit);
|
||||
|
||||
/* iterate thru the 8 bits, servicing any of the interrupts */
|
||||
for(i=0; (i<8 && pf_icr); (i++, m <<= 1))
|
||||
{
|
||||
if( pf_icr & m )
|
||||
{
|
||||
SET_ISR_FLAG( 0x80 + ((bit + i) * 4) );
|
||||
bsp_interrupt_handler_dispatch( MONGOOSEV_IRQ_PERIPHERAL_BASE + bit + i );
|
||||
CLR_ISR_FLAG( 0x80 + ((bit + i) * 4) );
|
||||
|
||||
/* or each serviced interrupt into our interrupt clear mask */
|
||||
pf_reset |= m;
|
||||
|
||||
/* xor off each int we service so we can immediately
|
||||
* exit once we get the last one
|
||||
*/
|
||||
pf_icr %= m;
|
||||
|
||||
/* if another interrupt has arrived, jump out right
|
||||
* away but be sure to reset all the interrupts we've
|
||||
* already serviced
|
||||
*/
|
||||
if( READ_CAUSE() & 0xff ) goto pfexit;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
pfexit:
|
||||
MONGOOSEV_WRITE( MONGOOSEV_PERIPHERAL_STATUS_REGISTER, pf_reset );
|
||||
}
|
||||
|
||||
/*
|
||||
* this is a last ditch interrupt check, if an interrupt arrives
|
||||
* after this step, servicing it will incur the entire interrupt
|
||||
* overhead cost.
|
||||
*/
|
||||
if( (cshifted = READ_CAUSE()) & 0xff ) goto intvect;
|
||||
}
|
||||
@@ -1,16 +0,0 @@
|
||||
#
|
||||
# Config file for "generic" Mongoose-V board
|
||||
#
|
||||
|
||||
include $(RTEMS_ROOT)/make/custom/default.cfg
|
||||
|
||||
RTEMS_CPU=mips
|
||||
RTEMS_CPU_MODEL=mongoosev
|
||||
|
||||
# This contains the compiler options necessary to select the CPU model
|
||||
# and (hopefully) optimize for it.
|
||||
#
|
||||
CPU_CFLAGS = -mips1 -G0
|
||||
|
||||
# optimize flag: typically -O2
|
||||
CFLAGS_OPTIMIZE_V = -O2 -g
|
||||
@@ -1,103 +0,0 @@
|
||||
## 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-am: $(PREINSTALL_FILES)
|
||||
|
||||
PREINSTALL_FILES =
|
||||
CLEANFILES = $(PREINSTALL_FILES)
|
||||
|
||||
all-local: $(TMPINSTALL_FILES)
|
||||
|
||||
TMPINSTALL_FILES =
|
||||
CLEANFILES += $(TMPINSTALL_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_INCLUDE)/bsp/$(dirstamp):
|
||||
@$(MKDIR_P) $(PROJECT_INCLUDE)/bsp
|
||||
@: > $(PROJECT_INCLUDE)/bsp/$(dirstamp)
|
||||
PREINSTALL_DIRS += $(PROJECT_INCLUDE)/bsp/$(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)/bsp/regs.h: start/regs.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
|
||||
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/regs.h
|
||||
PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/regs.h
|
||||
|
||||
$(PROJECT_INCLUDE)/bsp/irq-generic.h: ../../shared/include/irq-generic.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
|
||||
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/irq-generic.h
|
||||
PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/irq-generic.h
|
||||
|
||||
$(PROJECT_INCLUDE)/bsp/irq-info.h: ../../shared/include/irq-info.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
|
||||
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/irq-info.h
|
||||
PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/irq-info.h
|
||||
|
||||
$(PROJECT_INCLUDE)/bsp/irq.h: include/irq.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
|
||||
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/irq.h
|
||||
PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/irq.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/bootcard.h: ../../shared/include/bootcard.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
|
||||
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/bootcard.h
|
||||
PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/bootcard.h
|
||||
|
||||
$(PROJECT_INCLUDE)/bsp/lr33000.h: include/lr33000.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
|
||||
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/lr33000.h
|
||||
PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/lr33000.h
|
||||
|
||||
$(PROJECT_INCLUDE)/bsp/lr333x0.h: include/lr333x0.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
|
||||
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/lr333x0.h
|
||||
PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/lr333x0.h
|
||||
|
||||
$(PROJECT_INCLUDE)/bsp/mongoose-v.h: include/mongoose-v.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
|
||||
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/mongoose-v.h
|
||||
PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/mongoose-v.h
|
||||
|
||||
$(PROJECT_INCLUDE)/bsp/r3000.h: include/r3000.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
|
||||
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/r3000.h
|
||||
PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/r3000.h
|
||||
|
||||
$(PROJECT_INCLUDE)/bsp/mg5uart.h: console/mg5uart.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
|
||||
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/mg5uart.h
|
||||
PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/mg5uart.h
|
||||
|
||||
$(PROJECT_INCLUDE)/coverhd.h: ../../shared/include/coverhd.h $(PROJECT_INCLUDE)/$(dirstamp)
|
||||
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/coverhd.h
|
||||
PREINSTALL_FILES += $(PROJECT_INCLUDE)/coverhd.h
|
||||
|
||||
$(PROJECT_LIB)/start.$(OBJEXT): start.$(OBJEXT) $(PROJECT_LIB)/$(dirstamp)
|
||||
$(INSTALL_DATA) $< $(PROJECT_LIB)/start.$(OBJEXT)
|
||||
TMPINSTALL_FILES += $(PROJECT_LIB)/start.$(OBJEXT)
|
||||
|
||||
$(PROJECT_LIB)/linkcmds: startup/linkcmds $(PROJECT_LIB)/$(dirstamp)
|
||||
$(INSTALL_DATA) $< $(PROJECT_LIB)/linkcmds
|
||||
PREINSTALL_FILES += $(PROJECT_LIB)/linkcmds
|
||||
|
||||
@@ -1,379 +0,0 @@
|
||||
/*
|
||||
**
|
||||
** Section 1: Registers
|
||||
**
|
||||
*/
|
||||
|
||||
/*
|
||||
**
|
||||
*/
|
||||
#define PMON_ADDRESS 0xbfc00000
|
||||
|
||||
/*
|
||||
** Mongoose V Peripheral Function Registers
|
||||
*/
|
||||
|
||||
#define MG5_COMMAND_REG 0xfffe0180
|
||||
|
||||
/*
|
||||
** Extended Interrupt Registers
|
||||
** These registers are used as follows:
|
||||
** 1. The mask register is used to allow peripheral function and external
|
||||
** interrupts to function. To enable an interrupt, set the appropriate
|
||||
** bit.
|
||||
** 2. The status register contains the state of the peripheral functions
|
||||
** and external devices. This register should be read to poll devices
|
||||
** such as the uart when the interrupts are not enabled. Writing to this
|
||||
** register will clear the interrupt.
|
||||
** 3. The Cause register is similar to the status register, with the
|
||||
** exception that it only shows the bits that are set in the mask
|
||||
** register. This register should be read to determine which interrupt(s)
|
||||
** need to be serviced. This register when written to will CAUSE the interrupt.
|
||||
*/
|
||||
#define MG5_INT_STATUS_REG 0xfffe0184 /* Read to determine state/Write to clear */
|
||||
#define MG5_INT_CAUSE_REG 0xfffe0188 /* Read to determine int/Write to cause int */
|
||||
#define MG5_INT_MASK_REG 0xfffe018c /* Set bit here to enable int */
|
||||
|
||||
/*
|
||||
** EDAC Registers
|
||||
*/
|
||||
#define MG5_EDAC_ADDR_REG 0xfffe0190 /* edac error address */
|
||||
#define MG5_EDAC_PARITY_REG 0xfffe0194 /* edac parity */
|
||||
|
||||
/*
|
||||
** High speed serial port registers
|
||||
** This section is reserved for future Mongoose Processors
|
||||
*/
|
||||
|
||||
/*
|
||||
** Floating Point Register
|
||||
*/
|
||||
#define MG5_FPU_CNTRL_REG 0xfffe0020 /* FPU control register */
|
||||
|
||||
/*
|
||||
** MAVN Registers
|
||||
*/
|
||||
#define MG5_MAVN_TEST_REG 0xfffe01b4 /* test mavn */
|
||||
#define MG5_MAVN_PRIVLEGE_REG 0xfffe01b8 /* privlege bits */
|
||||
#define MG5_MAVN_VIOLATION_REG 0xfffe01bc /* address of violation */
|
||||
#define MG5_MAVN_RANGE_0_REG 0xfffe01c0 /* Range 0 */
|
||||
#define MG5_MAVN_RANGE_1_REG 0xfffe01c4 /* Range 1 */
|
||||
#define MG5_MAVN_RANGE_2_REG 0xfffe01c8 /* Range 2 */
|
||||
#define MG5_MAVN_RANGE_3_REG 0xfffe01cc /* Range 3 */
|
||||
#define MG5_MAVN_RANGE_4_REG 0xfffe01d0 /* Range 4 */
|
||||
#define MG5_MAVN_RANGE_5_REG 0xfffe01d4 /* Range 5 */
|
||||
|
||||
/*
|
||||
** Uart Specific Peripheral Function Registers
|
||||
*/
|
||||
#define MG5_UART_0_RX_REG 0xfffe01e8
|
||||
#define MG5_UART_0_TX_REG 0xfffe01ec
|
||||
#define MG5_UART_0_BAUD_REG 0xfffe01f0
|
||||
#define MG5_UART_1_RX_REG 0xfffe01f4
|
||||
#define MG5_UART_1_TX_REG 0xfffe01f8
|
||||
#define MG5_UART_1_BAUD_REG 0xfffe01fc
|
||||
|
||||
/*
|
||||
** Section 2: Bit definitions
|
||||
**
|
||||
*/
|
||||
|
||||
/*
|
||||
** Command Register Bits - defined from 31 to 0
|
||||
*/
|
||||
#define EDAC_ENABLE_BIT 0x80000000
|
||||
#define EDAC_OVERRIDE_BIT 0x40000000
|
||||
/* 29 - 16 reserved */
|
||||
#define UART_1_PARITY_EVEN_BIT 0x00008000
|
||||
#define UART_1_PARITY_ENABLE_BIT 0x00004000
|
||||
#define UART_1_RTS_BIT 0x00002000
|
||||
#define UART_1_TX_ENABLE_BIT 0x00001000
|
||||
#define UART_1_RX_ENABLE_BIT 0x00000800
|
||||
#define UART_1_TX_BREAK_BIT 0x00000400
|
||||
|
||||
#define UART_0_PARITY_EVEN_BIT 0x00000200
|
||||
#define UART_0_PARITY_ENABLE_BIT 0x00000100
|
||||
#define UART_0_RTS_BIT 0x00000080
|
||||
#define UART_0_TX_ENABLE_BIT 0x00000040
|
||||
#define UART_0_RX_ENABLE_BIT 0x00000020
|
||||
#define UART_0_TX_BREAK_BIT 0x00000010
|
||||
|
||||
#define UART_LOOPBACK_MODE_BIT 0x00000008
|
||||
#define UART_CTSN_TEST_BIT 0x00000004
|
||||
#define UART_RESET_BIT 0x00000002
|
||||
|
||||
/*
|
||||
** Interrupt Status/Cause/Mask register bits - from 31 to 0
|
||||
*/
|
||||
#define EDAC_SERR_BIT 0x80000000
|
||||
#define EDAC_MERR_BIT 0x40000000
|
||||
/* 29 - 24 reserved */
|
||||
#define UART_0_RX_READY_BIT 0x00008000
|
||||
#define UART_0_TX_READY_BIT 0x00004000
|
||||
#define UART_0_TX_EMPTY_BIT 0x00002000
|
||||
#define UART_0_RX_OVERRUN_BIT 0x00001000
|
||||
#define UART_0_FRAME_ERR_BIT 0x00000800
|
||||
#define UART_0_RESERVED_BIT 0x00000400
|
||||
#define UART_1_RX_READY_BIT 0x00200000
|
||||
#define UART_1_TX_READY_BIT 0x00100000
|
||||
#define UART_1_TX_EMPTY_BIT 0x00080000
|
||||
#define UART_1_RX_OVERRUN_BIT 0x00040000
|
||||
#define UART_1_FRAME_ERR_BIT 0x00020000
|
||||
#define UART_1_RESERVED_BIT 0x00010000
|
||||
#define MAVN_WRITE_ACC_BIT 0x00400000
|
||||
#define MAVN_READ_ACC_BIT 0x00800000
|
||||
#define EXTERN_INT_9_BIT 0x00000200
|
||||
#define EXTERN_INT_8_BIT 0x00000100
|
||||
#define EXTERN_INT_7_BIT 0x00000080
|
||||
#define EXTERN_INT_6_BIT 0x00000040
|
||||
#define EXTERN_INT_5_BIT 0x00000020
|
||||
#define EXTERN_INT_4_BIT 0x00000010
|
||||
#define EXTERN_INT_3_BIT 0x00000008
|
||||
#define EXTERN_INT_2_BIT 0x00000004
|
||||
#define EXTERN_INT_1_BIT 0x00000002
|
||||
#define EXTERN_INT_0_BIT 0x00000001
|
||||
|
||||
/*
|
||||
** MAVN Range Bits
|
||||
*/
|
||||
|
||||
#define MAVN_RANGE_0_WRITE_BIT 0x00000001
|
||||
#define MAVN_RANGE_1_WRITE_BIT 0x00000002
|
||||
#define MAVN_RANGE_2_WRITE_BIT 0x00000004
|
||||
#define MAVN_RANGE_3_WRITE_BIT 0x00000008
|
||||
#define MAVN_RANGE_4_WRITE_BIT 0x00000010
|
||||
#define MAVN_RANGE_5_WRITE_BIT 0x00000020
|
||||
|
||||
#define MAVN_GLOBAL_WRITE_BIT 0x00000200
|
||||
|
||||
#define MAVN_RANGE_0_READ_BIT 0x00000400
|
||||
#define MAVN_RANGE_1_READ_BIT 0x00000800
|
||||
#define MAVN_RANGE_2_READ_BIT 0x00001000
|
||||
#define MAVN_RANGE_3_READ_BIT 0x00002000
|
||||
#define MAVN_RANGE_4_READ_BIT 0x00004000
|
||||
#define MAVN_RANGE_5_READ_BIT 0x00008000
|
||||
|
||||
#define MAVN_GLOBAL_READ_BIT 0x00080000
|
||||
|
||||
#define MAVN_ENABLE_BIT 0x80000000
|
||||
#define MAVN_TEST_BIT 0x40000000
|
||||
|
||||
#define MAVN_RANGE_NO_ACESS 0x00000000
|
||||
|
||||
#define MAVN_PS_CODE_512 0x00000009
|
||||
#define MAVN_PS_CODE_1K 0x0000000a
|
||||
#define MAVN_PS_CODE_2K 0x0000000b
|
||||
#define MAVN_PS_CODE_4K 0x0000000c
|
||||
#define MAVN_PS_CODE_8K 0x0000000d
|
||||
#define MAVN_PS_CODE_16K 0x0000000e
|
||||
#define MAVN_PS_CODE_32K 0x0000000f
|
||||
#define MAVN_PS_CODE_64K 0x00000010
|
||||
#define MAVN_PS_CODE_128K 0x00000011
|
||||
#define MAVN_PS_CODE_256K 0x00000012
|
||||
#define MAVN_PS_CODE_512K 0x00000013
|
||||
#define MAVN_PS_CODE_1M 0x00000014
|
||||
#define MAVN_PS_CODE_2M 0x00000015
|
||||
|
||||
/*
|
||||
** FPU Control Bits
|
||||
*/
|
||||
#define FPU_CNTRL_CONDITION 0x00800000
|
||||
#define FPU_CNTRL_EXCEPT_E 0x00020000
|
||||
#define FPU_CNTRL_EXCEPT_V 0x00010000
|
||||
#define FPU_CNTRL_EXCEPT_Z 0x00008000
|
||||
#define FPU_CNTRL_EXCEPT_O 0x00004000
|
||||
#define FPU_CNTRL_EXCEPT_U 0x00002000
|
||||
#define FPU_CNTRL_EXCEPT_I 0x00001000
|
||||
#define FPU_CNTRL_TRAP_V 0x00000800
|
||||
#define FPU_CNTRL_TRAP_Z 0x00000400
|
||||
#define FPU_CNTRL_TRAP_O 0x00000200
|
||||
#define FPU_CNTRL_TRAP_U 0x00000100
|
||||
#define FPU_CNTRL_TRAP_I 0x00000080
|
||||
#define FPU_CNTRL_STICKY_V 0x00000040
|
||||
#define FPU_CNTRL_STICKY_Z 0x00000020
|
||||
#define FPU_CNTRL_STICKY_O 0x00000010
|
||||
#define FPU_CNTRL_STICKY_U 0x00000008
|
||||
#define FPU_CNTRL_STICKY_I 0x00000004
|
||||
#define FPU_CNTRL_ROUND_RN 0x00000000
|
||||
#define FPU_CNTRL_ROUND_RZ 0x00000001
|
||||
#define FPU_CNTRL_ROUND_RP 0x00000002
|
||||
#define FPU_CNTRL_ROUND_RM 0x00000003
|
||||
|
||||
#define FPU_EXCEPTIONS FPU_CNTRL_TRAP_V|FPU_CNTRL_TRAP_Z|FPU_CNTRL_TRAP_O|FPU_CNTRL_TRAP_U|FPU_CNTRL_TRAP_I
|
||||
#define FPU_CONFIGURATION FPU_EXCEPTIONS|FPU_CNTRL_ROUND_RN
|
||||
|
||||
/*
|
||||
**
|
||||
** Section 3 -- Masks
|
||||
**
|
||||
*/
|
||||
|
||||
#define UART_TX_BAUD_MASK 0x00007FFF
|
||||
#define UART_RX_BAUD_MASK 0x7FFF0000
|
||||
#define UART_DATA_MASK 0x000000FF
|
||||
|
||||
#define UART_TX_BAUD_4800(x) ((((x*1000000)/4800) - 1) & UART_TX_BAUD_MASK)
|
||||
#define UART_TX_BAUD_9600(x) ((((x*1000000)/9600) - 1) & UART_TX_BAUD_MASK)
|
||||
#define UART_TX_BAUD_19200(x) ((((x*1000000)/19200) - 1)& UART_TX_BAUD_MASK)
|
||||
#define UART_TX_BAUD_38400(x) ((((x*1000000)/38400) - 1)& UART_TX_BAUD_MASK)
|
||||
|
||||
#define UART_RX_BAUD_4800(x) (((((x*1000000)/4800) - 1) << 16) & UART_RX_BAUD_MASK)
|
||||
#define UART_RX_BAUD_9600(x) (((((x*1000000)/9600) - 1) << 16) & UART_RX_BAUD_MASK)
|
||||
#define UART_RX_BAUD_19200(x) (((((x*1000000)/19200) - 1) << 16)& UART_RX_BAUD_MASK)
|
||||
#define UART_RX_BAUD_38400(x) (((((x*1000000)/38400) - 1) << 16)& UART_RX_BAUD_MASK)
|
||||
|
||||
#define UART_BAUD_4800(x) ((((x*1000000)/4800) - 1) & UART_TX_BAUD_MASK) | (((((x*1000000)/4800) - 1) << 16) & UART_RX_BAUD_MASK)
|
||||
#define UART_BAUD_9600(x) ((((x*1000000)/9600) - 1) & UART_TX_BAUD_MASK) | (((((x*1000000)/9600) - 1) << 16) & UART_RX_BAUD_MASK)
|
||||
#define UART_BAUD_19200(x) ((((x*1000000)/19200) - 1)& UART_TX_BAUD_MASK) | (((((x*1000000)/19200) - 1) << 16)& UART_RX_BAUD_MASK)
|
||||
#define UART_BAUD_38400(x) ((((x*1000000)/38400) - 1)& UART_TX_BAUD_MASK) | (((((x*1000000)/38400) - 1) << 16)& UART_RX_BAUD_MASK)
|
||||
|
||||
#define EDAC_PARITY_MASK 0x000000FF
|
||||
|
||||
#define MAVN_START_ADDR_MASK 0xFFFFFE00
|
||||
#define MAVN_PS_CODE_MASK 0x0000001F
|
||||
|
||||
/* lr33000.h - defines for LSI Logic LR33000 */
|
||||
|
||||
/* Define counter/timer register addresses */
|
||||
#define M_TIC1 0xfffe0000 /* timer 1 initial count */
|
||||
#define M_TC1 0xfffe0004 /* timer 1 control */
|
||||
#define M_TIC2 0xfffe0008 /* timer 2 initial count */
|
||||
#define M_TC2 0xfffe000c /* timer 2 control */
|
||||
#define M_RTIC 0xfffe0010 /* refresh timer */
|
||||
|
||||
#ifdef LANGUAGE_C
|
||||
#define TIC1 (*((volatile unsigned long *)M_TIC1)) /* timer1 count */
|
||||
#define TC1 (*((volatile unsigned long *)M_TC1)) /* timer1 cntrl */
|
||||
#define TIC2 (*((volatile unsigned long *)M_TIC2)) /* timer2 count */
|
||||
#define TC2 (*((volatile unsigned long *)M_TC2)) /* timer2 cntrl */
|
||||
#define RTIC (*((volatile unsigned long *)M_RTIC)) /* refrsh timer */
|
||||
#endif
|
||||
|
||||
/* Definitions for counter/timer control register bits */
|
||||
#define TC_CE 0x00000004 /* count enable */
|
||||
#define TC_IE 0x00000002 /* interrupt enable */
|
||||
#define TC_INT 0x00000001 /* interrupt request */
|
||||
|
||||
/* lr33000.h */
|
||||
|
||||
#define _LR33300_
|
||||
|
||||
#define M_SRAM 0xfffe0100 /* SRAM config reg */
|
||||
#define M_SPEC0 0xfffe0104
|
||||
#define M_SPEC1 0xfffe0108
|
||||
#define M_SPEC2 0xfffe010c
|
||||
#define M_SPEC3 0xfffe0110
|
||||
#define M_DRAM 0xfffe0120 /* DRAM config reg */
|
||||
|
||||
#ifdef LANGUAGE_C
|
||||
#define SRAM (*((volatile unsigned long *)M_SRAM))
|
||||
#define SPEC0 (*((volatile unsigned long *)M_SPEC0))
|
||||
#define SPEC1 (*((volatile unsigned long *)M_SPEC1))
|
||||
#define SPEC2 (*((volatile unsigned long *)M_SPEC2))
|
||||
#define SPEC3 (*((volatile unsigned long *)M_SPEC3))
|
||||
#define DRAM (*((volatile unsigned long *)M_DRAM))
|
||||
#endif
|
||||
|
||||
/* wait-state config registers */
|
||||
#define SPC_INHIBITMASK (0xf<<24)
|
||||
#define SPC_INHIBITSHFT 24
|
||||
#define SPC_EXTGNT (1<<23)
|
||||
#define SPC_16WIDE (1<<22)
|
||||
#define SPC_8WIDE (1<<21)
|
||||
#define SPC_PENA (1<<20)
|
||||
#define SPC_CACHED (1<<19)
|
||||
#define SPC_CSDLYMASK (3<<17)
|
||||
#define SPC_CSDLYSHFT 17
|
||||
#define SPC_BLKENA (1<<16)
|
||||
#define SPC_BLKWAITMASK (7<<13)
|
||||
#define SPC_BLKWAITSHFT 13
|
||||
#define SPC_RECMASK (63<<7)
|
||||
#define SPC_RECSHFT 7
|
||||
#define SPC_WAITENA (1<<6)
|
||||
#define SPC_WAITMASK (63<<0)
|
||||
#define SPC_WAITSHFT 0
|
||||
|
||||
/* DCR */
|
||||
#define DRAM_DLP1 (1<<28)
|
||||
#define DRAM_SYNC (1<<27)
|
||||
#define DRAM_SCFG (1<<26)
|
||||
#define DRAM_DMARDY (1<<25)
|
||||
#define DRAM_DMABLKMASK (7<<22)
|
||||
#define DRAM_DMABLKSHFT 22
|
||||
#define DRAM_DPTHMASK (3<<20)
|
||||
#define DRAM_DPTHSHFT 20
|
||||
#define DRAM_RDYW (1<<19)
|
||||
#define DRAM_PGSZMASK (7<<16)
|
||||
#define DRAM_PGSZSHFT 16
|
||||
#define DRAM_PGMW (1<<15)
|
||||
#define DRAM_RFWEMASK (3<<13)
|
||||
#define DRAM_RFWESHFT 13
|
||||
#define DRAM_RFEN (1<<12)
|
||||
#define DRAM_RDYEN (1<<11)
|
||||
#define DRAM_BFD (1<<10)
|
||||
#define DRAM_PE (1<<9)
|
||||
#define DRAM_RPCMASK (3<<7)
|
||||
#define DRAM_RPCSHFT 7
|
||||
#define DRAM_RCDMASK (3<<5)
|
||||
#define DRAM_RCDSHFT 5
|
||||
#define DRAM_CS (1<<4)
|
||||
#define DRAM_CLMASK (7<<1)
|
||||
#define DRAM_CLSHFT 1
|
||||
#define DRAM_DCE (1<<0)
|
||||
|
||||
/* _LR33300_ */
|
||||
|
||||
#define _ERNIE_CORE_
|
||||
|
||||
#define M_BIU 0xfffe0130
|
||||
|
||||
#ifdef LANGUAGE_C
|
||||
#define BIU (*((volatile unsigned long *)M_BIU))
|
||||
|
||||
#define C0_TAR 6 /* target address register */
|
||||
#define C0_BDAM 9 /* breakpoint data addr mask */
|
||||
#define C0_BPCM 11 /* breakpoint instr addr mask */
|
||||
#else
|
||||
#define C0_TAR $6 /* target address register */
|
||||
#define C0_BDAM $9 /* breakpoint data addr mask */
|
||||
#define C0_BPCM $11 /* breakpoint instr addr mask */
|
||||
#endif
|
||||
|
||||
/* cause register */
|
||||
#define CAUSE_BT (1<<30) /* branch taken */
|
||||
|
||||
/* BIU */
|
||||
#define BIU_NOSTR (1<<17)
|
||||
#define BIU_LDSCH (1<<16)
|
||||
#define BIU_BGNT (1<<15)
|
||||
#define BIU_NOPAD (1<<14)
|
||||
#define BIU_RDPRI (1<<13)
|
||||
#define BIU_INTP (1<<12)
|
||||
#define BIU_IS1 (1<<11)
|
||||
#define BIU_IS0 (1<<10)
|
||||
#define BIU_IBLKSZMASK (3<<8)
|
||||
#define BIU_IBLKSZSHFT 8
|
||||
#define BIU_IBLKSZ2 (0<<BIU_IBLKSZSHFT)
|
||||
#define BIU_IBLKSZ4 (1<<BIU_IBLKSZSHFT)
|
||||
#define BIU_IBLKSZ8 (2<<BIU_IBLKSZSHFT)
|
||||
#define BIU_IBLKSZ16 (3<<BIU_IBLKSZSHFT)
|
||||
#define BIU_DS (1<<7)
|
||||
#define BIU_DS1 (1<<7)
|
||||
#define BIU_DS0 (1<<6)
|
||||
#define BIU_DBLKSZMASK (3<<4)
|
||||
#define BIU_DBLKSZSHFT 4
|
||||
#define BIU_DBLKSZ2 (0<<BIU_DBLKSZSHFT)
|
||||
#define BIU_DBLKSZ4 (1<<BIU_DBLKSZSHFT)
|
||||
#define BIU_DBLKSZ8 (2<<BIU_DBLKSZSHFT)
|
||||
#define BIU_DBLKSZ16 (3<<BIU_DBLKSZSHFT)
|
||||
#define BIU_RAM (1<<3)
|
||||
#define BIU_TAG (1<<2)
|
||||
#define BIU_INV (1<<1)
|
||||
#define BIU_LOCK (1<<0)
|
||||
|
||||
/* _ERNIE_CORE_ */
|
||||
|
||||
/* Definitions for cache sizes */
|
||||
|
||||
#define LR33300_IC_SIZE 0x1000 /* 33300 Inst cache = 4Kbytes */
|
||||
#define LR33300_DC_SIZE 0x800 /* 33300 Data cache = 2Kbytes */
|
||||
@@ -1,148 +0,0 @@
|
||||
/*
|
||||
* regs.S -- standard MIPS register names from
|
||||
* newlib-1.8.2/libgloss/mips and adapted.
|
||||
*
|
||||
* Copyright (c) 1995 Cygnus Support
|
||||
*
|
||||
* The authors hereby grant permission to use, copy, modify, distribute,
|
||||
* and license this software and its documentation for any purpose, provided
|
||||
* that existing copyright notices are retained in all copies and that this
|
||||
* notice is included verbatim in any distributions. No written agreement,
|
||||
* license, or royalty fee is required for any of the authorized uses.
|
||||
* Modifications to this software may be copyrighted by their authors
|
||||
* and need not follow the licensing terms described here, provided that
|
||||
* the new terms are clearly indicated on the first page of each file where
|
||||
* they apply.
|
||||
*/
|
||||
|
||||
/* Standard MIPS register names: */
|
||||
#define zero $0
|
||||
#define z0 $0
|
||||
#define v0 $2
|
||||
#define v1 $3
|
||||
#define a0 $4
|
||||
#define a1 $5
|
||||
#define a2 $6
|
||||
#define a3 $7
|
||||
#define t0 $8
|
||||
#define t1 $9
|
||||
#define t2 $10
|
||||
#define t3 $11
|
||||
#define t4 $12
|
||||
#define t5 $13
|
||||
#define t6 $14
|
||||
#define t7 $15
|
||||
#define s0 $16
|
||||
#define s1 $17
|
||||
#define s2 $18
|
||||
#define s3 $19
|
||||
#define s4 $20
|
||||
#define s5 $21
|
||||
#define s6 $22
|
||||
#define s7 $23
|
||||
#define t8 $24
|
||||
#define t9 $25
|
||||
#define k0 $26 /* kernel private register 0 */
|
||||
#define k1 $27 /* kernel private register 1 */
|
||||
#define gp $28 /* global data pointer */
|
||||
#define sp $29 /* stack-pointer */
|
||||
#define fp $30 /* frame-pointer */
|
||||
#define ra $31 /* return address */
|
||||
#define pc $pc /* pc, used on mips16 */
|
||||
|
||||
#define fp0 $f0
|
||||
#define fp1 $f1
|
||||
|
||||
#define WATCHDOG 0xBE000000
|
||||
|
||||
/* Useful memory constants: */
|
||||
#define K0BASE 0x80000000
|
||||
#ifndef __mips64
|
||||
#define K1BASE 0xA0000000
|
||||
#else
|
||||
#define K1BASE 0xFFFFFFFFA0000000LL
|
||||
#endif
|
||||
|
||||
#define PHYS_TO_K1(a) ((unsigned)(a) | K1BASE)
|
||||
|
||||
/* Standard Co-Processor 0 register numbers: */
|
||||
#define C0_DCIC $7 /* debug & cache invalidate control */
|
||||
#define C0_COUNT $9 /* Count Register */
|
||||
#define C0_SR $12 /* Status Register */
|
||||
#define C0_CAUSE $13 /* last exception description */
|
||||
#define C0_EPC $14 /* Exception error address */
|
||||
#define C0_CONFIG $16 /* CPU configuration */
|
||||
|
||||
/* Standard Status Register bitmasks: */
|
||||
#define SR_CU0 0x10000000
|
||||
#define SR_CU1 0x20000000 /* Mark CP1 as usable */
|
||||
#define SR_FR 0x04000000 /* Enable MIPS III FP registers */
|
||||
#define SR_BEV 0x00400000 /* Controls location of exception vectors */
|
||||
#define SR_PE 0x00100000 /* Mark soft reset (clear parity error) */
|
||||
|
||||
/* defined differently for Mongoose5- we don't use these anymore */
|
||||
#if UNUSED
|
||||
#define SR_KX 0x00000080 /* Kernel extended addressing enabled */
|
||||
#define SR_SX 0x00000040 /* Supervisor extended addressing enabled */
|
||||
#define SR_UX 0x00000020 /* User extended addressing enabled */
|
||||
#endif
|
||||
|
||||
/* R3000 */
|
||||
#define SR_ISC 0x00010000 /* Isolate data cache */
|
||||
|
||||
/* Standard (R4000) cache operations. Taken from "MIPS R4000
|
||||
Microprocessor User's Manual" 2nd edition: */
|
||||
|
||||
#define CACHE_I (0) /* primary instruction */
|
||||
#define CACHE_D (1) /* primary data */
|
||||
#define CACHE_SI (2) /* secondary instruction */
|
||||
#define CACHE_SD (3) /* secondary data (or combined instruction/data) */
|
||||
|
||||
#define INDEX_INVALIDATE (0) /* also encodes WRITEBACK if CACHE_D or CACHE_SD */
|
||||
#define INDEX_LOAD_TAG (1)
|
||||
#define INDEX_STORE_TAG (2)
|
||||
#define CREATE_DIRTY_EXCLUSIVE (3) /* CACHE_D and CACHE_SD only */
|
||||
#define HIT_INVALIDATE (4)
|
||||
#define CACHE_FILL (5) /* CACHE_I only */
|
||||
#define HIT_WRITEBACK_INVALIDATE (5) /* CACHE_D and CACHE_SD only */
|
||||
#define HIT_WRITEBACK (6) /* CACHE_I, CACHE_D and CACHE_SD only */
|
||||
#define HIT_SET_VIRTUAL (7) /* CACHE_SI and CACHE_SD only */
|
||||
|
||||
#define BUILD_CACHE_OP(o,c) (((o) << 2) | (c))
|
||||
|
||||
/* Individual cache operations: */
|
||||
#define INDEX_INVALIDATE_I BUILD_CACHE_OP(INDEX_INVALIDATE,CACHE_I)
|
||||
#define INDEX_WRITEBACK_INVALIDATE_D BUILD_CACHE_OP(INDEX_INVALIDATE,CACHE_D)
|
||||
#define INDEX_INVALIDATE_SI BUILD_CACHE_OP(INDEX_INVALIDATE,CACHE_SI)
|
||||
#define INDEX_WRITEBACK_INVALIDATE_SD BUILD_CACHE_OP(INDEX_INVALIDATE,CACHE_SD)
|
||||
|
||||
#define INDEX_LOAD_TAG_I BUILD_CACHE_OP(INDEX_LOAD_TAG,CACHE_I)
|
||||
#define INDEX_LOAD_TAG_D BUILD_CACHE_OP(INDEX_LOAD_TAG,CACHE_D)
|
||||
#define INDEX_LOAD_TAG_SI BUILD_CACHE_OP(INDEX_LOAD_TAG,CACHE_SI)
|
||||
#define INDEX_LOAD_TAG_SD BUILD_CACHE_OP(INDEX_LOAD_TAG,CACHE_SD)
|
||||
|
||||
#define INDEX_STORE_TAG_I BUILD_CACHE_OP(INDEX_STORE_TAG,CACHE_I)
|
||||
#define INDEX_STORE_TAG_D BUILD_CACHE_OP(INDEX_STORE_TAG,CACHE_D)
|
||||
#define INDEX_STORE_TAG_SI BUILD_CACHE_OP(INDEX_STORE_TAG,CACHE_SI)
|
||||
#define INDEX_STORE_TAG_SD BUILD_CACHE_OP(INDEX_STORE_TAG,CACHE_SD)
|
||||
|
||||
#define CREATE_DIRTY_EXCLUSIVE_D BUILD_CACHE_OP(CREATE_DIRTY_EXCLUSIVE,CACHE_D)
|
||||
#define CREATE_DIRTY_EXCLUSIVE_SD BUILD_CACHE_OP(CREATE_DIRTY_EXCLUSIVE,CACHE_SD)
|
||||
|
||||
#define HIT_INVALIDATE_I BUILD_CACHE_OP(HIT_INVALIDATE,CACHE_I)
|
||||
#define HIT_INVALIDATE_D BUILD_CACHE_OP(HIT_INVALIDATE,CACHE_D)
|
||||
#define HIT_INVALIDATE_SI BUILD_CACHE_OP(HIT_INVALIDATE,CACHE_SI)
|
||||
#define HIT_INVALIDATE_SD BUILD_CACHE_OP(HIT_INVALIDATE,CACHE_SD)
|
||||
|
||||
#define CACHE_FILL_I BUILD_CACHE_OP(CACHE_FILL,CACHE_I)
|
||||
#define HIT_WRITEBACK_INVALIDATE_D BUILD_CACHE_OP(HIT_WRITEBACK_INVALIDATE,CACHE_D)
|
||||
#define HIT_WRITEBACK_INVALIDATE_SD BUILD_CACHE_OP(HIT_WRITEBACK_INVALIDATE,CACHE_SD)
|
||||
|
||||
#define HIT_WRITEBACK_I BUILD_CACHE_OP(HIT_WRITEBACK,CACHE_I)
|
||||
#define HIT_WRITEBACK_D BUILD_CACHE_OP(HIT_WRITEBACK,CACHE_D)
|
||||
#define HIT_WRITEBACK_SD BUILD_CACHE_OP(HIT_WRITEBACK,CACHE_SD)
|
||||
|
||||
#define HIT_SET_VIRTUAL_SI BUILD_CACHE_OP(HIT_SET_VIRTUAL,CACHE_SI)
|
||||
#define HIT_SET_VIRTUAL_SD BUILD_CACHE_OP(HIT_SET_VIRTUAL,CACHE_SD)
|
||||
|
||||
/*> EOF regs.S <*/
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,97 +0,0 @@
|
||||
/**
|
||||
* @file
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* Modification History:
|
||||
* 12/10/01 A.Ferrer, NASA/GSFC, Code 582
|
||||
* Set interrupt mask to 0xAF00 (Line 139).
|
||||
*/
|
||||
|
||||
/*
|
||||
* COPYRIGHT (c) 1989-2012.
|
||||
* 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.org/license/LICENSE.
|
||||
*/
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include <bsp.h>
|
||||
#include <bsp/mongoose-v.h>
|
||||
#include <libcpu/isr_entries.h>
|
||||
#include <bsp/irq-generic.h>
|
||||
|
||||
void bsp_start( void );
|
||||
void clear_cache( void );
|
||||
extern void _sys_exit(int);
|
||||
extern void mips_gdb_stub_install(void);
|
||||
|
||||
/*
|
||||
* bsp_start
|
||||
*
|
||||
* This routine does the bulk of the system initialization.
|
||||
*/
|
||||
void bsp_start( void )
|
||||
{
|
||||
/* mask off any interrupts */
|
||||
MONGOOSEV_WRITE( MONGOOSEV_PERIPHERAL_FUNCTION_INTERRUPT_MASK_REGISTER, 0 );
|
||||
|
||||
/* reset the config register & clear any pending peripheral interrupts */
|
||||
MONGOOSEV_WRITE( MONGOOSEV_PERIPHERAL_COMMAND_REGISTER, 0 );
|
||||
MONGOOSEV_WRITE(
|
||||
MONGOOSEV_PERIPHERAL_COMMAND_REGISTER, MONGOOSEV_UART_CMD_RESET_BOTH_PORTS );
|
||||
MONGOOSEV_WRITE( MONGOOSEV_PERIPHERAL_COMMAND_REGISTER, 0 );
|
||||
|
||||
/* reset both timers */
|
||||
MONGOOSEV_WRITE_REGISTER(
|
||||
MONGOOSEV_TIMER1_BASE, MONGOOSEV_TIMER_INITIAL_COUNTER_REGISTER, 0xffffffff);
|
||||
MONGOOSEV_WRITE_REGISTER(
|
||||
MONGOOSEV_TIMER1_BASE, MONGOOSEV_TIMER_CONTROL_REGISTER, 0);
|
||||
|
||||
MONGOOSEV_WRITE_REGISTER(
|
||||
MONGOOSEV_TIMER2_BASE, MONGOOSEV_TIMER_INITIAL_COUNTER_REGISTER, 0xffffffff);
|
||||
MONGOOSEV_WRITE_REGISTER(
|
||||
MONGOOSEV_TIMER2_BASE, MONGOOSEV_TIMER_CONTROL_REGISTER, 0);
|
||||
|
||||
/* clear any pending interrupts */
|
||||
MONGOOSEV_WRITE( MONGOOSEV_PERIPHERAL_STATUS_REGISTER, 0xffffffff );
|
||||
|
||||
/* clear any writable bits in the cause register */
|
||||
mips_set_cause( 0 );
|
||||
|
||||
/* set interrupt mask, but globally off. */
|
||||
|
||||
/*
|
||||
* Bit 15 | Bit 14 | Bit 13 | Bit 12 | Bit 11 | Bit 10 | Bit 9 | Bit 8 |
|
||||
* periph | unused | FPU | unused | timer2 | timer1 | swint1 | swint2 |
|
||||
* extern | | | | | | | |
|
||||
*
|
||||
* 1 0 1 0 0 1 0 0
|
||||
*
|
||||
* 0x8C00 Enable only internal Mongoose V timers.
|
||||
* 0xA400 Enable Peripherial ints, FPU and timer1
|
||||
* 0x0400 Timer1 only
|
||||
*/
|
||||
|
||||
/* mips_set_sr( (SR_CU0 | SR_CU1 | 0xA400) ); */
|
||||
|
||||
/* to start up, only enable coprocessor 0 & timer int. per-task
|
||||
* processor settings will be applied as they are created, this
|
||||
* is just to configure the processor for startup
|
||||
*/
|
||||
mips_set_sr( (SR_CU0 | 0x400) );
|
||||
|
||||
bsp_interrupt_initialize();
|
||||
}
|
||||
|
||||
void clear_cache( void )
|
||||
{
|
||||
promCopyIcacheFlush();
|
||||
promCopyDcacheFlush();
|
||||
}
|
||||
@@ -1,145 +0,0 @@
|
||||
/*
|
||||
* GDB Support Routines for the Mongoose-V
|
||||
*/
|
||||
|
||||
/*
|
||||
* COPYRIGHT (c) 1989-2014.
|
||||
* 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.org/license/LICENSE.
|
||||
*/
|
||||
|
||||
#include <bsp.h>
|
||||
#include <rtems/bspIo.h>
|
||||
#include <bsp/mongoose-v.h>
|
||||
#include "gdb_if.h"
|
||||
|
||||
#include <rtems/libio.h>
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
/*
|
||||
|
||||
We're going to call right down into the uart driver because we're
|
||||
operating within an exception. if things are broken because something
|
||||
bad happened, this may be our last chance to debug before RTEMS goes
|
||||
mad, so we won't rely on the I/O subsystem to be operating. This is a
|
||||
little messy, but at least we're not talking right to the hardware.
|
||||
|
||||
*/
|
||||
|
||||
extern int mg5uart_set_attributes(int minor,const struct termios *t);
|
||||
extern int mg5uart_open(int major,int minor, void *arg);
|
||||
extern int mg5uart_close(int major,int minor, void *arg);
|
||||
extern void mg5uart_write_polled(int minor, char c );
|
||||
extern int mg5uart_inbyte_nonblocking_polled(int minor);
|
||||
|
||||
/*
|
||||
* Prototypes for methods assumed to exist by the gdb stub
|
||||
*/
|
||||
char getDebugChar (void);
|
||||
void putDebugChar (char c);
|
||||
|
||||
static int debugUartEnabled = 0;
|
||||
|
||||
int mg5rdbgOpenGDBuart(int breakoninit)
|
||||
{
|
||||
struct termios t;
|
||||
memset(&t,0,sizeof(struct termios));
|
||||
|
||||
if( mg5uart_open(0,1,NULL) != RTEMS_SUCCESSFUL )
|
||||
{
|
||||
printf("gdbstub: Failed to open UART port 2\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
t.c_cflag |= B19200;
|
||||
t.c_cflag |= CS8;
|
||||
if( mg5uart_set_attributes(1,&t) != 0 )
|
||||
{
|
||||
printf("gdbstub: Failed to configure UART 2 for 19200N82\n");
|
||||
return -1;
|
||||
}
|
||||
printf("gdbstub: UART 2 configured for 19200N82\n");
|
||||
|
||||
debugUartEnabled = -1;
|
||||
|
||||
/* set up vectoring for gdb */
|
||||
mips_gdb_stub_install(-1);
|
||||
|
||||
/*
|
||||
this is a rough approximation of our memory map. Yours is
|
||||
probably different. It only needs to be sufficient for the stub
|
||||
to know what it can and can't do and where.
|
||||
*/
|
||||
gdbstub_add_memsegment(0 , 0x8001ffff, MEMOPT_READABLE );
|
||||
gdbstub_add_memsegment(0x80020000, 0x80afffff, MEMOPT_READABLE | MEMOPT_WRITEABLE );
|
||||
gdbstub_add_memsegment(0x80b00000, 0x814fffff, MEMOPT_READABLE );
|
||||
gdbstub_add_memsegment(0x81500000, 0x81ffffff, MEMOPT_READABLE | MEMOPT_WRITEABLE );
|
||||
|
||||
if( breakoninit )
|
||||
{
|
||||
printf("gdbstub: GDB stub entered, connect host debugger now\n");
|
||||
/*
|
||||
break to gdb. We'll wait there for the operator to get their gdb
|
||||
going, then they can 'continue' or do whatever.
|
||||
*/
|
||||
mips_break(0);
|
||||
printf("gdbstub: User code running\n");
|
||||
}
|
||||
else
|
||||
printf("gdbstub: GDB stub ready for exceptions\n");
|
||||
|
||||
return RTEMS_SUCCESSFUL;
|
||||
}
|
||||
|
||||
void mg5rdbgCloseGDBuart(void)
|
||||
{
|
||||
mg5uart_close(0,1,NULL);
|
||||
debugUartEnabled = 0;
|
||||
}
|
||||
|
||||
char getDebugChar (void)
|
||||
{
|
||||
if( debugUartEnabled )
|
||||
{
|
||||
int rv;
|
||||
|
||||
while( (rv = mg5uart_inbyte_nonblocking_polled(1)) < 0 );
|
||||
return (char)rv;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void putDebugChar (char c)
|
||||
{
|
||||
if( debugUartEnabled )
|
||||
return mg5uart_write_polled(1,c);
|
||||
}
|
||||
|
||||
/*
|
||||
{
|
||||
* initialize hardware pc and data breakpoints to quiet state*
|
||||
uint32_t dcic, reg, mask;
|
||||
|
||||
reg = 0xffffffff;
|
||||
mask = 0xffffffff;
|
||||
|
||||
mips_set_bpcrm( reg, mask );
|
||||
mips_set_bdarm( reg, mask );
|
||||
|
||||
mips_get_dcic( dcic );
|
||||
* configure dcic for trapping, user & kernel mode, PC traps and enable it *
|
||||
dcic = DCIC_TR | DCIC_UD | DCIC_KD | DCIC_PCE | DCIC_DE;
|
||||
* dcic = DCIC_UD | DCIC_KD | DCIC_PCE | DCIC_DE; *
|
||||
mips_set_dcic( dcic );
|
||||
|
||||
mips_get_bpcrm( reg, mask );
|
||||
mips_get_dcic( dcic );
|
||||
* printf("bpc is %08X, bpc_mask is %08X, dcic is now %08X\n", reg, mask, dcic ); *
|
||||
}
|
||||
*/
|
||||
@@ -1,228 +0,0 @@
|
||||
/*
|
||||
* Linker script for Mongoose-V prototyping board.
|
||||
* See README for address map details.
|
||||
*/
|
||||
|
||||
/* . = 0x80020000; */
|
||||
|
||||
/*
|
||||
* Declare some sizes.
|
||||
*/
|
||||
|
||||
RamBase = DEFINED(RamBase) ? RamBase : 0x80000000;
|
||||
RamSize = DEFINED(RamSize) ? RamSize : 32M;
|
||||
HeapSize = DEFINED(HeapSize) ? HeapSize : 0x0;
|
||||
_StackSize = DEFINED(_StackSize) ? _StackSize : 0x4000;
|
||||
ClockRate = DEFINED(ClockRate) ? ClockRate : 12000000;
|
||||
|
||||
MEMORY
|
||||
{
|
||||
ram : ORIGIN = 0x80020000, LENGTH = 4M
|
||||
}
|
||||
|
||||
SECTIONS
|
||||
{
|
||||
.text :
|
||||
{
|
||||
_ftext = . ;
|
||||
|
||||
*/start.o(.text)
|
||||
|
||||
*(.text*)
|
||||
*(.gnu.linkonce.t*)
|
||||
*(.mips16.fn.*)
|
||||
*(.mips16.call.*)
|
||||
*(.reginfo)
|
||||
PROVIDE (__runtime_reloc_start = .);
|
||||
*(.rel.sdata)
|
||||
*(.rel.dyn)
|
||||
PROVIDE (__runtime_reloc_stop = .);
|
||||
|
||||
/*
|
||||
* Special FreeBSD sysctl sections.
|
||||
*/
|
||||
. = ALIGN (16);
|
||||
__start_set_sysctl_set = .;
|
||||
*(set_sysctl_*);
|
||||
__stop_set_sysctl_set = ABSOLUTE(.);
|
||||
*(set_domain_*);
|
||||
*(set_pseudo_*);
|
||||
|
||||
*(.gcc_except_table*)
|
||||
*(.eh_frame_hdr)
|
||||
*(.eh_frame)
|
||||
} >ram
|
||||
|
||||
.init :
|
||||
{
|
||||
KEEP(*(.init))
|
||||
|
||||
} > ram
|
||||
|
||||
.fini :
|
||||
{
|
||||
KEEP(*(.fini))
|
||||
|
||||
} > ram
|
||||
|
||||
|
||||
.ctors :
|
||||
{
|
||||
/* gcc uses crtbegin.o to find the start of
|
||||
the constructors, so we make sure it is
|
||||
first. Because this is a wildcard, it
|
||||
doesn't matter if the user does not
|
||||
actually link against crtbegin.o; the
|
||||
linker won't look for a file to match a
|
||||
wildcard. The wildcard also means that it
|
||||
doesn't matter which directory crtbegin.o
|
||||
is in. */
|
||||
|
||||
KEEP (*crtbegin.o(.ctors))
|
||||
|
||||
/* We don't want to include the .ctor section from
|
||||
from the crtend.o file until after the sorted ctors.
|
||||
The .ctor section from the crtend file contains the
|
||||
end of ctors marker and it must be last */
|
||||
|
||||
KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))
|
||||
KEEP (*(SORT(.ctors.*)))
|
||||
KEEP (*(.ctors))
|
||||
} >ram
|
||||
|
||||
.dtors :
|
||||
{
|
||||
KEEP (*crtbegin.o(.dtors))
|
||||
KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))
|
||||
KEEP (*(SORT(.dtors.*)))
|
||||
KEEP (*(.dtors))
|
||||
|
||||
etext = .;
|
||||
_etext = .;
|
||||
} >ram
|
||||
|
||||
|
||||
|
||||
.rdata :
|
||||
{
|
||||
*(.rdata)
|
||||
*(.rodata)
|
||||
*(.rodata.*)
|
||||
KEEP (*(SORT(.rtemsroset.*)))
|
||||
*(.gnu.linkonce.r*)
|
||||
} >ram
|
||||
|
||||
.tdata : {
|
||||
_TLS_Data_begin = .;
|
||||
*(.tdata .tdata.* .gnu.linkonce.td.*)
|
||||
_TLS_Data_end = .;
|
||||
} >ram
|
||||
|
||||
.tbss : {
|
||||
_TLS_BSS_begin = .;
|
||||
*(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon)
|
||||
_TLS_BSS_end = .;
|
||||
} >ram
|
||||
|
||||
_TLS_Data_size = _TLS_Data_end - _TLS_Data_begin;
|
||||
_TLS_Data_begin = _TLS_Data_size != 0 ? _TLS_Data_begin : _TLS_BSS_begin;
|
||||
_TLS_Data_end = _TLS_Data_size != 0 ? _TLS_Data_end : _TLS_BSS_begin;
|
||||
_TLS_BSS_size = _TLS_BSS_end - _TLS_BSS_begin;
|
||||
_TLS_Size = _TLS_BSS_end - _TLS_Data_begin;
|
||||
_TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
|
||||
|
||||
.data :
|
||||
{
|
||||
_fdata = ALIGN(16);
|
||||
|
||||
*(.data)
|
||||
*(.data.*)
|
||||
KEEP (*(SORT(.rtemsrwset.*)))
|
||||
*(.gnu.linkonce.d*)
|
||||
} >ram
|
||||
|
||||
.jcr :
|
||||
{
|
||||
. = ALIGN(8);
|
||||
KEEP (*(.jcr))
|
||||
|
||||
_gp = ALIGN(16) + 0x7440;
|
||||
__global = _gp;
|
||||
} >ram
|
||||
|
||||
.lit8 :
|
||||
{
|
||||
*(.lit8)
|
||||
} >ram
|
||||
|
||||
.lit4 :
|
||||
{
|
||||
*(.lit4)
|
||||
} >ram
|
||||
|
||||
.sdata :
|
||||
{
|
||||
*(.sdata*)
|
||||
*(.gnu.linkonce.s*)
|
||||
} >ram
|
||||
|
||||
.sbss :
|
||||
{
|
||||
edata = .;
|
||||
_edata = .;
|
||||
_fbss = .;
|
||||
*(.sbss*)
|
||||
*(.scommon)
|
||||
} >ram
|
||||
|
||||
|
||||
.bss :
|
||||
{
|
||||
_bss_start = . ;
|
||||
*(.bss .bss.* .gnu.linkonce.b.*)
|
||||
*(COMMON)
|
||||
. = ALIGN (64);
|
||||
_stack_limit = .;
|
||||
. += _StackSize;
|
||||
__stack = .;
|
||||
_stack_init = .;
|
||||
_clear_end = .;
|
||||
WorkAreaBase = .;
|
||||
end = .;
|
||||
_end = .;
|
||||
} >ram
|
||||
|
||||
|
||||
/*
|
||||
** DWARF debug sections.
|
||||
** Symbols in the DWARF debugging sections are relative to
|
||||
** the beginning of the section so we begin them at 0.
|
||||
*/
|
||||
|
||||
/* DWARF 1 */
|
||||
.debug 0 : { *(.debug) }
|
||||
.line 0 : { *(.line) }
|
||||
|
||||
/* GNU DWARF 1 extensions */
|
||||
.debug_srcinfo 0 : { *(.debug_srcinfo) }
|
||||
.debug_sfnames 0 : { *(.debug_sfnames) }
|
||||
|
||||
/* DWARF 1.1 and DWARF 2 */
|
||||
.debug_aranges 0 : { *(.debug_aranges) }
|
||||
.debug_pubnames 0 : { *(.debug_pubnames) }
|
||||
|
||||
/* DWARF 2 */
|
||||
.debug_info 0 : { *(.debug_info) }
|
||||
.debug_abbrev 0 : { *(.debug_abbrev) }
|
||||
.debug_line 0 : { *(.debug_line) }
|
||||
.debug_frame 0 : { *(.debug_frame)}
|
||||
.debug_str 0 : { *(.debug_str) }
|
||||
.debug_loc 0 : { *(.debug_loc) }
|
||||
.debug_macinfo 0 : { *(.debug_macinfo) }
|
||||
|
||||
/* SGI/MIPS DWARF 2 extensions */
|
||||
.debug_weaknames 0 : { *(.debug_weaknames) }
|
||||
.debug_funcnames 0 : { *(.debug_funcnames) }
|
||||
.debug_typenames 0 : { *(.debug_typenames) }
|
||||
.debug_varnames 0 : { *(.debug_varnames) }
|
||||
}
|
||||
@@ -1,93 +0,0 @@
|
||||
/*
|
||||
* This file implements a benchmark timer using a MONGOOSE-V timer.
|
||||
*
|
||||
* COPYRIGHT (c) 1989-2001.
|
||||
* 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.org/license/LICENSE.
|
||||
*/
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
#include <bsp.h>
|
||||
#include <rtems/btimer.h>
|
||||
|
||||
bool benchmark_timer_find_average_overhead;
|
||||
|
||||
#if defined(USE_TIMER2_FOR_CLOCK)
|
||||
#define TIMER_BASE MONGOOSEV_TIMER1_BASE
|
||||
#define TIMER_VECTOR MONGOOSEV_IRQ_TIMER1
|
||||
#else
|
||||
#define TIMER_BASE MONGOOSEV_TIMER2_BASE
|
||||
#define TIMER_VECTOR MONGOOSEV_IRQ_TIMER2
|
||||
#endif
|
||||
|
||||
void benchmark_timer_initialize(void)
|
||||
{
|
||||
/*
|
||||
* Programming the compare register as the maximum value should let
|
||||
* it run long enough and accurate enough not to require an interrupt.
|
||||
* but if it ever does generate an interrupt, we will simply fault.
|
||||
*
|
||||
* NOTE: This is similar to the clock driver initialization
|
||||
* with the exception that the divider is disabled and
|
||||
* the compare register is set to the maximum value.
|
||||
*/
|
||||
|
||||
MONGOOSEV_WRITE_REGISTER( TIMER_BASE, MONGOOSEV_TIMER_CONTROL_REGISTER, 0);
|
||||
|
||||
MONGOOSEV_WRITE_REGISTER( TIMER_BASE,
|
||||
MONGOOSEV_TIMER_INITIAL_COUNTER_REGISTER,
|
||||
0xffffffff );
|
||||
|
||||
MONGOOSEV_WRITE_REGISTER( TIMER_BASE,
|
||||
MONGOOSEV_TIMER_CONTROL_REGISTER,
|
||||
MONGOOSEV_TIMER_CONTROL_COUNTER_ENABLE );
|
||||
|
||||
}
|
||||
|
||||
#define AVG_OVERHEAD 0 /* It typically takes N instructions */
|
||||
/* to start/stop the timer. */
|
||||
|
||||
#define LEAST_VALID 1 /* Don't trust a value lower than this */
|
||||
/* mongoose-v can count cycles. :) */
|
||||
#include <rtems/bspIo.h>
|
||||
|
||||
benchmark_timer_t benchmark_timer_read(void)
|
||||
{
|
||||
uint32_t clicks;
|
||||
uint32_t total;
|
||||
uint32_t tcr;
|
||||
|
||||
clicks = MONGOOSEV_READ_REGISTER( TIMER_BASE,
|
||||
MONGOOSEV_TIMER_INITIAL_COUNTER_REGISTER );
|
||||
total = 0xffffffff - clicks;
|
||||
|
||||
tcr = MONGOOSEV_READ_REGISTER( TIMER_BASE, MONGOOSEV_TIMER_CONTROL_REGISTER );
|
||||
|
||||
MONGOOSEV_WRITE_REGISTER( TIMER_BASE,
|
||||
MONGOOSEV_TIMER_CONTROL_REGISTER,
|
||||
0 );
|
||||
|
||||
if ( tcr & MONGOOSEV_TIMER_CONTROL_TIMEOUT )
|
||||
printk( "MG5 timer overran\n" );
|
||||
|
||||
if ( benchmark_timer_find_average_overhead == true )
|
||||
return total; /* in cycle units */
|
||||
|
||||
if ( total < LEAST_VALID )
|
||||
return 0; /* below timer resolution */
|
||||
|
||||
return (total - AVG_OVERHEAD) / CPU_CLOCK_RATE_MHZ;
|
||||
}
|
||||
|
||||
void benchmark_timer_disable_subtracting_average_overhead(
|
||||
bool find_flag
|
||||
)
|
||||
{
|
||||
benchmark_timer_find_average_overhead = find_flag;
|
||||
}
|
||||
|
||||
/* eof */
|
||||
Reference in New Issue
Block a user