Patch from Charles-Antoine Gauthier <charles.gauthier@iit.nrc.ca>

to update the mvme167 BSP and account for the fact that RAM base
does not have to start at 0.
This commit is contained in:
Joel Sherrill
2000-04-05 18:24:48 +00:00
parent ce70a16674
commit bb734ccaa8
17 changed files with 429 additions and 254 deletions

View File

@@ -7,7 +7,13 @@ ACLOCAL_AMFLAGS = -I $(RTEMS_TOPdir)/aclocal
# wrapup is the one that actually builds and installs the library
# from the individual .rel files built in other directories
SUBDIRS = . include start startup clock console fatal timer wrapup
if HAS_NETWORKING
NETWORKING_DRIVER = network
endif
SUBDIRS = . include start startup clock console fatal timer \
$(NETWORKING_DRIVER) wrapup
include $(top_srcdir)/../../bsp.am

View File

@@ -2,18 +2,35 @@
# $Id$
#
This is a README file for the MVME167 port of RTEMS 4.0.0.
This is a README file for the MVME167 port of RTEMS 4.5.0.
Please send any comments, improvements, or bug reports to:
Charles-Antoine Gauthier
charles.gauthier@nrc.ca
or
Darlene Stewart
Darlene.Stewart@nrc.ca
Software Engineering Group
Institute for Information Technology
National Research Council of Canada
Ottawa, ON, K1A 0R6
Canada
charles.gauthier@iit.nrc.ca
WARNING:
--------
The network driver is currently being worked on. It is somewhat functional,
but it does run out of buffers under certain conditions. The code is
also undergoing a substantial reorganization. Before making any changes,
you should check with us for the availability of updates.
Note from Joel: The ttcp performance reported is very nice even if the
driver is still early in its life. :)
Disclaimer
@@ -43,15 +60,15 @@ Installation
Nothing unique to the MVME167. It uses the standard build process for
m68k targets. You will need to edit linkcmds to put in the start address
of your board. We do TFTP transfers to our target. The mvme167.cfg file
builds only the coff images, which we download to the target, skipping over
the first 0xA8 bytes; Motorola S-records are not generated. Edit this file
if you want S-records.
builds only the ELF images, which we download to the target, skipping
over the first 0x54 bytes; Motorola S-records are not generated. Edit
this file if you want S-records.
Port Description
Console driver
----------------
---------------
This BSP includes an termios-capable console driver that supports all
four serial ports on the MVME167 model. The RTEMS console, /dev/console,
@@ -60,27 +77,30 @@ corresponds to channel 1 in the CD2401. This corresponds to Serial Port
do not open /dev/tty00 if you are debugging using 167Bug.
The console is initialized with whatever parameters are set up in termios
before it calls the firtOpen driver callback, EXCEPT THAT HARDWARE HANDSHAKING
IS TURNED OFF, i.e. CLOCAL is set in the struct termios c_cflag field. We use
3-wire cables for I/O, and find hardware handshaking a pain. If you enable
hardware handshaking, you must drive CTS* low on the CD2401 for output to
occur. If the port is in the DTE configuration, you must drive the RS-232 CTS
line to space; if the port is in the DCE configuration, you must drive the
RS-232 RTS line to space.
before it calls the firtOpen driver callback, EXCEPT THAT HARDWARE
HANDSHAKING IS TURNED OFF, i.e. CLOCAL is set in the struct termios
c_cflag field. We use 3-wire cables for I/O, and find hardware handshaking
a pain. If you enable hardware handshaking, you must drive CTS* low on the
CD2401 for output to occur. If the port is in the DTE configuration, you
must drive the RS-232 CTS line to space; if the port is in the DCE
configuration, you must drive the RS-232 RTS line to space.
Limited support is provided for polled terminal I/O. This is used when
running the timing tests. Set the CD2401_POLLED_IO manifest constant to 1
in rtems/c/src/lib/libbsp/m68k/mvme167/console/console.c to enable polled
I/O. In this case, I/O is done through 167Bug, usually to the Serial Port
1/Console port. Interrupt-driven and polled I/O cannot be mixed in the
MVME167.
Limited support is provided for polled terminal I/O. This is used when running
the timing tests. Set the CD2401_POLLED_IO manifest constant to 1 in
rtems/c/src/lib/libbsp/m68k/mvme167/console/console.c to enable polled I/O.
In this case, I/O is done through 167Bug, usually to the Serial Port 1/Console
Floating-point
The MC68040 has a built-in FPU. This FPU does not implement all the
instruction of the MC68881/MC68882 floating-point coprocessors in hardware.
The -m68040 compilation options instructs gcc to not generate the missing
instructions. All of the RTEMS code is built this way. Some of the missing
functionality must be supplied by external libraries. The required functions
are part of libgcc.a.
instruction of the MC68881/MC68882 floating-point coprocessors in
hardware. The -m68040 compilation options instructs gcc to not generate
the missing instructions. All of the RTEMS code is built this way. Some
of the missing functionality must be supplied by external libraries. The
required functions are part of libgcc.a.
The issue gets complicated because libc, libm and libgcc do not come as
m68040-specific variants. The default variants of these libraries are for the
@@ -127,9 +147,22 @@ mvme167.cfg that redefine which variants of libc, libm and libgcc to link
against.
Miscellaneous
Cache Control and Memory Mapping
port. Interrupt-driven and polled I/O cannot be mixed in the MVME167.
If Jumper J1-7 is installed, the data cache will be turned on. If Jumper
J1-6 is installed, the instruction cache will be turned on. Removing the
jumper causes the corresponding cache to be left disabled.
If Jumper J1-5 is installed, the data cache will be placed in copyback
mode. If it is removed, it will be placed in writethrough mode.
Currently, block address translation is set up to map the virtual
0x00000000--0x7FFFFFFF to the physical range 0x00000000--0x7FFFFFFF. The
port relies on the hardware to raise exceptions when addressing
non-existent memory. Caching is not controllable on a finer grain.
Miscellaneous
The timer and clock drivers were patterned after the MVME162 and MVME152
ports.
@@ -137,8 +170,6 @@ ports.
At this time, we do not have an MPCI layer for the MVME167. We are planning
to write one.
The port does not have a network driver.
This port supplies its own fatal_error_handler, which attempts to print some
error message through 167Bug (on the Serial Port 1/Console on the MVME712M).
@@ -153,17 +184,20 @@ tools were used:
m68k-rtems target;
- GNU binutils 2.9.1 configured for a powerpc-ibm-aix4.2.0.0 host and
m68k-rtems target;
It was also tested on a Pentium II-based PC running Windows NT Workstation 4.0
and the Cygnus Cygwin32 release b20.1 environment, witht he following tools:
and the Cygnus Cygwin32 release b20.1 environment, with the following tools:
- EGCS 1.1.1 configured for a i586-cygwin32 host and m68k-rtems target;
- GNU binutils 2.9.4 configured for a i586-cygwin32 host and m68k-rtems
target;
- Cygnus newlib 1.8.0 with RTEMS 4.0.0 patches.
With the latter environment, be patient; builds take a very looong time...
- Cygnus newlib 1.8.0 with RTEMS 4.0.0 patches.
Current development is done on a Pentium III PC running RedHat Linux 6.1.
At the time this README was composed, the latest working compiler that was
used successfully was gcc version 2.96 20000213 (experimental). Both the C
and C++ compilers were working. Binutils 2.9.1 are used.
Known Problems
@@ -202,6 +236,11 @@ blown. This is one case were overwritting the first or last 16 bytes of the
stack does cause problems (but hey, an exception occurred, which is better
than propagating the error).
In the stackchk test, an access fault exception is raised after the stack is
blown. This is one case were overwritting the first or last 16 bytes of the
stack does cause problems (but hey, an exception occurred, which is better
than propagating the error).
When using interrupt-driven I/O, psx08 produces all the expected output, but
it does not return control to 167Bug. Is this test supposed to work with
interrupt-driven console I/O?
@@ -210,6 +249,8 @@ interrupt-driven console I/O?
What's new
----------
Support for Java is being actively worked on.
Thanks
------
@@ -460,10 +501,3 @@ Timing tests:
rtems_rate_monotonic_period: obtain status 13
Network tests:
The driver is currently being worked on. It is somewhat functional,
but it does run out of buffers under certain conditions. The code is
also undergoing a substantial reorganization. Before making any changes,
you should check with us for the availability of updates.

