From 3d6669ccf7960af91b93d5b8781b78160547c0d1 Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Wed, 13 Nov 2002 17:55:09 +0000 Subject: 2002-11-13 Jay Monkman * New BSP. * .cvsignore, ChangeLog, Makefile.am, bsp_specs, configure.ac, README, times, clock/.cvsignore, clock/Makefile.am, clock/clockdrv.c, console/.cvsignore, console/Makefile.am, console/uart.c, include/.cvsignore, include/Makefile.am, include/bsp.h, include/ep7312.h, irq/.cvsignore, irq/Makefile.am, irq/bsp_irq_asm.S, irq/bsp_irq_init.c, irq/irq.c, irq/irq.h, network/Makefile.am, network/network.c, start/.cvsignore, start/Makefile.am, start/start.S, startup/.cvsignore, startup/Makefile.am, startup/bspstart.c, startup/exit.c, startup/linkcmds, timer/.cvsignore, timer/Makefile.am, timer/timer.c, wrapup/.cvsignore, wrapup/Makefile.am: New file. --- c/src/lib/libbsp/arm/edb7312/.cvsignore | 14 + c/src/lib/libbsp/arm/edb7312/ChangeLog | 15 ++ c/src/lib/libbsp/arm/edb7312/Makefile.am | 16 ++ c/src/lib/libbsp/arm/edb7312/README | 5 + c/src/lib/libbsp/arm/edb7312/bsp_specs | 23 ++ c/src/lib/libbsp/arm/edb7312/clock/.cvsignore | 14 + c/src/lib/libbsp/arm/edb7312/clock/Makefile.am | 31 +++ c/src/lib/libbsp/arm/edb7312/clock/clockdrv.c | 78 ++++++ c/src/lib/libbsp/arm/edb7312/configure.ac | 31 +++ c/src/lib/libbsp/arm/edb7312/console/.cvsignore | 14 + c/src/lib/libbsp/arm/edb7312/console/Makefile.am | 35 +++ c/src/lib/libbsp/arm/edb7312/console/uart.c | 162 +++++++++++ c/src/lib/libbsp/arm/edb7312/include/.cvsignore | 14 + c/src/lib/libbsp/arm/edb7312/include/Makefile.am | 24 ++ c/src/lib/libbsp/arm/edb7312/include/bsp.h | 69 +++++ c/src/lib/libbsp/arm/edb7312/include/ep7312.h | 156 +++++++++++ c/src/lib/libbsp/arm/edb7312/irq/.cvsignore | 14 + c/src/lib/libbsp/arm/edb7312/irq/Makefile.am | 48 ++++ c/src/lib/libbsp/arm/edb7312/irq/bsp_irq_asm.S | 329 +++++++++++++++++++++++ c/src/lib/libbsp/arm/edb7312/irq/bsp_irq_init.c | 117 ++++++++ c/src/lib/libbsp/arm/edb7312/irq/irq.c | 155 +++++++++++ c/src/lib/libbsp/arm/edb7312/irq/irq.h | 195 ++++++++++++++ c/src/lib/libbsp/arm/edb7312/network/Makefile.am | 43 +++ c/src/lib/libbsp/arm/edb7312/network/network.c | 125 +++++++++ c/src/lib/libbsp/arm/edb7312/start/.cvsignore | 14 + c/src/lib/libbsp/arm/edb7312/start/Makefile.am | 33 +++ c/src/lib/libbsp/arm/edb7312/start/start.S | 170 ++++++++++++ c/src/lib/libbsp/arm/edb7312/startup/.cvsignore | 14 + c/src/lib/libbsp/arm/edb7312/startup/Makefile.am | 38 +++ c/src/lib/libbsp/arm/edb7312/startup/bspstart.c | 186 +++++++++++++ c/src/lib/libbsp/arm/edb7312/startup/exit.c | 40 +++ c/src/lib/libbsp/arm/edb7312/startup/linkcmds | 225 ++++++++++++++++ c/src/lib/libbsp/arm/edb7312/timer/.cvsignore | 14 + c/src/lib/libbsp/arm/edb7312/timer/Makefile.am | 33 +++ c/src/lib/libbsp/arm/edb7312/timer/timer.c | 93 +++++++ c/src/lib/libbsp/arm/edb7312/times | 189 +++++++++++++ c/src/lib/libbsp/arm/edb7312/wrapup/.cvsignore | 14 + c/src/lib/libbsp/arm/edb7312/wrapup/Makefile.am | 31 +++ 38 files changed, 2821 insertions(+) create mode 100644 c/src/lib/libbsp/arm/edb7312/.cvsignore create mode 100644 c/src/lib/libbsp/arm/edb7312/ChangeLog create mode 100644 c/src/lib/libbsp/arm/edb7312/Makefile.am create mode 100644 c/src/lib/libbsp/arm/edb7312/README create mode 100644 c/src/lib/libbsp/arm/edb7312/bsp_specs create mode 100644 c/src/lib/libbsp/arm/edb7312/clock/.cvsignore create mode 100644 c/src/lib/libbsp/arm/edb7312/clock/Makefile.am create mode 100644 c/src/lib/libbsp/arm/edb7312/clock/clockdrv.c create mode 100644 c/src/lib/libbsp/arm/edb7312/configure.ac create mode 100644 c/src/lib/libbsp/arm/edb7312/console/.cvsignore create mode 100644 c/src/lib/libbsp/arm/edb7312/console/Makefile.am create mode 100644 c/src/lib/libbsp/arm/edb7312/console/uart.c create mode 100644 c/src/lib/libbsp/arm/edb7312/include/.cvsignore create mode 100644 c/src/lib/libbsp/arm/edb7312/include/Makefile.am create mode 100644 c/src/lib/libbsp/arm/edb7312/include/bsp.h create mode 100644 c/src/lib/libbsp/arm/edb7312/include/ep7312.h create mode 100644 c/src/lib/libbsp/arm/edb7312/irq/.cvsignore create mode 100644 c/src/lib/libbsp/arm/edb7312/irq/Makefile.am create mode 100644 c/src/lib/libbsp/arm/edb7312/irq/bsp_irq_asm.S create mode 100644 c/src/lib/libbsp/arm/edb7312/irq/bsp_irq_init.c create mode 100644 c/src/lib/libbsp/arm/edb7312/irq/irq.c create mode 100644 c/src/lib/libbsp/arm/edb7312/irq/irq.h create mode 100644 c/src/lib/libbsp/arm/edb7312/network/Makefile.am create mode 100644 c/src/lib/libbsp/arm/edb7312/network/network.c create mode 100644 c/src/lib/libbsp/arm/edb7312/start/.cvsignore create mode 100644 c/src/lib/libbsp/arm/edb7312/start/Makefile.am create mode 100644 c/src/lib/libbsp/arm/edb7312/start/start.S create mode 100644 c/src/lib/libbsp/arm/edb7312/startup/.cvsignore create mode 100644 c/src/lib/libbsp/arm/edb7312/startup/Makefile.am create mode 100644 c/src/lib/libbsp/arm/edb7312/startup/bspstart.c create mode 100644 c/src/lib/libbsp/arm/edb7312/startup/exit.c create mode 100644 c/src/lib/libbsp/arm/edb7312/startup/linkcmds create mode 100644 c/src/lib/libbsp/arm/edb7312/timer/.cvsignore create mode 100644 c/src/lib/libbsp/arm/edb7312/timer/Makefile.am create mode 100644 c/src/lib/libbsp/arm/edb7312/timer/timer.c create mode 100644 c/src/lib/libbsp/arm/edb7312/times create mode 100644 c/src/lib/libbsp/arm/edb7312/wrapup/.cvsignore create mode 100644 c/src/lib/libbsp/arm/edb7312/wrapup/Makefile.am (limited to 'c/src/lib/libbsp') diff --git a/c/src/lib/libbsp/arm/edb7312/.cvsignore b/c/src/lib/libbsp/arm/edb7312/.cvsignore new file mode 100644 index 0000000000..d29e5050f5 --- /dev/null +++ b/c/src/lib/libbsp/arm/edb7312/.cvsignore @@ -0,0 +1,14 @@ +Makefile +Makefile.in +aclocal.m4 +autom4te.cache +config.cache +config.guess +config.log +config.status +config.sub +configure +depcomp +install-sh +missing +mkinstalldirs diff --git a/c/src/lib/libbsp/arm/edb7312/ChangeLog b/c/src/lib/libbsp/arm/edb7312/ChangeLog new file mode 100644 index 0000000000..7cae3feb58 --- /dev/null +++ b/c/src/lib/libbsp/arm/edb7312/ChangeLog @@ -0,0 +1,15 @@ +2002-11-13 Jay Monkman + + * New BSP. + * .cvsignore, ChangeLog, Makefile.am, bsp_specs, configure.ac, README, + times, clock/.cvsignore, clock/Makefile.am, clock/clockdrv.c, + console/.cvsignore, console/Makefile.am, console/uart.c, + include/.cvsignore, include/Makefile.am, include/bsp.h, + include/ep7312.h, irq/.cvsignore, irq/Makefile.am, irq/bsp_irq_asm.S, + irq/bsp_irq_init.c, irq/irq.c, irq/irq.h, network/Makefile.am, + network/network.c, start/.cvsignore, start/Makefile.am, + start/start.S, startup/.cvsignore, startup/Makefile.am, + startup/bspstart.c, startup/exit.c, startup/linkcmds, + timer/.cvsignore, timer/Makefile.am, timer/timer.c, + wrapup/.cvsignore, wrapup/Makefile.am: New file. + diff --git a/c/src/lib/libbsp/arm/edb7312/Makefile.am b/c/src/lib/libbsp/arm/edb7312/Makefile.am new file mode 100644 index 0000000000..7f195b1893 --- /dev/null +++ b/c/src/lib/libbsp/arm/edb7312/Makefile.am @@ -0,0 +1,16 @@ +## +## $Id$ +## + +ACLOCAL_AMFLAGS = -I ../../../../../../aclocal + +# wrapup is the one that actually builds and installs the library +# from the individual .rel files built in other directories +SUBDIRS = . include clock console irq startup timer start network wrapup + +include $(top_srcdir)/../../bsp.am + +EXTRA_DIST = bsp_specs + +include $(top_srcdir)/../../../../../../automake/subdirs.am +include $(top_srcdir)/../../../../../../automake/local.am diff --git a/c/src/lib/libbsp/arm/edb7312/README b/c/src/lib/libbsp/arm/edb7312/README new file mode 100644 index 0000000000..3ba879b228 --- /dev/null +++ b/c/src/lib/libbsp/arm/edb7312/README @@ -0,0 +1,5 @@ +# +# $Id$ +# + +This board is from Cogent. diff --git a/c/src/lib/libbsp/arm/edb7312/bsp_specs b/c/src/lib/libbsp/arm/edb7312/bsp_specs new file mode 100644 index 0000000000..2309f0e53b --- /dev/null +++ b/c/src/lib/libbsp/arm/edb7312/bsp_specs @@ -0,0 +1,23 @@ +%rename cpp old_cpp +%rename lib old_lib +%rename endfile old_endfile +%rename startfile old_startfile +%rename link old_link + +*cpp: +%(old_cpp) %{qrtems: -D__embedded__ -DUSE_ENHANCED_INTR_API} -Asystem(embedded) + +*lib: +%{!qrtems: %(old_lib)} %{qrtems: --start-group \ +%{!qrtems_debug: -lrtemsbsp -lrtemscpu} %{qrtems_debug: -lrtemsbsp_g -lrtemscpu_g} \ +-lc -lgcc --end-group \ +%{!qnolinkcmds: -T linkcmds%s}} + +*startfile: +%{!qrtems: %(old_startfile)} %{qrtems: \ +%{!qrtems_debug: start.o%s crtbegin.o%s} \ +%{qrtems_debug: start_g.o%s crtbegin.o%s}} + +*link: +%{!qrtems: %(old_link)} %{qrtems: -Qy -dp -Bstatic -N -e _start} + diff --git a/c/src/lib/libbsp/arm/edb7312/clock/.cvsignore b/c/src/lib/libbsp/arm/edb7312/clock/.cvsignore new file mode 100644 index 0000000000..d29e5050f5 --- /dev/null +++ b/c/src/lib/libbsp/arm/edb7312/clock/.cvsignore @@ -0,0 +1,14 @@ +Makefile +Makefile.in +aclocal.m4 +autom4te.cache +config.cache +config.guess +config.log +config.status +config.sub +configure +depcomp +install-sh +missing +mkinstalldirs diff --git a/c/src/lib/libbsp/arm/edb7312/clock/Makefile.am b/c/src/lib/libbsp/arm/edb7312/clock/Makefile.am new file mode 100644 index 0000000000..3c6035781c --- /dev/null +++ b/c/src/lib/libbsp/arm/edb7312/clock/Makefile.am @@ -0,0 +1,31 @@ +## +## $Id$ +## + +PGM = $(ARCH)/clock.rel + +C_FILES = clockdrv.c +C_O_FILES = $(C_FILES:%.c=$(ARCH)/%.o) + +OBJS = $(C_O_FILES) + +include $(RTEMS_ROOT)/make/custom/@RTEMS_BSP@.cfg +include $(top_srcdir)/../../../../../../automake/compile.am +include $(top_srcdir)/../../../../../../automake/lib.am + +# +# (OPTIONAL) Add local stuff here using += +# + +$(PGM): $(OBJS) + $(make-rel) + +# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile + +all-local: $(ARCH) $(OBJS) $(PGM) + +.PRECIOUS: $(PGM) + +EXTRA_DIST = ckinit.c + +include $(top_srcdir)/../../../../../../automake/local.am diff --git a/c/src/lib/libbsp/arm/edb7312/clock/clockdrv.c b/c/src/lib/libbsp/arm/edb7312/clock/clockdrv.c new file mode 100644 index 0000000000..46a22ca4a9 --- /dev/null +++ b/c/src/lib/libbsp/arm/edb7312/clock/clockdrv.c @@ -0,0 +1,78 @@ +/* + * Cirrus EP7312 Clock driver + * + * Copyright (c) 2002 by Jay Monkman + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * + * http://www.OARcorp.com/rtems/license.html. + * + * + * $Id$ +*/ +#include +#include +#include +#include + + +rtems_isr clock_isr(rtems_vector_number vector); +rtems_isr Clock_isr(rtems_vector_number vector); +static void clock_isr_on(const rtems_irq_connect_data *unused); +static void clock_isr_off(const rtems_irq_connect_data *unused); +static int clock_isr_is_on(const rtems_irq_connect_data *irq); + +rtems_irq_connect_data clock_isr_data = {BSP_TC1OI, + (rtems_irq_hdl)Clock_isr, + clock_isr_on, + clock_isr_off, + clock_isr_is_on, + 3, + 0 }; + +#define CLOCK_VECTOR 0 + +#define Clock_driver_support_at_tick() \ + do { \ + *EP7312_TC1EOI = 0xffffffff; \ + } while(0) + +#define Clock_driver_support_install_isr( _new, _old ) \ + do { \ + BSP_install_rtems_irq_handler(&clock_isr_data); \ + } while(0) + + +/* + * Set up the clock hardware +*/ +#define Clock_driver_support_initialize_hardware() \ + do { \ + *EP7312_SYSCON1 |= EP7312_SYSCON1_TC1_PRESCALE; \ + *EP7312_TC1D =(BSP_Configuration.microseconds_per_tick * 2000)/1000000; \ + *EP7312_TC1EOI = 0xFFFFFFFF; \ + } while (0) + +#define Clock_driver_support_shutdown_hardware() \ + do { \ + BSP_remove_rtems_irq_handler(&clock_isr_data); \ + } while (0) + +static void clock_isr_on(const rtems_irq_connect_data *unused) +{ + return; +} + +static void clock_isr_off(const rtems_irq_connect_data *unused) +{ + return; +} + +static int clock_isr_is_on(const rtems_irq_connect_data *irq) +{ + return 1; +} + + +#include "../../../shared/clockdrv_shell.c" diff --git a/c/src/lib/libbsp/arm/edb7312/configure.ac b/c/src/lib/libbsp/arm/edb7312/configure.ac new file mode 100644 index 0000000000..a01bff0c94 --- /dev/null +++ b/c/src/lib/libbsp/arm/edb7312/configure.ac @@ -0,0 +1,31 @@ +## Process this file with autoconf to produce a configure script. +## +## $Id$ + +AC_PREREQ(2.52) +AC_INIT([rtems-c-src-lib-libbsp-arm-edb7312],[_RTEMS_VERSION],[rtems-bugs@OARcorp.com]) +AC_CONFIG_SRCDIR([bsp_specs]) +RTEMS_TOP(../../../../../..) +AC_CONFIG_AUX_DIR(../../../../../..) + +RTEMS_CANONICAL_TARGET_CPU +AM_INIT_AUTOMAKE([no-define foreign 1.6]) +RTEMS_BSP_CONFIGURE + +RTEMS_PROG_CC_FOR_TARGET([-ansi -fasm]) +RTEMS_CANONICALIZE_TOOLS + + + +# Explicitly list all Makefiles here +AC_CONFIG_FILES([Makefile +clock/Makefile +console/Makefile +include/Makefile +irq/Makefile +start/Makefile +startup/Makefile +timer/Makefile +network/Makefile +wrapup/Makefile]) +AC_OUTPUT diff --git a/c/src/lib/libbsp/arm/edb7312/console/.cvsignore b/c/src/lib/libbsp/arm/edb7312/console/.cvsignore new file mode 100644 index 0000000000..d29e5050f5 --- /dev/null +++ b/c/src/lib/libbsp/arm/edb7312/console/.cvsignore @@ -0,0 +1,14 @@ +Makefile +Makefile.in +aclocal.m4 +autom4te.cache +config.cache +config.guess +config.log +config.status +config.sub +configure +depcomp +install-sh +missing +mkinstalldirs diff --git a/c/src/lib/libbsp/arm/edb7312/console/Makefile.am b/c/src/lib/libbsp/arm/edb7312/console/Makefile.am new file mode 100644 index 0000000000..cbe1ce7ac4 --- /dev/null +++ b/c/src/lib/libbsp/arm/edb7312/console/Makefile.am @@ -0,0 +1,35 @@ +## +## $Id$ +## + +VPATH = @srcdir@:@srcdir@/../../shared/io:@srcdir@/../../../shared + +PGM = $(ARCH)/console.rel + +C_FILES = uart.c console.c +C_O_FILES = $(C_FILES:%.c=$(ARCH)/%.o) + +OBJS = $(C_O_FILES) + +include $(RTEMS_ROOT)/make/custom/@RTEMS_BSP@.cfg +include $(top_srcdir)/../../../../../../automake/compile.am +include $(top_srcdir)/../../../../../../automake/lib.am + +# +# (OPTIONAL) Add local stuff here using += +# + +AM_CPPFLAGS += -I $(srcdir)/../irq + +$(PGM): $(OBJS) + $(make-rel) + +# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile + +all-local: $(ARCH) $(OBJS) $(PGM) + +.PRECIOUS: $(PGM) + +EXTRA_DIST = uart.c console.c + +include $(top_srcdir)/../../../../../../automake/local.am diff --git a/c/src/lib/libbsp/arm/edb7312/console/uart.c b/c/src/lib/libbsp/arm/edb7312/console/uart.c new file mode 100644 index 0000000000..fb549d3905 --- /dev/null +++ b/c/src/lib/libbsp/arm/edb7312/console/uart.c @@ -0,0 +1,162 @@ +/* + * Cirrus EP7312 Console Driver + * + * Copyright (c) 2002 by Jay Monkman + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * + * http://www.OARcorp.com/rtems/license.html. + * + * + * $Id$ +*/ +#include /* Must be before libio.h */ +#include +#include +#include + +#include +#include +#include + +#define NUM_DEVS 1 +int uart_poll_read(int minor); + +static int uart_first_open(int major, int minor, void *arg); +static int uart_last_close(int major, int minor, void *arg); +static int uart_read(int minor); +static int uart_write(int minor, const char *buf, int len); +static void uart_init(int minor); +static void uart_write_polled(int minor, char c); +static int uart_set_attributes(int minor, const struct termios *t); + +unsigned long Console_Port_Count = NUM_DEVS; +console_data Console_Port_Data[NUM_DEVS]; +rtems_device_minor_number Console_Port_Minor = 0; +console_fns uart_fns = +{ + libchip_serial_default_probe, + uart_first_open, + uart_last_close, + uart_read, + uart_write, + uart_init, + uart_write_polled, + uart_set_attributes, + FALSE +}; +console_tbl Console_Port_Tbl[] = { + { + "/dev/com0", /* sDeviceName */ + SERIAL_CUSTOM, /* deviceType */ + &uart_fns, /* pDeviceFns */ + NULL, /* deviceProbe */ + NULL, /* pDeviceFlow */ + 16, /* ulMargin */ + 8, /* ulHysteresis */ + NULL, /* pDeviceParams */ + (unsigned32)EP7312_UARTCR1, /* ulCtrlPort1 */ + (unsigned32)EP7312_SYSFLG1, /* ulCtrlPort2 */ + (unsigned32)EP7312_UARTDR1, /* ulDataPort */ + 0, /* getRegister */ + 0, /* setRegister */ + 0, /* getData */ + 0, /* setData */ + 0, /* ulClock */ + 0 /* ulIntVector */ + }}; + +static int uart_first_open(int major, int minor, void *arg) {return 0;} +static int uart_last_close(int major, int minor, void *arg) {return 0;} +static int uart_read(int minor) +{ + return uart_poll_read(minor); +} + +static void uart_write_polled(int minor, char c) +{ + uart_write(minor, &c, 1); +} + +static int uart_set_attributes(int minor, const struct termios *t) +{ + return 0; +} + +int uart_poll_read(int minor) +{ + volatile unsigned32 *data_reg; + volatile unsigned32 *ctrl_reg1; + volatile unsigned32 *ctrl_reg2; + char c; + int err; + + data_reg = (unsigned32*)Console_Port_Tbl[minor].ulDataPort; + ctrl_reg1 = (unsigned32*)Console_Port_Tbl[minor].ulCtrlPort1; + ctrl_reg2 = (unsigned32*)Console_Port_Tbl[minor].ulCtrlPort2; + + if ((*ctrl_reg2 & EP7312_UART_URXFE1) != 0) { + return -1; + } + + + + err = *data_reg; + c = err & 0xff; + err &= (EP7312_UART_FRMERR | EP7312_UART_PARERR | EP7312_UART_OVERR); + + return c; +} + +static void _BSP_null_char( char c ) {uart_write_polled(0, c);} +BSP_output_char_function_type BSP_output_char = _BSP_null_char; + +static int uart_write(int minor, const char *buf, int len) +{ + volatile unsigned32 *data_reg; + volatile unsigned32 *ctrl_reg1; + volatile unsigned32 *ctrl_reg2; + int i; + char c; + + data_reg = (unsigned32*)Console_Port_Tbl[minor].ulDataPort; + ctrl_reg1 = (unsigned32*)Console_Port_Tbl[minor].ulCtrlPort1; + ctrl_reg2 = (unsigned32*)Console_Port_Tbl[minor].ulCtrlPort2; + + for (i = 0; i < len; i++) { + /* Wait for fifo to have room */ + while ((*ctrl_reg2 & EP7312_UART_UTXFF1) != 0) { + continue; + } + + c = (char) buf[i]; + *data_reg = c; + } + + return 1; +} + +static void uart_init(int minor) +{ + volatile unsigned32 *data_reg; + volatile unsigned32 *ctrl_reg1; + volatile unsigned32 *ctrl_reg2; + + data_reg = (unsigned32*)Console_Port_Tbl[minor].ulDataPort; + ctrl_reg1 = (unsigned32*)Console_Port_Tbl[minor].ulCtrlPort1; + ctrl_reg2 = (unsigned32*)Console_Port_Tbl[minor].ulCtrlPort2; + + /* *ctrl_reg = (BSP_UART_DATA8 | + BSP_UART_STOP1 | + BSP_UART_PARITY_NONE | + EP7312_UART_FIFOEN | + BSP_UART_BAUD_9600); + */ + *ctrl_reg1 = (EP7312_UART_WRDLEN8 | + EP7312_UART_FIFOEN | + 0x17); /* 9600 baud */ + + +} + diff --git a/c/src/lib/libbsp/arm/edb7312/include/.cvsignore b/c/src/lib/libbsp/arm/edb7312/include/.cvsignore new file mode 100644 index 0000000000..d29e5050f5 --- /dev/null +++ b/c/src/lib/libbsp/arm/edb7312/include/.cvsignore @@ -0,0 +1,14 @@ +Makefile +Makefile.in +aclocal.m4 +autom4te.cache +config.cache +config.guess +config.log +config.status +config.sub +configure +depcomp +install-sh +missing +mkinstalldirs diff --git a/c/src/lib/libbsp/arm/edb7312/include/Makefile.am b/c/src/lib/libbsp/arm/edb7312/include/Makefile.am new file mode 100644 index 0000000000..3202b1b5ee --- /dev/null +++ b/c/src/lib/libbsp/arm/edb7312/include/Makefile.am @@ -0,0 +1,24 @@ +## +## $Id$ +## + +include_HEADERS = bsp.h coverhd.h bspopts.h ep7312.h + +coverhd.h: $(top_srcdir)/../../shared/include/coverhd.h + cp $< $@ + +CLEANFILES = coverhd.h + + +$(PROJECT_INCLUDE): + $(mkinstalldirs) $@ + +$(PROJECT_INCLUDE)/%.h: %.h + $(INSTALL_DATA) $< $@ + +TMPINSTALL_FILES = $(PROJECT_INCLUDE) \ + $(include_HEADERS:%=$(PROJECT_INCLUDE)/%) + +all-local: $(TMPINSTALL_FILES) + +include $(top_srcdir)/../../../../../../automake/local.am diff --git a/c/src/lib/libbsp/arm/edb7312/include/bsp.h b/c/src/lib/libbsp/arm/edb7312/include/bsp.h new file mode 100644 index 0000000000..264d3de34d --- /dev/null +++ b/c/src/lib/libbsp/arm/edb7312/include/bsp.h @@ -0,0 +1,69 @@ +/* + * Cirrus EP7312 BSP header file + * + * Copyright (c) 2002 by Jay Monkman + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * + * http://www.OARcorp.com/rtems/license.html. + * + * + * $Id$ +*/ +#ifndef __BSP_H__ +#define __BSP_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +#include +#include +#include +#include + +/* + * Define the interrupt mechanism for Time Test 27 + * + * NOTE: Following are not defined and are board independent + * + */ +struct rtems_bsdnet_ifconfig *config; +int cs8900_driver_attach (struct rtems_bsdnet_ifconfig *config, + int attaching); + +#define CONFIGURE_NUMBER_OF_TERMIOS_PORTS 2 +#define CONFIGURE_INTERRUPT_STACK_MEMORY (16 * 1024) + +extern rtems_configuration_table BSP_Configuration; + +#define MUST_WAIT_FOR_INTERRUPT 0 + +#define Install_tm27_vector( handler ) + +#define Cause_tm27_intr() + +#define Clear_tm27_intr() + +#define Lower_tm27_intr() + + + +/* + * Network driver configuration + */ +#define RTEMS_BSP_NETWORK_DRIVER_NAME "eth0" +#define RTEMS_BSP_NETWORK_DRIVER_ATTACH cs8900_driver_attach + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __BSP_H__ */ + diff --git a/c/src/lib/libbsp/arm/edb7312/include/ep7312.h b/c/src/lib/libbsp/arm/edb7312/include/ep7312.h new file mode 100644 index 0000000000..f9d4c52c82 --- /dev/null +++ b/c/src/lib/libbsp/arm/edb7312/include/ep7312.h @@ -0,0 +1,156 @@ +/* + * Cirrus EP7312 register declarations + * + * Copyright (c) 2002 by Charlie Steader + * + * Copyright (c) 2002 by Jay Monkman + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * + * http://www.OARcorp.com/rtems/license.html. + * + * + * Notes: The PLL registers (pll_ro and pll_wo) are either read only + * or write only. The data sheet says not to write the read + * only one or read the write only one. I'm not sure what will + * happen if you do. + * + * $Id$ +*/ +#ifndef __EP7312_H__ +#define __EP7312_H__ + +#define EP7312_REG_BASE 0x80000000 + +#define EP7312_PADR ((volatile unsigned8 *)(EP7312_REG_BASE + 0x0000)) +#define EP7312_PBDR ((volatile unsigned8 *)(EP7312_REG_BASE + 0x0001)) +#define EP7312_PDDR ((volatile unsigned8 *)(EP7312_REG_BASE + 0x0003)) +#define EP7312_PADDR ((volatile unsigned8 *)(EP7312_REG_BASE + 0x0040)) +#define EP7312_PBDDR ((volatile unsigned8 *)(EP7312_REG_BASE + 0x0041)) +#define EP7312_PDDDR ((volatile unsigned8 *)(EP7312_REG_BASE + 0x0043)) +#define EP7312_PEDR ((volatile unsigned8 *)(EP7312_REG_BASE + 0x0080)) +#define EP7312_PEDDR ((volatile unsigned8 *)(EP7312_REG_BASE + 0x00C0)) +#define EP7312_SYSCON1 ((volatile unsigned32 *)(EP7312_REG_BASE + 0x0100)) +#define EP7312_SYSFLG1 ((volatile unsigned32 *)(EP7312_REG_BASE + 0x0140)) +#define EP7312_MEMCFG1 ((volatile unsigned32 *)(EP7312_REG_BASE + 0x0180)) +#define EP7312_MEMCFG2 ((volatile unsigned32 *)(EP7312_REG_BASE + 0x01C0)) +#define EP7312_INTSR1 ((volatile unsigned32 *)(EP7312_REG_BASE + 0x0240)) +#define EP7312_INTMR1 ((volatile unsigned32 *)(EP7312_REG_BASE + 0x0280)) +#define EP7312_LCDCON ((volatile unsigned32 *)(EP7312_REG_BASE + 0x02C0)) +#define EP7312_TC1D ((volatile unsigned32 *)(EP7312_REG_BASE + 0x0300)) +#define EP7312_TC2D ((volatile unsigned32 *)(EP7312_REG_BASE + 0x0340)) +#define EP7312_RTCDR ((volatile unsigned32 *)(EP7312_REG_BASE + 0x0380)) +#define EP7312_RTCMR ((volatile unsigned32 *)(EP7312_REG_BASE + 0x03C0)) +#define EP7312_PMPCON ((volatile unsigned32 *)(EP7312_REG_BASE + 0x0400)) +#define EP7312_CODR ((volatile unsigned8 *)(EP7312_REG_BASE + 0x0440)) +#define EP7312_UARTDR1 ((volatile unsigned32 *)(EP7312_REG_BASE + 0x0480)) +#define EP7312_UARTCR1 ((volatile unsigned32 *)(EP7312_REG_BASE + 0x04C0)) +#define EP7312_SYNCIO ((volatile unsigned32 *)(EP7312_REG_BASE + 0x0500)) +#define EP7312_PALLSW ((volatile unsigned32 *)(EP7312_REG_BASE + 0x0540)) +#define EP7312_PALMSW ((volatile unsigned32 *)(EP7312_REG_BASE + 0x0580)) +#define EP7312_STFCLR ((volatile unsigned32 *)(EP7312_REG_BASE + 0x05C0)) +#define EP7312_BLEOI ((volatile unsigned32 *)(EP7312_REG_BASE + 0x0600)) +#define EP7312_MCEOI ((volatile unsigned32 *)(EP7312_REG_BASE + 0x0640)) +#define EP7312_TEOI ((volatile unsigned32 *)(EP7312_REG_BASE + 0x0680)) +#define EP7312_TC1EOI ((volatile unsigned32 *)(EP7312_REG_BASE + 0x06C0)) +#define EP7312_TC2EOI ((volatile unsigned32 *)(EP7312_REG_BASE + 0x0700)) +#define EP7312_RTCEOI ((volatile unsigned32 *)(EP7312_REG_BASE + 0x0740)) +#define EP7312_UMSEOI ((volatile unsigned32 *)(EP7312_REG_BASE + 0x0780)) +#define EP7312_COEOI ((volatile unsigned32 *)(EP7312_REG_BASE + 0x07C0)) +#define EP7312_HALT ((volatile unsigned32 *)(EP7312_REG_BASE + 0x0800)) +#define EP7312_STDBY ((volatile unsigned32 *)(EP7312_REG_BASE + 0x0840)) +#define EP7312_FBADDR ((volatile unsigned8 *)(EP7312_REG_BASE + 0x1000)) +#define EP7312_SYSCON2 ((volatile unsigned32 *)(EP7312_REG_BASE + 0x1100)) +#define EP7312_SYSFLG2 ((volatile unsigned32 *)(EP7312_REG_BASE + 0x1140)) +#define EP7312_INTSR2 ((volatile unsigned32 *)(EP7312_REG_BASE + 0x1240)) +#define EP7312_INTMR2 ((volatile unsigned32 *)(EP7312_REG_BASE + 0x1280)) +#define EP7312_UARTDR2 ((volatile unsigned32 *)(EP7312_REG_BASE + 0x1480)) +#define EP7312_UARTCR2 ((volatile unsigned32 *)(EP7312_REG_BASE + 0x14C0)) +#define EP7312_SS2DR ((volatile unsigned32 *)(EP7312_REG_BASE + 0x1500)) +#define EP7312_SRXEOF ((volatile unsigned32 *)(EP7312_REG_BASE + 0x1600)) +#define EP7312_SS2POP ((volatile unsigned32 *)(EP7312_REG_BASE + 0x16C0)) +#define EP7312_KBDEOI ((volatile unsigned32 *)(EP7312_REG_BASE + 0x1700)) +#define EP7312_DAIR ((volatile unsigned32 *)(EP7312_REG_BASE + 0x2000)) +#define EP7312_DAIDR0 ((volatile unsigned32 *)(EP7312_REG_BASE + 0x2040)) +#define EP7312_DAIDR1 ((volatile unsigned32 *)(EP7312_REG_BASE + 0x2080)) +#define EP7312_DAIDR2 ((volatile unsigned32 *)(EP7312_REG_BASE + 0x20C0)) +#define EP7312_DAISR ((volatile unsigned32 *)(EP7312_REG_BASE + 0x2100)) +#define EP7312_SYSCON3 ((volatile unsigned32 *)(EP7312_REG_BASE + 0x2200)) +#define EP7312_INTSR3 ((volatile unsigned32 *)(EP7312_REG_BASE + 0x2240)) +#define EP7312_INTMR3 ((volatile unsigned8 *)(EP7312_REG_BASE + 0x2280)) +#define EP7312_LEDFLSH ((volatile unsigned8 *)(EP7312_REG_BASE + 0x22C0)) +#define EP7312_SDCONF ((volatile unsigned32 *)(EP7312_REG_BASE + 0x2300)) +#define EP7312_SDRFPR ((volatile unsigned32 *)(EP7312_REG_BASE + 0x2340)) +#define EP7312_UNIQID ((volatile unsigned32 *)(EP7312_REG_BASE + 0x2440)) +#define EP7312_DAI64Fs ((volatile unsigned32 *)(EP7312_REG_BASE + 0x2600)) +#define EP7312_PLLW ((volatile unsigned8 *)(EP7312_REG_BASE + 0x2610)) +#define EP7312_PLLR ((volatile unsigned8 *)(EP7312_REG_BASE + 0xA5A8)) +#define EP7312_RANDID0 ((volatile unsigned32 *)(EP7312_REG_BASE + 0x2700)) +#define EP7312_RANDID1 ((volatile unsigned32 *)(EP7312_REG_BASE + 0x2704)) +#define EP7312_RANDID2 ((volatile unsigned32 *)(EP7312_REG_BASE + 0x2708)) +#define EP7312_RANDID3 ((volatile unsigned32 *)(EP7312_REG_BASE + 0x270C)) + +/* serial port bits */ +/* BITS in UBRLCR1 */ +#define EP7312_UART_WRDLEN5 0x00000000 +#define EP7312_UART_WRDLEN6 0x00020000 +#define EP7312_UART_WRDLEN7 0x00040000 +#define EP7312_UART_WRDLEN8 0x00060000 +#define EP7312_UART_FIFOEN 0x00010000 +#define EP7312_UART_XSTOP 0x00008000 +#define EP7312_UART_EVENPRT 0x00004000 +#define EP7312_UART_PRTEN 0x00002000 +#define EP7312_UART_BREAK 0x00001000 + +/* BITS in INTSR1 */ +#define EP7312_UART_UTXINT1 0x00002000 +#define EP7312_UART_URXINT1 0x00001000 + +/* BITS in UARTTDR1 */ +#define EP7312_UART_FRMERR 0x00000100 +#define EP7312_UART_PARERR 0x00000200 +#define EP7312_UART_OVERR 0x00000400 + +/* BITS in system status flag register 1 */ +#define EP7312_UART_UBUSY1 0x00000800 +#define EP7312_UART_URXFE1 0x00400000 +#define EP7312_UART_UTXFF1 0x00800000 + +/* system configuration bits */ +/* BITS in SYSCON1 */ +#define EP7312_SYSCON1_UART1EN 0x00000100 +#define EP7312_SYSCON1_TC1_PRESCALE 0x00000010 +#define EP7312_SYSCON1_TC1_512KHZ 0x00000020 +#define EP7312_SYSCON1_TC2_PRESCALE 0x00000040 +#define EP7312_SYSCON1_TC2_512KHZ 0x00000080 + +/* INTR1 (Interrupt 1) mask/status register bits */ +#define EP7312_INTR1_EXTFIQ 0x00000001 +#define EP7312_INTR1_BLINT 0x00000002 +#define EP7312_INTR1_WEINT 0x00000004 +#define EP7312_INTR1_MCINT 0x00000008 +#define EP7312_INTR1_CSINT 0x00000010 +#define EP7312_INTR1_EINT1 0x00000020 +#define EP7312_INTR1_EINT2 0x00000040 +#define EP7312_INTR1_EINT3 0x00000080 +#define EP7312_INTR1_TC1OI 0x00000100 +#define EP7312_INTR1_TC2OI 0x00000200 +#define EP7312_INTR1_RTCMI 0x00000400 +#define EP7312_INTR1_TINT 0x00000800 +#define EP7312_INTR1_URXINT1 0x00001000 +#define EP7312_INTR1_UTXINT1 0x00002000 +#define EP7312_INTR1_UMSINT 0x00004000 +#define EP7312_INTR1_SSEOTI 0x00008000 + +/* INTR2 (Interrupt 2) mask/status register bits */ +#define EP7312_INTR2_KBDINT 0x00000001 +#define EP7312_INTR2_SS2RX 0x00000002 +#define EP7312_INTR2_SS2TX 0x00000004 +#define EP7312_INTR2_URXINT2 0x00001000 +#define EP7312_INTR2_UTXINT2 0x00002000 + +/* INTR3 (Interrupt 3) mask/status register bits */ +#define EP7312_INTR2_DAIINT 0x00000001 + +#endif /* __EP7312_H__ */ diff --git a/c/src/lib/libbsp/arm/edb7312/irq/.cvsignore b/c/src/lib/libbsp/arm/edb7312/irq/.cvsignore new file mode 100644 index 0000000000..d29e5050f5 --- /dev/null +++ b/c/src/lib/libbsp/arm/edb7312/irq/.cvsignore @@ -0,0 +1,14 @@ +Makefile +Makefile.in +aclocal.m4 +autom4te.cache +config.cache +config.guess +config.log +config.status +config.sub +configure +depcomp +install-sh +missing +mkinstalldirs diff --git a/c/src/lib/libbsp/arm/edb7312/irq/Makefile.am b/c/src/lib/libbsp/arm/edb7312/irq/Makefile.am new file mode 100644 index 0000000000..4771a9879c --- /dev/null +++ b/c/src/lib/libbsp/arm/edb7312/irq/Makefile.am @@ -0,0 +1,48 @@ +## +## $Id$ +## + +VPATH = @srcdir@:@srcdir@/../../shared/irq + +PGM = $(ARCH)/irq.rel + +C_FILES = irq.c bsp_irq_init.c irq_init.c +C_O_FILES = $(C_FILES:%.c=$(ARCH)/%.o) + +S_FILES = bsp_irq_asm.S irq_asm.S +S_O_FILES = $(S_FILES:%.S=$(ARCH)/%.o) + +include_HEADERS = irq.h + +OBJS = $(C_O_FILES) $(S_O_FILES) + +include $(RTEMS_ROOT)/make/custom/@RTEMS_BSP@.cfg +include $(top_srcdir)/../../../../../../automake/compile.am +include $(top_srcdir)/../../../../../../automake/lib.am + +# +# (OPTIONAL) Add local stuff here using += +# + +AM_CPPFLAGS += -I$(srcdir) + +$(PROJECT_INCLUDE): + $(mkinstalldirs) $@ + +$(PROJECT_INCLUDE)/%.h: %.h + $(INSTALL_DATA) $< $@ + +PREINSTALL_FILES = $(PROJECT_INCLUDE) $(include_HEADERS:%=$(PROJECT_INCLUDE)/%) + +$(PGM): $(OBJS) + $(make-rel) + +# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile + +all-local: $(ARCH) $(OBJS) $(PGM) + +.PRECIOUS: $(PGM) + +EXTRA_DIST = bsp_irq_asm.S bsp_irq_init.c irq.c + +include $(top_srcdir)/../../../../../../automake/local.am diff --git a/c/src/lib/libbsp/arm/edb7312/irq/bsp_irq_asm.S b/c/src/lib/libbsp/arm/edb7312/irq/bsp_irq_asm.S new file mode 100644 index 0000000000..f2338a4b3e --- /dev/null +++ b/c/src/lib/libbsp/arm/edb7312/irq/bsp_irq_asm.S @@ -0,0 +1,329 @@ +/* + * Cirrus EP7312 Intererrupt handler + * + * Copyright (c) 2002 by Jay Monkman + * + * Copyright (c) 2002 by Charlie Steader + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * + * http://www.OARcorp.com/rtems/license.html. + * + * + * $Id$ +*/ +#define __asm__ +#include "irq.h" + +#define VECTOR_TABLE 0x40 + +/* + * Function to obtain, execute an IT handler and acknowledge the IT + */ + + .globl ExecuteITHandler +ExecuteITHandler : +/* + * Look at interrupt status register to determine source. + * From source, determine offset into expanded vector table + * and load handler address into r0. + */ + + ldr r1, =0x80000000 /* close to interrupt status/mask registers 1 */ + ldr r2, =0x80001000 /* close to interrupt status/mask registers 2 */ + ldr r3, =0x80002000 /* close to interrupt status/mask registers 3 */ + + stmdb sp!,{r4, r5, r6} + +/* + * INTSR3 + */ +check_dai: + ldr r4, [r3, #0x240] + ldr r5, [r3, #0x280] + and r6, r4, r5 /* only look at interrupts which are enabled */ + tst r6, #0x0001 + beq check_extfiq + ldr r0, =(VECTOR_TABLE + (4 * 21)) /* load the vector number */ + b get_handler + +/* + * INTSR1 + */ +check_extfiq: + ldr r4, [r1, #0x240] + ldr r5, [r1, #0x280] + and r6, r4, r5 /* only look at interrupts which are enabled */ + tst r6, #0x0001 + beq check_bl + ldr r0, =(VECTOR_TABLE + (4 * 0)) /* load the vector number */ + b get_handler + +check_bl: +#if 0 +MUST REMEMBER TO UNCOMMENT IF THIS HANDLER MOVES + ldr r4, [r1, #0x240] + ldr r5, [r1, #0x280] + and r6, r4, r5 /* only look at interrupts which are enabled */ +#endif + tst r6, #0x0002 + beq check_we + ldr r0, =(VECTOR_TABLE + (4 * 1)) /* load the vector number */ + b get_handler + +check_we: +#if 0 +MUST REMEMBER TO UNCOMMENT IF THIS HANDLER MOVES + ldr r4, [r1, #0x240] + ldr r5, [r1, #0x280] + and r6, r4, r5 /* only look at interrupts which are enabled */ +#endif + tst r6, #0x0004 + beq check_mc + ldr r0, =(VECTOR_TABLE + (4 * 2)) /* load the vector number */ + b get_handler + +check_mc: +#if 0 +MUST REMEMBER TO UNCOMMENT IF THIS HANDLER MOVES + ldr r4, [r1, #0x240] + ldr r5, [r1, #0x280] + and r6, r4, r5 /* only look at interrupts which are enabled */ +#endif + tst r6, #0x0008 + beq check_cs + ldr r0, =(VECTOR_TABLE + (4 * 3)) /* load the vector number */ + b get_handler + +check_cs: +#if 0 +MUST REMEMBER TO UNCOMMENT IF THIS HANDLER MOVES + ldr r4, [r1, #0x240] + ldr r5, [r1, #0x280] + and r6, r4, r5 /* only look at interrupts which are enabled */ +#endif + tst r6, #0x0010 + beq check_e1 + ldr r0, =(VECTOR_TABLE + (4 * 4)) /* load the vector number */ + b get_handler + +check_e1: +#if 0 +MUST REMEMBER TO UNCOMMENT IF THIS HANDLER MOVES + ldr r4, [r1, #0x240] + ldr r5, [r1, #0x280] + and r6, r4, r5 /* only look at interrupts which are enabled */ +#endif + tst r6, #0x0020 + beq check_e2 + ldr r0, =(VECTOR_TABLE + (4 * 5)) /* load the vector number */ + b get_handler + +check_e2: +#if 0 +MUST REMEMBER TO UNCOMMENT IF THIS HANDLER MOVES + ldr r4, [r1, #0x240] + ldr r5, [r1, #0x280] + and r6, r4, r5 /* only look at interrupts which are enabled */ +#endif + tst r6, #0x0040 + beq check_e3 + ldr r0, =(VECTOR_TABLE + (4 * 6)) /* load the vector number */ + b get_handler + +check_e3: +#if 0 +MUST REMEMBER TO UNCOMMENT IF THIS HANDLER MOVES + ldr r4, [r1, #0x240] + ldr r5, [r1, #0x280] + and r6, r4, r5 /* only look at interrupts which are enabled */ +#endif + tst r6, #0x0080 + beq check_tc1 + ldr r0, =(VECTOR_TABLE + (4 * 7)) /* load the vector number */ + b get_handler + +check_tc1: +#if 0 +MUST REMEMBER TO UNCOMMENT IF THIS HANDLER MOVES + ldr r4, [r1, #0x240] + ldr r5, [r1, #0x280] + and r6, r4, r5 /* only look at interrupts which are enabled */ +#endif + tst r6, #0x0100 + beq check_tc2 + ldr r0, =(VECTOR_TABLE + (4 * 8)) /* load the vector number */ + b get_handler + +check_tc2: +#if 0 +MUST REMEMBER TO UNCOMMENT IF THIS HANDLER MOVES + ldr r4, [r1, #0x240] + ldr r5, [r1, #0x280] + and r6, r4, r5 /* only look at interrupts which are enabled */ +#endif + tst r6, #0x0200 + beq check_rtc + ldr r0, =(VECTOR_TABLE + (4 * 9)) /* load the vector number */ + b get_handler + +check_rtc: +#if 0 +MUST REMEMBER TO UNCOMMENT IF THIS HANDLER MOVES + ldr r4, [r1, #0x240] + ldr r5, [r1, #0x280] + and r6, r4, r5 /* only look at interrupts which are enabled */ +#endif + tst r6, #0x0400 + beq check_tick + ldr r0, =(VECTOR_TABLE + (4 * 10)) /* load the vector number */ + b get_handler + +check_tick: +#if 0 +MUST REMEMBER TO UNCOMMENT IF THIS HANDLER MOVES + ldr r4, [r1, #0x240] + ldr r5, [r1, #0x280] + and r6, r4, r5 /* only look at interrupts which are enabled */ +#endif + tst r6, #0x0800 + beq check_utx1 + ldr r0, =(VECTOR_TABLE + (4 * 11)) /* load the vector number */ + b get_handler + +check_utx1: +#if 0 +MUST REMEMBER TO UNCOMMENT IF THIS HANDLER MOVES + ldr r4, [r1, #0x240] + ldr r5, [r1, #0x280] + and r6, r4, r5 /* only look at interrupts which are enabled */ +#endif + tst r6, #0x1000 + beq check_urx1 + ldr r0, =(VECTOR_TABLE + (4 * 12)) /* load the vector number */ + b get_handler + +check_urx1: +#if 0 +MUST REMEMBER TO UNCOMMENT IF THIS HANDLER MOVES + ldr r4, [r1, #0x240] + ldr r5, [r1, #0x280] + and r6, r4, r5 /* only look at interrupts which are enabled */ +#endif + tst r6, #0x2000 + beq check_ums + ldr r0, =(VECTOR_TABLE + (4 * 13)) /* load the vector number */ + b get_handler + +check_ums: +#if 0 +MUST REMEMBER TO UNCOMMENT IF THIS HANDLER MOVES + ldr r4, [r1, #0x240] + ldr r5, [r1, #0x280] + and r6, r4, r5 /* only look at interrupts which are enabled */ +#endif + tst r6, #0x4000 + beq check_sse + ldr r0, =(VECTOR_TABLE + (4 * 14)) /* load the vector number */ + b get_handler + +check_sse: +#if 0 +MUST REMEMBER TO UNCOMMENT IF THIS HANDLER MOVES + ldr r4, [r1, #0x240] + ldr r5, [r1, #0x280] + and r6, r4, r5 /* only look at interrupts which are enabled */ +#endif + tst r6, #0x8000 + beq check_kbd + ldr r0, =(VECTOR_TABLE + (4 * 15)) /* load the vector number */ + b get_handler + +/* + * INTSR2 + */ +check_kbd: + ldr r4, [r2, #0x240] + ldr r5, [r2, #0x280] + and r6, r4, r5 /* only look at interrupts which are enabled */ + tst r6, #0x0001 + beq check_ss2rx + ldr r0, =(VECTOR_TABLE + (4 * 16)) /* load the vector number */ + b get_handler + +check_ss2rx: +#if 0 +MUST REMEMBER TO UNCOMMENT IF THIS HANDLER MOVES + ldr r4, [r2, #0x240] + ldr r5, [r2, #0x280] + and r6, r4, r5 /* only look at interrupts which are enabled */ +#endif + tst r6, #0x0002 + beq check_ss2tx + ldr r0, =(VECTOR_TABLE + (4 * 17)) /* load the vector number */ + b get_handler + +check_ss2tx: +#if 0 +MUST REMEMBER TO UNCOMMENT IF THIS HANDLER MOVES + ldr r4, [r2, #0x240] + ldr r5, [r2, #0x280] + and r6, r4, r5 /* only look at interrupts which are enabled */ +#endif + tst r6, #0x0004 + beq check_utx2 + ldr r0, =(VECTOR_TABLE + (4 * 18)) /* load the vector number */ + b get_handler + +check_utx2: +#if 0 +MUST REMEMBER TO UNCOMMENT IF THIS HANDLER MOVES + ldr r4, [r2, #0x240] + ldr r5, [r2, #0x280] + and r6, r4, r5 /* only look at interrupts which are enabled */ +#endif + tst r6, #0x1000 + beq check_urx2 + ldr r0, =(VECTOR_TABLE + (4 * 19)) /* load the vector number */ + b get_handler + +check_urx2: +#if 0 +MUST REMEMBER TO UNCOMMENT IF THIS HANDLER MOVES + ldr r4, [r2, #0x240] + ldr r5, [r2, #0x280] + and r6, r4, r5 /* only look at interrupts which are enabled */ +#endif + tst r6, #0x2000 + beq IRQ_NoInterrupt + ldr r0, =(VECTOR_TABLE + (4 * 20)) /* load the vector number */ + b get_handler + +get_handler: + + ldmia sp!,{r4, r5, r6} + + ldr r0, [r0] /* extract the IT handler @ */ + + /* + * re-enable interrupts at processor level as the current + * interrupt source is now masked via VEGA logic + */ +/* + mrs r1, cpsr + and r1, r1, #0xFFFFFF3F + msr cpsr, r1 +*/ + + stmdb sp!,{lr} + ldr lr, =IRQ_return /* prepare the return from handler */ + + mov pc, r0 /* EXECUTE INT HANDLER */ + +IRQ_return: + ldmia sp!,{lr} + +IRQ_NoInterrupt: + /* return to the "main" interrupt handler */ + mov pc, lr diff --git a/c/src/lib/libbsp/arm/edb7312/irq/bsp_irq_init.c b/c/src/lib/libbsp/arm/edb7312/irq/bsp_irq_init.c new file mode 100644 index 0000000000..a69298e102 --- /dev/null +++ b/c/src/lib/libbsp/arm/edb7312/irq/bsp_irq_init.c @@ -0,0 +1,117 @@ +/* + * Cirrus EP7312 Intererrupt handler + * + * Copyright (c) 2002 by Jay Monkman + * + * Copyright (c) 2002 by Charlie Steader + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * + * http://www.OARcorp.com/rtems/license.html. + * + * + * $Id$ +*/ +#include +#include +#include + +extern void default_int_handler(); + +void BSP_rtems_irq_mngt_init() +{ + long int_stat; + + /* mask all interrupts */ + *EP7312_INTMR1 = 0x0; + *EP7312_INTMR2 = 0x0; + *EP7312_INTMR3 = 0x0; + + /* clear all pending interrupt status' */ + int_stat = *EP7312_INTSR1; + if(int_stat & EP7312_INTR1_EXTFIQ) + { + } + if(int_stat & EP7312_INTR1_BLINT) + { + *EP7312_BLEOI = 0xFFFFFFFF; + } + if(int_stat & EP7312_INTR1_WEINT) + { + *EP7312_TEOI = 0xFFFFFFFF; + } + if(int_stat & EP7312_INTR1_MCINT) + { + } + if(int_stat & EP7312_INTR1_CSINT) + { + *EP7312_COEOI = 0xFFFFFFFF; + } + if(int_stat & EP7312_INTR1_EINT1) + { + } + if(int_stat & EP7312_INTR1_EINT2) + { + } + if(int_stat & EP7312_INTR1_EINT3) + { + } + if(int_stat & EP7312_INTR1_TC1OI) + { + *EP7312_TC1EOI = 0xFFFFFFFF; + } + if(int_stat & EP7312_INTR1_TC2OI) + { + *EP7312_TC2EOI = 0xFFFFFFFF; + } + if(int_stat & EP7312_INTR1_RTCMI) + { + *EP7312_RTCEOI = 0xFFFFFFFF; + } + if(int_stat & EP7312_INTR1_TINT) + { + *EP7312_TEOI = 0xFFFFFFFF; + } + if(int_stat & EP7312_INTR1_URXINT1) + { + } + if(int_stat & EP7312_INTR1_UTXINT1) + { + } + if(int_stat & EP7312_INTR1_UMSINT) + { + *EP7312_UMSEOI = 0xFFFFFFFF; + } + if(int_stat & EP7312_INTR1_SSEOTI) + { + *EP7312_SYNCIO; + } + int_stat = *EP7312_INTSR1; + + int_stat = *EP7312_INTSR2; + if(int_stat & EP7312_INTR2_KBDINT) + { + *EP7312_KBDEOI = 0xFFFFFFFF; + } + if(int_stat & EP7312_INTR2_SS2RX) + { + } + if(int_stat & EP7312_INTR2_SS2TX) + { + } + if(int_stat & EP7312_INTR2_URXINT2) + { + } + if(int_stat & EP7312_INTR2_UTXINT2) + { + } + int_stat = *EP7312_INTSR2; + + int_stat = *EP7312_INTSR3; + if(int_stat & EP7312_INTR2_DAIINT) + { + } + int_stat = *EP7312_INTSR3; +} + diff --git a/c/src/lib/libbsp/arm/edb7312/irq/irq.c b/c/src/lib/libbsp/arm/edb7312/irq/irq.c new file mode 100644 index 0000000000..cb46d9c301 --- /dev/null +++ b/c/src/lib/libbsp/arm/edb7312/irq/irq.c @@ -0,0 +1,155 @@ +/* + * Cirrus EP7312 Intererrupt handler + * + * Copyright (c) 2002 by Jay Monkman + * + * Copyright (c) 2002 by Charlie Steader + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * + * http://www.OARcorp.com/rtems/license.html. + * + * + * $Id$ +*/ +#include +#include +#include +#include +#include + +/* + * This function check that the value given for the irq line + * is valid. + */ + +static int isValidInterrupt(int irq) +{ + if ( (irq < 0) || (irq > BSP_MAX_INT)) + return 0; + return 1; +} + +/* + * -------------------- RTEMS Single Irq Handler Mngt Routines ---------------- + */ + +int BSP_install_rtems_irq_handler (const rtems_irq_connect_data* irq) +{ + rtems_irq_hdl *HdlTable; + rtems_interrupt_level level; + + if (!isValidInterrupt(irq->name)) { + return 0; + } + /* + * Check if default handler is actually connected. If not issue an error. + */ + HdlTable = (rtems_irq_hdl *) VECTOR_TABLE; + if (*(HdlTable + irq->name) != default_int_handler) { + return 0; + } + + _CPU_ISR_Disable(level); + + /* + * store the new handler + */ + *(HdlTable + irq->name) = irq->hdl; + + /* + * unmask interrupt + */ + if(irq->name >= BSP_EXTFIQ && irq->name <= BSP_SSEOTI) + { + /* interrupt managed by INTMR1 and INTSR1 */ + *EP7312_INTMR1 |= (1 << irq->name); + } + else if(irq->name >= BSP_KBDINT && irq->name <= BSP_SS2TX) + { + /* interrupt managed by INTMR2 and INTSR2 */ + *EP7312_INTMR2 |= (1 << (irq->name - 16)); + } + else if(irq->name >= BSP_UTXINT2 && irq->name <= BSP_URXINT2) + { + /* interrupt managed by INTMR2 and INTSR2 */ + *EP7312_INTMR2 |= (1 << (irq->name - 7)); + } + else if(irq->name == BSP_DAIINT) + { + /* interrupt managed by INTMR3 and INTSR3 */ + *EP7312_INTMR3 |= (1 << (irq->name - 21)); + } + + /* + * Enable interrupt on device + */ + if(irq->on) + { + irq->on(irq); + } + + _CPU_ISR_Enable(level); + + return 1; +} + +int BSP_remove_rtems_irq_handler (const rtems_irq_connect_data* irq) +{ + rtems_irq_hdl *HdlTable; + rtems_interrupt_level level; + + if (!isValidInterrupt(irq->name)) { + return 0; + } + /* + * Check if the handler is actually connected. If not issue an error. + */ + HdlTable = (rtems_irq_hdl *) VECTOR_TABLE; + if (*(HdlTable + irq->name) != irq->hdl) { + return 0; + } + _CPU_ISR_Disable(level); + + /* + * mask interrupt + */ + if(irq->name >= BSP_EXTFIQ && irq->name <= BSP_SSEOTI) + { + /* interrupt managed by INTMR1 and INTSR1 */ + *EP7312_INTMR1 &= ~(1 << irq->name); + } + else if(irq->name >= BSP_KBDINT && irq->name <= BSP_SS2TX) + { + /* interrupt managed by INTMR2 and INTSR2 */ + *EP7312_INTMR2 &= ~(1 << (irq->name - 16)); + } + else if(irq->name >= BSP_UTXINT2 && irq->name <= BSP_URXINT2) + { + /* interrupt managed by INTMR2 and INTSR2 */ + *EP7312_INTMR2 &= ~(1 << (irq->name - 7)); + } + else if(irq->name == BSP_DAIINT) + { + /* interrupt managed by INTMR3 and INTSR3 */ + *EP7312_INTMR3 &= ~(1 << (irq->name - 21)); + } + + /* + * Disable interrupt on device + */ + if(irq->off) + irq->off(irq); + + /* + * restore the default irq value + */ + *(HdlTable + irq->name) = default_int_handler; + + _CPU_ISR_Enable(level); + + return 1; +} + + diff --git a/c/src/lib/libbsp/arm/edb7312/irq/irq.h b/c/src/lib/libbsp/arm/edb7312/irq/irq.h new file mode 100644 index 0000000000..f8ddcd5d44 --- /dev/null +++ b/c/src/lib/libbsp/arm/edb7312/irq/irq.h @@ -0,0 +1,195 @@ +/* + * Cirrus EP7312 Intererrupt handler + * + * Copyright (c) 2002 by Jay Monkman + * + * Copyright (c) 2002 by Charlie Steader + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * + * http://www.OARcorp.com/rtems/license.html. + * + * + * $Id$ +*/ + +#ifndef __IRQ_H__ +#define __IRQ_H__ + +#ifdef __cplusplus +extern "C" { +#endif + + /* define that can be useful (the values are just examples) */ +#define VECTOR_TABLE 0x40 + +#ifndef __asm__ + +/* + * Include some preprocessor value also used by assember code + */ + +#include + +extern void default_int_handler(); +/*-------------------------------------------------------------------------+ +| Constants ++--------------------------------------------------------------------------*/ + + /* enum of the possible interrupt sources */ +typedef enum { + /* int interrupt status/mask register 1 */ + BSP_EXTFIQ = 0, + BSP_BLINT, + BSP_WEINT, + BSP_MCINT, + BSP_CSINT, + BSP_EINT1, + BSP_EINT2, + BSP_EINT3, + BSP_TC1OI, + BSP_TC2OI, + BSP_RTCMI, + BSP_TINT, + BSP_UTXINT1, + BSP_URXINT1, + BSP_UMSINT, + BSP_SSEOTI, + /* int interrupt status/mask register 2 */ + BSP_KBDINT, + BSP_SS2RX, + BSP_SS2TX, + BSP_UTXINT2, + BSP_URXINT2, + /* int interrupt status/mask register 3 */ + BSP_DAIINT, + BSP_MAX_INT, +} rtems_irq_symbolic_name; + + + +/* + * Type definition for RTEMS managed interrupts + */ +typedef unsigned char rtems_irq_level; +typedef unsigned char rtems_irq_trigger; + +struct __rtems_irq_connect_data__; /* forward declaratiuon */ + +typedef void (*rtems_irq_hdl) (void); +typedef void (*rtems_irq_enable) (const struct __rtems_irq_connect_data__*); +typedef void (*rtems_irq_disable) (const struct __rtems_irq_connect_data__*); +typedef int (*rtems_irq_is_enabled)(const struct __rtems_irq_connect_data__*); + +typedef struct __rtems_irq_connect_data__ { + /* + * IRQ line + */ + rtems_irq_symbolic_name name; + /* + * handler. See comment on handler properties below in function prototype. + */ + rtems_irq_hdl hdl; + /* + * function for enabling interrupts at device level (ONLY!). + * The BSP code will automatically enable it at i8259s level. + * RATIONALE : anyway such code has to exist in current driver code. + * It is usually called immediately AFTER connecting the interrupt handler. + * RTEMS may well need such a function when restoring normal interrupt + * processing after a debug session. + * + */ + rtems_irq_enable on; + /* + * function for disabling interrupts at device level (ONLY!). + * The code will disable it at i8259s level. RATIONALE : anyway + * such code has to exist for clean shutdown. It is usually called + * BEFORE disconnecting the interrupt. RTEMS may well need such + * a function when disabling normal interrupt processing for + * a debug session. May well be a NOP function. + */ + rtems_irq_disable off; + /* + * function enabling to know what interrupt may currently occur + * if someone manipulates the i8259s interrupt mask without care... + */ + rtems_irq_is_enabled isOn; + /* + * priority level at the vplus level + */ + rtems_irq_level irqLevel; + /* + * Trigger way : Rising or falling edge or High or low level + */ + rtems_irq_trigger irqTrigger; +} rtems_irq_connect_data; + +/*-------------------------------------------------------------------------+ +| Function Prototypes. ++--------------------------------------------------------------------------*/ +/* + * ------------------- RTEMS Single Irq Handler Mngt Routines ---------------- + */ + +/* + * function to initialize the interrupt for a specific BSP + */ +void BSP_rtems_irq_mngt_init(); + + +/* + * function to connect a particular irq handler. This hanlder will NOT be called + * directly as the result of the corresponding interrupt. Instead, a RTEMS + * irq prologue will be called that will : + * + * 1) save the C scratch registers, + * 2) switch to a interrupt stack if the interrupt is not nested, + * 3) store the current i8259s' interrupt masks + * 4) modify them to disable the current interrupt at 8259 level (and may + * be others depending on software priorities) + * 5) aknowledge the i8259s', + * 6) demask the processor, + * 7) call the application handler + * + * As a result the hdl function provided + * + * a) can perfectly be written is C, + * b) may also well directly call the part of the RTEMS API that can be used + * from interrupt level, + * c) It only responsible for handling the jobs that need to be done at + * the device level including (aknowledging/re-enabling the interrupt at device, + * level, getting the data,...) + * + * When returning from the function, the following will be performed by + * the RTEMS irq epilogue : + * + * 1) masks the interrupts again, + * 2) restore the original i8259s' interrupt masks + * 3) switch back on the orinal stack if needed, + * 4) perform rescheduling when necessary, + * 5) restore the C scratch registers... + * 6) restore initial execution flow + * + */ + +int BSP_install_rtems_irq_handler (const rtems_irq_connect_data*); +/* + * function to get the current RTEMS irq handler for ptr->name. It enables to + * define hanlder chain... + */ +int BSP_get_current_rtems_irq_handler (rtems_irq_connect_data* ptr); +/* + * function to get disconnect the RTEMS irq handler for ptr->name. + * This function checks that the value given is the current one for safety reason. + * The user can use the previous function to get it. + */ +int BSP_remove_rtems_irq_handler (const rtems_irq_connect_data*); + +#endif /* __asm__ */ + +#ifdef __cplusplus +} +#endif + +#endif /* __IRQ_H__ */ diff --git a/c/src/lib/libbsp/arm/edb7312/network/Makefile.am b/c/src/lib/libbsp/arm/edb7312/network/Makefile.am new file mode 100644 index 0000000000..fb06ff5e5b --- /dev/null +++ b/c/src/lib/libbsp/arm/edb7312/network/Makefile.am @@ -0,0 +1,43 @@ +## +## $Id$ +## + +PGM = $(ARCH)/network.rel + +C_FILES = network.c +C_O_FILES = $(C_FILES:%.c=$(ARCH)/%.o) + +include_HEADERS = + +OBJS = $(C_O_FILES) + +include $(RTEMS_ROOT)/make/custom/@RTEMS_BSP@.cfg +include $(top_srcdir)/../../../../../../automake/compile.am +include $(top_srcdir)/../../../../../../automake/lib.am + +# +# (OPTIONAL) Add local stuff here using += +# +AM_CPPFLAGS += -D__INSIDE_RTEMS_BSD_TCPIP_STACK__ + +$(PROJECT_INCLUDE): + $(mkinstalldirs) $@ + +$(PROJECT_INCLUDE)/%.h: %.h + $(INSTALL_DATA) $< $@ + +PREINSTALL_FILES = $(PROJECT_INCLUDE) \ + $(include_HEADERS:%=$(PROJECT_INCLUDE)/%) + +$(PGM): $(OBJS) + $(make-rel) + +# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile + +all-local: $(ARCH) $(OBJS) $(PGM) + +.PRECIOUS: $(PGM) + +EXTRA_DIST = network.c + +include $(top_srcdir)/../../../../../../automake/local.am diff --git a/c/src/lib/libbsp/arm/edb7312/network/network.c b/c/src/lib/libbsp/arm/edb7312/network/network.c new file mode 100644 index 0000000000..9265cddb94 --- /dev/null +++ b/c/src/lib/libbsp/arm/edb7312/network/network.c @@ -0,0 +1,125 @@ +#include +#include +#include +#include + +#define CS8900_BASE 0x20000300 +unsigned int bsp_cs8900_io_base = 0; +unsigned int bsp_cs8900_memory_base = 0; +cs8900_device *g_cs; +rtems_irq_hdl cs8900_isr(rtems_vector_number v); +rtems_irq_connect_data cs8900_isr_data = {BSP_EINT3, + (rtems_irq_hdl)cs8900_isr, + NULL, + NULL, + NULL, + 0, + 0 }; + +char g_enetbuf[1520]; + +rtems_irq_hdl cs8900_isr(rtems_vector_number v) +{ + cs8900_interrupt(v, g_cs); +} + +/* cs8900_io_set_reg - set one of the I/O addressed registers */ +void cs8900_io_set_reg (int dev, unsigned short reg, unsigned short data) +{ + /* works the same for all values of dev */ +/* + printf("cs8900_io_set_reg: reg: %#6x, val %#6x\n", + CS8900_BASE + reg, + data); +*/ + *(unsigned short *)(CS8900_BASE + reg) = data; +} + +/* cs8900_io_get_reg - reads one of the I/O addressed registers */ +unsigned short cs8900_io_get_reg (int dev, unsigned short reg) +{ + unsigned short val; + /* works the same for all values of dev */ + val = *(unsigned short *)(CS8900_BASE + reg); +/* + printf("cs8900_io_get_reg: reg: %#6x, val %#6x\n", reg, val); +*/ + return val; +} + +/* cs8900_mem_set_reg - sets one of the registers mapped through + * PacketPage + */ +void cs8900_mem_set_reg (int dev, unsigned long reg, unsigned short data) +{ + /* works the same for all values of dev */ + cs8900_io_set_reg(dev, CS8900_IO_PACKET_PAGE_PTR, reg); + cs8900_io_set_reg(dev, CS8900_IO_PP_DATA_PORT0, data); +} + +/* cs8900_mem_get_reg - reads one of the registers mapped through + * PacketPage + */ +unsigned short cs8900_mem_get_reg (int dev, unsigned long reg) +{ + /* works the same for all values of dev */ + cs8900_io_set_reg(dev, CS8900_IO_PACKET_PAGE_PTR, reg); + return cs8900_io_get_reg(dev, CS8900_IO_PP_DATA_PORT0); +} + +void cs8900_get_mac_addr (int dev, unsigned char *mac_address) +{ + mac_address[0] = 0x08; + mac_address[1] = 0x00; + mac_address[2] = 0x3e; + mac_address[3] = 0x21; + mac_address[4] = 0xc7; + mac_address[5] = 0xf7; +} + +void cs8900_attach_interrupt (int dev, cs8900_device *cs) +{ + g_cs = cs; + BSP_install_rtems_irq_handler(&cs8900_isr_data); +} + +void cs8900_detach_interrupt (int dev) +{ + BSP_remove_rtems_irq_handler(&cs8900_isr_data); +} + +unsigned short cs8900_get_data_block (int dev, unsigned char *data) +{ + int len; + int i; + + len = cs8900_mem_get_reg(dev, CS8900_PP_RxLength); + + for (i = 0; i < ((len + 1) / 2); i++) { + ((short *)data)[i] = cs8900_io_get_reg(dev, + CS8900_IO_RX_TX_DATA_PORT0); + } + return len; +} + +void cs8900_tx_load (int dev, struct mbuf *m) +{ + int len; + short *data; + int i; + + len = 0; + + do { + memcpy(&g_enetbuf[len], mtod(m, const void *), m->m_len); + len += m->m_len; + m = m->m_next; + } while (m != 0); + + data = (unsigned short *) &g_enetbuf[0]; + for (i = 0; i < ((len + 1) / 2); i++) { + cs8900_io_set_reg(dev, + CS8900_IO_RX_TX_DATA_PORT0, + data[i]); + } +} diff --git a/c/src/lib/libbsp/arm/edb7312/start/.cvsignore b/c/src/lib/libbsp/arm/edb7312/start/.cvsignore new file mode 100644 index 0000000000..d29e5050f5 --- /dev/null +++ b/c/src/lib/libbsp/arm/edb7312/start/.cvsignore @@ -0,0 +1,14 @@ +Makefile +Makefile.in +aclocal.m4 +autom4te.cache +config.cache +config.guess +config.log +config.status +config.sub +configure +depcomp +install-sh +missing +mkinstalldirs diff --git a/c/src/lib/libbsp/arm/edb7312/start/Makefile.am b/c/src/lib/libbsp/arm/edb7312/start/Makefile.am new file mode 100644 index 0000000000..db35ecdb3a --- /dev/null +++ b/c/src/lib/libbsp/arm/edb7312/start/Makefile.am @@ -0,0 +1,33 @@ +## +## $Id$ +## + +PGMS = $(ARCH)/start.o + +S_FILES = start.S +S_O_FILES = $(S_FILES:%.S=$(ARCH)/%.$(OBJEXT)) + +OBJS = $(S_O_FILES) + +include $(RTEMS_ROOT)/make/custom/@RTEMS_BSP@.cfg +include $(top_srcdir)/../../../../../../automake/compile.am +include $(top_srcdir)/../../../../../../automake/lib.am + +# +# (OPTIONAL) Add local stuff here using += +# + +bsplib_DATA = $(PROJECT_RELEASE)/lib/start$(LIB_VARIANT).$(OBJEXT) + +$(PROJECT_RELEASE)/lib/start$(LIB_VARIANT).$(OBJEXT): $(ARCH)/start.$(OBJEXT) + $(INSTALL_DATA) $< $@ + +TMPINSTALL_FILES += $(PROJECT_RELEASE)/lib/start$(LIB_VARIANT).$(OBJEXT) + +all-local: $(ARCH) $(OBJS) $(ARCH)/start.$(OBJEXT) $(TMPINSTALL_FILES) + +.PRECIOUS: $(ARCH)/start.$(OBJEXT) + +EXTRA_DIST = start.S + +include $(top_srcdir)/../../../../../../automake/local.am diff --git a/c/src/lib/libbsp/arm/edb7312/start/start.S b/c/src/lib/libbsp/arm/edb7312/start/start.S new file mode 100644 index 0000000000..2885e1d773 --- /dev/null +++ b/c/src/lib/libbsp/arm/edb7312/start/start.S @@ -0,0 +1,170 @@ +/* + * Cirrus EP7312 Startup code + * + * Copyright (c) 2002 by Jay Monkman + * + * Copyright (c) 2002 by Charlie Steader + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * + * http://www.OARcorp.com/rtems/license.html. + * + * + * $Id$ +*/ + + +/* Some standard definitions...*/ + +.equ Mode_USR, 0x10 +.equ Mode_FIQ, 0x11 +.equ Mode_IRQ, 0x12 +.equ Mode_SVC, 0x13 +.equ Mode_ABT, 0x17 +.equ Mode_ABORT, 0x17 +.equ Mode_UNDEF, 0x1B +.equ Mode_SYS, 0x1F /*only available on ARM Arch. v4*/ + +.equ I_Bit, 0x80 +.equ F_Bit, 0x40 + + + .text + .globl _start + + +_start: + /* store the sp */ + mov r12, sp +/* + * Here is the code to initialize the low-level BSP environment + * (Chip Select, PLL, ....?) + + +/* zero the bss */ + LDR r1, =_bss_end_ /* get end of ZI region */ + LDR r0, =_bss_start_ /* load base address of ZI region */ + +zi_init: + MOV r2, #0 + CMP r0, r1 /* loop whilst r0 < r1 */ + STRLOT r2, [r0], #4 + BLO zi_init + +/* Load basic ARM7 interrupt table */ +VectorInit: + MOV R0, #0 + ADR R1, Vector_Init_Block + LDMIA R1!, {R2, r3} /* Copy the Vectors (8 words) */ + STMIA R0!, {r2, r3} + LDMIA R1!, {R2, r3} /* Copy the Vectors (8 words) */ + STMIA R0!, {r2, r3} + LDMIA R1!, {R2, r3} /* Copy the Vectors (8 words) */ + STMIA R0!, {r2, r3} + LDMIA R1!, {R2, r3} /* Copy the Vectors (8 words) */ + STMIA R0!, {r2, r3} + + LDMIA R1!, {R2, r3} /* Copy the .long'ed addresses (8 words) */ + STMIA R0!, {r2, r3} + LDMIA R1!, {R2, r3} /* Copy the .long'ed addresses (8 words) */ + STMIA R0!, {r2, r3} + LDMIA R1!, {R2, r3} /* Copy the .long'ed addresses (8 words) */ + STMIA R0!, {r2, r3} + LDMIA R1!, {R2, r3} /* Copy the .long'ed addresses (8 words) */ + STMIA R0!, {r2, r3} + + B init2 + +/******************************************************* + standard exception vectors table + *** Must be located at address 0 +********************************************************/ + +Vector_Init_Block: + LDR PC, Reset_Addr + LDR PC, Undefined_Addr + LDR PC, SWI_Addr + LDR PC, Prefetch_Addr + LDR PC, Abort_Addr + NOP + LDR PC, IRQ_Addr + LDR PC, FIQ_Addr + + .globl Reset_Addr +Reset_Addr: .long _start +Undefined_Addr: .long Undefined_Handler +SWI_Addr: .long SWI_Handler +Prefetch_Addr: .long Prefetch_Handler +Abort_Addr: .long Abort_Handler + .long 0 +IRQ_Addr: .long IRQ_Handler +FIQ_Addr: .long FIQ_Handler + +/* The following handlers do not do anything useful */ + .globl Undefined_Handler +Undefined_Handler: + B Undefined_Handler + .globl SWI_Handler +SWI_Handler: + B SWI_Handler + .globl Prefetch_Handler +Prefetch_Handler: + B Prefetch_Handler + .globl Abort_Handler +Abort_Handler: + B Abort_Handler + .globl IRQ_Handler +IRQ_Handler: + B IRQ_Handler + .globl FIQ_Handler +FIQ_Handler: + B FIQ_Handler + +init2 : +/* --- Initialise stack pointer registers + +/* Enter IRQ mode and set up the IRQ stack pointer */ + MOV r0, #Mode_IRQ | I_Bit | F_Bit /* No interrupts */ + MSR cpsr, r0 + ldr r1, =_irq_stack_size + LDR sp, =_irq_stack + add sp, sp, r1 + sub sp, sp, #0x64 + +/* Enter FIQ mode and set up the FIQ stack pointer */ + MOV r0, #Mode_FIQ | I_Bit | F_Bit /* No interrupts */ + MSR cpsr, r0 + ldr r1, =_fiq_stack_size + LDR sp, =_fiq_stack + add sp, sp, r1 + sub sp, sp, #0x64 + +/* Enter ABT mode and set up the ABT stack pointer */ + MOV r0, #Mode_ABT | I_Bit | F_Bit /* No interrupts */ + MSR cpsr, r0 + ldr r1, =_abt_stack_size + LDR sp, =_abt_stack + add sp, sp, r1 + sub sp, sp, #0x64 + +/* Set up the SVC stack pointer last and stay in SVC mode */ + MOV r0, #Mode_SVC | I_Bit | F_Bit /* No interrupts */ + MSR cpsr, r0 + ldr r1, =_svc_stack_size + LDR sp, =_svc_stack + add sp, sp, r1 + sub sp, sp, #0x64 + + /* save the original registers */ + stmdb sp!, {r4-r12, lr} + +/* --- Now we enter the C code */ + + bl boot_card + + ldmia sp!, {r4-r12, lr} + mov sp, r12 + mov pc, lr + + diff --git a/c/src/lib/libbsp/arm/edb7312/startup/.cvsignore b/c/src/lib/libbsp/arm/edb7312/startup/.cvsignore new file mode 100644 index 0000000000..d29e5050f5 --- /dev/null +++ b/c/src/lib/libbsp/arm/edb7312/startup/.cvsignore @@ -0,0 +1,14 @@ +Makefile +Makefile.in +aclocal.m4 +autom4te.cache +config.cache +config.guess +config.log +config.status +config.sub +configure +depcomp +install-sh +missing +mkinstalldirs diff --git a/c/src/lib/libbsp/arm/edb7312/startup/Makefile.am b/c/src/lib/libbsp/arm/edb7312/startup/Makefile.am new file mode 100644 index 0000000000..b7a4e44317 --- /dev/null +++ b/c/src/lib/libbsp/arm/edb7312/startup/Makefile.am @@ -0,0 +1,38 @@ +## + +VPATH = @srcdir@:@srcdir@/../../../shared + +PGM = $(ARCH)/startup.rel + +C_FILES = bsplibc.c bsppost.c bspstart.c exit.c bootcard.c main.c sbrk.c \ + gnatinstallhandler.c +C_O_FILES = $(C_FILES:%.c=$(ARCH)/%.o) + +OBJS = $(C_O_FILES) + +include $(RTEMS_ROOT)/make/custom/@RTEMS_BSP@.cfg +include $(top_srcdir)/../../../../../../automake/compile.am +include $(top_srcdir)/../../../../../../automake/lib.am + +# +# (OPTIONAL) Add local stuff here using += +# + +$(PGM): $(OBJS) + $(make-rel) + +bsplib_DATA = linkcmds + +$(PROJECT_RELEASE)/lib/linkcmds: linkcmds + $(INSTALL_DATA) $< $@ + +# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile +TMPINSTALL_FILES += $(PROJECT_RELEASE)/lib/linkcmds + +all-local: $(ARCH) $(OBJS) $(PGM) $(TMPINSTALL_FILES) + +.PRECIOUS: $(PGM) + +EXTRA_DIST = bspstart.c exit.c linkcmds + +include $(top_srcdir)/../../../../../../automake/local.am diff --git a/c/src/lib/libbsp/arm/edb7312/startup/bspstart.c b/c/src/lib/libbsp/arm/edb7312/startup/bspstart.c new file mode 100644 index 0000000000..19e8b6d1a0 --- /dev/null +++ b/c/src/lib/libbsp/arm/edb7312/startup/bspstart.c @@ -0,0 +1,186 @@ +/* + * Cirrus EP7312 Startup code + * + * Copyright (c) 2002 by Jay Monkman + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * + * http://www.OARcorp.com/rtems/license.html. + * + * + * $Id$ +*/ + +#include +#include +#include +#include +#include + +/*************************************************************/ +/* Macros */ +/*************************************************************/ + +/*************************************************************/ +/* Data Structures */ +/*************************************************************/ + +/*************************************************************/ +/* Global Variables */ +/*************************************************************/ +extern void *_flash_size; +extern void *_flash_base; +extern void *_sdram_size; +extern void *_sdram_base; +extern void *_bss_free_start; + +unsigned long free_mem_start; +unsigned long free_mem_end; + +/* The original BSP configuration table from the application and our copy of it + with some changes. */ + +extern rtems_configuration_table Configuration; + rtems_configuration_table BSP_Configuration; + +rtems_cpu_table Cpu_table; /* CPU configuration table. */ +char *rtems_progname; /* Program name - from main(). */ + +/*************************************************************/ +/* Function prototypes */ +/*************************************************************/ +extern void rtems_irq_mngt_init(void); +void bsp_libc_init( void *, unsigned32, int ); +void bsp_postdriver_hook(void); + +/**************************************************************************/ +/* */ +/* NAME: bps_pretasking_hook - Function to setup system before startup */ +/* */ +/* DESCRIPTION: */ +/* This function is called before drivers are initialized and used */ +/* to setup libc and BSP extensions. It configures non cacheable */ +/* SDRAM, SRAM, AIM, and ADM regions and sets up the CPU's memory */ +/* protection unit. */ +/* */ +/* GLOBALS USED: */ +/* free_mem_start */ +/* free_mem_end */ +/* */ +/* RESTRICTIONS/LIMITATIONS: */ +/* Since this function is setting up libc, it cannot use and libc */ +/* functions. */ +/* */ +/**************************************************************************/ +void bsp_pretasking_hook(void) +{ + unsigned32 heap_start; + unsigned32 heap_size; + + + /* + * Set up the heap. It uses all free SDRAM except that reserved + * for non-cached uses. + */ + heap_start = free_mem_start; + + /* heap_size = (free_mem_end - heap_start - MEM_NOCACHE_SIZE); */ + heap_size = 0x200000; + + bsp_libc_init((void *)heap_start, heap_size, 0); + +#ifdef RTEMS_DEBUG + + rtems_debug_enable(RTEMS_DEBUG_ALL_MASK); + +#endif /* RTEMS_DEBUG */ + +} /* bsp_pretasking_hook */ + + +/**************************************************************************/ +/* */ +/* NAME: bsp_start_default - BSP initialization function */ +/* */ +/* DESCRIPTION: */ +/* This function is called before RTEMS is initialized and used */ +/* adjust the kernel's configuration. */ +/* */ +/* This function also configures the CPU's memory protection unit. */ +/* */ +/* GLOBALS USED: */ +/* CPU_table */ +/* BSP_Configuration */ +/* free_mem_start */ +/* free_mem_end */ +/* free_mem_nocache_start */ +/* _bss_free_start */ +/* mpu_region_tbl */ +/* */ +/* */ +/* */ +/* */ +/* RESTRICTIONS/LIMITATIONS: */ +/* Since RTEMS is not configured, no RTEMS functions can be called. */ +/* */ +/**************************************************************************/ +void bsp_start_default( void ) +{ + /* disable interrupts */ + *EP7312_INTMR1 = 0; + *EP7312_INTMR2 = 0; + Cpu_table.pretasking_hook = bsp_pretasking_hook; + Cpu_table.postdriver_hook = bsp_postdriver_hook; + Cpu_table.do_zero_of_workspace = TRUE; + + /* Place RTEMS workspace at beginning of free memory. */ + BSP_Configuration.work_space_start = (void *)&_bss_free_start; + + free_mem_start = ((unsigned32)&_bss_free_start + + BSP_Configuration.work_space_size); + + free_mem_end = ((unsigned32)&_sdram_base + (unsigned32)&_sdram_size); + + /* + * Init rtems exceptions management + */ + rtems_exception_init_mngt(); + + /* + * Init rtems interrupt management + */ + rtems_irq_mngt_init(); + + + /* + * The following information is very useful when debugging. + */ +#if 0 + printk( "work_space_size = 0x%x\n", BSP_Configuration.work_space_size ); + printk( "maximum_extensions = 0x%x\n", BSP_Configuration.maximum_extensions ); + printk( "microseconds_per_tick = 0x%x\n", + BSP_Configuration.microseconds_per_tick ); + printk( "ticks_per_timeslice = 0x%x\n", + BSP_Configuration.ticks_per_timeslice ); + printk( "maximum_devices = 0x%x\n", BSP_Configuration.maximum_devices ); + printk( "number_of_device_drivers = 0x%x\n", + BSP_Configuration.number_of_device_drivers ); + printk( "Device_driver_table = 0x%x\n", + BSP_Configuration.Device_driver_table ); + + /* printk( "_stack_size = 0x%x\n", _stack_size );*/ + printk( "work_space_start = 0x%x\n", BSP_Configuration.work_space_start ); + printk( "work_space_size = 0x%x\n", BSP_Configuration.work_space_size ); +#endif +} /* bsp_start */ + + + + +/* + * By making this a weak alias for bsp_start_default, a brave soul + * can override the actual bsp_start routine used. + */ + +void bsp_start (void) __attribute__ ((weak, alias("bsp_start_default"))); diff --git a/c/src/lib/libbsp/arm/edb7312/startup/exit.c b/c/src/lib/libbsp/arm/edb7312/startup/exit.c new file mode 100644 index 0000000000..895f90cc60 --- /dev/null +++ b/c/src/lib/libbsp/arm/edb7312/startup/exit.c @@ -0,0 +1,40 @@ +/* + * Cirrus EP7312 BSP Shutdown code + * + * Copyright (c) 2002 by Jay Monkman + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * + * http://www.OARcorp.com/rtems/license.html. + * + * + * $Id$ +*/ + +#include +#include +#include +#include + +int uart_poll_read(int); + +void rtemsReboot (void) +{ + asm volatile ("b _start"); +} + +void bsp_cleanup(void) +{ + static char line[]="\nEXECUTIVE SHUTDOWN! Any key to reboot..."; + /* + * AT this point, the console driver is disconnected => we must + * use polled output/input. This is exactly what printk + * does. + */ + printk("\n"); + printk(line); + while (uart_poll_read(0) < 0) continue; + + /* rtemsReboot(); */ +} diff --git a/c/src/lib/libbsp/arm/edb7312/startup/linkcmds b/c/src/lib/libbsp/arm/edb7312/startup/linkcmds new file mode 100644 index 0000000000..c88c9da52f --- /dev/null +++ b/c/src/lib/libbsp/arm/edb7312/startup/linkcmds @@ -0,0 +1,225 @@ +/* + * Cirrus EP7312 linker script + * + * Copyright (c) 2002 by Jay Monkman + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * + * http://www.OARcorp.com/rtems/license.html. + * + * + * $Id$ +*/ + +OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", + "elf32-littlearm") +OUTPUT_ARCH(arm) +ENTRY(_start) +/* SEARCH_DIR(/usr/local/rtems-arm-dev-tools/arm-rtems/lib); */ + + +MEMORY { + sdram : ORIGIN = 0x00000000, LENGTH = 16M + regs : ORIGIN = 0x80000000, LENGTH = 1M +} + +/* + * Declare some sizes. + */ + +_sdram_base = DEFINED(_sdram_base) ? _sdram_base : 0x00000000; +_sdram_size = DEFINED(_sdram_size) ? _sdram_size : 16M; + + +_irq_stack_size = DEFINED(_irq_stack_size) ? _irq_stack_size : 0x1000; +_fiq_stack_size = DEFINED(_fiq_stack_size) ? _fiq_stack_size : 0x400; +_abt_stack_size = DEFINED(_abt_stack_size) ? _abt_stack_size : 0; +_svc_stack_size = DEFINED(_svc_stack_size) ? _svc_stack_size : 0x1000; + + + +/* Do we need any of these for elf? + __DYNAMIC = 0; */ + +SECTIONS +{ + .base : + { + _sram_base = .; + arm_exception_table = .; + + arm_reset_vect = .; /* 0x00 */ + . += 4; + + arm_undef_vect = .; /* 0x04 */ + . += 4; + + arm_swi_vect = .; /* 0x08 */ + . += 4; + + arm_iabrt_vect = .; /* 0x0c */ + . += 4; + + arm_dabrt_vect = .; /* 0x10 */ + . += 4; + + /* no vector here */ + . += 4; + + arm_irq_vect = .; /* 0x18 */ + . += 4; + + arm_fiq_vect = .; /* 0x1c */ + . += 4; + /* FIXME: */ + fiq_vect_table = .; /* this and irq_vector_table should be swapped */ + . += (32 * 4); + + irq_vector_table = .; + . += (32 * 4); + + } > sdram + + .init : + { + KEEP (*(.init)) + } > sdram /*=0*/ + + .text : + { + _text_start = .; + CREATE_OBJECT_SYMBOLS + *(.text) + *(.text.*) + *(.glue_7) + *(.glue_7t) + + /* I think these come from the ld docs: */ + ___CTOR_LIST__ = .; + LONG((___CTOR_END__ - ___CTOR_LIST__) / 4 - 2) + *(.ctors) + LONG(0) + ___CTOR_END__ = .; + ___DTOR_LIST__ = .; + LONG((___DTOR_END__ - ___DTOR_LIST__) / 4 - 2) + *(.dtors) + LONG(0) + ___DTOR_END__ = .; + + _etext = .; + PROVIDE (etext = .); + } > sdram + + .fini : + { + KEEP (*(.fini)) + } > sdram /*=0*/ + + .data : + { + *(.data) + *(.data.*) + *(.gnu.linkonce.d*) + *(.jcr) + SORT(CONSTRUCTORS) + _edata = .; + } > sdram + + .eh_frame : { *(.eh_frame) } > RAM + .data1 : { *(.data1) } > RAM + .eh_frame : { *(.eh_frame) } > RAM + .gcc_except_table : { *(.gcc_except_table) } > RAM + + .rodata : + { + *(.rodata) + *(.rodata.*) + *(.gnu.linkonce.r*) + } > sdram + + .bss : + { + _bss_start_ = .; + _clear_start = .; + *(.bss) + *(.bss.*) + *(COMMON) + . = ALIGN(64); + _clear_end = .; + + . = ALIGN (256); + _abt_stack = .; + . += _abt_stack_size; + + . = ALIGN (256); + _irq_stack = .; + . += _irq_stack_size; + + . = ALIGN (256); + _fiq_stack = .; + . += _fiq_stack_size; + + . = ALIGN (256); + _svc_stack = .; + . += _svc_stack_size; + + _bss_end_ = .; + _end = .; + __end = .; + + + . = ALIGN (1024); + _bss_free_start = .; + + } > sdram + +/* + .regs : + { + ep7312_regs_base = .; + ep7312_regs = .; + . += 8192; + } > regs +*/ + + +/* Debugging stuff follows? */ + + /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + /* 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) } + /*.stack 0x80000 : { _stack = .; *(.stack) }*/ + /* These must appear regardless of . */ +} + diff --git a/c/src/lib/libbsp/arm/edb7312/timer/.cvsignore b/c/src/lib/libbsp/arm/edb7312/timer/.cvsignore new file mode 100644 index 0000000000..d29e5050f5 --- /dev/null +++ b/c/src/lib/libbsp/arm/edb7312/timer/.cvsignore @@ -0,0 +1,14 @@ +Makefile +Makefile.in +aclocal.m4 +autom4te.cache +config.cache +config.guess +config.log +config.status +config.sub +configure +depcomp +install-sh +missing +mkinstalldirs diff --git a/c/src/lib/libbsp/arm/edb7312/timer/Makefile.am b/c/src/lib/libbsp/arm/edb7312/timer/Makefile.am new file mode 100644 index 0000000000..56ac482989 --- /dev/null +++ b/c/src/lib/libbsp/arm/edb7312/timer/Makefile.am @@ -0,0 +1,33 @@ +## +## $Id$ +## + +VPATH = @srcdir@:@srcdir@/../../../shared + +PGM = $(ARCH)/timer.rel + +C_FILES = timer.c +C_O_FILES = $(C_FILES:%.c=$(ARCH)/%.o) + +OBJS = $(C_O_FILES) + +include $(RTEMS_ROOT)/make/custom/@RTEMS_BSP@.cfg +include $(top_srcdir)/../../../../../../automake/compile.am +include $(top_srcdir)/../../../../../../automake/lib.am + +# +# (OPTIONAL) Add local stuff here using += +# + +$(PGM): $(OBJS) + $(make-rel) + +# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile + +all-local: $(ARCH) $(OBJS) $(PGM) + +.PRECIOUS: $(PGM) + +EXTRA_DIST = timer.c + +include $(top_srcdir)/../../../../../../automake/local.am diff --git a/c/src/lib/libbsp/arm/edb7312/timer/timer.c b/c/src/lib/libbsp/arm/edb7312/timer/timer.c new file mode 100644 index 0000000000..954a35f86c --- /dev/null +++ b/c/src/lib/libbsp/arm/edb7312/timer/timer.c @@ -0,0 +1,93 @@ +/* + * Cirrus EP7312 Timer driver + * + * Copyright (c) 2002 by Jay Monkman + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * + * http://www.OARcorp.com/rtems/license.html. + * + * Notes: + * This file manages the benchmark timer used by the RTEMS Timing Test + * Suite. Each measured time period is demarcated by calls to + * Timer_initialize() and Read_timer(). Read_timer() usually returns + * the number of microseconds since Timer_initialize() exitted. + * + * It is important that the timer start/stop overhead be determined + * when porting or modifying this code. + * + * $Id$ +*/ + +#include +#include +#include + +rtems_unsigned16 tstart; +rtems_boolean Timer_driver_Find_average_overhead; + +void Timer_initialize( void ) +{ + *EP7312_SYSCON1 |= EP7312_SYSCON1_TC2_512KHZ; + *EP7312_TC2D = 0xffff; +} + +/* + * The following controls the behavior of Read_timer(). + * + * AVG_OVEREHAD is the overhead for starting and stopping the timer. It + * is usually deducted from the number returned. + * + * LEAST_VALID is the lowest number this routine should trust. Numbers + * below this are "noise" and zero is returned. + */ + +#define AVG_OVERHEAD 0 /* It typically takes X.X microseconds */ + /* (Y countdowns) to start/stop the timer. */ + /* This value is in microseconds. */ +#define LEAST_VALID 1 /* Don't trust a clicks value lower than this */ + +int Read_timer( void ) +{ + rtems_unsigned16 t; + rtems_unsigned32 total; + t = *EP7312_TC2D; + + /* + * Total is calculated by taking into account the number of timer overflow + * interrupts since the timer was initialized and clicks since the last + * interrupts. + */ + + total = (unsigned32)0x0000ffff - t; /* result is 1/512000 = ~2 uS */ + total = (total * 1953) / 1000; /* convert to uS */ + if ( Timer_driver_Find_average_overhead == 1 ) + return total; /* in XXX microsecond units */ + else { + if ( total < LEAST_VALID ) + return 0; /* below timer resolution */ + /* + * Somehow convert total into microseconds + */ + return (total - AVG_OVERHEAD); + } +} + +/* + * Empty function call used in loops to measure basic cost of looping + * in Timing Test Suite. + */ + +rtems_status_code Empty_function( void ) +{ + return RTEMS_SUCCESSFUL; +} + +void Set_find_average_overhead( + rtems_boolean find_flag +) +{ + Timer_driver_Find_average_overhead = find_flag; +} + diff --git a/c/src/lib/libbsp/arm/edb7312/times b/c/src/lib/libbsp/arm/edb7312/times new file mode 100644 index 0000000000..ffc660b1a1 --- /dev/null +++ b/c/src/lib/libbsp/arm/edb7312/times @@ -0,0 +1,189 @@ +# +# Timing Test Suite Results for the EDB7312 BSP +# +# +# + +Board: Cogent EDB7312 +CPU: Cirrus EP7312 +Clock Speed: 74MHz +Memory Configuration: SDRAM, 16 bit bus +Cache: Data and Instruction cache enabled +Wait States: + +Times Reported in: microseconds +Timer Source: Timer 2, 512KHz timer rate + + +# DESCRIPTION A B +== ================================================================= ==== ==== + 1 rtems_semaphore_create 35 + rtems_semaphore_delete 29 + rtems_semaphore_obtain: available 3 + rtems_semaphore_obtain: not available -- NO_WAIT 3 + rtems_semaphore_release: no waiting tasks 6 + + 2 rtems_semaphore_obtain: not available -- caller blocks 34 + + 3 rtems_semaphore_release: task readied -- preempts caller 27 + + 4 rtems_task_restart: blocked task -- preempts caller 95 + rtems_task_restart: ready task -- preempts caller 99 + rtems_semaphore_release: task readied -- returns to caller 12 + rtems_task_create 47 + rtems_task_start 25 + rtems_task_restart: suspended task -- returns to caller 25 + rtems_task_delete: suspended task 48 + rtems_task_restart: ready task -- returns to caller 26 + rtems_task_restart: blocked task -- returns to caller 33 + rtems_task_delete: blocked task 51 + + 5 rtems_task_suspend: calling task 25 + rtems_task_resume: task readied -- preempts caller 23 + + 6 rtems_task_restart: calling task 19 + rtems_task_suspend: returns to caller 8 + rtems_task_resume: task readied -- returns to caller 9 + rtems_task_delete: ready task 58 + + 7 rtems_task_restart: suspended task -- preempts caller 47 + + 8 rtems_task_set_priority: obtain current priority 4 + rtems_task_set_priority: returns to caller 9 + rtems_task_mode: obtain current mode 2 + rtems_task_mode: no reschedule 2 + rtems_task_mode: reschedule -- returns to caller 15 + rtems_task_mode: reschedule -- preempts caller 52 + rtems_task_set_note 4 + rtems_task_get_note 4 + rtems_clock_set 14 + rtems_clock_get 1 + + 9 rtems_message_queue_create 97 + rtems_message_queue_send: no waiting tasks 10 + rtems_message_queue_urgent: no waiting tasks 10 + rtems_message_queue_receive: available 11 + rtems_message_queue_flush: no messages flushed 2 + rtems_message_queue_flush: messages flushed 6 + rtems_message_queue_delete 52 + +10 rtems_message_queue_receive: not available -- NO_WAIT 6 + rtems_message_queue_receive: not available -- caller blocks 36 + +11 rtems_message_queue_send: task readied -- preempts caller 34 + +12 rtems_message_queue_send: task readied -- returns to caller 17 + +13 rtems_message_queue_urgent: task readied -- preempts caller 34 + +14 rtems_message_queue_urgent: task readied -- returns to caller 17 + +15 rtems_event_receive: obtain current events 1 + rtems_event_receive: not available -- NO_WAIT 4 + rtems_event_receive: not available -- caller blocks 28 + rtems_event_send: no task readied 4 + rtems_event_receive: available 15 + rtems_event_send: task readied -- returns to caller 15 + +16 rtems_event_send: task readied -- preempts caller 29 + +17 rtems_task_set_priority: preempts caller 36 + +18 rtems_task_delete: calling task 81 + +19 rtems_signal_catch 5 + rtems_signal_send: returns to caller 29 + rtems_signal_send: signal to self 50 + exit ASR overhead: returns to calling task 29 + exit ASR overhead: returns to preempting task 33 + +20 rtems_partition_create 44 + rtems_region_create 70 + rtems_partition_get_buffer: available 23 + rtems_partition_get_buffer: not available 3 + rtems_partition_return_buffer 21 + rtems_partition_delete 15 + rtems_region_get_segment: available 25 + rtems_region_get_segment: not available -- NO_WAIT 58 + rtems_region_return_segment: no waiting tasks 25 + rtems_region_get_segment: not available -- caller blocks 115 + rtems_region_return_segment: task readied -- preempts caller 132 + rtems_region_return_segment: task readied -- returns to caller 70 + rtems_region_delete 41 + rtems_io_initialize 1 + rtems_io_open 0 + rtems_io_close 0 + rtems_io_read 0 + rtems_io_write 0 + rtems_io_control 0 + +21 rtems_task_ident 34 + rtems_message_queue_ident 33 + rtems_semaphore_ident 38 + rtems_partition_ident 33 + rtems_region_ident 36 + rtems_port_ident 33 + rtems_timer_ident 33 + rtems_rate_monotonic_ident 34 + +22 rtems_message_queue_broadcast: task readied -- returns to caller 48 + rtems_message_queue_broadcast: no waiting tasks 8 + rtems_message_queue_broadcast: task readied -- preempts caller 60 + +23 rtems_timer_create 6 + rtems_timer_fire_after: inactive 11 + rtems_timer_fire_after: active 11 + rtems_timer_cancel: active 6 + rtems_timer_cancel: inactive 5 + rtems_timer_reset: inactive 9 + rtems_timer_reset: active 10 + rtems_timer_fire_when: inactive 12 + rtems_timer_fire_when: active 13 + rtems_timer_delete: active 8 + rtems_timer_delete: inactive 7 + rtems_task_wake_when 38 + +24 rtems_task_wake_after: yield -- returns to caller 2 + rtems_task_wake_after: yields -- preempts caller 20 + +25 rtems_clock_tick 17 + +26 _ISR_Disable 0 + _ISR_Flash 0 + _ISR_Enable 0 + _Thread_Disable_dispatch 0 + _Thread_Enable_dispatch 3 + _Thread_Set_state 11 + _Thread_Disptach (NO FP) 25 + context switch: no floating point contexts 15 + context switch: self 0 + context switch: to another task 0 + fp context switch: restore 1st FP task - NA + fp context switch: save idle, restore initialized - NA + fp context switch: save idle, restore idle - NA + fp context switch: save initialized, restore initialized - NA + _Thread_Resume 13 + _Thread_Unblock 11 + _Thread_Ready 5 + _Thread_Get 2 + _Semaphore_Get 1 + _Thread_Get: invalid id 1 + +27 interrupt entry overhead: returns to interrupted task 0 + interrupt exit overhead: returns to interrupted task 0 + interrupt entry overhead: returns to nested interrupt 0 + interrupt exit overhead: returns to nested interrupt 0 + +28 rtems_port_create 23 + rtems_port_external_to_internal 3 + rtems_port_internal_to_external 3 + rtems_port_delete 21 + +29 rtems_rate_monotonic_create 21 + rtems_rate_monotonic_period: initiate period -- returns to caller 41 + rtems_rate_monotonic_period: obtain status 11 + rtems_rate_monotonic_cancel 23 + rtems_rate_monotonic_delete: inactive 25 + rtems_rate_monotonic_delete: active 21 + rtems_rate_monotonic_period: conclude periods -- caller blocks 23 + \ No newline at end of file diff --git a/c/src/lib/libbsp/arm/edb7312/wrapup/.cvsignore b/c/src/lib/libbsp/arm/edb7312/wrapup/.cvsignore new file mode 100644 index 0000000000..d29e5050f5 --- /dev/null +++ b/c/src/lib/libbsp/arm/edb7312/wrapup/.cvsignore @@ -0,0 +1,14 @@ +Makefile +Makefile.in +aclocal.m4 +autom4te.cache +config.cache +config.guess +config.log +config.status +config.sub +configure +depcomp +install-sh +missing +mkinstalldirs diff --git a/c/src/lib/libbsp/arm/edb7312/wrapup/Makefile.am b/c/src/lib/libbsp/arm/edb7312/wrapup/Makefile.am new file mode 100644 index 0000000000..7742137f70 --- /dev/null +++ b/c/src/lib/libbsp/arm/edb7312/wrapup/Makefile.am @@ -0,0 +1,31 @@ +## +## $Id$ +## + +BSP_FILES = clock console startup irq timer network start + +# bummer; have to use $foreach since % pattern subst rules only replace 1x +OBJS = $(foreach piece, $(BSP_FILES), $(wildcard ../$(piece)/$(ARCH)/*.$(OBJEXT))) \ + $(wildcard ../../../../libcpu/$(RTEMS_CPU)/shared/*/$(ARCH)/*.$(OBJEXT)) \ + $(wildcard ../../../../libcpu/$(RTEMS_CPU)/$(RTEMS_CPU_MODEL)/*/$(ARCH)/*.$(OBJEXT)) +LIB = $(ARCH)/libbsp.a + +include $(RTEMS_ROOT)/make/custom/@RTEMS_BSP@.cfg +include $(top_srcdir)/../../../../../../automake/compile.am +include $(top_srcdir)/../../../../../../automake/lib.am + +# +# (OPTIONAL) Add local stuff here using += +# + +$(LIB): ${OBJS} + $(make-library) + +$(PROJECT_RELEASE)/lib/libbsp$(LIB_VARIANT).a: $(LIB) + $(INSTALL_DATA) $< $@ + +TMPINSTALL_FILES += $(PROJECT_RELEASE)/lib/libbsp$(LIB_VARIANT).a + +all-local: ${ARCH} $(TMPINSTALL_FILES) + +include $(top_srcdir)/../../../../../../automake/local.am -- cgit v1.2.3