From b759b04efa5c93f080ab2c07e217a15256985537 Mon Sep 17 00:00:00 2001 From: Jay Monkman Date: Thu, 15 Jul 2004 06:16:16 +0000 Subject: 2004-07-15 Jay Monkman * .cvsignore, ChangeLog, Makefile.am, README, bsp_specs, configure.ac, times, console/uarts.c, include/.cvsignore, include/bsp.h, include/tm27.h, network/.cvsignore, network/network.c, start/.cvsignore, start/start.S, startup/.cvsignore, startup/bspstart.c, startup/exit.c, startup/linkcmds, startup/memmap.c: New files. --- c/src/lib/libbsp/arm/csb337/.cvsignore | 14 + c/src/lib/libbsp/arm/csb337/ChangeLog | 9 + c/src/lib/libbsp/arm/csb337/Makefile.am | 151 ++++++ c/src/lib/libbsp/arm/csb337/README | 7 + c/src/lib/libbsp/arm/csb337/bsp_specs | 23 + c/src/lib/libbsp/arm/csb337/configure.ac | 24 + c/src/lib/libbsp/arm/csb337/console/uarts.c | 72 +++ c/src/lib/libbsp/arm/csb337/include/.cvsignore | 7 + c/src/lib/libbsp/arm/csb337/include/bsp.h | 65 +++ c/src/lib/libbsp/arm/csb337/include/tm27.h | 32 ++ c/src/lib/libbsp/arm/csb337/network/.cvsignore | 14 + c/src/lib/libbsp/arm/csb337/network/network.c | 665 +++++++++++++++++++++++++ c/src/lib/libbsp/arm/csb337/start/.cvsignore | 14 + c/src/lib/libbsp/arm/csb337/start/start.S | 147 ++++++ c/src/lib/libbsp/arm/csb337/startup/.cvsignore | 14 + c/src/lib/libbsp/arm/csb337/startup/bspstart.c | 206 ++++++++ c/src/lib/libbsp/arm/csb337/startup/exit.c | 37 ++ c/src/lib/libbsp/arm/csb337/startup/linkcmds | 227 +++++++++ c/src/lib/libbsp/arm/csb337/startup/memmap.c | 29 ++ c/src/lib/libbsp/arm/csb337/times | 189 +++++++ 20 files changed, 1946 insertions(+) create mode 100644 c/src/lib/libbsp/arm/csb337/.cvsignore create mode 100644 c/src/lib/libbsp/arm/csb337/ChangeLog create mode 100644 c/src/lib/libbsp/arm/csb337/Makefile.am create mode 100644 c/src/lib/libbsp/arm/csb337/README create mode 100644 c/src/lib/libbsp/arm/csb337/bsp_specs create mode 100644 c/src/lib/libbsp/arm/csb337/configure.ac create mode 100644 c/src/lib/libbsp/arm/csb337/console/uarts.c create mode 100644 c/src/lib/libbsp/arm/csb337/include/.cvsignore create mode 100644 c/src/lib/libbsp/arm/csb337/include/bsp.h create mode 100644 c/src/lib/libbsp/arm/csb337/include/tm27.h create mode 100644 c/src/lib/libbsp/arm/csb337/network/.cvsignore create mode 100644 c/src/lib/libbsp/arm/csb337/network/network.c create mode 100644 c/src/lib/libbsp/arm/csb337/start/.cvsignore create mode 100644 c/src/lib/libbsp/arm/csb337/start/start.S create mode 100644 c/src/lib/libbsp/arm/csb337/startup/.cvsignore create mode 100644 c/src/lib/libbsp/arm/csb337/startup/bspstart.c create mode 100644 c/src/lib/libbsp/arm/csb337/startup/exit.c create mode 100644 c/src/lib/libbsp/arm/csb337/startup/linkcmds create mode 100644 c/src/lib/libbsp/arm/csb337/startup/memmap.c create mode 100644 c/src/lib/libbsp/arm/csb337/times diff --git a/c/src/lib/libbsp/arm/csb337/.cvsignore b/c/src/lib/libbsp/arm/csb337/.cvsignore new file mode 100644 index 0000000000..d29e5050f5 --- /dev/null +++ b/c/src/lib/libbsp/arm/csb337/.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/csb337/ChangeLog b/c/src/lib/libbsp/arm/csb337/ChangeLog new file mode 100644 index 0000000000..b1de0deff5 --- /dev/null +++ b/c/src/lib/libbsp/arm/csb337/ChangeLog @@ -0,0 +1,9 @@ +2004-07-15 Jay Monkman + + * .cvsignore, ChangeLog, Makefile.am, README, bsp_specs, configure.ac, + times, console/uarts.c, include/.cvsignore, include/bsp.h, + include/tm27.h, network/.cvsignore, network/network.c, + start/.cvsignore, start/start.S, startup/.cvsignore, + startup/bspstart.c, startup/exit.c, startup/linkcmds, + startup/memmap.c: New files. + diff --git a/c/src/lib/libbsp/arm/csb337/Makefile.am b/c/src/lib/libbsp/arm/csb337/Makefile.am new file mode 100644 index 0000000000..1c4b973655 --- /dev/null +++ b/c/src/lib/libbsp/arm/csb337/Makefile.am @@ -0,0 +1,151 @@ +## +## $Id$ +## + +ACLOCAL_AMFLAGS = -I ../../../../aclocal + +include $(top_srcdir)/../../../../automake/compile.am +include $(top_srcdir)/../../bsp.am + +dist_project_lib_DATA = bsp_specs + +include_HEADERS = include/bsp.h +include_HEADERS += include/tm27.h +nodist_include_HEADERS = include/bspopts.h + +EXTRA_PROGRAMS = +CLEANFILES = +noinst_DATA = + +nodist_include_HEADERS += ../../shared/include/coverhd.h + +EXTRA_DIST = start/start.S +start$(LIB_VARIANT).$(OBJEXT): start/start.S + $(CPPASCOMPILE) -DASM -o $@ -c $< +project_lib_DATA = start$(LIB_VARIANT).$(OBJEXT) + +dist_project_lib_DATA += startup/linkcmds + +EXTRA_PROGRAMS += startup.rel +CLEANFILES += startup.rel +startup_rel_SOURCES = ../../shared/bsplibc.c ../../shared/bsppost.c \ + startup/bspstart.c startup/exit.c \ + startup/memmap.c \ + ../../shared/bootcard.c \ + ../../shared/main.c ../../shared/sbrk.c \ + ../../shared/gnatinstallhandler.c +startup_rel_CPPFLAGS = $(AM_CPPFLAGS) $(CFLAGS_OPTIMIZE_V) +startup_rel_LDFLAGS = $(RTEMS_RELLDFLAGS) + +EXTRA_PROGRAMS += startup_g.rel +CLEANFILES += startup_g.rel +startup_g_rel_SOURCES = $(startup_rel_SOURCES) +startup_g_rel_CPPFLAGS = $(AM_CPPFLAGS) $(CFLAGS_DEBUG_V) +startup_g_rel_LDFLAGS = $(RTEMS_RELLDFLAGS) + +noinst_DATA += startup$(LIB_VARIANT).rel + +EXTRA_PROGRAMS += console.rel +CLEANFILES += console.rel +console_rel_SOURCES = console/uarts.c ../../shared/console.c +console_rel_CPPFLAGS = $(AM_CPPFLAGS) $(CFLAGS_OPTIMIZE_V) +console_rel_LDFLAGS = $(RTEMS_RELLDFLAGS) + +EXTRA_PROGRAMS += console_g.rel +CLEANFILES += console_g.rel +console_g_rel_SOURCES = $(console_rel_SOURCES) +console_g_rel_CPPFLAGS = $(AM_CPPFLAGS) $(CFLAGS_DEBUG_V) +console_g_rel_LDFLAGS = $(RTEMS_RELLDFLAGS) + +noinst_DATA += console$(LIB_VARIANT).rel + +if HAS_NETWORKING +network_CPPFLAGS = -D__INSIDE_RTEMS_BSD_TCPIP_STACK__ +EXTRA_PROGRAMS += network.rel +CLEANFILES += network.rel +network_rel_SOURCES = network/network.c +network_rel_CPPFLAGS = $(AM_CPPFLAGS) $(CFLAGS_OPTIMIZE_V) \ + $(network_CPPFLAGS) +network_rel_LDFLAGS = $(RTEMS_RELLDFLAGS) + +EXTRA_PROGRAMS += network_g.rel +CLEANFILES += network_g.rel +network_g_rel_SOURCES = $(network_rel_SOURCES) +network_g_rel_CPPFLAGS = $(AM_CPPFLAGS) $(CFLAGS_DEBUG_V) \ + $(network_CPPFLAGS) +network_g_rel_LDFLAGS = $(RTEMS_RELLDFLAGS) + +noinst_DATA += network$(LIB_VARIANT).rel +endif + +EXTRA_LIBRARIES = libbsp.a +CLEANFILES += libbsp.a +libbsp_a_SOURCES = +libbsp_a_LIBADD = startup$(LIB_VARIANT).rel console$(LIB_VARIANT).rel +if HAS_NETWORKING +libbsp_a_LIBADD += network$(LIB_VARIANT).rel +endif +libbsp_a_LIBADD += \ + ../../../libcpu/@RTEMS_CPU@/shared/arm920$(LIB_VARIANT).rel \ + ../../../libcpu/@RTEMS_CPU@/@RTEMS_CPU_MODEL@/clock$(LIB_VARIANT).rel \ + ../../../libcpu/@RTEMS_CPU@/@RTEMS_CPU_MODEL@/dbgu$(LIB_VARIANT).rel \ + ../../../libcpu/@RTEMS_CPU@/@RTEMS_CPU_MODEL@/timer$(LIB_VARIANT).rel \ + ../../../libcpu/@RTEMS_CPU@/@RTEMS_CPU_MODEL@/pmc$(LIB_VARIANT).rel \ + ../../../libcpu/@RTEMS_CPU@/@RTEMS_CPU_MODEL@/irq$(LIB_VARIANT).rel + +EXTRA_LIBRARIES += libbsp_g.a +CLEANFILES += libbsp_g.a +libbsp_g_a_SOURCES = $(libbsp_a_SOURCES) +libbsp_g_a_LIBADD = $(libbsp_a_LIBADD) + +noinst_DATA += libbsp$(LIB_VARIANT).a + +all-local: $(PREINSTALL_FILES) $(TMPINSTALL_FILES) + +PREINSTALL_DIRS = +PREINSTALL_FILES = +TMPINSTALL_FILES = + +$(PROJECT_INCLUDE)/$(dirstamp): + @$(mkdir_p) $(PROJECT_INCLUDE) + @: > $(PROJECT_INCLUDE)/$(dirstamp) +PREINSTALL_DIRS += $(PROJECT_INCLUDE)/$(dirstamp) + +$(PROJECT_LIB)/$(dirstamp): + @$(mkdir_p) $(PROJECT_LIB) + @: > $(PROJECT_LIB)/$(dirstamp) +PREINSTALL_DIRS += $(PROJECT_LIB)/$(dirstamp) + +$(PROJECT_LIB)/bsp_specs: bsp_specs $(PROJECT_LIB)/$(dirstamp) + $(INSTALL_DATA) $< $(PROJECT_LIB)/bsp_specs +PREINSTALL_FILES += $(PROJECT_LIB)/bsp_specs + +$(PROJECT_INCLUDE)/bsp.h: include/bsp.h $(PROJECT_INCLUDE)/$(dirstamp) + $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp.h +PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp.h + +$(PROJECT_INCLUDE)/tm27.h: include/tm27.h $(PROJECT_INCLUDE)/$(dirstamp) + $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/tm27.h +PREINSTALL_FILES += $(PROJECT_INCLUDE)/tm27.h + +$(PROJECT_INCLUDE)/bspopts.h: include/bspopts.h $(PROJECT_INCLUDE)/$(dirstamp) + $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bspopts.h +PREINSTALL_FILES += $(PROJECT_INCLUDE)/bspopts.h + +$(PROJECT_INCLUDE)/coverhd.h: ../../shared/include/coverhd.h $(PROJECT_INCLUDE)/$(dirstamp) + $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/coverhd.h +PREINSTALL_FILES += $(PROJECT_INCLUDE)/coverhd.h + +$(PROJECT_LIB)/start$(LIB_VARIANT).$(OBJEXT): start$(LIB_VARIANT).$(OBJEXT) $(PROJECT_LIB)/$(dirstamp) + $(INSTALL_DATA) $< $(PROJECT_LIB)/start$(LIB_VARIANT).$(OBJEXT) +TMPINSTALL_FILES += $(PROJECT_LIB)/start$(LIB_VARIANT).$(OBJEXT) + +$(PROJECT_LIB)/linkcmds: startup/linkcmds $(PROJECT_LIB)/$(dirstamp) + $(INSTALL_DATA) $< $(PROJECT_LIB)/linkcmds +PREINSTALL_FILES += $(PROJECT_LIB)/linkcmds + +CLEANFILES += $(PREINSTALL_FILES) +DISTCLEANFILES = $(PREINSTALL_DIRS) +CLEANFILES += $(TMPINSTALL_FILES) + +include $(top_srcdir)/../../../../automake/local.am diff --git a/c/src/lib/libbsp/arm/csb337/README b/c/src/lib/libbsp/arm/csb337/README new file mode 100644 index 0000000000..13e5473ef1 --- /dev/null +++ b/c/src/lib/libbsp/arm/csb337/README @@ -0,0 +1,7 @@ +# +# $Id$ +# + +This is the BSP for Cogent Computer System's CSB337, a single board +computer using the Atmel AT91RM9200 CPU. + diff --git a/c/src/lib/libbsp/arm/csb337/bsp_specs b/c/src/lib/libbsp/arm/csb337/bsp_specs new file mode 100644 index 0000000000..2309f0e53b --- /dev/null +++ b/c/src/lib/libbsp/arm/csb337/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/csb337/configure.ac b/c/src/lib/libbsp/arm/csb337/configure.ac new file mode 100644 index 0000000000..894e8f9c3c --- /dev/null +++ b/c/src/lib/libbsp/arm/csb337/configure.ac @@ -0,0 +1,24 @@ +## Process this file with autoconf to produce a configure script. +## +## configure.ac,v 1.5 2003/03/11 09:39:07 ralf Exp + +AC_PREREQ(2.57) +AC_INIT([rtems-c-src-lib-libbsp-arm-csb337],[_RTEMS_VERSION],[rtems-bugs@OARcorp.com]) +AC_CONFIG_SRCDIR([bsp_specs]) +RTEMS_TOP(../../../../../..) + +RTEMS_CANONICAL_TARGET_CPU +AM_INIT_AUTOMAKE([no-define foreign 1.8]) +RTEMS_BSP_CONFIGURE + +RTEMS_PROG_CC_FOR_TARGET([-ansi -fasm]) +RTEMS_CANONICALIZE_TOOLS +RTEMS_PROG_CCAS + +RTEMS_CHECK_NETWORKING +AM_CONDITIONAL(HAS_NETWORKING,test "$HAS_NETWORKING" = "yes") + +# Explicitly list all Makefiles here +AC_CONFIG_FILES([Makefile]) +AC_OUTPUT + diff --git a/c/src/lib/libbsp/arm/csb337/console/uarts.c b/c/src/lib/libbsp/arm/csb337/console/uarts.c new file mode 100644 index 0000000000..a4b16d2a05 --- /dev/null +++ b/c/src/lib/libbsp/arm/csb337/console/uarts.c @@ -0,0 +1,72 @@ +/* + * Console driver for CSB337 + * + * This driver uses the shared console driver in + * ...../libbsp/shared/console.c + * + * Copyright (c) 2003 by Cogent Computer Systems + * Written 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 +#include +#include +#include + +/* How many serial ports? */ +#define NUM_DEVS 1 + +/* These are used by code in console.c */ +unsigned long Console_Port_Count = NUM_DEVS; +console_data Console_Port_Data[NUM_DEVS]; + +/* rtems console uses the following minor number */ +rtems_device_minor_number Console_Port_Minor = 0; +extern console_fns dbgu_fns; + +/* + * There's one item in array for each UART. + * + * Some of these fields are marked "NOT USED". They are not used + * by console.c, but may be used by drivers in libchip + * + * when we add other types of UARTS we will need to move this + * structure to a generic uart.c file with only this in it + */ +console_tbl Console_Port_Tbl[] = { + { + "/dev/console", /* sDeviceName */ + SERIAL_CUSTOM, /* deviceType */ + &dbgu_fns, /* pDeviceFns */ + NULL, /* deviceProbe */ + NULL, /* pDeviceFlow */ + 0, /* ulMargin - NOT USED */ + 0, /* ulHysteresis - NOT USED */ + NULL, /* pDeviceParams */ + DBGU_BASE, /* ulCtrlPort1 - Pointer to DBGU regs */ + 0, /* ulCtrlPort2 - NOT USED */ + 0, /* ulDataPort - NOT USED */ + NULL, /* getRegister - NOT USED */ + NULL, /* setRegister - NOT USED */ + NULL, /* getData - NOT USED */ + NULL, /* setData - NOT USED */ + 0, /* ulClock - NOT USED */ + 0 /* ulIntVector - NOT USED */ + }}; + + +console_tbl *BSP_get_uart_from_minor(int minor) +{ + return &Console_Port_Tbl[minor]; +} diff --git a/c/src/lib/libbsp/arm/csb337/include/.cvsignore b/c/src/lib/libbsp/arm/csb337/include/.cvsignore new file mode 100644 index 0000000000..34cf1342d5 --- /dev/null +++ b/c/src/lib/libbsp/arm/csb337/include/.cvsignore @@ -0,0 +1,7 @@ +Makefile +Makefile.in +coverhd.h +bspopts.h +bspopts.h.in +stamp-h +stamp-h.in diff --git a/c/src/lib/libbsp/arm/csb337/include/bsp.h b/c/src/lib/libbsp/arm/csb337/include/bsp.h new file mode 100644 index 0000000000..579f69f295 --- /dev/null +++ b/c/src/lib/libbsp/arm/csb337/include/bsp.h @@ -0,0 +1,65 @@ +/* + * CSB337 BSP header file + * + * Copyright (c) 2004 by Cogent Computer Systems + * Writtent 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 + + +/* What is the input clock freq in hertz? */ +#define BSP_MAIN_FREQ 3686400 /* 3.6864 MHz */ +#define BSP_SLCK_FREQ 32768 /* 32.768 KHz */ + +/* What is the last interrupt? */ +#define BSP_MAX_INT AT91RM9200_MAX_INT + +console_tbl *BSP_get_uart_from_minor(int minor); +static inline int32_t BSP_get_baud(void) {return 38400;} + +/* How many serial ports? */ +#define CONFIGURE_NUMBER_OF_TERMIOS_PORTS 1 + +/* How big should the interrupt stack be? */ +#define CONFIGURE_INTERRUPT_STACK_MEMORY (16 * 1024) + +extern rtems_configuration_table BSP_Configuration; + +#define ST_PIMR_PIV 33 /* 33 ticks of the 32.768Khz clock ~= 1msec + +/* + * Network driver configuration + */ +extern struct rtems_bsdnet_ifconfig *config; + +/* Change these to match your board */ +int rtems_at91rm9200_emac_attach(struct rtems_bsdnet_ifconfig *config, int attaching); +#define RTEMS_BSP_NETWORK_DRIVER_NAME "eth0" +#define RTEMS_BSP_NETWORK_DRIVER_ATTACH rtems_at91rm9200_emac_attach + +#ifdef __cplusplus +} +#endif + +#endif /* __BSP_H__ */ + diff --git a/c/src/lib/libbsp/arm/csb337/include/tm27.h b/c/src/lib/libbsp/arm/csb337/include/tm27.h new file mode 100644 index 0000000000..b417668d83 --- /dev/null +++ b/c/src/lib/libbsp/arm/csb337/include/tm27.h @@ -0,0 +1,32 @@ +/* + * tm27.h + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rtems.com/license/LICENSE. + * + * $Id$ + */ + +#ifndef _RTEMS_TMTEST27 +#error "This is an RTEMS internal file you must not include directly." +#endif + +#ifndef __tm27_h +#define __tm27_h + +/* + * Define the interrupt mechanism for Time Test 27 + */ + +#define MUST_WAIT_FOR_INTERRUPT 0 + +#define Install_tm27_vector( handler ) /* empty */ + +#define Cause_tm27_intr() /* empty */ + +#define Clear_tm27_intr() /* empty */ + +#define Lower_tm27_intr() /* empty */ + +#endif diff --git a/c/src/lib/libbsp/arm/csb337/network/.cvsignore b/c/src/lib/libbsp/arm/csb337/network/.cvsignore new file mode 100644 index 0000000000..d29e5050f5 --- /dev/null +++ b/c/src/lib/libbsp/arm/csb337/network/.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/csb337/network/network.c b/c/src/lib/libbsp/arm/csb337/network/network.c new file mode 100644 index 0000000000..69a16d2e61 --- /dev/null +++ b/c/src/lib/libbsp/arm/csb337/network/network.c @@ -0,0 +1,665 @@ +/* + * AT91RM9200 ethernet driver + * + * Copyright (c) 2003 by Cogent Computer Systems + * Written by Mike Kelly + * and Jay Monkman + * + * $Id$ + */ + +#include +#include +#include +#include + +#include +#include + +#include +#include + +#include +#include +#include +#include + +#include + +#include +#include + +#include + + +/* interrupt stuff */ +#define EMAC_INT_PRIORITY 0 /* lowest priority */ + +/* RTEMS event used by interrupt handler to start receive daemon. */ +#define START_RECEIVE_EVENT RTEMS_EVENT_1 + +/* RTEMS event used to start transmit daemon. */ +#define START_TRANSMIT_EVENT RTEMS_EVENT_2 + +rtems_isr at91rm9200_emac_isr(rtems_vector_number vector); +static void at91rm9200_emac_isr_on(const rtems_irq_connect_data *unused); +static void at91rm9200_emac_isr_off(const rtems_irq_connect_data *unused); +static int at91rm9200_emac_isr_is_on(const rtems_irq_connect_data *irq); + +/* Replace the first value with the clock's interrupt name. */ +rtems_irq_connect_data at91rm9200_emac_isr_data = { + AT91RM9200_INT_EMAC, + (rtems_irq_hdl)at91rm9200_emac_isr, + at91rm9200_emac_isr_on, + at91rm9200_emac_isr_off, + at91rm9200_emac_isr_is_on, + 3, /* unused for ARM */ + 0 }; /* unused for ARM */ + + +/* use the values defined in linkcmds for our use of SRAM */ +extern void * at91rm9200_emac_rxbuf_hdrs; +extern void * at91rm9200_emac_txbuf; +extern void * at91rm9200_emac_rxbufs; + +/* Set up EMAC hardware */ +/* Number of Receive and Transmit Buffers and Buffer Descriptors */ +#define NUM_RXBDS 8 +#define NUM_TXBDS 1 +#define RX_BUFFER_SIZE 0x600 + +/* use internal SRAM for buffers and descriptors + * also insure that the receive descriptors + * start on a 64byte boundary + * Receive Buffer Descriptor Header + */ + +typedef struct +{ + unsigned long address; + unsigned long status; +} RXBUF_HDR; + +RXBUF_HDR *rxbuf_hdrs; +unsigned char *txbuf; +unsigned char *rxbuf; + +int delay_cnt; + +/* + * Hardware-specific storage + */ +typedef struct +{ + /* + * Connection to networking code + * This entry *must* be the first in the sonic_softc structure. + */ + struct arpcom arpcom; + + /* + * Interrupt vector + */ + rtems_vector_number vector; + + /* + * Indicates configuration + */ + int acceptBroadcast; + + /* + * Task waiting for interrupts + */ + rtems_id rxDaemonTid; + rtems_id txDaemonTid; + + /* + * current receive header + */ + int rx_buf_idx; + + + + /* + * Statistics + */ + unsigned long Interrupts; + unsigned long rxInterrupts; + unsigned long rxMissed; + unsigned long rxGiant; + unsigned long rxNonOctet; + unsigned long rxBadCRC; + unsigned long rxCollision; + + unsigned long txInterrupts; + unsigned long txSingleCollision; + unsigned long txMultipleCollision; + unsigned long txCollision; + unsigned long txDeferred; + unsigned long txUnderrun; + unsigned long txLateCollision; + unsigned long txExcessiveCollision; + unsigned long txExcessiveDeferral; + unsigned long txLostCarrier; + unsigned long txRawWait; +} at91rm9200_emac_softc_t; + +static at91rm9200_emac_softc_t softc; + + +/* The AT91RM9200 ethernet fifos are very undersized. Therefore + * we use the internal SRAM to hold 4 receive packets and one + * transmit packet. Note that the AT91RM9200 can only queue + * one transmit packet at a time. + */ + +/* function prototypes */ +int rtems_at91rm9200_emac_attach (struct rtems_bsdnet_ifconfig *config, + void *chip); +void at91rm9200_emac_init(void *arg); +void at91rm9200_emac_init_hw(at91rm9200_emac_softc_t *sc); +void at91rm9200_emac_start(struct ifnet *ifp); +void at91rm9200_emac_stop (at91rm9200_emac_softc_t *sc); +void at91rm9200_emac_txDaemon (void *arg); +void at91rm9200_emac_sendpacket (struct ifnet *ifp, struct mbuf *m); +void at91rm9200_emac_rxDaemon(void *arg); +void at91rm9200_emac_stats (at91rm9200_emac_softc_t *sc); +static int at91rm9200_emac_ioctl (struct ifnet *ifp, + int command, + caddr_t data); + + +int rtems_at91rm9200_emac_attach ( + struct rtems_bsdnet_ifconfig *config, + void *chip /* only one ethernet, so no chip number */ + ) +{ + struct ifnet *ifp; + int mtu; + int unitnumber; + char *unitname; + + /* an array of receive buffer descriptors */ + rxbuf_hdrs = (RXBUF_HDR *)&at91rm9200_emac_rxbuf_hdrs; + + /* one transmit buffer, 1536 bytes maximum */ + txbuf = (char *)&at91rm9200_emac_txbuf; + + /* receive buffers starting address */ + rxbuf = (char *)&at91rm9200_emac_rxbufs; + /* + * Parse driver name + */ + if ((unitnumber = rtems_bsdnet_parse_driver_name (config, &unitname)) < 0) + return 0; + + /* + * Is driver free? + */ + if (unitnumber != 0) { + printf ("Bad AT91RM9200 EMAC unit number.\n"); + return 0; + } + ifp = &softc.arpcom.ac_if; + if (ifp->if_softc != NULL) { + printf ("Driver already in use.\n"); + return 0; + } + + /* + * zero out the control structure + */ + + memset( &softc, 0, sizeof(softc) ); + + + /* get the MAC address from the chip */ + softc.arpcom.ac_enaddr[0] = (EMAC_REG(EMAC_SA1L) >> 0) & 0xff; + softc.arpcom.ac_enaddr[1] = (EMAC_REG(EMAC_SA1L) >> 8) & 0xff; + softc.arpcom.ac_enaddr[2] = (EMAC_REG(EMAC_SA1L) >> 16) & 0xff; + softc.arpcom.ac_enaddr[3] = (EMAC_REG(EMAC_SA1L) >> 24) & 0xff; + softc.arpcom.ac_enaddr[4] = (EMAC_REG(EMAC_SA1H) >> 0) & 0xff; + softc.arpcom.ac_enaddr[5] = (EMAC_REG(EMAC_SA1H) >> 8) & 0xff; + + if (config->mtu) { + mtu = config->mtu; + } else { + mtu = ETHERMTU; + } + + softc.acceptBroadcast = !config->ignore_broadcast; + + /* + * Set up network interface values + */ + ifp->if_softc = &softc; + ifp->if_unit = unitnumber; + ifp->if_name = unitname; + ifp->if_mtu = mtu; + ifp->if_init = at91rm9200_emac_init; + ifp->if_ioctl = at91rm9200_emac_ioctl; + ifp->if_start = at91rm9200_emac_start; + ifp->if_output = ether_output; + ifp->if_flags = IFF_BROADCAST; + if (ifp->if_snd.ifq_maxlen == 0) { + ifp->if_snd.ifq_maxlen = ifqmaxlen; + } + + softc.rx_buf_idx = 0; + + /* + * Attach the interface + */ + if_attach (ifp); + ether_ifattach (ifp); + return 1; +} + +void at91rm9200_emac_init(void *arg) +{ + at91rm9200_emac_softc_t *sc = arg; + struct ifnet *ifp = &sc->arpcom.ac_if; + + /* + *This is for stuff that only gets done once (at91rm9200_emac_init() + * gets called multiple times + */ + if (sc->txDaemonTid == 0) { + /* Set up EMAC hardware */ + at91rm9200_emac_init_hw(sc); + + /* Start driver tasks */ + sc->rxDaemonTid = rtems_bsdnet_newproc("ENrx", + 4096, + at91rm9200_emac_rxDaemon, + sc); + sc->txDaemonTid = rtems_bsdnet_newproc("ENtx", + 4096, + at91rm9200_emac_txDaemon, + sc); + } /* if txDaemonTid */ + + /* set our priority in the AIC */ + AIC_SMR_REG(AIC_SMR_EMAC) = AIC_SMR_PRIOR(EMAC_INT_PRIORITY); + + /* install the interrupt handler */ + BSP_install_rtems_irq_handler(&at91rm9200_emac_isr_data); + + /* EMAC doesn't support promiscuous, so ignore requests */ + if (ifp->if_flags & IFF_PROMISC) { + printf ("Warning - AT91RM9200 Ethernet driver" + " doesn't support Promiscuous Mode!\n"); + } + + /* + * Tell the world that we're running. + */ + ifp->if_flags |= IFF_RUNNING; + + /* Enable TX/RX and clear the statistics counters */ + EMAC_REG(EMAC_CTL) = (EMAC_CTL_TE | EMAC_CTL_RE | EMAC_CTL_CSR); + + /* clear any pending interrupts */ + EMAC_REG(EMAC_TSR) = 0xffffffff; + EMAC_REG(EMAC_RSR) = 0xffffffff; + +} /* at91rm9200_emac_init() */ + +void at91rm9200_emac_init_hw(at91rm9200_emac_softc_t *sc) +{ + int i; + + /* initialize our receive buffer descriptors */ + for (i = 0; i < NUM_RXBDS-1; i++) { + rxbuf_hdrs[i].address = (unsigned long)(&rxbuf[i * RX_BUFFER_SIZE]); + rxbuf_hdrs[i].status = 0x00000000; + } + + /* last one needs the wrapbit set as well */ + rxbuf_hdrs[i].address = ((unsigned long)(&rxbuf[i * RX_BUFFER_SIZE]) | + RXBUF_ADD_WRAP); + rxbuf_hdrs[i].status = 0x00000000; + + /* point to our receive buffer queue */ + EMAC_REG(EMAC_RBQP) = (unsigned long)rxbuf_hdrs; + + /* clear any left over status bits */ + EMAC_REG(EMAC_RSR) &= ~(EMAC_RSR_OVR | EMAC_RSR_REC | EMAC_RSR_BNA); + + /* set the MII clock divder to MCK/64 */ + EMAC_REG(EMAC_CFG) = (EMAC_CFG_CLK_64 | EMAC_CFG_BIG | EMAC_CFG_FD); + + /* enable the MII interface */ + EMAC_REG(EMAC_CTL) = EMAC_CTL_MPE; + + /* Set PHY LED2 to combined Link/Activity and enable pulse stretching */ + EMAC_REG(EMAC_MAN) = (0x01 << 30 | /* Start of Frame Delimiter */ + 0x01 << 28 | /* Operation, 0x01 = Write */ + 0x00 << 23 | /* Phy Number */ + 0x14 << 18 | /* Phy Register */ + 0x02 << 16 | /* must be 0x02 */ + 0x0D0A); /* Write data (0x0000 if read) */ + +} /* at91rm9200_emac_init_hw() */ + +void at91rm9200_emac_start(struct ifnet *ifp) +{ + at91rm9200_emac_softc_t *sc = ifp->if_softc; + + rtems_event_send(sc->txDaemonTid, START_TRANSMIT_EVENT); + ifp->if_flags |= IFF_OACTIVE; +} + +void at91rm9200_emac_stop (at91rm9200_emac_softc_t *sc) +{ + struct ifnet *ifp = &sc->arpcom.ac_if; + + ifp->if_flags &= ~IFF_RUNNING; + + /* + * Stop the transmitter and receiver. + */ + EMAC_REG(EMAC_CTL) &= ~(EMAC_CTL_TE | EMAC_CTL_RE); +} + +/* + * Driver transmit daemon + */ +void at91rm9200_emac_txDaemon (void *arg) +{ + at91rm9200_emac_softc_t *sc = (at91rm9200_emac_softc_t *)arg; + struct ifnet *ifp = &sc->arpcom.ac_if; + struct mbuf *m; + rtems_event_set events; + + for (;;) + { + /* turn on TX interrupt, then wait for one */ + EMAC_REG(EMAC_IER) = EMAC_INT_TCOM; /* Transmit complete */ + + rtems_bsdnet_event_receive( + START_TRANSMIT_EVENT, + RTEMS_EVENT_ANY | RTEMS_WAIT, + RTEMS_NO_TIMEOUT, + &events); + + /* Send packets till queue is empty */ + for (;;) + { + /* Get the next mbuf chain to transmit. */ + IF_DEQUEUE(&ifp->if_snd, m); + if (!m) + break; + at91rm9200_emac_sendpacket (ifp, m); + } + ifp->if_flags &= ~IFF_OACTIVE; + } +} + +/* Send packet */ +void at91rm9200_emac_sendpacket (struct ifnet *ifp, struct mbuf *m) +{ + struct mbuf *l = NULL; + unsigned int pkt_offset = 0; + delay_cnt = 0; + /* printf("at91rm9200_emac_sendpacket %p\n", m); */ + + /* Wait for EMAC Transmit Queue to become available. */ + while (((EMAC_REG(EMAC_TSR) & EMAC_TSR_COMP) == 0) && + ((EMAC_REG(EMAC_TSR) & EMAC_TSR_TXIDLE) == 0)) + + { + delay_cnt++; +/* sleep(0); make sure we don't hog the cpu */ + continue; + } + + /* copy the mbuf chain into the transmit buffer */ + l = m; + while (l != NULL) { + memcpy(((char *)txbuf + pkt_offset), /* offset into pkt for mbuf */ + (char *)mtod(l, void *), /* cast to void */ + l->m_len); /* length of this mbuf */ + + pkt_offset += l->m_len; /* update offset */ + l = l->m_next; /* get next mbuf, if any */ + } + + /* free the mbuf chain we just copied */ + m_freem(m); + + /* clear any pending status */ + EMAC_REG(EMAC_TSR) = (EMAC_TSR_OVR | EMAC_TSR_COL | EMAC_TSR_RLE + | EMAC_TSR_COMP | EMAC_TSR_UND); + + /* tell the EMAC about our buffer */ + EMAC_REG(EMAC_TAR) = (unsigned long)txbuf; + EMAC_REG(EMAC_TCR) = (unsigned long)pkt_offset; +} /* at91rm9200_emac_sendpacket () */ + + +/* SONIC reader task */ +void at91rm9200_emac_rxDaemon(void *arg) +{ + at91rm9200_emac_softc_t *sc = (at91rm9200_emac_softc_t *)arg; + struct ifnet *ifp = &sc->arpcom.ac_if; + struct mbuf *m; + struct ether_header *eh; + rtems_event_set events; + int pktlen; + + /* Input packet handling loop */ + for (;;) { + /* turn on RX interrupts, then wait for one */ + EMAC_REG(EMAC_IER) = (EMAC_INT_RCOM | /* Receive complete */ + EMAC_INT_RBNA | /* Receive buf not available */ + EMAC_INT_ROVR); /* Receive overrun */ + + rtems_bsdnet_event_receive( + START_RECEIVE_EVENT, + RTEMS_EVENT_ANY | RTEMS_WAIT, + RTEMS_NO_TIMEOUT, + &events); + + if (EMAC_REG(EMAC_RSR) & EMAC_RSR_BNA) { + printf("1: EMAC_BNA\n"); + } + + if (EMAC_REG(EMAC_RSR) & EMAC_RSR_OVR) { + printf("1: EMAC_OVR\n"); + } + + /* clear the receive status as we do not use it anyway */ + EMAC_REG(EMAC_RSR) = (EMAC_RSR_REC | EMAC_RSR_OVR | EMAC_RSR_BNA); + + /* scan the buffer descriptors looking for any with data in them */ + while (rxbuf_hdrs[sc->rx_buf_idx].address & RXBUF_ADD_OWNED) { + pktlen = rxbuf_hdrs[sc->rx_buf_idx].status & RXBUF_STAT_LEN_MASK; + + /* get an mbuf this packet */ + MGETHDR(m, M_WAIT, MT_DATA); + + /* now get a cluster pointed to by the mbuf */ + /* since an mbuf by itself is too small */ + MCLGET(m, M_WAIT); + + /* set the type of mbuf to ifp (ethernet I/F) */ + m->m_pkthdr.rcvif = ifp; + m->m_nextpkt = 0; + + /* copy the packet into the cluster pointed to by the mbuf */ + memcpy((char *)m->m_ext.ext_buf, + (char *)(rxbuf_hdrs[sc->rx_buf_idx].address & 0xfffffffc), + pktlen); + + /* Release the buffer ASAP back to the EMAC */ + rxbuf_hdrs[sc->rx_buf_idx].address &= ~RXBUF_ADD_OWNED; + + /* set the length of the mbuf */ + m->m_len = pktlen - (sizeof(struct ether_header) + 4); + m->m_pkthdr.len = m->m_len; + + /* strip off the ethernet header from the mbuf */ + /* but save the pointer to it */ + eh = mtod (m, struct ether_header *); + m->m_data += sizeof(struct ether_header); + + /* increment the buffer index */ + sc->rx_buf_idx++; + if (sc->rx_buf_idx >= NUM_RXBDS) { + sc->rx_buf_idx = 0; + } + + /* give all this stuff to the stack */ + ether_input(ifp, eh, m); + + } /* while ADD_OWNED = 0 */ + + if (EMAC_REG(EMAC_RSR) & EMAC_RSR_BNA) { + printf("2:EMAC_BNA\n"); + } + if (EMAC_REG(EMAC_RSR) & EMAC_RSR_OVR) { + printf("2:EMAC_OVR\n"); + } + + + } /* for (;;) */ +} /* at91rm9200_emac_rxDaemon() */ + + +/* Show interface statistics */ +void at91rm9200_emac_stats (at91rm9200_emac_softc_t *sc) +{ + printf (" Total Interrupts:%-8lu", sc->Interrupts); + printf (" Rx Interrupts:%-8lu", sc->rxInterrupts); + printf (" Giant:%-8lu", sc->rxGiant); + printf (" Non-octet:%-8lu\n", sc->rxNonOctet); + printf (" Bad CRC:%-8lu", sc->rxBadCRC); + printf (" Collision:%-8lu", sc->rxCollision); + printf (" Missed:%-8lu\n", sc->rxMissed); + + printf ( " Tx Interrupts:%-8lu", sc->txInterrupts); + printf ( " Deferred:%-8lu", sc->txDeferred); + printf (" Lost Carrier:%-8lu\n", sc->txLostCarrier); + printf ( "Single Collisions:%-8lu", sc->txSingleCollision); + printf ( "Multiple Collisions:%-8lu", sc->txMultipleCollision); + printf ("Excessive Collisions:%-8lu\n", sc->txExcessiveCollision); + printf ( " Total Collisions:%-8lu", sc->txCollision); + printf ( " Late Collision:%-8lu", sc->txLateCollision); + printf (" Underrun:%-8lu\n", sc->txUnderrun); + printf ( " Raw output wait:%-8lu\n", sc->txRawWait); +} + + +/* Enables at91rm9200_emac interrupts. */ +static void at91rm9200_emac_isr_on(const rtems_irq_connect_data *unused) +{ + /* Enable various TX/RX interrupts */ + EMAC_REG(EMAC_IER) = (EMAC_INT_RCOM | /* Receive complete */ + EMAC_INT_RBNA | /* Receive buffer not available */ + EMAC_INT_TCOM | /* Transmit complete */ + EMAC_INT_ROVR | /* Receive overrun */ + EMAC_INT_ABT); /* Abort on DMA transfer */ + + return; +} + +/* Disables at91rm9200_emac interrupts */ +static void at91rm9200_emac_isr_off(const rtems_irq_connect_data *unused) +{ + /* disable all various TX/RX interrupts */ + EMAC_REG(EMAC_IDR) = 0xffffffff; + return; +} + +/* Tests to see if at91rm9200_emac interrupts are enabled, and + * returns non-0 if so. + * If interrupt is not enabled, returns 0. + */ +static int at91rm9200_emac_isr_is_on(const rtems_irq_connect_data *irq) +{ + return EMAC_REG(EMAC_IMR); /* any interrupts enabled? */ +} + +/* Driver ioctl handler */ +static int +at91rm9200_emac_ioctl (struct ifnet *ifp, int command, caddr_t data) +{ + at91rm9200_emac_softc_t *sc = ifp->if_softc; + int error = 0; + + switch (command) { + case SIOCGIFADDR: + case SIOCSIFADDR: + ether_ioctl (ifp, command, data); + break; + + case SIOCSIFFLAGS: + switch (ifp->if_flags & (IFF_UP | IFF_RUNNING)) + { + case IFF_RUNNING: + at91rm9200_emac_stop (sc); + break; + + case IFF_UP: + at91rm9200_emac_init (sc); + break; + + case IFF_UP | IFF_RUNNING: + at91rm9200_emac_stop (sc); + at91rm9200_emac_init (sc); + break; + + default: + break; + } /* switch (if_flags) */ + break; + + case SIO_RTEMS_SHOW_STATS: + at91rm9200_emac_stats (sc); + break; + + /* + * FIXME: All sorts of multicast commands need to be added here! + */ + default: + error = EINVAL; + break; + } /* switch (command) */ + return error; +} + +/* interrupt handler */ +rtems_isr at91rm9200_emac_isr (rtems_vector_number v) +{ + unsigned long status32; + + /* get the ISR status and determine RX or TX */ + status32 = EMAC_REG(EMAC_ISR); + + if (status32 & EMAC_INT_ABT) { + EMAC_REG(EMAC_IDR) = EMAC_INT_ABT; /* disable it */ + rtems_panic("AT91RM9200 Ethernet MAC has received an Abort.\n"); + } + + if (status32 & (EMAC_INT_RCOM | /* Receive complete */ + EMAC_INT_RBNA | /* Receive buffer not available */ + EMAC_INT_ROVR)) { /* Receive overrun */ + + /* disable the RX interrupts */ + EMAC_REG(EMAC_IDR) = (EMAC_INT_RCOM | /* Receive complete */ + EMAC_INT_RBNA | /* Receive buf not available */ + EMAC_INT_ROVR); /* Receive overrun */ + + rtems_event_send (softc.rxDaemonTid, START_RECEIVE_EVENT); + } + + if (status32 & EMAC_INT_TCOM) { /* Transmit buffer register empty */ + + /* disable the TX interrupts */ + EMAC_REG(EMAC_IDR) = EMAC_INT_TCOM; + + rtems_event_send (softc.txDaemonTid, START_TRANSMIT_EVENT); + } +} + diff --git a/c/src/lib/libbsp/arm/csb337/start/.cvsignore b/c/src/lib/libbsp/arm/csb337/start/.cvsignore new file mode 100644 index 0000000000..d29e5050f5 --- /dev/null +++ b/c/src/lib/libbsp/arm/csb337/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/csb337/start/start.S b/c/src/lib/libbsp/arm/csb337/start/start.S new file mode 100644 index 0000000000..bfc809ca9b --- /dev/null +++ b/c/src/lib/libbsp/arm/csb337/start/start.S @@ -0,0 +1,147 @@ +/* + * Cogent CSB337 startup code + * + * Copyright (c) 2004 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$ +*/ + + +/* Some standard definitions...*/ +.equ PSR_MODE_USR, 0x10 +.equ PSR_MODE_FIQ, 0x11 +.equ PSR_MODE_IRQ, 0x12 +.equ PSR_MODE_SVC, 0x13 +.equ PSR_MODE_ABT, 0x17 +.equ PSR_MODE_UNDEF, 0x1B +.equ PSR_MODE_SYS, 0x1F + +.equ PSR_I, 0x80 +.equ PSR_F, 0x40 +.equ PSR_T, 0x20 + +.text +.globl _start +_start: + /* + * Since I don't plan to return to the bootloader, + * I don't have to save the registers. + * + * I'll just set the CPSR for SVC mode, interrupts + * off, and ARM instructions. + */ + mov r0, #(PSR_MODE_SVC | PSR_I | PSR_F) + msr cpsr, r0 + + /* zero the bss */ + ldr r1, =_bss_end_ + ldr r0, =_bss_start_ + +_bss_init: + mov r2, #0 + cmp r0, r1 + strlot r2, [r0], #4 + blo _bss_init /* loop while r0 < r1 */ + + + /* --- Initialize stack pointer registers */ + /* Enter IRQ mode and set up the IRQ stack pointer */ + mov r0, #(PSR_MODE_IRQ | PSR_I | PSR_F) /* No interrupts */ + msr cpsr, r0 + ldr r1, =_irq_stack_size + ldr sp, =_irq_stack + add sp, sp, r1 + + /* Enter FIQ mode and set up the FIQ stack pointer */ + mov r0, #(PSR_MODE_FIQ | PSR_I | PSR_F) /* No interrupts */ + msr cpsr, r0 + ldr r1, =_fiq_stack_size + ldr sp, =_fiq_stack + add sp, sp, r1 + + /* Enter ABT mode and set up the ABT stack pointer */ + mov r0, #(PSR_MODE_ABT | PSR_I | PSR_F) /* No interrupts */ + msr cpsr, r0 + ldr r1, =_abt_stack_size + ldr sp, =_abt_stack + add sp, sp, r1 + + /* Set up the SVC stack pointer last and stay in SVC mode */ + mov r0, #(PSR_MODE_SVC | PSR_I | PSR_F) /* No interrupts */ + msr cpsr, r0 + ldr r1, =_svc_stack_size + ldr sp, =_svc_stack + add sp, sp, r1 + sub sp, sp, #0x64 + + /* + * Initialize the MMU. After we return, the MMU is enabled, + * and memory may be remapped. I hope we don't remap this + * memory away. + */ + ldr r0, =mem_map + bl mmu_init + + /* + * Initialize the exception vectors. This includes the + * exceptions vectors (0x00000000-0x0000001c), and the + * pointers to the exception handlers (0x00000020-0x0000003c). + */ + mov r0, #0 + adr r1, vector_block + ldmia r1!, {r2-r9} + stmia r0!, {r2-r9} + ldmia r1!, {r2-r9} + stmia r0!, {r2-r9} + + /* Now we are prepared to start the BSP's C code */ + bl boot_card + + /* + * Theoretically, we could return to what started us up, + * but we'd have to have saved the registers and stacks. + * Instead, we'll just reset. + */ + bl bsp_reset + + /* We shouldn't get here. If we do, hang */ +_hang: b _hang + + +/* + * This is the exception vector table and the pointers to + * the functions that handle the exceptions. It's a total + * of 16 words (64 bytes) + */ +vector_block: + ldr pc, Reset_Handler + ldr pc, Undefined_Handler + ldr pc, SWI_Handler + ldr pc, Prefetch_Handler + ldr pc, Abort_Handler + nop + ldr pc, IRQ_Handler + ldr pc, FIQ_Handler + +Reset_Handler: b bsp_reset +Undefined_Handler: b Undefined_Handler +SWI_Handler: b SWI_Handler +Prefetch_Handler: b Prefetch_Handler +Abort_Handler: b Abort_Handler + nop +IRQ_Handler: b IRQ_Handler +FIQ_Handler: b FIQ_Handler + +.globl Reset_Handler +.globl Undefined_Handler +.globl SWI_Handler +.globl Prefetch_Handler +.globl Abort_Handler +.globl IRQ_Handler +.globl FIQ_Handler diff --git a/c/src/lib/libbsp/arm/csb337/startup/.cvsignore b/c/src/lib/libbsp/arm/csb337/startup/.cvsignore new file mode 100644 index 0000000000..d29e5050f5 --- /dev/null +++ b/c/src/lib/libbsp/arm/csb337/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/csb337/startup/bspstart.c b/c/src/lib/libbsp/arm/csb337/startup/bspstart.c new file mode 100644 index 0000000000..fc53971e54 --- /dev/null +++ b/c/src/lib/libbsp/arm/csb337/startup/bspstart.c @@ -0,0 +1,206 @@ +/* + * Cogent CSB337 - AT91RM9200 Startup code + * + * Copyright (c) 2004 by Cogent Computer Systems + * Written 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 +#include + +/* 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; + +rtems_configuration_table BSP_Configuration; +rtems_cpu_table Cpu_table; +char *rtems_progname = "RTEMS"; + +/* Function prototypes */ +extern void rtems_irq_mngt_init(void); +void bsp_libc_init( void *, unsigned32, int ); +void bsp_postdriver_hook(void); +static void fix_mac_addr(); + +/**************************************************************************/ +/* */ +/* NAME: bsp_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. */ +/* */ +/* 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. + */ + heap_start = free_mem_start; + heap_size = free_mem_end - free_mem_start; + + /* call rtems lib init - malloc stuff */ + bsp_libc_init((void *)heap_start, heap_size, 0); + +#ifdef RTEMS_DEBUG + + rtems_debug_enable(RTEMS_DEBUG_ALL_MASK); + +#endif /* RTEMS_DEBUG */ + +} + + +/**************************************************************************/ +/* */ +/* 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. */ +/* */ +/* RESTRICTIONS/LIMITATIONS: */ +/* Since RTEMS is not configured, no RTEMS functions can be called. */ +/* */ +/**************************************************************************/ +void bsp_start_default( void ) +{ + /* disable interrupts */ + AIC_CTL_REG(AIC_IDCR) = 0xffffffff; + + /* + * Some versions of the bootloader have the MAC address + * reversed. This fixes it, if necessary. + */ + fix_mac_addr(); + + /* tell RTEMS about the hooks we are using */ + Cpu_table.pretasking_hook = bsp_pretasking_hook; + Cpu_table.postdriver_hook = bsp_postdriver_hook; + + /* tell RTEMS to clear the workspace */ + 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\r", + BSP_Configuration.work_space_size ); + printk( "maximum_extensions = 0x%x\n\r", + BSP_Configuration.maximum_extensions ); + printk( "microseconds_per_tick = 0x%x\n\r", + BSP_Configuration.microseconds_per_tick ); + printk( "ticks_per_timeslice = 0x%x\n\r", + BSP_Configuration.ticks_per_timeslice ); + printk( "maximum_devices = 0x%x\n\r", + BSP_Configuration.maximum_devices ); + printk( "number_of_device_drivers = 0x%x\n\r", + BSP_Configuration.number_of_device_drivers ); + printk( "Device_driver_table = 0x%x\n\r", + BSP_Configuration.Device_driver_table ); + printk( "work_space_start = 0x%x\n\r", + BSP_Configuration.work_space_start ); + printk( "work_space_size = 0x%x\n\r", + BSP_Configuration.work_space_size ); +#endif +} /* bsp_start */ + +/* + * Some versions of the bootloader shipped with the CSB337 + * reverse the MAC address. This function tests for that, + * and fixes the MAC address. + */ +static void fix_mac_addr() +{ + uint8_t addr[6]; + + /* Read the MAC address */ + addr[0] = (EMAC_REG(EMAC_SA1L) >> 0) & 0xff; + addr[1] = (EMAC_REG(EMAC_SA1L) >> 8) & 0xff; + addr[2] = (EMAC_REG(EMAC_SA1L) >> 16) & 0xff; + addr[3] = (EMAC_REG(EMAC_SA1L) >> 24) & 0xff; + addr[4] = (EMAC_REG(EMAC_SA1H) >> 0) & 0xff; + addr[5] = (EMAC_REG(EMAC_SA1H) >> 8) & 0xff; + + /* Check which 3 bytes have Cogent's OUI */ + if ((addr[5] == 0x00) && (addr[4] == 0x23) && (addr[3] == 0x31)) { + EMAC_REG(EMAC_SA1L) = ((addr[5] << 0) | + (addr[4] << 8) | + (addr[3] << 16) | + (addr[2] << 24)); + + EMAC_REG(EMAC_SA1H) = ((addr[1] << 0) | + (addr[0] << 8)); + } +} + + +/* + * 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"))); + +/** + * Reset the system. + * + * This functions enables the watchdog and waits for it to + * fire, thus resetting the system. + */ +void bsp_reset(void) +{ + rtems_interrupt_level level; + + _CPU_ISR_Disable(level); + + /* Enable the watchdog timer, then wait for the world to end. */ + ST_REG(ST_WDMR) = ST_WDMR_RSTEN | 1; + + while(1); +} diff --git a/c/src/lib/libbsp/arm/csb337/startup/exit.c b/c/src/lib/libbsp/arm/csb337/startup/exit.c new file mode 100644 index 0000000000..baf70bd88d --- /dev/null +++ b/c/src/lib/libbsp/arm/csb337/startup/exit.c @@ -0,0 +1,37 @@ +/* + * Cogent CSB337 Shutdown code + * + * Copyright (c) 2004 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 dbgu_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 (dbgu_poll_read(0) < 0) continue; +} diff --git a/c/src/lib/libbsp/arm/csb337/startup/linkcmds b/c/src/lib/libbsp/arm/csb337/startup/linkcmds new file mode 100644 index 0000000000..cf45e1869b --- /dev/null +++ b/c/src/lib/libbsp/arm/csb337/startup/linkcmds @@ -0,0 +1,227 @@ +/* + * Cogent CSB337 Linker script + * + * Copyright (c) 2004 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) + +MEMORY +{ + sdram : ORIGIN = 0x20100000, LENGTH = 15M + sram : ORIGIN = 0x00200000, LENGTH = 16K +} + +/* + * Declare some sizes. + */ +_sdram_base = DEFINED(_sdram_base) ? _sdram_base : 0x20100000; +_sdram_size = DEFINED(_sdram_size) ? _sdram_size : 15M; + + +_sram_base = DEFINED(_sram_base) ? _sram_base : 0x00000000; +_sram_size = DEFINED(_sram_size) ? _sram_size : 16K; + +_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 : 0x100; +_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 = .; + + /* reserve room for the vectors and function pointers */ + arm_exception_table = .; + . += 64; + + /* 256 byte aligned rx buffer header array */ + . = ALIGN (0x100); + at91rm9200_emac_rxbuf_hdrs = .; + + /* 1 transmit buffer, 0x600 size */ + . += (0x100); + at91rm9200_emac_txbuf = .; + . += (0x600); + + /* 4 receive buffers, 0x600 each */ + at91rm9200_emac_rxbufs = .; + . += (0x600 * 8); + + } > sram + + .init : + { + KEEP (*(.init)) + } > sdram /*=0*/ + + .text : + { + _text_start = .; + CREATE_OBJECT_SYMBOLS + *(.text) + *(.text.*) + + /* + * Special FreeBSD sysctl sections. + */ + . = ALIGN (16); + __start_set_sysctl_set = .; + *(set_sysctl_*); + __stop_set_sysctl_set = ABSOLUTE(.); + *(set_domain_*); + *(set_pseudo_*); + + /* .gnu.warning sections are handled specially by elf32.em. */ + *(.gnu.warning) + *(.gnu.linkonce.t*) + *(.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 = .; + +/* + * Ideally, the MMU's translation table would be in SRAM. But we need + * 16K which is the size of SRAM. If we do the mapping right, the TLB + * should be big enough that to hold all the translations that matter, + * so keeping the table in SDRAM won't be a problem. + */ + . = ALIGN (16 * 1024); + _ttbl_base = .; + . += (16 * 1024); + + + . = ALIGN (1024); + _bss_free_start = .; + + } > sdram + + +/* 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/csb337/startup/memmap.c b/c/src/lib/libbsp/arm/csb337/startup/memmap.c new file mode 100644 index 0000000000..95248af400 --- /dev/null +++ b/c/src/lib/libbsp/arm/csb337/startup/memmap.c @@ -0,0 +1,29 @@ +/* + * CSB337 Memory Map + * + * Copyright (c) 2004 by Cogent Computer Systems + * Written by Jay Monkman + * + * $Id$ + */ +#include +#include + +/* Remember, the ARM920 has 64 TLBs. If you have more 1MB sections than + * that, you'll have TLB lookups, which could hurt performance. + */ +mmu_sect_map_t mem_map[] = { +/* */ + {0x00200000, 0x00000000, 1, MMU_CACHE_NONE}, /* SRAM */ + {0x00200000, 0x00200000, 1, MMU_CACHE_NONE}, /* SRAM */ + {0x10000000, 0x10000000, 8, MMU_CACHE_NONE}, /* FLASH */ + {0x20000000, 0x20000000, 32, MMU_CACHE_WTHROUGH}, /* SDRAM */ + {0x30000000, 0x30000000, 1, MMU_CACHE_NONE}, /* video */ + {0x40000000, 0x40000000, 1, MMU_CACHE_NONE}, /* Expansion CS0 */ + {0x50000000, 0x50000000, 1, MMU_CACHE_NONE}, /* CF CE 1 */ + {0x60000000, 0x60000000, 1, MMU_CACHE_NONE}, /* CF CE 1 */ + {0x70000000, 0x70000000, 1, MMU_CACHE_NONE}, /* CF CE 2 */ + {0x80000000, 0x80000000, 1, MMU_CACHE_NONE}, /* Expansion CS0 */ + {0xfff00000, 0xfff00000, 1, MMU_CACHE_NONE}, /* Internal regs */ + {0x00000000, 0x00000000, 0, 0} /* The end */ +}; diff --git a/c/src/lib/libbsp/arm/csb337/times b/c/src/lib/libbsp/arm/csb337/times new file mode 100644 index 0000000000..29421b0ed8 --- /dev/null +++ b/c/src/lib/libbsp/arm/csb337/times @@ -0,0 +1,189 @@ +# +# Timing Test Suite Results for the Cogent CSB337 AT91RM9200 based SBC. +# +# +# + +Board: Cogent CSB337 +CPU: AT91RM200 - ARM920T +Clock Speed: 184 MHz +Memory Configuration: SDRAM, 32 bits wide + +Times Reported in: nanoseconds +Timer Source: TC0, using timer_clock2 - 173 ns resolution + +All tests were compiled with VARIANT=DEBUG + + + cache state: none I only both +== =================================================================== ======= ======= ======= + 1 rtems_semaphore_create 25258 24220 14878 + 1 rtems_semaphore_delete 25604 25777 15570 + 1 rtems_semaphore_obtain: available 8227 8227 2876 + 1 rtems_semaphore_obtain: not available -- NO_WAIT 8228 8228 2876 + 1 rtems_semaphore_release: no waiting tasks 14718 14718 5947 + + 2 rtems_semaphore_obtain: not available -- caller blocks 42779 42803 19163 + + 3 rtems_semaphore_release: task readied -- preempts caller 32518 32522 15196 + + 4 rtems_task_restart: blocked task -- preempts caller 76466 75255 42731 + 4 rtems_task_restart: ready task -- preempts caller 71276 71622 35638 + 4 rtems_semaphore_release: task readied -- returns to caller 21202 21218 9188 + 4 rtems_task_create 76725 76753 34138 + 4 rtems_task_start 30470 30468 12108 + 4 rtems_task_restart: suspended task -- returns to caller 35973 35937 14440 + 4 rtems_task_delete: suspended task 65546 65528 30141 + 4 rtems_task_restart: ready task -- returns to caller 37046 37087 14654 + 4 rtems_task_restart: blocked task -- returns to caller 43506 43549 18857 + 4 rtems_task_delete: blocked task 68155 68110 31268 + + 5 rtems_task_suspend: calling task 34020 33985 14128 + 5 rtems_task_resume: task readied -- preempts caller 27956 27942 11641 + + 6 rtems_task_restart: calling task 45360 45360 14846 + 6 rtems_task_suspend: returns to caller 15398 15393 6722 + 6 rtems_task_resume: task readied -- returns to caller 17206 17211 6544 + 6 rtems_task_delete: ready task 68696 68681 31434 + + 7 rtems_task_restart: suspended task -- preempts caller 54129 54104 22877 + + 8 rtems_task_set_priority: obtain current priority 10869 10867 4267 + 8 rtems_task_set_priority: returns to caller 25368 25351 8487 + 8 rtems_task_mode: obtain current mode 5835 5830 2501 + 8 rtems_task_mode: no reschedule 5998 5995 2645 + 8 rtems_task_mode: reschedule -- returns to caller 12110 11764 6055 + 8 rtems_task_mode: reschedule -- preempts caller 33043 34773 18338 + 8 rtems_task_set_note 11869 11871 4356 + 8 rtems_task_get_note 12092 12087 4397 + 8 rtems_clock_set 33141 33145 10160 + 8 rtems_clock_get 2920 2921 811 + + 9 rtems_message_queue_create 74390 75601 46883 + 9 rtems_message_queue_send: no waiting tasks 20387 20387 8702 + 9 rtems_message_queue_urgent: no waiting tasks 20379 20379 8632 + 9 rtems_message_queue_receive: available 22941 22941 8487 + 9 rtems_message_queue_flush: no messages flushed 13459 13455 5932 + 9 rtems_message_queue_flush: messages flushed 15808 15794 6802 + 9 rtems_message_queue_delete 32351 33043 20414 + +10 rtems_message_queue_receive: not available -- NO_WAIT 14282 14296 4859 +10 rtems_message_queue_receive: not available -- caller blocks 43862 43794 19374 + +11 rtems_message_queue_send: task readied -- preempts caller 35025 35054 16997 + +12 rtems_message_queue_send: task readied -- returns to caller 24213 24194 11113 + +13 rtems_message_queue_urgent: task readied -- preempts caller 35004 24190 17099 + +14 rtems_message_queue_urgent: task readied -- returns to caller 24190 35042 11087 + +15 rtems_event_receive: obtain current events 1847 1849 560 +15 rtems_event_receive: not available -- NO_WAIT 10207 10210 3541 +15 rtems_event_receive: not available -- caller blocks 36305 36444 16165 +15 rtems_event_send: no task readied 10879 10871 4055 +15 rtems_event_receive: available 14359 14705 7439 +15 rtems_event_send: task readied -- returns to caller 20730 20727 9674 + +16 rtems_event_send: task readied -- preempts caller 33179 33210 15246 + +17 rtems_task_set_priority: preempts caller 44149 44232 18573 + +18 rtems_task_delete: calling task 85693 85685 38982 + +19 rtems_signal_catch 11418 11764 6401 +19 rtems_signal_send: returns to caller 20414 20414 14705 +19 rtems_signal_send: signal to self 33043 33043 23182 +19 exit ASR overhead: returns to calling task 18684 18857 11591 +19 exit ASR overhead: returns to preempting task 27680 26988 13321 + +20 rtems_partition_create 30621 31486 20587 +20 rtems_region_create 47921 46710 29410 +20 rtems_partition_get_buffer: available 16435 16781 12283 +20 rtems_partition_get_buffer: not available 13840 13494 6228 +20 rtems_partition_return_buffer 18338 18684 10207 +20 rtems_partition_delete 19203 21279 10380 +20 rtems_region_get_segment: available 36849 36676 16608 +20 rtems_region_get_segment: not available -- NO_WAIT 35984 35119 17819 +20 rtems_region_return_segment: no waiting tasks 34254 34254 15916 +20 rtems_region_get_segment: not available -- caller blocks 76639 76639 42385 +20 rtems_region_return_segment: task readied -- preempts caller 71968 73006 37714 +20 rtems_region_return_segment: task readied -- returns to caller 58128 57263 24220 +20 rtems_region_delete 37368 38060 22144 +20 rtems_io_initialize 3807 3788 1332 +20 rtems_io_open 2565 2560 854 +20 rtems_io_close 2565 2558 863 +20 rtems_io_read 2560 2550 852 +20 rtems_io_write 2638 2638 908 +20 rtems_io_control 2556 2556 854 + +21 rtems_task_ident 88425 88427 41471 +21 rtems_message_queue_ident 85875 85887 40243 +21 rtems_semaphore_ident 98762 98763 46357 +21 rtems_partition_ident 85825 85816 40255 +21 rtems_region_ident 87409 87413 41071 +21 rtems_port_ident 85567 85551 40167 +21 rtems_timer_ident 85801 85795 40289 +21 rtems_rate_monotonic_ident 85787 85780 40315 + +22 rtems_message_queue_broadcast: task readied -- returns to caller 39271 38752 26469 +22 rtems_message_queue_broadcast: no waiting tasks 15305 15308 6406 +22 rtems_message_queue_broadcast: task readied -- preempts caller 43077 43250 22144 + +23 rtems_timer_create 11144 11151 4421 +23 rtems_timer_fire_after: inactive 22863 22848 7918 +23 rtems_timer_fire_after: active 25072 25074 8092 +23 rtems_timer_cancel: active 13078 13073 4392 +23 rtems_timer_cancel: inactive 10834 10841 3710 +23 rtems_timer_reset: inactive 22254 22242 7096 +23 rtems_timer_reset: active 24450 24446 7608 +23 rtems_timer_fire_when: inactive 33001 33008 10186 +23 rtems_timer_fire_when: active 33004 33025 10148 +23 rtems_timer_delete: active 17280 17289 5580 +23 rtems_timer_delete: inactive 15102 15099 5006 +23 rtems_task_wake_when 51777 51825 20185 + +24 rtems_task_wake_after: yield -- returns to caller 8205 8208 2932 +24 rtems_task_wake_after: yields -- preempts caller 27998 28006 11879 + +25 rtems_clock_tick 14878 14878 11764 + +26 _ISR_Disable 4325 4325 3806 +26 _ISR_Flash 3633 3633 2768 +26 _ISR_Enable 3806 3806 2595 +26 _Thread_Disable_dispatch 4325 4498 2941 +26 _Thread_Enable_dispatch 8131 7958 4325 +26 _Thread_Set_state 14705 15051 6055 +26 _Thread_Disptach (NO FP) 24047 25258 13840 +26 context switch: no floating point contexts 16781 17127 11418 +26 context switch: self 4671 4671 3287 +26 context switch: to another task 5363 5536 3806 +26 fp context switch: restore 1st FP task - NA NA NA +26 fp context switch: save idle, restore initialized - NA NA NA +26 fp context switch: save idle, restore idle - NA NA NA +26 fp context switch: save initialized, restore initialized - NA NA NA +26 _Thread_Resume 14705 14705 10034 +26 _Thread_Unblock 13840 14186 8304 +26 _Thread_Ready 13148 13148 5190 +26 _Thread_Get 4909 4916 2003 +26 _Semaphore_Get 3430 3427 1055 +26 _Thread_Get: invalid id 1809 1807 998 + +27 interrupt entry overhead: returns to interrupted task 0 0 0 +27 interrupt exit overhead: returns to interrupted task 0 0 0 +27 interrupt entry overhead: returns to nested interrupt 0 0 0 +27 interrupt exit overhead: returns to nested interrupt 0 0 0 + +28 rtems_port_create 19722 20414 12283 +28 rtems_port_external_to_internal 10392 10393 3361 +28 rtems_port_internal_to_external 10397 10390 3325 +28 rtems_port_delete 18511 19376 10726 + +29 rtems_rate_monotonic_create 20414 20241 12629 +29 rtems_rate_monotonic_period: initiate period -- returns to caller 32178 32351 21106 +29 rtems_rate_monotonic_period: obtain status 15051 14532 6920 +29 rtems_rate_monotonic_cancel 21971 22317 12283 +29 rtems_rate_monotonic_delete: inactive 22490 21971 11591 +29 rtems_rate_monotonic_delete: active 22490 21452 8131 +29 rtems_rate_monotonic_period: conclude periods -- caller blocks 29652 29750 12897 + -- cgit v1.2.3