View File

@@ -7,15 +7,11 @@
*cpp:
%(old_cpp) %{qrtems: -D__embedded__} -Asystem(embedded)
*endfile:
%{qelf: crtend.o%s crtn.o%s}
*lib:
%{!qrtems: %(old_lib)} %{qrtems: --start-group \
%{!qrtems_debug: -lrtemsall} %{qrtems_debug: -lrtemsall_g} \
-lc -lgcc --end-group \
%{!qelf: %{!qnolinkcmds: -T linkcmds%s}} %{qelf: %{!qnolinkcmd: -T
linkcmds%s}}}
%{qjava: -lffi -lzgcj -lgcj} %{qc++: -lstdc++} -lc -lgcc --end-group \
%{!qnolinkcmds: -T linkcmds%s}}
*startfile:
%{!qrtems: %(old_startfile)} %{qrtems: \

View File

@@ -17,8 +17,11 @@ RTEMS_CANONICALIZE_TOOLS
RTEMS_ENV_RTEMSBSP
RTEMS_CHECK_CUSTOM_BSP(RTEMS_BSP)
RTEMS_CHECK_BSP_CACHE(RTEMS_BSP)
RTEMS_CHECK_NETWORKING
RTEMS_CANONICAL_HOST
AM_CONDITIONAL(HAS_NETWORKING,test "$HAS_NETWORKING" = "yes")
RTEMS_PROJECT_ROOT
# Explicitly list all Makefiles here
@@ -28,6 +31,7 @@ clock/Makefile
console/Makefile
fatal/Makefile
include/Makefile
network/Makefile
start/Makefile
startup/Makefile
timer/Makefile

View File

@@ -2,22 +2,24 @@
* console.c
*
* This file contains the MVME167 termios console package. Only asynchronous
* I/O is supported. Normal I/O uses DMA for output, interrupts for input.
* Very limited support is provided for polled I/O. Polled I/O is intended
* only for running the RTEMS test suites, and uses the 167Bug console only.
* I/O is supported.
*
* /dev/tty0 is channel 0, Serial Port 1/Console on the MVME712M.
* /dev/tty1 is channel 1, Serial Port 2/TTY01 on the MVME712M.
* /dev/tty2 is channel 2, Serial Port 3 on the MVME712M.
* /dev/tty3 is channel 3, Serial Port 4 on the MVME712M.
*
* /dev/console is fixed to be /dev/tty01, Serial Port 2. 167Bug is given
* Serial Port 1/Console. Do not open /dev/tty00.
* Normal I/O uses DMA for output, interrupts for input. /dev/console is
* fixed to be /dev/tty01, Serial Port 2. Very limited support is provided
* for polled I/O. Polled I/O is intended only for running the RTEMS test
* suites. In all cases, Serial Port 1/Console is allocated to 167Bug and
* is the dedicated debugger port. We configure GDB to use 167Bug for
* debugging. When debugging with GDB or 167Bug, do not open /dev/tty00.
*
* Modern I/O chips often contain a number of I/O devices that can operate
* almost independently of each other. Typically, in RTEMS, all devices in
* an I/O chip are handled by a single device driver, but that need not be
* always the case. Each device driver must supply six entry points in the
* always the case. Each device driver must supply six entry points in the
* Device Driver Table: a device initialization function, as well as an open,
* close, read, write and a control function. RTEMS assigns a device major
* number to each device driver. This major device number is the index of the
@@ -59,7 +61,7 @@
* Worse, it requires that the sub-devices be initialized in some
* configuration, and that configuration then changed through a series of
* device driver control calls. There is no standard API in RTEMS to switch
* a serial line to some synchronous protocol.
* a serial line to some synchronous protocol.
*
* A better approach is to treat each channel as a separate device, each with
* its own device device driver. The application then supplies its own device
@@ -96,7 +98,7 @@
* THIS MODULE IS NOT RE-ENTRANT! Simultaneous access to a device from
* multiple tasks is likely to cause significant problems! Concurrency
* control is implemented in the termios package.
*
*
* THE INTERRUPT LEVEL IS SET TO 1 FOR ALL CHANNELS.
* If the CD2401 is to be used for high speed synchronous serial I/O, the
* interrupt priority might need to be increased.
@@ -125,13 +127,12 @@
#define M167_INIT
#include <stdarg.h>
#include <stdio.h>
#include <termios.h>
#include <bsp.h> /* Must be before libio.h */
#include <rtems/libio.h>
#define CD2401_INT_LEVEL 1 /* Interrupt level for the CD2401 */
#define CD2401_POLLED_IO 0 /* 0 for interrupt-driven, 1 for polled I/O */
/* Channel info */
/* static */ struct {
@@ -569,7 +570,7 @@ rtems_isr cd2401_tx_isr(
if ( status & 0x20 ) {
/* DMA done */
cd2401->ier &= 0xFC; /* Shut up the interrupts */
/* This call can result in a call to cd2401_write() */
rtems_termios_dequeue_characters (
CD2401_Channel_Info[ch].tty,
@@ -634,7 +635,7 @@ int cd2401_firstOpen(
sc = rtems_termios_ioctl (&newarg);
if (sc != RTEMS_SUCCESSFUL)
rtems_fatal_error_occurred (sc);
/*
* Turn off hardware flow control. It is a pain with 3-wire cables.
* The rtems_termios_ioctl() call below results in a call to
@@ -646,7 +647,7 @@ int cd2401_firstOpen(
sc = rtems_termios_ioctl (&newarg);
if (sc != RTEMS_SUCCESSFUL)
rtems_fatal_error_occurred (sc);
/* Mark that the channel as initialized */
CD2401_Channel_Info[minor].tty = args->iop->data1;
@@ -876,10 +877,10 @@ int cd2401_setAttributes(
else
istrip = 0; /* Leave as 8 bits */
/* Clear channel and disable rx and tx */
cd2401_chan_cmd (minor, 0x40, 1);
/* Write to the ports */
cd2401->car = minor; /* Select channel */
cd2401->cmr = 0x42; /* Interrupt Rx, DMA Tx, async mode */
@@ -1079,24 +1080,28 @@ int _167Bug_pollRead(
{
int char_not_available;
unsigned char c;
/* Check for a char in the input FIFO */
asm volatile( "trap #15 /* Trap to 167Bug (.INSTAT) */
.short 0x01
move %%cc, %0 /* Get condition codes */
andil #4, %0"
: "=d" (char_not_available) :: "%%cc" );
asm volatile( "movew #0x1, -(%%sp) /* Code for .INSTAT */
movew %1, -(%%sp) /* Channel */
trap #15 /* Trap to 167Bug */
.short 0x60 /* Code for .REDIR */
move %%cc, %0 /* Get condition codes */
andil #4, %0" /* Keep the Zero bit */
: "=d" (char_not_available) : "d" (minor): "%%cc" );
if (char_not_available)
return -1;
/* Read the char and return it */
asm volatile( "subq.l #2,%%a7 /* Space for result */
trap #15 /* Trap to 167 Bug (.INCHR) */
.short 0x00
moveb (%%a7)+, %0"
: "=d" (c) );
asm volatile( "subq.l #2,%%a7 /* Space for result */
movew #0x0, -(%%sp) /* Code for .INCHR */
movew %1, -(%%sp) /* Channel */
trap #15 /* Trap to 167 Bug */
.short 0x60 /* Code for .REDIR */
moveb (%%a7)+, %0" /* Pop char into c */
: "=d" (c) : "d" (minor) );
return (int)c;
}
@@ -1105,7 +1110,7 @@ int _167Bug_pollRead(
* _167Bug_pollWrite
*
* Output buffer through 167Bug. Returns only once every character has been
* sent (polled output).
* sent (polled output).
*
* Input parameters:
* minor - selected channel
@@ -1127,18 +1132,55 @@ int _167Bug_pollWrite(
)
{
const char *endbuf = buf + len;
asm volatile( "pea (%0)
pea (%1)
trap #15 /* trap to 167Bug (.OUTSTR) */
.short 0x21"
:: "a" (endbuf), "a" (buf) );
asm volatile( "pea (%0) /* endbuf */
pea (%1) /* buf */
movew #0x21, -(%%sp) /* Code for .OUTSTR */
movew %2, -(%%sp) /* Channel */
trap #15 /* Trap to 167Bug */
.short 0x60" /* Code for .REDIR */
:: "a" (endbuf), "a" (buf), "d" (minor) );
/* Return something */
return RTEMS_SUCCESSFUL;
}
/*
* Print functions: prototyped in bsp.h
* Debug printing on Channel 1
*/
void printk( char *fmt, ... )
{
va_list ap; /* points to each unnamed argument in turn */
static char buf[256];
unsigned int level;
_CPU_ISR_Disable(level);
va_start(ap, fmt); /* make ap point to 1st unnamed arg */
vsprintf(buf, fmt, ap); /* send output to buffer */
BSP_output_string(buf); /* print buffer -- Channel 1 */
va_end(ap); /* clean up and re-enable interrupts */
_CPU_ISR_Enable(level);
}
void BSP_output_string( char * buf )
{
int len = strlen(buf);
rtems_status_code sc;
/* The first argument forces a print to Port2 (ttyS1) */
sc = _167Bug_pollWrite(1, buf, len);
if (sc != RTEMS_SUCCESSFUL)
rtems_fatal_error_occurred (sc);
}
/*
***************
* BOILERPLATE *
@@ -1229,7 +1271,7 @@ rtems_device_driver console_open(
NULL, /* startRemoteTx */
0 /* outputUsesInterrupts */
};
#else
static const rtems_termios_callbacks callbacks = {
@@ -1242,7 +1284,7 @@ rtems_device_driver console_open(
cd2401_startRemoteTx, /* startRemoteTx */
1 /* outputUsesInterrupts */
};
#endif
return rtems_termios_open (major, minor, arg, &callbacks);

View File

@@ -25,7 +25,7 @@ TMPINSTALL_FILES += $(PROJECT_INCLUDE) $(PROJECT_INCLUDE)/bsp.h \
$(PROJECT_INCLUDE)/coverhd.h $(PROJECT_INCLUDE)/page_table.h \
$(PROJECT_INCLUDE)/fatal.h
all-local: $(TMPINSTALL_FILES)
all: $(TMPINSTALL_FILES)
EXTRA_DIST = bsp.h coverhd.h fatal.h page_table.h

View File

@@ -32,6 +32,15 @@ extern "C" {
#include <iosupp.h>
/*
* Network driver configuration
*/
struct rtems_bsdnet_ifconfig;
extern int uti596_attach(struct rtems_bsdnet_ifconfig * pConfig );
#define RTEMS_BSP_NETWORK_DRIVER_NAME "uti1"
#define RTEMS_BSP_NETWORK_DRIVER_ATTACH uti596_attach
/*
* This is NOT the base address of local RAM!
* This is the base local address of the VMEbus short I/O space. A local
@@ -396,6 +405,28 @@ typedef volatile struct cd2401_regs_ {
void console_reserve_resources( rtems_configuration_table *configuration );
/*
* Debug print functions: implemented in console.c
*/
void printk( char *fmt, ... );
void BSP_output_string( char * buf );
/*
* Representation of 82596CA LAN controller: Memory Map
*/
typedef volatile struct i82596_regs_ {
unsigned short port_lower; /* 0xFFF46000 */
unsigned short port_upper; /* 0xFFF46002 */
unsigned long chan_attn; /* 0xFFF46004 */
} i82596_regs;
/*
* Base address of the 82596.
*/
#define i82596 ((i82596_regs * const) 0xFFF46000)
/* BSP-wide functions */
void bsp_cleanup( void );

View File

@@ -9,7 +9,7 @@ PGM = $(ARCH)/network.rel
C_FILES = network.c
C_O_FILES = $(C_FILES:%.c=$(ARCH)/%.o)
H_FILES = uti596.h
H_FILES = netexterns.h uti596.h
OBJS = $(C_O_FILES)
@@ -20,6 +20,8 @@ include $(top_srcdir)/../../../../../../automake/lib.am
# (OPTIONAL) Add local stuff here using +=
#
AM_CPPFLAGS += -D__INSIDE_RTEMS_BSD_TCPIP_STACK__
$(PGM): $(OBJS)
$(make-rel)
@@ -31,6 +33,6 @@ endif
.PRECIOUS: $(PGM)
EXTRA_DIST = network.c uti596.h
EXTRA_DIST = network.c netexterns.h uti596.h
include $(top_srcdir)/../../../../../../automake/local.am

View File

@@ -11,7 +11,7 @@
extern int uti596_attach(struct rtems_bsdnet_ifconfig *);
extern int uti596dump(char * );
extern void uti596reset(void);
extern void uti596reset(void);
extern void uti596Diagnose(int);
extern void uti596_request_reset(void);

View File

@@ -1,4 +1,5 @@
/* uti596.h: Contains the defines and structures used by the uti596 driver */
/*
@@ -26,30 +27,30 @@
/* Ethernet statistics */
struct enet_statistics{
int rx_packets; /* total packets received */
int tx_packets; /* total packets transmitted */
int rx_errors; /* bad packets received */
int tx_errors; /* packet transmit problems */
int rx_dropped; /* no space in buffers */
int tx_dropped;
int rx_packets; /* total packets received */
int tx_packets; /* total packets transmitted */
int rx_errors; /* bad packets received */
int tx_errors; /* packet transmit problems */
int rx_dropped; /* no space in buffers */
int tx_dropped;
int tx_retries_exceeded; /* excessive retries */
int multicast; /* multicast packets received */
int collisions;
int multicast; /* multicast packets received */
int collisions;
/* detailed rx_errors: */
int rx_length_errors;
int rx_over_errors; /* receiver ring buff overflow */
int rx_crc_errors; /* recved pkt with crc error */
int rx_frame_errors; /* recv'd frame alignment error */
int rx_fifo_errors; /* recv'r fifo overrun */
int rx_missed_errors; /* receiver missed packet */
int rx_length_errors;
int rx_over_errors; /* receiver ring buff overflow */
int rx_crc_errors; /* recved pkt with crc error */
int rx_frame_errors; /* recv'd frame alignment error */
int rx_fifo_errors; /* recv'r fifo overrun */
int rx_missed_errors; /* receiver missed packet */
/* detailed tx_errors */
int tx_aborted_errors;
int tx_carrier_errors;
int tx_fifo_errors;
int tx_heartbeat_errors;
int tx_window_errors;
int tx_aborted_errors;
int tx_carrier_errors;
int tx_fifo_errors;
int tx_heartbeat_errors;
int tx_window_errors;
/* NIC reset errors */
int nic_reset_count; /* The number of times uti596reset() has been called. */
@@ -58,62 +59,62 @@ struct enet_statistics{
#define UTI596_MUTEX 1
#define CMD_EOL 0x8000 /* The last command of the list, stop. */
#define CMD_SUSP 0x4000 /* Suspend after doing cmd. */
#define CMD_INTR 0x2000 /* Interrupt after doing cmd. */
#define CMD_EOL 0x8000 /* The last command of the list, stop. */
#define CMD_SUSP 0x4000 /* Suspend after doing cmd. */
#define CMD_INTR 0x2000 /* Interrupt after doing cmd. */
#define CMD_FLEX 0x0008 /* Enable flexible memory model */
#define CMD_FLEX 0x0008 /* Enable flexible memory model */
#define SCB_STAT_CX 0x8000 /* Cmd completes with 'I' bit set */
#define SCB_STAT_FR 0x4000 /* Frame Received */
#define SCB_STAT_CNA 0x2000 /* Cmd unit Not Active */
#define SCB_STAT_RNR 0x1000 /* Receiver Not Ready */
#define SCB_STAT_CX 0x8000 /* Cmd completes with 'I' bit set */
#define SCB_STAT_FR 0x4000 /* Frame Received */
#define SCB_STAT_CNA 0x2000 /* Cmd unit Not Active */
#define SCB_STAT_RNR 0x1000 /* Receiver Not Ready */
#define SCB_CUS_SUSPENDED 0x0100
#define SCB_CUS_ACTIVE 0x0200
#define STAT_C 0x8000 /* Set to 1 after execution */
#define STAT_B 0x4000 /* 1 : Cmd being executed, 0 : Cmd done. */
#define STAT_OK 0x2000 /* 1: Command executed ok 0 : Error */
#define STAT_A 0x1000 /* command has been aborted */
#define STAT_C 0x8000 /* Set to 1 after execution */
#define STAT_B 0x4000 /* 1 : Cmd being executed, 0 : Cmd done. */
#define STAT_OK 0x2000 /* 1: Command executed ok 0 : Error */
#define STAT_A 0x1000 /* command has been aborted */
#define STAT_S11 0x0800
#define STAT_S10 0x0400
#define STAT_S9 0x0200
#define STAT_S8 0x0100
#define STAT_S7 0x0080
#define STAT_S6 0x0040
#define STAT_S5 0x0020
#define STAT_MAX_COLLS 0x000F
#define STAT_S11 0x0800
#define STAT_S10 0x0400
#define STAT_S9 0x0200
#define STAT_S8 0x0100
#define STAT_S7 0x0080
#define STAT_S6 0x0040
#define STAT_S5 0x0020
#define STAT_MAX_COLLS 0x000F
#define RBD_STAT_P 0x4000 /* prefetch */
#define RBD_STAT_F 0x4000 /* used */
#define RBD_STAT_P 0x4000 /* prefetch */
#define RBD_STAT_F 0x4000 /* used */
#define CUC_START 0x0100
#define CUC_RESUME 0x0200
#define CUC_SUSPEND 0x0300
#define CUC_ABORT 0x0400
#define RX_START 0x0010
#define RX_RESUME 0x0020
#define RX_SUSPEND 0x0030
#define RX_ABORT 0x0040
#define CUC_START 0x0100
#define CUC_RESUME 0x0200
#define CUC_SUSPEND 0x0300
#define CUC_ABORT 0x0400
#define RX_START 0x0010
#define RX_RESUME 0x0020
#define RX_SUSPEND 0x0030
#define RX_ABORT 0x0040
#define RU_SUSPENDED 0x0010
#define RU_NO_RESOURCES 0x0020
#define RU_READY 0x0040
#define RU_SUSPENDED 0x0010
#define RU_NO_RESOURCES 0x0020
#define RU_READY 0x0040
#define IO_ADDR 0x360
#define PORT_ADDR IO_ADDR
#define CHAN_ATTN PORT_ADDR + 4
#define NIC_ADDR PORT_ADDR + 8
#define IO_ADDR 0x360
#define PORT_ADDR IO_ADDR
#define CHAN_ATTN PORT_ADDR + 4
#define NIC_ADDR PORT_ADDR + 8
#define I596_NULL ( ( void * ) 0xffffffff)
#define UTI_596_END_OF_FRAME 0x8000
#define SIZE_MASK 0x3fff
#define SIZE_MASK 0x3fff
struct i596_tbd;
@@ -271,9 +272,9 @@ typedef volatile struct uti596_softc {
i596_cmd *pCmdHead;
i596_cmd *pCmdTail; /* unneeded, as chaining not used, but implemented */
rtems_id rxDaemonTid;
rtems_id txDaemonTid;
rtems_id resetDaemonTid;
rtems_id rxDaemonTid;
rtems_id txDaemonTid;
rtems_id resetDaemonTid;
struct enet_statistics stats;
int started;
@@ -281,7 +282,7 @@ typedef volatile struct uti596_softc {
unsigned long txInterrupts;
volatile int cmdOk;
int resetDone;
unsigned long txRawWait;
unsigned long txRawWait;
i596_rfd *pInboundFrameQueue;
short int rxBdCount;
short int txBdCount;
@@ -296,3 +297,4 @@ typedef volatile struct uti596_softc {
} uti596_softc_;
#endif /* UTI596_H */

View File

@@ -32,16 +32,12 @@ $(PGM): $(OBJS)
$(PROJECT_RELEASE)/lib/linkcmds: linkcmds
$(INSTALL_DATA) $< $@
$(PROJECT_RELEASE)/lib/elflinkcmds: elflinkcmds
$(INSTALL_DATA) $< $@
TMPINSTALL_FILES += $(PROJECT_RELEASE)/lib/linkcmds \
$(PROJECT_RELEASE)/lib/elflinkcmds
TMPINSTALL_FILES += $(PROJECT_RELEASE)/lib/linkcmds
all-local: $(ARCH) $(OBJS) $(PGM) $(TMPINSTALL_FILES)
.PRECIOUS: $(PGM)
EXTRA_DIST = bspclean.c bspstart.c elflinkcmds linkcmds page_table.c
EXTRA_DIST = bspclean.c bspstart.c linkcmds page_table.c
include $(top_srcdir)/../../../../../../automake/local.am

View File

@@ -81,7 +81,6 @@ void bsp_start( void )
{
extern void *_WorkspaceBase;
extern m68k_isr_entry M68Kvec[];
extern void *_WorkspaceBase;
void M68KFPSPInstallExceptionHandlers (void);

View File

@@ -22,11 +22,11 @@ OUTPUT_ARCH(m68k)
ENTRY(_start)
/*
* Declare some sizes.
* Declare some sizes. Heap is sized at whatever ram space is left.
*/
_RamBase = 0x00800000;
_RamBase = DEFINED(_RamBase) ? _RamBase : 0x00800000;
_RamSize = DEFINED(_RamSize) ? _RamSize : 4M;
_HeapSize = DEFINED(_HeapSize) ? _HeapSize : 0x10000;
_HeapSize = DEFINED(_HeapSize) ? _HeapSize : 0;
_StackSize = DEFINED(_StackSize) ? _StackSize : 0x1000;
MEMORY
@@ -42,103 +42,144 @@ MEMORY
SECTIONS
{
ram : {
. = .;
} >ram
/*
* Text, data and bss segments
*/
.text : {
*(.text)
/*
* Text, data and bss segments
*/
.text : {
*(.text)
/*
* C++ constructors/destructors
*/
*(.gnu.linkonce.t.*)
/*
* C++ constructors/destructors
*/
*(.gnu.linkonce.t.*)
/*
* Initialization and finalization code.
*
* Various files can provide initialization and finalization
* functions. crtbegin.o and crtend.o are two instances. The
* body of these functions are in .init and .fini sections. We
* accumulate the bodies here, and prepend function prologues
* from crti.o and function epilogues from crtn.o. crti.o must
* be linked first; crtn.o must be linked last. Because these
* are wildcards, it doesn't matter if the user does not
* actually link against crti.o and crtn.o; the linker won't
* look for a file to match a wildcard. The wildcard also
* means that it doesn't matter which directory crti.o and
* crtn.o are in.
*/
PROVIDE (_init = .);
*crti.o(.init)
*(.init)
*crtn.o(.init)
PROVIDE (_fini = .);
*crti.o(.fini)
*(.fini)
*crtn.o(.fini)
/*
* Initialization and finalization code.
*
* Various files can provide initialization and finalization
* functions. crtbegin.o and crtend.o are two instances. The
* body of these functions are in .init and .fini sections. We
* accumulate the bodies here, and prepend function prologues
* from crti.o and function epilogues from crtn.o. crti.o must
* be linked first; crtn.o must be linked last. Because these
* are wildcards, it doesn't matter if the user does not
* actually link against crti.o and crtn.o; the linker won't
* look for a file to match a wildcard. The wildcard also
* means that it doesn't matter which directory crti.o and
* crtn.o are in.
*/
PROVIDE (_init = .);
*crti.o(.init)
*(.init)
*crtn.o(.init)
PROVIDE (_fini = .);
*crti.o(.fini)
*(.fini)
*crtn.o(.fini)
/*
* C++ constructors/destructors
*
* gcc uses crtbegin.o to find the start of the constructors
* and destructors so we make sure it is first. Because this
* is a wildcard, it doesn't matter if the user does not
* actually link against crtbegin.o; the linker won't look for
* a file to match a wildcard. The wildcard also means that
* it doesn't matter which directory crtbegin.o is in. The
* constructor and destructor list are terminated in
* crtend.o. The same comments apply to it.
*/
. = ALIGN (16);
*crtbegin.o(.ctors)
*(.ctors)
*crtend.o(.ctors)
*crtbegin.o(.dtors)
*(.dtors)
*crtend.o(.dtors)
/*
* C++ constructors/destructors
*
* gcc uses crtbegin.o to find the start of the constructors
* and destructors so we make sure it is first. Because this
* is a wildcard, it doesn't matter if the user does not
* actually link against crtbegin.o; the linker won't look for
* a file to match a wildcard. The wildcard also means that
* it doesn't matter which directory crtbegin.o is in. The
* constructor and destructor list are terminated in
* crtend.o. The same comments apply to it.
*/
. = ALIGN (16);
*crtbegin.o(.ctors)
*(.ctors)
*crtend.o(.ctors)
*crtbegin.o(.dtors)
*(.dtors)
*crtend.o(.dtors)
/*
* Exception frame info
*/
. = ALIGN (16);
*(.eh_frame)
/*
* Exception frame info
*/
. = ALIGN (16);
*(.eh_frame)
/*
* Read-only data
*/
. = ALIGN (16);
PROVIDE(_rodata_start = . );
*(.rodata)
*(.gnu.linkonce.r*)
PROVIDE(_erodata = . );
/*
* Read-only data
*/
. = ALIGN (16);
_rodata_start = . ;
*(.rodata)
*(.gnu.linkonce.r*)
. = ALIGN (16);
PROVIDE (_etext = .);
} >ram
.data : {
PROVIDE (_copy_start = .);
*(.data)
*(.gnu.linkonce.d*)
*(.gcc_except_table)
. = ALIGN (16);
PROVIDE (_edata = .);
PROVIDE (_copy_end = .);
} >ram
.bss : {
_clear_start = .;
*(.bss)
*(COMMON)
. = ALIGN (16);
PROVIDE (end = .);
. = ALIGN (16);
PROVIDE (_etext = .);
} >ram
.data : {
PROVIDE (_copy_start = .);
*(.data)
*(.gnu.linkonce.d*)
*(.gcc_except_table)
. = ALIGN (16);
PROVIDE (_edata = .);
PROVIDE (_copy_end = .);
} >ram
.bss : {
_clear_start = .;
*(.bss)
*(COMMON)
. = ALIGN (16);
PROVIDE (end = .);
. += _StackSize;
. = ALIGN (16);
_stack_init = .;
_clear_end = .;
. += _StackSize;
. = ALIGN (16);
_stack_init = .;
_clear_end = .;
_WorkspaceBase = .;
} >ram
_WorkspaceBase = .;
} >ram
/* 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) }
/* These must appear regardless of . */
}

View File

@@ -79,7 +79,7 @@ void page_table_init(
* E = 0b1 enable address translation
* S-Field = 0b1X ignore FC2 when matching
* U1, U0 = 0b00 user page attributes not used
* CM = 0b01 cachable, writethrough
* CM = 0b01 cachable, copyback
* W = 0b0 read/write access allowed
*/
dtt0 = 0x007FC020;

View File

@@ -4,7 +4,12 @@
AUTOMAKE_OPTIONS = foreign 1.4
BSP_PIECES = clock console fatal startup timer
# We only build the networking device driver if HAS_NETWORKING was defined
if HAS_NETWORKING
NETWORKING_DRIVER = network
endif
BSP_PIECES = clock console fatal startup timer $(NETWORKING_DRIVER)
# bummer; have to use $foreach since % pattern subst rules only replace 1x
OBJS = $(foreach piece, $(BSP_PIECES), $(wildcard ../$(piece)/$(ARCH)/*.o)) \

View File

@@ -35,6 +35,7 @@ extern void bsp_libc_init( void *, unsigned long, int );
extern rtems_configuration_table BSP_Configuration;
extern unsigned long _RamSize;
extern void *_RamBase;
extern void *_WorkspaceBase;
extern void *_HeapSize;
@@ -46,7 +47,7 @@ void bsp_pretasking_hook(void)
heapStart = (void *)
((unsigned long)&_WorkspaceBase + BSP_Configuration.work_space_size);
ramSpace = _RamSize - (unsigned long) heapStart;
ramSpace = (unsigned long) &_RamBase + (unsigned long) &_RamSize - (unsigned long) heapStart;
if (heapSize == 0)
heapSize = ramSpace;