forked from Imagelibrary/rtems
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:
@@ -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
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
|
||||
@@ -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: \
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 {
|
||||
@@ -1081,21 +1082,25 @@ int _167Bug_pollRead(
|
||||
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;
|
||||
}
|
||||
@@ -1128,17 +1133,54 @@ 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 *
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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 );
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 */
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -81,7 +81,6 @@ void bsp_start( void )
|
||||
{
|
||||
extern void *_WorkspaceBase;
|
||||
extern m68k_isr_entry M68Kvec[];
|
||||
extern void *_WorkspaceBase;
|
||||
|
||||
void M68KFPSPInstallExceptionHandlers (void);
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
/*
|
||||
* 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)
|
||||
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)
|
||||
|
||||
/*
|
||||
* Exception frame info
|
||||
*/
|
||||
. = ALIGN (16);
|
||||
*(.eh_frame)
|
||||
*crtbegin.o(.dtors)
|
||||
*(.dtors)
|
||||
*crtend.o(.dtors)
|
||||
|
||||
/*
|
||||
* Read-only data
|
||||
*/
|
||||
. = ALIGN (16);
|
||||
_rodata_start = . ;
|
||||
*(.rodata)
|
||||
*(.gnu.linkonce.r*)
|
||||
/*
|
||||
* Exception frame info
|
||||
*/
|
||||
. = ALIGN (16);
|
||||
*(.eh_frame)
|
||||
|
||||
. = 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 = .);
|
||||
/*
|
||||
* Read-only data
|
||||
*/
|
||||
. = ALIGN (16);
|
||||
PROVIDE(_rodata_start = . );
|
||||
*(.rodata)
|
||||
*(.gnu.linkonce.r*)
|
||||
PROVIDE(_erodata = . );
|
||||
|
||||
. += _StackSize;
|
||||
. = ALIGN (16);
|
||||
_stack_init = .;
|
||||
_clear_end = .;
|
||||
. = ALIGN (16);
|
||||
PROVIDE (_etext = .);
|
||||
} >ram
|
||||
|
||||
_WorkspaceBase = .;
|
||||
} >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 = .;
|
||||
|
||||
_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 . */
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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)) \
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -4,6 +4,9 @@
|
||||
# $Id$
|
||||
#
|
||||
|
||||
# THIS BSP USES ELF IMAGES. IT WILL NOT WORK WITH COFF UNLESS CHANGES
|
||||
# ARE MADE TO THE LINKCMDS FILE.
|
||||
|
||||
RTEMS_CPU=m68k
|
||||
RTEMS_CPU_MODEL=m68040
|
||||
|
||||
@@ -14,10 +17,12 @@ RTEMS_BSP_FAMILY=mvme167
|
||||
|
||||
#
|
||||
# This contains the compiler options necessary to select the CPU model
|
||||
# and (hopefully) optimize for it.
|
||||
# and (hopefully) optimize for it. We also specify the BSP during compilation.
|
||||
# This should really get its own flag, but it works here.
|
||||
#
|
||||
|
||||
CPU_CFLAGS = -m68040
|
||||
CPU_CFLAGS = -m68040 -DRTEMS_BSP=$(RTEMS_BSP)
|
||||
CFLAGS_DEBUG_V += -ggdb
|
||||
|
||||
# optimize flag: typically -O, could use -O4 or -fast
|
||||
# -O4 is ok for RTEMS
|
||||
@@ -33,11 +38,21 @@ CFLAGS_OPTIMIZE_V=-O4 -fomit-frame-pointer
|
||||
#
|
||||
# RTEMS_DEBUG (RTEMS)
|
||||
# If defined, debug checks in RTEMS and support library code are enabled.
|
||||
#
|
||||
# CD2401_INT_LEVEL
|
||||
# Interrupt level for the CD2401.
|
||||
#
|
||||
# CD2401_POLLED_IO
|
||||
# 0 for interrupt-driven, 1 for polled I/O.
|
||||
|
||||
define make-target-options
|
||||
@echo "/* #define NDEBUG 1 */ " >>$@
|
||||
@echo "#define RTEMS_TEST_NO_PAUSE 1" >>$@
|
||||
@echo "/* #define RTEMS_DEBUG 1 */" >>$@
|
||||
@echo "#define CD2401_INT_LEVEL 1" >>$@
|
||||
@echo "#define CD2401_POLLED_IO 1" >>$@
|
||||
|
||||
|
||||
endef
|
||||
|
||||
# Here is the rule to actually build a $(ARCH)/foo.exe
|
||||
@@ -79,7 +94,8 @@ define make-exe
|
||||
$(LINK.c) $(AM_CFLAGS) $(AM_LDFLAGS) -o $@ \
|
||||
$(LINK_OBJS) $(LINK_LIBS)
|
||||
$(NM) -g -n $@ > $(basename $@).nm
|
||||
$(SIZE) $@
|
||||
$(STRIP) -o $(basename $@) $@
|
||||
$(SIZE) $(basename $@).exe
|
||||
endef
|
||||
endif
|
||||
|
||||
|
||||
Reference in New Issue
Block a user