mirror of
https://gitlab.rtems.org/rtems/rtos/rtems.git
synced 2025-12-05 15:15:44 +00:00
New BSP from Tony R. Ambardar <tonya@ece.ubc.ca> from the
University of British Columbia. The BSP is for:
Yes, this is the "entry model" of a series of boards from Technologic
Systems. Costs <$200 I believe. They have a WWW page at www.t-systems.com.
I am letting them know about the availability of this BSP too.
This commit is contained in:
31
c/src/lib/libbsp/i386/ts_386ex/Makefile.in
Normal file
31
c/src/lib/libbsp/i386/ts_386ex/Makefile.in
Normal file
@@ -0,0 +1,31 @@
|
||||
#
|
||||
# $Id$
|
||||
#
|
||||
|
||||
@SET_MAKE@
|
||||
srcdir = @srcdir@
|
||||
top_srcdir = @top_srcdir@
|
||||
top_builddir = ../../../../../..
|
||||
subdir = c/src/lib/libbsp/i386/ts_386ex
|
||||
|
||||
INSTALL = @INSTALL@
|
||||
|
||||
RTEMS_ROOT = $(top_srcdir)/@RTEMS_TOPdir@
|
||||
PROJECT_ROOT = @PROJECT_ROOT@
|
||||
|
||||
VPATH = @srcdir@
|
||||
|
||||
include $(RTEMS_ROOT)/make/custom/$(RTEMS_BSP).cfg
|
||||
include $(RTEMS_ROOT)/make/directory.cfg
|
||||
|
||||
# We only build the Network library if HAS_NETWORKING was defined
|
||||
NETWORK_yes_V = network
|
||||
NETWORK = $(NETWORK_$(HAS_NETWORKING)_V)
|
||||
|
||||
# wrapup is the one that actually builds and installs the library
|
||||
# from the individual .rel files built in other directories
|
||||
SUB_DIRS=include start startup clock console timer $(NETWORK) wrapup
|
||||
|
||||
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
||||
cd $(top_builddir) \
|
||||
&& CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
|
||||
43
c/src/lib/libbsp/i386/ts_386ex/README
Normal file
43
c/src/lib/libbsp/i386/ts_386ex/README
Normal file
@@ -0,0 +1,43 @@
|
||||
#
|
||||
# $Id$
|
||||
#
|
||||
|
||||
This BSP is for the Technologic Systems TS-1325, an i386EX PC/AT
|
||||
compatible SBC equipped with 2 standard serial ports and a parallel
|
||||
port suitable for general digital I/O. It comes with 2MB RAM and 1MB
|
||||
Flash ROM. Additional information is available at the TS web site:
|
||||
http://www.t-systems.com.
|
||||
|
||||
The BSP uses software floating-point emulation, so one must build the
|
||||
cross-compilation tools with this support. The BSP also supports the
|
||||
on-board RTC, and an NE2000 compatible network card. It has been used
|
||||
successfully with C (gcc-2.8.1) and Ada95 (gnat-3.11p), including
|
||||
networking applications in both languages.
|
||||
|
||||
The TS-1325 runs a version of DOS, and should be configured with a RAM
|
||||
disk and Zmodem software (see WWW site). RTEMS executables are loaded
|
||||
and run in DOS conventional memory, giving a 600K file-size limit. The
|
||||
1MB extended memory is used for the RTEMS workspace, heap, stack and
|
||||
BSS. Console output is to COM2 @ 115200 baud, 8-N-1. The high baud
|
||||
rate is needed to speed up serial-line Zmodem file transfers. The
|
||||
TS-1325 DOS console I/O is by default 9600 baud, and should be changed
|
||||
to 115200 baud (see WWW site).
|
||||
|
||||
A typical development cycle involves these steps:
|
||||
|
||||
1. Cross-compile the application, yielding a COFF executable. Convert this
|
||||
to raw binary format, using objcopy or the coff2bin script (see the
|
||||
tools subdirectory in the BSP).
|
||||
|
||||
2. Use Zmodem to download the raw exec to the TS-1325's ram-disk
|
||||
(faster than the A: flash disk). A terminal program supporting
|
||||
Zmodem is needed on the host e.g. minicom under Linux.
|
||||
|
||||
3. Use the DOS-based RTEMS loader "loader.com" (see tools
|
||||
subdirectory) to load and run the executable.
|
||||
|
||||
Additional documentation and support software is in the tools BSP subdirectory.
|
||||
|
||||
Happy Coding!
|
||||
|
||||
Tony Ambardar, 4/21/99
|
||||
23
c/src/lib/libbsp/i386/ts_386ex/bsp_specs
Normal file
23
c/src/lib/libbsp/i386/ts_386ex/bsp_specs
Normal file
@@ -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__} -Asystem(embedded)
|
||||
|
||||
*lib:
|
||||
%{!qrtems: %(old_lib)} %{qrtems: --start-group \
|
||||
%{!qrtems_debug: -lrtemsall} %{qrtems_debug: -lrtemsall_g} \
|
||||
-lc -lgcc --end-group \
|
||||
%{!qnolinkcmds: -T linkcmds%s}}
|
||||
|
||||
*startfile:
|
||||
%{!qrtems: %(old_startfile)} %{qrtems: \
|
||||
%{!qrtems_debug: start.o%s} \
|
||||
%{qrtems_debug: start_g.o%s}}
|
||||
|
||||
*link:
|
||||
%{!qrtems: %(old_link)} %{qrtems: -dc -dp -N -e _init_i386ex}
|
||||
|
||||
70
c/src/lib/libbsp/i386/ts_386ex/clock/Makefile.in
Normal file
70
c/src/lib/libbsp/i386/ts_386ex/clock/Makefile.in
Normal file
@@ -0,0 +1,70 @@
|
||||
#
|
||||
# $Id$
|
||||
#
|
||||
|
||||
@SET_MAKE@
|
||||
srcdir = @srcdir@
|
||||
top_srcdir = @top_srcdir@
|
||||
top_builddir = ../../../../../../..
|
||||
subdir = c/src/lib/libbsp/i386/ts_386ex/clock
|
||||
|
||||
INSTALL = @INSTALL@
|
||||
|
||||
RTEMS_ROOT = $(top_srcdir)/@RTEMS_TOPdir@
|
||||
PROJECT_ROOT = @PROJECT_ROOT@
|
||||
|
||||
VPATH = @srcdir@
|
||||
|
||||
PGM=${ARCH}/clock.rel
|
||||
|
||||
# C source names, if any, go here -- minus the .c
|
||||
C_PIECES=ckinit rtc
|
||||
C_FILES=$(C_PIECES:%=%.c)
|
||||
C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
|
||||
|
||||
H_FILES=
|
||||
|
||||
# Assembly source names, if any, go here -- minus the .S
|
||||
S_PIECES=
|
||||
S_FILES=$(S_PIECES:%=%.S)
|
||||
S_O_FILES=$(S_FILES:%.S=${ARCH}/%.o)
|
||||
|
||||
SRCS=$(C_FILES) $(CC_FILES) $(H_FILES) $(S_FILES)
|
||||
OBJS=$(C_O_FILES) $(CC_O_FILES) $(S_O_FILES)
|
||||
|
||||
include $(RTEMS_ROOT)/make/custom/$(RTEMS_BSP).cfg
|
||||
include $(RTEMS_ROOT)/make/leaf.cfg
|
||||
|
||||
#
|
||||
# (OPTIONAL) Add local stuff here using +=
|
||||
#
|
||||
|
||||
DEFINES +=
|
||||
CPPFLAGS +=
|
||||
CFLAGS +=
|
||||
|
||||
LD_PATHS +=
|
||||
LD_LIBS +=
|
||||
LDFLAGS +=
|
||||
|
||||
#
|
||||
# Add your list of files to delete here. The config files
|
||||
# already know how to delete some stuff, so you may want
|
||||
# to just run 'make clean' first to see what gets missed.
|
||||
# 'make clobber' already includes 'make clean'
|
||||
#
|
||||
|
||||
CLEAN_ADDITIONS +=
|
||||
CLOBBER_ADDITIONS +=
|
||||
|
||||
${PGM}: ${SRCS} ${OBJS}
|
||||
$(make-rel)
|
||||
|
||||
all: ${ARCH} $(SRCS) $(PGM)
|
||||
|
||||
# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
|
||||
install: all
|
||||
|
||||
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
||||
cd $(top_builddir) \
|
||||
&& CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
|
||||
191
c/src/lib/libbsp/i386/ts_386ex/clock/ckinit.c
Normal file
191
c/src/lib/libbsp/i386/ts_386ex/clock/ckinit.c
Normal file
@@ -0,0 +1,191 @@
|
||||
/* Clock_initialize
|
||||
*
|
||||
* This routine initializes the Timer/Counter on the Intel
|
||||
* 386ex evaluation board.
|
||||
*
|
||||
* The tick frequency is 1 millisecond.
|
||||
*
|
||||
* Input parameters: NONE
|
||||
*
|
||||
* Output parameters: NONE
|
||||
*
|
||||
* COPYRIGHT (c) 1989-1998.
|
||||
* On-Line Applications Research Corporation (OAR).
|
||||
* Copyright assigned to U.S. Government, 1994.
|
||||
*
|
||||
* 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 <bsp.h>
|
||||
#include <irq.h>
|
||||
|
||||
#include <rtems/libio.h>
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
rtems_unsigned32 Clock_isrs; /* ISRs until next tick */
|
||||
static rtems_unsigned32 Clock_initial_isr_value;
|
||||
|
||||
volatile rtems_unsigned32 Clock_driver_ticks;
|
||||
|
||||
void Clock_exit( void );
|
||||
|
||||
/*
|
||||
* These are set by clock driver during its init
|
||||
*/
|
||||
|
||||
rtems_device_major_number rtems_clock_major = ~0;
|
||||
rtems_device_major_number rtems_clock_minor = 0;
|
||||
|
||||
/*
|
||||
* This is the ISR handler.
|
||||
*/
|
||||
|
||||
void Clock_isr()
|
||||
{
|
||||
/* enable_tracing(); */
|
||||
Clock_driver_ticks += 1;
|
||||
if ( Clock_isrs == 1 ) {
|
||||
rtems_clock_tick();
|
||||
Clock_isrs = Clock_initial_isr_value; /* BSP_Configuration.microseconds_per_tick / 1000;*/
|
||||
}
|
||||
else
|
||||
Clock_isrs -= 1;
|
||||
}
|
||||
|
||||
void ClockOff(const rtems_irq_connect_data* unused)
|
||||
{
|
||||
outport_byte (TIMER_CONFIG, 0x80 ); /* disable the counter timer */
|
||||
}
|
||||
|
||||
void ClockOn(const rtems_irq_connect_data* unused)
|
||||
{
|
||||
outport_byte (TIMER_CONFIG, 0x00 ); /* enable the counter timer */
|
||||
}
|
||||
|
||||
int ClockIsOn(const rtems_irq_connect_data* unused)
|
||||
{
|
||||
return ((i8259s_cache & 0x1) == 0);
|
||||
}
|
||||
|
||||
static rtems_irq_connect_data clockIrqData = {BSP_PERIODIC_TIMER,
|
||||
Clock_isr,
|
||||
ClockOn,
|
||||
ClockOff,
|
||||
ClockIsOn};
|
||||
|
||||
|
||||
rtems_device_driver Clock_initialize(
|
||||
rtems_device_major_number major,
|
||||
rtems_device_minor_number minor,
|
||||
void *pargp
|
||||
)
|
||||
{
|
||||
unsigned timer_counter_init_value;
|
||||
unsigned char clock_lsb, clock_msb;
|
||||
|
||||
#ifdef BSP_DEBUG
|
||||
printk("Initializing clock driver in Clock_initialize().\n");
|
||||
#endif
|
||||
|
||||
#ifdef LOAD_RTC_AT_START
|
||||
/* Initialize clock from on-board real time clock. This breaks the */
|
||||
/* test code which assumes which assumes the application will do it. */
|
||||
{
|
||||
rtems_time_of_day now;
|
||||
|
||||
/* External Prototypes */
|
||||
extern void init_rtc(void); /* defined in 'rtc.c' */
|
||||
extern long rtc_read(rtems_time_of_day *); /* defined in 'rtc.c' */
|
||||
|
||||
#ifdef BSP_DEBUG
|
||||
printk("Loading clock from on-board real-time clock.\n");
|
||||
#endif
|
||||
|
||||
init_rtc();
|
||||
if (rtc_read(&now) >= 0)
|
||||
rtems_clock_set(&now);
|
||||
}
|
||||
#endif
|
||||
|
||||
Clock_driver_ticks = 0;
|
||||
|
||||
Clock_isrs =
|
||||
Clock_initial_isr_value =
|
||||
BSP_Configuration.microseconds_per_tick / 1000; /* ticks per clock_isr */
|
||||
|
||||
/*
|
||||
* configure the counter timer ( should be based on microsecs/tick )
|
||||
* NB. The divisor(Clock_isrs) resolves the is the same number that appears in confdefs.h
|
||||
* when setting the microseconds_per_tick value.
|
||||
*/
|
||||
ClockOff ( &clockIrqData );
|
||||
|
||||
timer_counter_init_value = BSP_Configuration.microseconds_per_tick / Clock_isrs;
|
||||
clock_lsb = (unsigned char)timer_counter_init_value;
|
||||
clock_msb = timer_counter_init_value >> 8;
|
||||
|
||||
outport_byte (TIMER_MODE, TIMER_SEL0|TIMER_16BIT|TIMER_RATEGEN);
|
||||
outport_byte (TIMER_CNTR0, clock_lsb ); /* load LSB first */
|
||||
outport_byte (TIMER_CNTR0, clock_msb ); /* then MSB */
|
||||
|
||||
if (!BSP_install_rtems_irq_handler (&clockIrqData)) {
|
||||
printk("Unable to initialize system clock\n");
|
||||
rtems_fatal_error_occurred(1);
|
||||
}
|
||||
|
||||
/*
|
||||
* make major/minor avail to others such as shared memory driver
|
||||
*/
|
||||
|
||||
rtems_clock_major = major;
|
||||
rtems_clock_minor = minor;
|
||||
|
||||
return RTEMS_SUCCESSFUL;
|
||||
}
|
||||
|
||||
rtems_device_driver Clock_control(
|
||||
rtems_device_major_number major,
|
||||
rtems_device_minor_number minor,
|
||||
void *pargp
|
||||
)
|
||||
{
|
||||
rtems_libio_ioctl_args_t *args = pargp;
|
||||
|
||||
if (args == 0)
|
||||
goto done;
|
||||
|
||||
/*
|
||||
* This is hokey, but until we get a defined interface
|
||||
* to do this, it will just be this simple...
|
||||
*/
|
||||
|
||||
if (args->command == rtems_build_name('I', 'S', 'R', ' '))
|
||||
{
|
||||
Clock_isr();
|
||||
}
|
||||
else if (args->command == rtems_build_name('N', 'E', 'W', ' '))
|
||||
{
|
||||
if (!BSP_install_rtems_irq_handler (&clockIrqData)) {
|
||||
printk("Error installing clock interrupt handler!\n");
|
||||
rtems_fatal_error_occurred(1);
|
||||
}
|
||||
#ifdef BSP_DEBUG
|
||||
else
|
||||
printk("Clock installed AGAIN\n");
|
||||
#endif
|
||||
}
|
||||
|
||||
done:
|
||||
return RTEMS_SUCCESSFUL;
|
||||
}
|
||||
|
||||
void Clock_exit()
|
||||
{
|
||||
ClockOff(&clockIrqData);
|
||||
BSP_remove_rtems_irq_handler (&clockIrqData);
|
||||
}
|
||||
226
c/src/lib/libbsp/i386/ts_386ex/clock/rtc.c
Normal file
226
c/src/lib/libbsp/i386/ts_386ex/clock/rtc.c
Normal file
@@ -0,0 +1,226 @@
|
||||
/*-------------------------------------------------------------------------+
|
||||
| rtc.c v1.1 - PC386 BSP - 1997/08/07
|
||||
+--------------------------------------------------------------------------+
|
||||
| This file contains the real time clock manipulation package for the
|
||||
| PC386 board.
|
||||
+--------------------------------------------------------------------------+
|
||||
| (C) Copyright 1997 -
|
||||
| - NavIST Group - Real-Time Distributed Systems and Industrial Automation
|
||||
|
|
||||
| http://pandora.ist.utl.pt
|
||||
|
|
||||
| Instituto Superior Tecnico * Lisboa * PORTUGAL
|
||||
+--------------------------------------------------------------------------+
|
||||
| Disclaimer:
|
||||
|
|
||||
| This file is provided "AS IS" without warranty of any kind, either
|
||||
| expressed or implied.
|
||||
+--------------------------------------------------------------------------+
|
||||
| This code is based on:
|
||||
| rtc.c,v 1.4 1995/12/19 20:07:15 joel Exp - go32 BSP
|
||||
| With the following copyright notice:
|
||||
| **************************************************************************
|
||||
| * COPYRIGHT (c) 1989-1998.
|
||||
| * On-Line Applications Research Corporation (OAR).
|
||||
| * Copyright assigned to U.S. Government, 1994.
|
||||
| *
|
||||
| * The license and distribution terms for this file may be
|
||||
| * found in found in the file LICENSE in this distribution or at
|
||||
| * http://www.OARcorp.com/rtems/license.html.
|
||||
| **************************************************************************
|
||||
|
|
||||
| $Id$
|
||||
+--------------------------------------------------------------------------*/
|
||||
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include <bsp.h>
|
||||
|
||||
/*-------------------------------------------------------------------------+
|
||||
| Constants
|
||||
+--------------------------------------------------------------------------*/
|
||||
#define IO_RTC 0x70 /* RTC */
|
||||
|
||||
#define RTC_SEC 0x00 /* seconds */
|
||||
#define RTC_SECALRM 0x01 /* seconds alarm */
|
||||
#define RTC_MIN 0x02 /* minutes */
|
||||
#define RTC_MINALRM 0x03 /* minutes alarm */
|
||||
#define RTC_HRS 0x04 /* hours */
|
||||
#define RTC_HRSALRM 0x05 /* hours alarm */
|
||||
#define RTC_WDAY 0x06 /* week day */
|
||||
#define RTC_DAY 0x07 /* day of month */
|
||||
#define RTC_MONTH 0x08 /* month of year */
|
||||
#define RTC_YEAR 0x09 /* month of year */
|
||||
#define RTC_STATUSA 0x0a /* status register A */
|
||||
#define RTCSA_TUP 0x80 /* time update, don't look now */
|
||||
|
||||
#define RTC_STATUSB 0x0b /* status register B */
|
||||
|
||||
#define RTC_INTR 0x0c /* status register C (R) interrupt source */
|
||||
#define RTCIR_UPDATE 0x10 /* update intr */
|
||||
#define RTCIR_ALARM 0x20 /* alarm intr */
|
||||
#define RTCIR_PERIOD 0x40 /* periodic intr */
|
||||
#define RTCIR_INT 0x80 /* interrupt output signal */
|
||||
|
||||
#define RTC_STATUSD 0x0d /* status register D (R) Lost Power */
|
||||
#define RTCSD_PWR 0x80 /* clock lost power */
|
||||
|
||||
#define RTC_DIAG 0x0e /* status register E - bios diagnostic */
|
||||
#define RTCDG_BITS "\020\010clock_battery\007ROM_cksum\006config_unit\005memory_size\004fixed_disk\003invalid_time"
|
||||
|
||||
#define RTC_CENTURY 0x32 /* current century - increment in Dec99 */
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------+
|
||||
| Auxiliary Functions
|
||||
+--------------------------------------------------------------------------*/
|
||||
/*-------------------------------------------------------------------------+
|
||||
| Function: bcd
|
||||
| Description: Convert 2 digit number to its BCD representation.
|
||||
| Global Variables: None.
|
||||
| Arguments: i - Number to convert.
|
||||
| Returns: BCD representation of number.
|
||||
+--------------------------------------------------------------------------*/
|
||||
static inline rtems_unsigned8
|
||||
bcd(rtems_unsigned8 i)
|
||||
{
|
||||
return ((i / 16) * 10 + (i % 16));
|
||||
} /* bcd */
|
||||
|
||||
#define QUICK_READ /* Quick read of the RTC: don't return number of seconds. */
|
||||
|
||||
#ifndef QUICK_READ
|
||||
|
||||
#define SECS_PER_DAY (24 * 60 * 60)
|
||||
#define SECS_PER_REG_YEAR (365 * SECS_PER_DAY)
|
||||
|
||||
/*-------------------------------------------------------------------------+
|
||||
| Function: ytos
|
||||
| Description: Convert years to seconds (since 1970).
|
||||
| Global Variables: None.
|
||||
| Arguments: y - year to convert (1970 <= y <= 2100).
|
||||
| Returns: number of seconds since 1970.
|
||||
+--------------------------------------------------------------------------*/
|
||||
static inline rtems_unsigned32
|
||||
ytos(rtems_unsigned16 y)
|
||||
{ /* v NUM LEAP YEARS v */
|
||||
return ((y - 1970) * SECS_PER_REG_YEAR + (y - 1970 + 1) / 4 * SECS_PER_DAY);
|
||||
} /* ytos */
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------+
|
||||
| Function: mtos
|
||||
| Description: Convert months to seconds since January.
|
||||
| Global Variables: None.
|
||||
| Arguments: m - month to convert, leap - is this a month of a leap year.
|
||||
| Returns: number of seconds since January.
|
||||
+--------------------------------------------------------------------------*/
|
||||
static inline rtems_unsigned32
|
||||
mtos(rtems_unsigned8 m, rtems_boolean leap)
|
||||
{
|
||||
static rtems_unsigned16 daysMonth[] = { 0, 0, 31, 59, 90, 120, 151, 181,
|
||||
212, 243, 273, 304, 334, 365 };
|
||||
/* Days since beginning of year until beginning of month. */
|
||||
|
||||
return ((daysMonth[m] + (leap ? 1 : 0)) * SECS_PER_DAY);
|
||||
} /* mtos */
|
||||
|
||||
#endif /* QUICK_READ */
|
||||
|
||||
/*-------------------------------------------------------------------------+
|
||||
| Function: rtcin
|
||||
| Description: Perform action on RTC and return its result.
|
||||
| Global Variables: None.
|
||||
| Arguments: what - what to write to RTC port (what to do).
|
||||
| Returns: result received from RTC port after action performed.
|
||||
+--------------------------------------------------------------------------*/
|
||||
static inline rtems_unsigned8
|
||||
rtcin(rtems_unsigned8 what)
|
||||
{
|
||||
rtems_unsigned8 r;
|
||||
|
||||
outport_byte(IO_RTC, what);
|
||||
inport_byte (IO_RTC+1, r);
|
||||
return r;
|
||||
} /* rtcin */
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------+
|
||||
| Functions
|
||||
+--------------------------------------------------------------------------*/
|
||||
/*-------------------------------------------------------------------------+
|
||||
| Function: init_rtc
|
||||
| Description: Initialize real-time clock (RTC).
|
||||
| Global Variables: None.
|
||||
| Arguments: None.
|
||||
| Returns: Nothing.
|
||||
+--------------------------------------------------------------------------*/
|
||||
void
|
||||
init_rtc(void)
|
||||
{
|
||||
rtems_unsigned8 s;
|
||||
|
||||
/* initialize brain-dead battery powered clock */
|
||||
outport_byte(IO_RTC, RTC_STATUSA);
|
||||
outport_byte(IO_RTC+1, 0x26);
|
||||
outport_byte(IO_RTC, RTC_STATUSB);
|
||||
outport_byte(IO_RTC+1, 2);
|
||||
|
||||
outport_byte(IO_RTC, RTC_DIAG);
|
||||
inport_byte (IO_RTC+1, s);
|
||||
if (s)
|
||||
printk("RTC BIOS diagnostic error %b\n", s);
|
||||
|
||||
/* FIXME: This was last line's original version. How was it supposed to work?
|
||||
printf("RTC BIOS diagnostic error %b\n", s, RTCDG_BITS); */
|
||||
} /* init_rtc */
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------+
|
||||
| Function: rtc_read
|
||||
| Description: Read present time from RTC and return it.
|
||||
| Global Variables: None.
|
||||
| Arguments: tod - to return present time in 'rtems_time_of_day' format.
|
||||
| Returns: number of seconds from 1970/01/01 corresponding to 'tod'.
|
||||
+--------------------------------------------------------------------------*/
|
||||
long int
|
||||
rtc_read(rtems_time_of_day *tod)
|
||||
{
|
||||
rtems_unsigned8 sa;
|
||||
rtems_unsigned32 sec = 0;
|
||||
|
||||
memset(tod, 0, sizeof *tod); /* zero tod structure */
|
||||
|
||||
/* do we have a realtime clock present? (otherwise we loop below) */
|
||||
sa = rtcin(RTC_STATUSA);
|
||||
if (sa == 0xff || sa == 0)
|
||||
return -1;
|
||||
|
||||
/* ready for a read? */
|
||||
while ((sa&RTCSA_TUP) == RTCSA_TUP)
|
||||
sa = rtcin(RTC_STATUSA);
|
||||
|
||||
tod->year = bcd(rtcin(RTC_YEAR)) + 1900; /* year */
|
||||
if (tod->year < 1970) tod->year += 100;
|
||||
tod->month = bcd(rtcin(RTC_MONTH)); /* month */
|
||||
tod->day = bcd(rtcin(RTC_DAY)); /* day */
|
||||
(void) bcd(rtcin(RTC_WDAY)); /* weekday */
|
||||
tod->hour = bcd(rtcin(RTC_HRS)); /* hour */
|
||||
tod->minute = bcd(rtcin(RTC_MIN)); /* minutes */
|
||||
tod->second = bcd(rtcin(RTC_SEC)); /* seconds */
|
||||
tod->ticks = 0;
|
||||
|
||||
#ifndef QUICK_READ /* Quick read of the RTC: don't return number of seconds. */
|
||||
sec = ytos(tod->year);
|
||||
sec += mtos(tod->month, (tod->year % 4) == 0);
|
||||
sec += tod->day * SECS_PER_DAY;
|
||||
sec += tod->hour * 60 * 60; /* hour */
|
||||
sec += tod->minute * 60; /* minutes */
|
||||
sec += tod->second; /* seconds */
|
||||
#endif /* QUICK_READ */
|
||||
|
||||
return (long int)sec;
|
||||
} /* rtc_read */
|
||||
|
||||
|
||||
74
c/src/lib/libbsp/i386/ts_386ex/console/Makefile.in
Normal file
74
c/src/lib/libbsp/i386/ts_386ex/console/Makefile.in
Normal file
@@ -0,0 +1,74 @@
|
||||
#
|
||||
# $Id$
|
||||
#
|
||||
|
||||
@SET_MAKE@
|
||||
srcdir = @srcdir@
|
||||
top_srcdir = @top_srcdir@
|
||||
top_builddir = ../../../../../../..
|
||||
subdir = c/src/lib/libbsp/i386/ts_386ex/console
|
||||
|
||||
INSTALL = @INSTALL@
|
||||
|
||||
RTEMS_ROOT = $(top_srcdir)/@RTEMS_TOPdir@
|
||||
PROJECT_ROOT = @PROJECT_ROOT@
|
||||
|
||||
VPATH = @srcdir@
|
||||
|
||||
PGM=${ARCH}/console.rel
|
||||
|
||||
IMPORT_SRC=$(srcdir)/../../shared/io/printk.c
|
||||
|
||||
# C source names, if any, go here -- minus the .c
|
||||
C_PIECES=console printk
|
||||
C_FILES=$(C_PIECES:%=%.c)
|
||||
C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
|
||||
|
||||
H_FILES=
|
||||
|
||||
# Assembly source names, if any, go here -- minus the .S
|
||||
S_PIECES=
|
||||
S_FILES=$(S_PIECES:%=%.S)
|
||||
S_O_FILES=$(S_FILES:%.S=${ARCH}/%.o)
|
||||
|
||||
SRCS=$(C_FILES) $(CC_FILES) $(H_FILES) $(S_FILES)
|
||||
OBJS=$(C_O_FILES) $(CC_O_FILES) $(S_O_FILES)
|
||||
|
||||
include $(RTEMS_ROOT)/make/custom/$(RTEMS_BSP).cfg
|
||||
include $(RTEMS_ROOT)/make/leaf.cfg
|
||||
|
||||
#
|
||||
# (OPTIONAL) Add local stuff here using +=
|
||||
#
|
||||
|
||||
DEFINES +=
|
||||
CFLAGS +=
|
||||
|
||||
LD_PATHS +=
|
||||
LD_LIBS +=
|
||||
LDFLAGS +=
|
||||
|
||||
#
|
||||
# Add your list of files to delete here. The config files
|
||||
# already know how to delete some stuff, so you may want
|
||||
# to just run 'make clean' first to see what gets missed.
|
||||
# 'make clobber' already includes 'make clean'
|
||||
#
|
||||
|
||||
CLEAN_ADDITIONS +=
|
||||
CLOBBER_ADDITIONS +=
|
||||
|
||||
preinstall:
|
||||
${CP} ${IMPORT_SRC} .
|
||||
|
||||
${PGM}: ${SRCS} ${OBJS}
|
||||
$(make-rel)
|
||||
|
||||
all: ${ARCH} preinstall $(SRCS) $(PGM)
|
||||
|
||||
# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
|
||||
install: all
|
||||
|
||||
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
||||
cd $(top_builddir) \
|
||||
&& CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
|
||||
399
c/src/lib/libbsp/i386/ts_386ex/console/console.c
Normal file
399
c/src/lib/libbsp/i386/ts_386ex/console/console.c
Normal file
@@ -0,0 +1,399 @@
|
||||
/*-------------------------------------------------------------------------+
|
||||
| console.c v1.1 - i386ex BSP - 1997/08/07
|
||||
+--------------------------------------------------------------------------+
|
||||
| This file contains the i386ex console I/O package. It is just a termios
|
||||
| wrapper.
|
||||
+--------------------------------------------------------------------------+
|
||||
| (C) Copyright 1997 -
|
||||
| - NavIST Group - Real-Time Distributed Systems and Industrial Automation
|
||||
|
|
||||
| http://pandora.ist.utl.pt
|
||||
|
|
||||
| Instituto Superior Tecnico * Lisboa * PORTUGAL
|
||||
+--------------------------------------------------------------------------+
|
||||
| Disclaimer:
|
||||
|
|
||||
| This file is provided "AS IS" without warranty of any kind, either
|
||||
| expressed or implied.
|
||||
+--------------------------------------------------------------------------+
|
||||
| This code is based on:
|
||||
| console.c,v 1.4 1995/12/19 20:07:23 joel Exp - go32 BSP
|
||||
| console.c,v 1.15 pc386 BSP
|
||||
| With the following copyright notice:
|
||||
| **************************************************************************
|
||||
| * COPYRIGHT (c) 1989-1998.
|
||||
| * On-Line Applications Research Corporation (OAR).
|
||||
| * Copyright assigned to U.S. Government, 1994.
|
||||
| *
|
||||
| * The license and distribution terms for this file may be
|
||||
| * found in found in the file LICENSE in this distribution or at
|
||||
| * http://www.OARcorp.com/rtems/license.html.
|
||||
| **************************************************************************
|
||||
|
|
||||
| $Id$
|
||||
+--------------------------------------------------------------------------*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <assert.h>
|
||||
|
||||
/* workaround for gcc development tools */
|
||||
#undef __assert
|
||||
void __assert (const char *file, int line, const char *msg);
|
||||
|
||||
#include <bsp.h>
|
||||
#include <irq.h>
|
||||
#include <rtems/libio.h>
|
||||
#include <termios.h>
|
||||
#include <uart.h>
|
||||
#include <libcpu/cpuModel.h>
|
||||
|
||||
/*
|
||||
* Possible value for console input/output :
|
||||
* BSP_UART_COM1
|
||||
* BSP_UART_COM2
|
||||
* BSP_CONSOLE_PORT_CONSOLE is not valid in this BSP.
|
||||
* All references to either keyboard or video handling have been removed.
|
||||
*/
|
||||
|
||||
int BSPConsolePort = BSP_UART_COM2;
|
||||
int BSPBaseBaud = 115200;
|
||||
int BSP_poll_read(int);
|
||||
|
||||
extern BSP_polling_getchar_function_type BSP_poll_char;
|
||||
|
||||
static int conSetAttr(int minor, const struct termios *);
|
||||
static void isr_on(const rtems_irq_connect_data *);
|
||||
static void isr_off(const rtems_irq_connect_data *);
|
||||
static int isr_is_on(const rtems_irq_connect_data *);
|
||||
|
||||
/*
|
||||
* Change references to com2 if required.
|
||||
*/
|
||||
|
||||
static rtems_irq_connect_data console_isr_data =
|
||||
{ BSP_UART_COM2_IRQ,
|
||||
BSP_uart_termios_isr_com2,
|
||||
isr_on,
|
||||
isr_off,
|
||||
isr_is_on};
|
||||
|
||||
static void
|
||||
isr_on(const rtems_irq_connect_data *unused)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
static void
|
||||
isr_off(const rtems_irq_connect_data *unused)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
static int
|
||||
isr_is_on(const rtems_irq_connect_data *irq)
|
||||
{
|
||||
return BSP_irq_enabled_at_i8259s(irq->name);
|
||||
}
|
||||
|
||||
void console_reserve_resources(rtems_configuration_table *conf)
|
||||
{
|
||||
rtems_termios_reserve_resources(conf, 1);
|
||||
return;
|
||||
}
|
||||
|
||||
void __assert (const char *file, int line, const char *msg)
|
||||
{
|
||||
static char exit_msg[] = "EXECUTIVE SHUTDOWN! Any key to reboot...";
|
||||
unsigned char ch;
|
||||
|
||||
/*
|
||||
* Note we cannot call exit or printf from here,
|
||||
* assert can fail inside ISR too
|
||||
*/
|
||||
|
||||
/*
|
||||
* Close console
|
||||
*/
|
||||
close(2);
|
||||
close(1);
|
||||
close(0);
|
||||
|
||||
printk("\nassert failed: %s: ", file);
|
||||
printk("%d: ", line);
|
||||
printk("%s\n\n", msg);
|
||||
printk(exit_msg);
|
||||
ch = BSP_poll_char();
|
||||
printk("\nShould jump to reset now!\n");
|
||||
}
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------+
|
||||
| Console device driver INITIALIZE entry point.
|
||||
+--------------------------------------------------------------------------+
|
||||
| Initilizes the I/O console (keyboard + VGA display) driver.
|
||||
+--------------------------------------------------------------------------*/
|
||||
rtems_device_driver
|
||||
console_initialize(rtems_device_major_number major,
|
||||
rtems_device_minor_number minor,
|
||||
void *arg)
|
||||
{
|
||||
rtems_status_code status;
|
||||
|
||||
/*
|
||||
* Set up TERMIOS
|
||||
*/
|
||||
rtems_termios_initialize ();
|
||||
|
||||
/*
|
||||
* Do device-specific initialization
|
||||
*/
|
||||
|
||||
/* 115200-8-N-1, without hardware flow control */
|
||||
BSP_uart_init(BSPConsolePort, 115200, 0);
|
||||
|
||||
/* Set interrupt handler */
|
||||
if(BSPConsolePort == BSP_UART_COM1)
|
||||
{
|
||||
console_isr_data.name = BSP_UART_COM1_IRQ;
|
||||
console_isr_data.hdl = BSP_uart_termios_isr_com1;
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
assert(BSPConsolePort == BSP_UART_COM2);
|
||||
console_isr_data.name = BSP_UART_COM2_IRQ;
|
||||
console_isr_data.hdl = BSP_uart_termios_isr_com2;
|
||||
}
|
||||
|
||||
status = BSP_install_rtems_irq_handler(&console_isr_data);
|
||||
|
||||
if (!status){
|
||||
printk("Error installing serial console interrupt handler!\n");
|
||||
rtems_fatal_error_occurred(status);
|
||||
}
|
||||
/*
|
||||
* Register the device
|
||||
*/
|
||||
status = rtems_io_register_name ("/dev/console", major, 0);
|
||||
if (status != RTEMS_SUCCESSFUL)
|
||||
{
|
||||
printk("Error registering console device!\n");
|
||||
rtems_fatal_error_occurred (status);
|
||||
}
|
||||
|
||||
if(BSPConsolePort == BSP_UART_COM1)
|
||||
{
|
||||
printk("Initialized console on port COM1 115200-8-N-1\n\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
printk("Initialized console on port COM2 115200-8-N-1\n\n");
|
||||
}
|
||||
|
||||
return RTEMS_SUCCESSFUL;
|
||||
} /* console_initialize */
|
||||
|
||||
|
||||
static int console_open_count = 0;
|
||||
|
||||
static int console_last_close(int major, int minor, void *arg)
|
||||
{
|
||||
BSP_remove_rtems_irq_handler (&console_isr_data);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*-------------------------------------------------------------------------+
|
||||
| Console device driver OPEN entry point
|
||||
+--------------------------------------------------------------------------*/
|
||||
rtems_device_driver
|
||||
console_open(rtems_device_major_number major,
|
||||
rtems_device_minor_number minor,
|
||||
void *arg)
|
||||
{
|
||||
rtems_status_code status;
|
||||
static rtems_termios_callbacks cb =
|
||||
{
|
||||
NULL, /* firstOpen */
|
||||
console_last_close, /* lastClose */
|
||||
NULL, /* poll read */
|
||||
BSP_uart_termios_write_com2, /* write */
|
||||
conSetAttr, /* setAttributes */
|
||||
NULL, /* stopRemoteTx */
|
||||
NULL, /* startRemoteTx */
|
||||
1 /* outputUsesInterrupts */
|
||||
};
|
||||
|
||||
if(BSPConsolePort == BSP_UART_COM2)
|
||||
{
|
||||
cb.write = BSP_uart_termios_write_com2;
|
||||
}
|
||||
|
||||
status = rtems_termios_open (major, minor, arg, &cb);
|
||||
|
||||
if(status != RTEMS_SUCCESSFUL)
|
||||
{
|
||||
printk("Error openning console device\n");
|
||||
return status;
|
||||
}
|
||||
|
||||
/*
|
||||
* Pass data area info down to driver
|
||||
*/
|
||||
BSP_uart_termios_set(BSPConsolePort,
|
||||
((rtems_libio_open_close_args_t *)arg)->iop->data1);
|
||||
|
||||
/* Enable interrupts on channel */
|
||||
BSP_uart_intr_ctrl(BSPConsolePort, BSP_UART_INTR_CTRL_TERMIOS);
|
||||
|
||||
return RTEMS_SUCCESSFUL;
|
||||
}
|
||||
|
||||
/*-------------------------------------------------------------------------+
|
||||
| Console device driver CLOSE entry point
|
||||
+--------------------------------------------------------------------------*/
|
||||
rtems_device_driver
|
||||
console_close(rtems_device_major_number major,
|
||||
rtems_device_minor_number minor,
|
||||
void *arg)
|
||||
{
|
||||
|
||||
return (rtems_termios_close (arg));
|
||||
|
||||
} /* console_close */
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------+
|
||||
| Console device driver READ entry point.
|
||||
+--------------------------------------------------------------------------+
|
||||
| Read characters from the I/O console. We only have stdin.
|
||||
+--------------------------------------------------------------------------*/
|
||||
rtems_device_driver
|
||||
console_read(rtems_device_major_number major,
|
||||
rtems_device_minor_number minor,
|
||||
void *arg)
|
||||
{
|
||||
rtems_status_code sc;
|
||||
|
||||
sc = rtems_termios_read (arg);
|
||||
|
||||
if ( sc != RTEMS_SUCCESSFUL )
|
||||
printk("console_read: fails %s\n",rtems_status_text(sc));
|
||||
|
||||
return sc;
|
||||
|
||||
} /* console_read */
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------+
|
||||
| Console device driver WRITE entry point.
|
||||
+--------------------------------------------------------------------------+
|
||||
| Write characters to the I/O console. Stderr and stdout are the same.
|
||||
+--------------------------------------------------------------------------*/
|
||||
rtems_device_driver
|
||||
console_write(rtems_device_major_number major,
|
||||
rtems_device_minor_number minor,
|
||||
void * arg)
|
||||
{
|
||||
return rtems_termios_write (arg);
|
||||
|
||||
} /* console_write */
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* Handle ioctl request.
|
||||
*/
|
||||
rtems_device_driver
|
||||
console_control(rtems_device_major_number major,
|
||||
rtems_device_minor_number minor,
|
||||
void * arg
|
||||
)
|
||||
{
|
||||
return rtems_termios_ioctl (arg);
|
||||
}
|
||||
|
||||
static int
|
||||
conSetAttr(int minor, const struct termios *t)
|
||||
{
|
||||
int baud;
|
||||
|
||||
switch (t->c_cflag & CBAUD)
|
||||
{
|
||||
case B50:
|
||||
baud = 50;
|
||||
break;
|
||||
case B75:
|
||||
baud = 75;
|
||||
break;
|
||||
case B110:
|
||||
baud = 110;
|
||||
break;
|
||||
case B134:
|
||||
baud = 134;
|
||||
break;
|
||||
case B150:
|
||||
baud = 150;
|
||||
break;
|
||||
case B200:
|
||||
baud = 200;
|
||||
break;
|
||||
case B300:
|
||||
baud = 300;
|
||||
break;
|
||||
case B600:
|
||||
baud = 600;
|
||||
break;
|
||||
case B1200:
|
||||
baud = 1200;
|
||||
break;
|
||||
case B1800:
|
||||
baud = 1800;
|
||||
break;
|
||||
case B2400:
|
||||
baud = 2400;
|
||||
break;
|
||||
case B4800:
|
||||
baud = 4800;
|
||||
break;
|
||||
case B9600:
|
||||
baud = 9600;
|
||||
break;
|
||||
case B19200:
|
||||
baud = 19200;
|
||||
break;
|
||||
case B38400:
|
||||
baud = 38400;
|
||||
break;
|
||||
case B57600:
|
||||
baud = 57600;
|
||||
break;
|
||||
case B115200:
|
||||
baud = 115200;
|
||||
break;
|
||||
default:
|
||||
baud = 0;
|
||||
rtems_fatal_error_occurred (RTEMS_INTERNAL_ERROR);
|
||||
return 0;
|
||||
}
|
||||
|
||||
BSP_uart_set_baud(BSPConsolePort, baud);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* BSP initialization
|
||||
*/
|
||||
|
||||
BSP_output_char_function_type BSP_output_char =
|
||||
(BSP_output_char_function_type) BSP_output_char_via_serial;
|
||||
|
||||
BSP_polling_getchar_function_type BSP_poll_char =
|
||||
(BSP_polling_getchar_function_type) BSP_poll_char_via_serial;
|
||||
|
||||
int BSP_poll_read(int ttyMinor){
|
||||
|
||||
return BSP_poll_char_via_serial();
|
||||
}
|
||||
50
c/src/lib/libbsp/i386/ts_386ex/include/Makefile.in
Normal file
50
c/src/lib/libbsp/i386/ts_386ex/include/Makefile.in
Normal file
@@ -0,0 +1,50 @@
|
||||
#
|
||||
# $Id$
|
||||
#
|
||||
|
||||
@SET_MAKE@
|
||||
srcdir = @srcdir@
|
||||
top_srcdir = @top_srcdir@
|
||||
top_builddir = ../../../../../../..
|
||||
subdir = c/src/lib/libbsp/i386/ts_386ex/include
|
||||
|
||||
INSTALL = @INSTALL@
|
||||
|
||||
RTEMS_ROOT = $(top_srcdir)/@RTEMS_TOPdir@
|
||||
PROJECT_ROOT = @PROJECT_ROOT@
|
||||
|
||||
VPATH = @srcdir@
|
||||
|
||||
# We only install wd80x3.h if HAS_NETWORKING was defined
|
||||
NE2000_yes_V = $(srcdir)/wd80x3.h
|
||||
NE2000 = $(NE2000_$(HAS_NETWORKING)_V)
|
||||
|
||||
H_FILES = $(srcdir)/bsp.h $(srcdir)/coverhd.h $(NE2000)
|
||||
|
||||
#
|
||||
# Equate files are for including from assembly preprocessed by
|
||||
# gm4 or gasp. No examples are provided except for those for
|
||||
# other CPUs. The best way to generate them would be to
|
||||
# provide a program which generates the constants used based
|
||||
# on the C equivalents.
|
||||
#
|
||||
|
||||
EQ_FILES =
|
||||
|
||||
SRCS=$(H_FILES) $(EQ_FILES)
|
||||
|
||||
include $(RTEMS_ROOT)/make/custom/$(RTEMS_BSP).cfg
|
||||
include $(RTEMS_ROOT)/make/leaf.cfg
|
||||
|
||||
CLEAN_ADDITIONS +=
|
||||
CLOBBER_ADDITIONS +=
|
||||
|
||||
all: $(SRCS)
|
||||
$(INSTALL_CHANGE) -m 444 $(H_FILES) $(PROJECT_INCLUDE)
|
||||
$(INSTALL_CHANGE) -m 444 $(EQ_FILES) $(PROJECT_INCLUDE)
|
||||
|
||||
install: all
|
||||
|
||||
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
||||
cd $(top_builddir) \
|
||||
&& CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
|
||||
186
c/src/lib/libbsp/i386/ts_386ex/include/bsp.h
Normal file
186
c/src/lib/libbsp/i386/ts_386ex/include/bsp.h
Normal file
@@ -0,0 +1,186 @@
|
||||
/*
|
||||
* This include file definitions related to an Intel i386ex board.
|
||||
*
|
||||
* COPYRIGHT (c) 1989-1998.
|
||||
* On-Line Applications Research Corporation (OAR).
|
||||
* Copyright assigned to U.S. Government, 1994.
|
||||
*
|
||||
* 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 __TS386_h
|
||||
#define __TS386_h
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <rtems.h>
|
||||
#include <iosupp.h>
|
||||
#include <console.h>
|
||||
#include <clockdrv.h>
|
||||
#include <bspIo.h>
|
||||
#include <irq.h>
|
||||
|
||||
/*
|
||||
* Network driver configuration
|
||||
*/
|
||||
|
||||
struct rtems_bsdnet_ifconfig;
|
||||
extern int rtems_ne_driver_attach (struct rtems_bsdnet_ifconfig *config);
|
||||
|
||||
extern void Wait_X_ms (unsigned);
|
||||
|
||||
#define RTEMS_BSP_NETWORK_DRIVER_NAME "ne1"
|
||||
#define RTEMS_BSP_NETWORK_DRIVER_ATTACH rtems_ne_driver_attach
|
||||
|
||||
#define NE2000_BYTE_TRANSFERS
|
||||
|
||||
/*
|
||||
* Constants relating to the 8254 (or 8253) programmable interval timers.
|
||||
*/
|
||||
|
||||
#define TIMER_CONFIG 0xF834
|
||||
#define IO_TIMER1 0xF040
|
||||
|
||||
/* Port address of the control port and timer channels */
|
||||
|
||||
#define TIMER_CNTR0 (IO_TIMER1 + 0) /* timer 0 counter port */
|
||||
#define TIMER_CNTR1 (IO_TIMER1 + 1) /* timer 1 counter port */
|
||||
#define TIMER_CNTR2 (IO_TIMER1 + 2) /* timer 2 counter port */
|
||||
#define TIMER_MODE (IO_TIMER1 + 3) /* timer mode port */
|
||||
#define TIMER_SEL0 0x00 /* select counter 0 */
|
||||
#define TIMER_SEL1 0x40 /* select counter 1 */
|
||||
#define TIMER_SEL2 0x80 /* select counter 2 */
|
||||
#define TIMER_INTTC 0x00 /* mode 0, intr on terminal cnt */
|
||||
#define TIMER_ONESHOT 0x02 /* mode 1, one shot */
|
||||
#define TIMER_RATEGEN 0x04 /* mode 2, rate generator */
|
||||
#define TIMER_SQWAVE 0x06 /* mode 3, square wave */
|
||||
#define TIMER_SWSTROBE 0x08 /* mode 4, s/w triggered strobe */
|
||||
#define TIMER_HWSTROBE 0x0a /* mode 5, h/w triggered strobe */
|
||||
#define TIMER_LATCH 0x00 /* latch counter for reading */
|
||||
#define TIMER_LSB 0x10 /* r/w counter LSB */
|
||||
#define TIMER_MSB 0x20 /* r/w counter MSB */
|
||||
#define TIMER_16BIT 0x30 /* r/w counter 16 bits, LSB first */
|
||||
#define TIMER_BCD 0x01 /* count in BCD */
|
||||
|
||||
/*
|
||||
* Define the time limits for RTEMS Test Suite test durations.
|
||||
* Long test and short test duration limits are provided. These
|
||||
* values are in seconds and need to be converted to ticks for the
|
||||
* application.
|
||||
*
|
||||
*/
|
||||
|
||||
#define MAX_LONG_TEST_DURATION 300 /* 5 minutes = 300 seconds */
|
||||
#define MAX_SHORT_TEST_DURATION 3 /* 3 seconds */
|
||||
|
||||
/*
|
||||
* Define the interrupt mechanism for Time Test 27
|
||||
*
|
||||
* NOTE: Use a software interrupt for the i386.
|
||||
*/
|
||||
|
||||
#define MUST_WAIT_FOR_INTERRUTPT 0
|
||||
|
||||
|
||||
#define Install_tm27_vector(handler) \
|
||||
{ \
|
||||
rtems_isr_entry dummy; \
|
||||
rtems_interrupt_catch(handler, 0x90, &dummy); \
|
||||
}
|
||||
#define Cause_tm27_intr() asm volatile( "int $0x90" : : );
|
||||
|
||||
#define Clear_tm27_intr()
|
||||
|
||||
#define Lower_tm27_intr()
|
||||
|
||||
/*
|
||||
* Simple spin delay in microsecond units for device drivers.
|
||||
* This is very dependent on the clock speed of the target.
|
||||
*/
|
||||
|
||||
#define delay( _microseconds ) \
|
||||
{ \
|
||||
rtems_unsigned32 _counter; \
|
||||
\
|
||||
_counter = (_microseconds); \
|
||||
\
|
||||
asm volatile ( "0: nop;" \
|
||||
" mov %0,%0 ;" \
|
||||
" loop 0b" : "=c" (_counter) \
|
||||
: "0" (_counter) \
|
||||
); \
|
||||
\
|
||||
}
|
||||
|
||||
/* Constants */
|
||||
|
||||
#define RAM_START 0
|
||||
|
||||
/* replaced the earlier EI kludge of 0xfffff */
|
||||
|
||||
#define RAM_END 0x200000
|
||||
|
||||
/* I/O addressing */
|
||||
|
||||
/*
|
||||
*#define Is_tx_ready( _status ) ( (_status) & 0x20 )
|
||||
*/
|
||||
/* dec 20. try the TE instead of TBE as the check */
|
||||
|
||||
#define Is_tx_ready( _status ) ( (_status) & 0x40 )
|
||||
|
||||
|
||||
#define Is_rx_ready( _status ) ( (_status) & 0x01 )
|
||||
|
||||
/* Structures */
|
||||
|
||||
#ifdef F386_INIT
|
||||
#undef BSP_EXTERN
|
||||
#define BSP_EXTERN
|
||||
#else
|
||||
#undef BSP_EXTERN
|
||||
#define BSP_EXTERN extern
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Device Driver Table Entries
|
||||
*/
|
||||
|
||||
/*
|
||||
* NOTE: Use the standard Console driver entry
|
||||
*/
|
||||
|
||||
/*
|
||||
* NOTE: Use the standard Clock driver entry
|
||||
*/
|
||||
|
||||
/* miscellaneous stuff assumed to exist */
|
||||
|
||||
extern rtems_configuration_table BSP_Configuration;
|
||||
|
||||
#define IDT_SIZE 256
|
||||
#define GDT_SIZE 3
|
||||
|
||||
extern interrupt_gate_descriptor Interrupt_descriptor_table[IDT_SIZE];
|
||||
extern segment_descriptors Global_descriptor_table [GDT_SIZE];
|
||||
|
||||
BSP_EXTERN unsigned short Idt[3]; /* Interrupt Descriptor Table Address */
|
||||
BSP_EXTERN unsigned short Gdt[3]; /* Global Descriptor Table Address */
|
||||
BSP_EXTERN unsigned int Idt_base;
|
||||
BSP_EXTERN unsigned int Gdt_base;
|
||||
|
||||
/* routines */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
/* end of include file */
|
||||
104
c/src/lib/libbsp/i386/ts_386ex/include/coverhd.h
Normal file
104
c/src/lib/libbsp/i386/ts_386ex/include/coverhd.h
Normal file
@@ -0,0 +1,104 @@
|
||||
/* coverhd.h
|
||||
*
|
||||
* This include file has defines to represent the overhead associated
|
||||
* with calling a particular directive from C on this target.
|
||||
*
|
||||
* COPYRIGHT (c) 1989-1998.
|
||||
* On-Line Applications Research Corporation (OAR).
|
||||
* Copyright assigned to U.S. Government, 1994.
|
||||
*
|
||||
* 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 __COVERHD_h
|
||||
#define __COVERHD_h
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define CALLING_OVERHEAD_INITIALIZE_EXECUTIVE 3
|
||||
#define CALLING_OVERHEAD_SHUTDOWN_EXECUTIVE 3
|
||||
#define CALLING_OVERHEAD_TASK_CREATE 4
|
||||
#define CALLING_OVERHEAD_TASK_IDENT 4
|
||||
#define CALLING_OVERHEAD_TASK_START 4
|
||||
#define CALLING_OVERHEAD_TASK_RESTART 3
|
||||
#define CALLING_OVERHEAD_TASK_DELETE 3
|
||||
#define CALLING_OVERHEAD_TASK_SUSPEND 3
|
||||
#define CALLING_OVERHEAD_TASK_RESUME 3
|
||||
#define CALLING_OVERHEAD_TASK_SET_PRIORITY 4
|
||||
#define CALLING_OVERHEAD_TASK_MODE 4
|
||||
#define CALLING_OVERHEAD_TASK_GET_NOTE 4
|
||||
#define CALLING_OVERHEAD_TASK_SET_NOTE 4
|
||||
#define CALLING_OVERHEAD_TASK_WAKE_WHEN 7
|
||||
#define CALLING_OVERHEAD_TASK_WAKE_AFTER 3
|
||||
#define CALLING_OVERHEAD_INTERRUPT_CATCH 4
|
||||
#define CALLING_OVERHEAD_CLOCK_GET 7
|
||||
#define CALLING_OVERHEAD_CLOCK_SET 7
|
||||
#define CALLING_OVERHEAD_CLOCK_TICK 2
|
||||
|
||||
#define CALLING_OVERHEAD_TIMER_CREATE 3
|
||||
#define CALLING_OVERHEAD_TIMER_IDENT 3
|
||||
#define CALLING_OVERHEAD_TIMER_DELETE 3
|
||||
#define CALLING_OVERHEAD_TIMER_FIRE_AFTER 4
|
||||
#define CALLING_OVERHEAD_TIMER_FIRE_WHEN 8
|
||||
#define CALLING_OVERHEAD_TIMER_RESET 3
|
||||
#define CALLING_OVERHEAD_TIMER_CANCEL 3
|
||||
#define CALLING_OVERHEAD_SEMAPHORE_CREATE 4
|
||||
#define CALLING_OVERHEAD_SEMAPHORE_DELETE 3
|
||||
#define CALLING_OVERHEAD_SEMAPHORE_IDENT 4
|
||||
#define CALLING_OVERHEAD_SEMAPHORE_OBTAIN 4
|
||||
#define CALLING_OVERHEAD_SEMAPHORE_RELEASE 3
|
||||
#define CALLING_OVERHEAD_MESSAGE_QUEUE_CREATE 4
|
||||
#define CALLING_OVERHEAD_MESSAGE_QUEUE_IDENT 4
|
||||
#define CALLING_OVERHEAD_MESSAGE_QUEUE_DELETE 3
|
||||
#define CALLING_OVERHEAD_MESSAGE_QUEUE_SEND 3
|
||||
#define CALLING_OVERHEAD_MESSAGE_QUEUE_URGENT 3
|
||||
#define CALLING_OVERHEAD_MESSAGE_QUEUE_BROADCAST 4
|
||||
#define CALLING_OVERHEAD_MESSAGE_QUEUE_RECEIVE 4
|
||||
#define CALLING_OVERHEAD_MESSAGE_QUEUE_FLUSH 3
|
||||
|
||||
#define CALLING_OVERHEAD_EVENT_SEND 4
|
||||
#define CALLING_OVERHEAD_EVENT_RECEIVE 4
|
||||
#define CALLING_OVERHEAD_SIGNAL_CATCH 3
|
||||
#define CALLING_OVERHEAD_SIGNAL_SEND 3
|
||||
#define CALLING_OVERHEAD_PARTITION_CREATE 4
|
||||
#define CALLING_OVERHEAD_PARTITION_IDENT 4
|
||||
#define CALLING_OVERHEAD_PARTITION_DELETE 3
|
||||
#define CALLING_OVERHEAD_PARTITION_GET_BUFFER 4
|
||||
#define CALLING_OVERHEAD_PARTITION_RETURN_BUFFER 4
|
||||
#define CALLING_OVERHEAD_REGION_CREATE 4
|
||||
#define CALLING_OVERHEAD_REGION_IDENT 3
|
||||
#define CALLING_OVERHEAD_REGION_DELETE 3
|
||||
#define CALLING_OVERHEAD_REGION_GET_SEGMENT 4
|
||||
#define CALLING_OVERHEAD_REGION_RETURN_SEGMENT 4
|
||||
#define CALLING_OVERHEAD_PORT_CREATE 4
|
||||
#define CALLING_OVERHEAD_PORT_IDENT 3
|
||||
#define CALLING_OVERHEAD_PORT_DELETE 3
|
||||
#define CALLING_OVERHEAD_PORT_EXTERNAL_TO_INTERNAL 4
|
||||
#define CALLING_OVERHEAD_PORT_INTERNAL_TO_EXTERNAL 4
|
||||
|
||||
#define CALLING_OVERHEAD_IO_INITIALIZE 4
|
||||
#define CALLING_OVERHEAD_IO_OPEN 4
|
||||
#define CALLING_OVERHEAD_IO_CLOSE 4
|
||||
#define CALLING_OVERHEAD_IO_READ 4
|
||||
#define CALLING_OVERHEAD_IO_WRITE 4
|
||||
#define CALLING_OVERHEAD_IO_CONTROL 4
|
||||
#define CALLING_OVERHEAD_FATAL_ERROR_OCCURRED 3
|
||||
#define CALLING_OVERHEAD_RATE_MONOTONIC_CREATE 3
|
||||
#define CALLING_OVERHEAD_RATE_MONOTONIC_IDENT 3
|
||||
#define CALLING_OVERHEAD_RATE_MONOTONIC_DELETE 3
|
||||
#define CALLING_OVERHEAD_RATE_MONOTONIC_CANCEL 3
|
||||
#define CALLING_OVERHEAD_RATE_MONOTONIC_PERIOD 3
|
||||
#define CALLING_OVERHEAD_MULTIPROCESSING_ANNOUNCE 2
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
/* end of include file */
|
||||
123
c/src/lib/libbsp/i386/ts_386ex/include/wd80x3.h
Normal file
123
c/src/lib/libbsp/i386/ts_386ex/include/wd80x3.h
Normal file
@@ -0,0 +1,123 @@
|
||||
|
||||
/* Register descriptions */
|
||||
/* Controller DP8390. */
|
||||
|
||||
#define DATAPORT 0x10 /* Port Window. */
|
||||
#define RESET 0x1f /* Issue a read for reset */
|
||||
#define W83CREG 0x00 /* I/O port definition */
|
||||
#define ADDROM 0x08
|
||||
|
||||
/* page 0 read or read/write registers */
|
||||
|
||||
#define CMDR 0x00+RO
|
||||
#define CLDA0 0x01+RO /* current local dma addr 0 for read */
|
||||
#define CLDA1 0x02+RO /* current local dma addr 1 for read */
|
||||
#define BNRY 0x03+RO /* boundary reg for rd and wr */
|
||||
#define TSR 0x04+RO /* tx status reg for rd */
|
||||
#define NCR 0x05+RO /* number of collision reg for rd */
|
||||
#define FIFO 0x06+RO /* FIFO for rd */
|
||||
#define ISR 0x07+RO /* interrupt status reg for rd and wr */
|
||||
#define CRDA0 0x08+RO /* current remote dma address 0 for rd */
|
||||
#define CRDA1 0x09+RO /* current remote dma address 1 for rd */
|
||||
#define RSR 0x0C+RO /* rx status reg for rd */
|
||||
#define CNTR0 0x0D+RO /* tally cnt 0 for frm alg err for rd */
|
||||
#define CNTR1 RO+0x0E /* tally cnt 1 for crc err for rd */
|
||||
#define CNTR2 0x0F+RO /* tally cnt 2 for missed pkt for rd */
|
||||
|
||||
/* page 0 write registers */
|
||||
|
||||
#define PSTART 0x01+RO /* page start register */
|
||||
#define PSTOP 0x02+RO /* page stop register */
|
||||
#define TPSR 0x04+RO /* tx start page start reg */
|
||||
#define TBCR0 0x05+RO /* tx byte count 0 reg */
|
||||
#define TBCR1 0x06+RO /* tx byte count 1 reg */
|
||||
#define RSAR0 0x08+RO /* remote start address reg 0 */
|
||||
#define RSAR1 0x09+RO /* remote start address reg 1 */
|
||||
#define RBCR0 0x0A+RO /* remote byte count reg 0 */
|
||||
#define RBCR1 0x0B+RO /* remote byte count reg 1 */
|
||||
#define RCR 0x0C+RO /* rx configuration reg */
|
||||
#define TCR 0x0D+RO /* tx configuration reg */
|
||||
#define DCR RO+0x0E /* data configuration reg */
|
||||
#define IMR 0x0F+RO /* interrupt mask reg */
|
||||
|
||||
/* page 1 registers */
|
||||
|
||||
#define PAR 0x01+RO /* physical addr reg base for rd and wr */
|
||||
#define CURR 0x07+RO /* current page reg for rd and wr */
|
||||
#define MAR 0x08+RO /* multicast addr reg base fro rd and WR */
|
||||
#define MARsize 8 /* size of multicast addr space */
|
||||
|
||||
/*-----W83CREG command bits-----*/
|
||||
#define MSK_RESET 0x80 /* W83CREG masks */
|
||||
#define MSK_ENASH 0x40
|
||||
#define MSK_DECOD 0x3F /* memory decode bits, corresponding */
|
||||
/* to SA 18-13. SA 19 assumed to be 1 */
|
||||
|
||||
/*-----CMDR command bits-----*/
|
||||
#define MSK_STP 0x01 /* stop the chip */
|
||||
#define MSK_STA 0x02 /* start the chip */
|
||||
#define MSK_TXP 0x04 /* initial txing of a frm */
|
||||
#define MSK_RRE 0x08 /* remote read */
|
||||
#define MSK_RWR 0x10 /* remote write */
|
||||
#define MSK_RD2 0x20 /* no DMA used */
|
||||
#define MSK_PG0 0x00 /* select register page 0 */
|
||||
#define MSK_PG1 0x40 /* select register page 1 */
|
||||
#define MSK_PG2 0x80 /* select register page 2 */
|
||||
|
||||
/*-----ISR and TSR status bits-----*/
|
||||
#define MSK_PRX 0x01 /* rx with no error */
|
||||
#define MSK_PTX 0x02 /* tx with no error */
|
||||
#define MSK_RXE 0x04 /* rx with error */
|
||||
#define MSK_TXE 0x08 /* tx with error */
|
||||
#define MSK_OVW 0x10 /* overwrite warning */
|
||||
#define MSK_CNT 0x20 /* MSB of one of the tally counters is set */
|
||||
#define MSK_RDC 0x40 /* remote dma completed */
|
||||
#define MSK_RST 0x80 /* reset state indicator */
|
||||
|
||||
/*-----DCR command bits-----*/
|
||||
#define MSK_WTS 0x01 /* word transfer mode selection */
|
||||
#define MSK_BOS 0x02 /* byte order selection */
|
||||
#define MSK_LAS 0x04 /* long addr selection */
|
||||
#define MSK_BMS 0x08 /* burst mode selection */
|
||||
#define MSK_ARM 0x10 /* autoinitialize remote */
|
||||
#define MSK_FT00 0x00 /* burst lrngth selection */
|
||||
#define MSK_FT01 0x20 /* burst lrngth selection */
|
||||
#define MSK_FT10 0x40 /* burst lrngth selection */
|
||||
#define MSK_FT11 0x60 /* burst lrngth selection */
|
||||
|
||||
/*-----RCR command bits-----*/
|
||||
#define MSK_SEP 0x01 /* save error pkts */
|
||||
#define MSK_AR 0x02 /* accept runt pkt */
|
||||
#define MSK_AB 0x04 /* 8390 RCR */
|
||||
#define MSK_AM 0x08 /* accept multicast */
|
||||
#define MSK_PRO 0x10 /* accept all pkt with physical adr */
|
||||
#define MSK_MON 0x20 /* monitor mode */
|
||||
|
||||
/*-----TCR command bits-----*/
|
||||
#define MSK_CRC 0x01 /* inhibit CRC, do not append crc */
|
||||
#define MSK_LOOP 0x02 /* set loopback mode */
|
||||
#define MSK_BCST 0x04 /* Accept broadcasts */
|
||||
#define MSK_LB01 0x06 /* encoded loopback control */
|
||||
#define MSK_ATD 0x08 /* auto tx disable */
|
||||
#define MSK_OFST 0x10 /* collision offset enable */
|
||||
|
||||
/*-----receive status bits-----*/
|
||||
#define SMK_PRX 0x01 /* rx without error */
|
||||
#define SMK_CRC 0x02 /* CRC error */
|
||||
#define SMK_FAE 0x04 /* frame alignment error */
|
||||
#define SMK_FO 0x08 /* FIFO overrun */
|
||||
#define SMK_MPA 0x10 /* missed pkt */
|
||||
#define SMK_PHY 0x20 /* physical/multicase address */
|
||||
#define SMK_DIS 0x40 /* receiver disable. set in monitor mode */
|
||||
#define SMK_DEF 0x80 /* deferring */
|
||||
|
||||
/*-----transmit status bits-----*/
|
||||
#define SMK_PTX 0x01 /* tx without error */
|
||||
#define SMK_DFR 0x02 /* non deferred tx */
|
||||
#define SMK_COL 0x04 /* tx collided */
|
||||
#define SMK_ABT 0x08 /* tx abort because of excessive collisions */
|
||||
#define SMK_CRS 0x10 /* carrier sense lost */
|
||||
#define SMK_FU 0x20 /* FIFO underrun */
|
||||
#define SMK_CDH 0x40 /* collision detect heartbeat */
|
||||
#define SMK_OWC 0x80 /* out of window collision */
|
||||
|
||||
66
c/src/lib/libbsp/i386/ts_386ex/network/Makefile.in
Normal file
66
c/src/lib/libbsp/i386/ts_386ex/network/Makefile.in
Normal file
@@ -0,0 +1,66 @@
|
||||
#
|
||||
# $Id$
|
||||
#
|
||||
|
||||
@SET_MAKE@
|
||||
srcdir = @srcdir@
|
||||
top_srcdir = @top_srcdir@
|
||||
top_builddir = ../../../../../../..
|
||||
subdir = c/src/lib/libbsp/i386/ts_386ex/network
|
||||
|
||||
INSTALL = @INSTALL@
|
||||
|
||||
RTEMS_ROOT = $(top_srcdir)/@RTEMS_TOPdir@
|
||||
PROJECT_ROOT = @PROJECT_ROOT@
|
||||
|
||||
VPATH = @srcdir@
|
||||
|
||||
PGM=${ARCH}/network.rel
|
||||
|
||||
# C source names, if any, go here -- minus the .c
|
||||
C_PIECES=ne2000
|
||||
C_FILES=$(C_PIECES:%=%.c)
|
||||
C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
|
||||
|
||||
H_FILES=
|
||||
|
||||
SRCS=$(C_FILES) $(H_FILES)
|
||||
OBJS=$(C_O_FILES)
|
||||
|
||||
include $(RTEMS_ROOT)/make/custom/$(RTEMS_BSP).cfg
|
||||
include $(RTEMS_ROOT)/make/leaf.cfg
|
||||
|
||||
#
|
||||
# (OPTIONAL) Add local stuff here using +=
|
||||
#
|
||||
|
||||
DEFINES += -D_COMPILING_BSD_KERNEL_ -DKERNEL -DINET -DNFS \
|
||||
-DDIAGNOSTIC -DBOOTP_COMPAT
|
||||
CPPFLAGS +=
|
||||
CFLAGS +=
|
||||
|
||||
LD_PATHS +=
|
||||
LD_LIBS +=
|
||||
LDFLAGS +=
|
||||
|
||||
#
|
||||
# Add your list of files to delete here. The config files
|
||||
# already know how to delete some stuff, so you may want
|
||||
# to just run 'make clean' first to see what gets missed.
|
||||
# 'make clobber' already includes 'make clean'
|
||||
#
|
||||
|
||||
CLEAN_ADDITIONS +=
|
||||
CLOBBER_ADDITIONS +=
|
||||
|
||||
${PGM}: ${SRCS} ${OBJS}
|
||||
$(make-rel)
|
||||
|
||||
all: ${ARCH} $(SRCS) $(PGM)
|
||||
|
||||
# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
|
||||
install: all
|
||||
|
||||
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
||||
cd $(top_builddir) \
|
||||
&& CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
|
||||
1041
c/src/lib/libbsp/i386/ts_386ex/network/ne2000.c
Normal file
1041
c/src/lib/libbsp/i386/ts_386ex/network/ne2000.c
Normal file
File diff suppressed because it is too large
Load Diff
254
c/src/lib/libbsp/i386/ts_386ex/start/80386ex.h
Normal file
254
c/src/lib/libbsp/i386/ts_386ex/start/80386ex.h
Normal file
@@ -0,0 +1,254 @@
|
||||
/*
|
||||
* Submitted by:
|
||||
*
|
||||
* Erik Ivanenko
|
||||
* University of Toronto
|
||||
* erik.ivanenko@utoronto.ca
|
||||
*
|
||||
* 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$
|
||||
*/
|
||||
|
||||
/* REMAP ADDRESSING Registers */
|
||||
#define REMAPCFGH 0x0023
|
||||
#define REMAPCFGL 0x0022
|
||||
#define REMAPCFG 0x0022
|
||||
/* INTERRUPT CONTROL REGISTERS -- SLOT 15 ADDRESSES */
|
||||
#define ICW1M 0xF020
|
||||
#define ICW1S 0xF0A0
|
||||
#define ICW2M 0xF021
|
||||
#define ICW2S 0xF0A1
|
||||
#define ICW3M 0xF021
|
||||
#define ICW3S 0xF0A1
|
||||
#define ICW4M 0xF021
|
||||
#define ICW4S 0xF0A1
|
||||
#define OCW1M 0xF021
|
||||
#define OCW1S 0xF0A1
|
||||
#define OCW2M 0xF020
|
||||
#define OCW2S 0xF0A0
|
||||
#define OCW3M 0xF020
|
||||
#define OCW3S 0xF0A0
|
||||
/* INTERRUPT CONTROL REGISTERS -- SLOT 0 ADDRESSES */
|
||||
#define ICW1MDOS 0x0020
|
||||
#define ICW1SDOS 0x00A0
|
||||
#define ICW2MDOS 0x0021
|
||||
#define ICW2SDOS 0x00A1
|
||||
#define ICW3MDOS 0x0021
|
||||
#define ICW3SDOS 0x00A1
|
||||
#define ICW4MDOS 0x0021
|
||||
#define ICW4SDOS 0x00A1
|
||||
#define OCW1MDOS 0x0021
|
||||
#define OCW1SDOS 0x00A1
|
||||
#define OCW2MDOS 0x0020
|
||||
#define OCW2SDOS 0x00A0
|
||||
#define OCW3MDOS 0x0020
|
||||
#define OCW3SDOS 0x00A0
|
||||
|
||||
|
||||
/* CONFIGURATION Registers */
|
||||
#define DMACFG 0xF830
|
||||
#define INTCFG 0xF832
|
||||
#define TMRCFG 0xF834
|
||||
#define SIOCFG 0xF836
|
||||
#define P1CFG 0xF820
|
||||
#define P2CFG 0xF822
|
||||
#define P3CFG 0xF824
|
||||
#define PINCFG 0xF826
|
||||
|
||||
/* WATCHDOG TIMER Registers */
|
||||
#define WDTRLDH 0xF4C0
|
||||
#define WDTRLDL 0xF4C2
|
||||
#define WDTCNTH 0xF4C4
|
||||
#define WDTCNTL 0xF4C6
|
||||
#define WDTCLR 0xF4C8
|
||||
#define WDTSTATUS 0xF4CA
|
||||
|
||||
/* TIMER CONTROL REGISTERS -- SLOT 15 ADDRESSES */
|
||||
#define TMR0 0xF040
|
||||
#define TMR1 0xF041
|
||||
#define TMR2 0xF042
|
||||
#define TMRCON 0xF043
|
||||
/* TIMER CONTROL REGISTERS -- SLOT 0 ADDRESSES */
|
||||
#define TMR0DOS 0x0040
|
||||
#define TMR1DOS 0x0041
|
||||
#define TMR2DOS 0x0042
|
||||
#define TMRCONDOS 0x0043
|
||||
|
||||
/* INPUT/OUTPUT PORT UNIT Registers */
|
||||
#define P1PIN 0xF860
|
||||
#define P1LTC 0xF862
|
||||
#define P1DIR 0xF864
|
||||
#define P2PIN 0xF868
|
||||
#define P2LTC 0xF86A
|
||||
#define P2DIR 0xF86C
|
||||
#define P3PIN 0xF870
|
||||
#define P3LTC 0xF872
|
||||
#define P3DIR 0xF874
|
||||
|
||||
/* ASYNCHRONOUS SERIAL CHANNEL 0 -- SLOT 15 ADDRESSES */
|
||||
#define RBR0 0xF4F8
|
||||
#define THR0 0xF4F8
|
||||
#define TBR0 0xF4F8
|
||||
#define DLL0 0xF4F8
|
||||
#define IER0 0xF4F9
|
||||
#define DLH0 0xF4F9
|
||||
#define IIR0 0xF4FA
|
||||
#define LCR0 0xF4FB
|
||||
#define MCR0 0xF4FC
|
||||
#define LSR0 0xF4FD
|
||||
#define MSR0 0xF4FE
|
||||
#define SCR0 0xF4FF
|
||||
/* ASYNCHRONOUS SERIAL CHANNEL 0 -- SLOT 0 ADDRESSES */
|
||||
#define RBR0DOS 0x03F8
|
||||
#define THR0DOS 0x03F8
|
||||
#define TBR0DOS 0x03F8
|
||||
#define DLL0DOS 0x03F8
|
||||
#define IER0DOS 0x03F9
|
||||
#define DLH0DOS 0x03F9
|
||||
#define IIR0DOS 0x03FA
|
||||
#define LCR0DOS 0x03FB
|
||||
#define MCR0DOS 0x03FC
|
||||
#define LSR0DOS 0x03FD
|
||||
#define MSR0DOS 0x03FE
|
||||
#define SCR0DOS 0x03FF
|
||||
|
||||
/* ASYNCHRONOUS SERIAL CHANNEL 1 -- SLOT 15 ADDRESSES */
|
||||
#define RBR1 0xF8F8
|
||||
#define THR1 0xF8F8
|
||||
#define TBR1 0XF8F8
|
||||
#define DLL1 0xF8F8
|
||||
#define IER1 0xF8F9
|
||||
#define DLH1 0xF8F9
|
||||
#define IIR1 0xF8FA
|
||||
#define LCR1 0xF8FB
|
||||
#define MCR1 0xF8FC
|
||||
#define LSR1 0xF8FD
|
||||
#define MSR1 0xF8FE
|
||||
#define SCR1 0xF8FF
|
||||
/* ASYNCHRONOUS SERIAL CHANNEL 1 -- SLOT 0 ADDRESSES */
|
||||
#define RBR1DOS 0x02F8
|
||||
#define THR1DOS 0x02F8
|
||||
#define TBR1DOS 0x02F8
|
||||
#define DLL1DOS 0x02F8
|
||||
#define IER1DOS 0x02F9
|
||||
#define DLH1DOS 0x02F9
|
||||
#define IIR1DOS 0x02FA
|
||||
#define LCR1DOS 0x02FB
|
||||
#define MCR1DOS 0x02FC
|
||||
#define LSR1DOS 0x02FD
|
||||
#define MSR1DOS 0x02FE
|
||||
#define SCR1DOS 0x02FF
|
||||
|
||||
/* SYNCHRONOUS SERIAL CHANNEL REGISTERS */
|
||||
#define SSIOTBUF 0xF480
|
||||
#define SSIORBUF 0xF482
|
||||
#define SSIOBAUD 0xF484
|
||||
#define SSIOCON1 0xF486
|
||||
#define SSIOCON2 0xF488
|
||||
#define SSIOCTR 0xF48A
|
||||
|
||||
/* CHIP SELECT UNIT Registers */
|
||||
#define CS0ADL 0xF400
|
||||
#define CS0ADH 0xF402
|
||||
#define CS0MSKL 0xF404
|
||||
#define CS0MSKH 0xF406
|
||||
#define CS1ADL 0xF408
|
||||
#define CS1ADH 0xF40A
|
||||
#define CS1MSKL 0xF40C
|
||||
#define CS1MSKH 0xF40E
|
||||
#define CS2ADL 0xF410
|
||||
#define CS2ADH 0xF412
|
||||
#define CS2MSKL 0xF414
|
||||
#define CS2MSKH 0xF416
|
||||
#define CS3ADL 0xF418
|
||||
#define CS3ADH 0xF41A
|
||||
#define CS3MSKL 0xF41C
|
||||
#define CS3MSKH 0xF41E
|
||||
#define CS4ADL 0xF420
|
||||
#define CS4ADH 0xF422
|
||||
#define CS4MSKL 0xF424
|
||||
#define CS4MSKH 0xF426
|
||||
#define CS5ADL 0xF428
|
||||
#define CS5ADH 0xF42A
|
||||
#define CS5MSKL 0xF42C
|
||||
#define CS5MSKH 0xF42E
|
||||
#define CS6ADL 0xF430
|
||||
#define CS6ADH 0xF432
|
||||
#define CS6MSKL 0xF434
|
||||
#define CS6MSKH 0xF436
|
||||
#define UCSADL 0xF438
|
||||
#define UCSADH 0xF43A
|
||||
#define UCSMSKL 0xF43C
|
||||
#define UCSMSKH 0xF43E
|
||||
|
||||
/* REFRESH CONTROL UNIT Registers */
|
||||
|
||||
#define RFSBAD 0xF4A0
|
||||
#define RFSCIR 0xF4A2
|
||||
#define RFSCON 0xF4A4
|
||||
#define RFSADD 0xF4A6
|
||||
|
||||
/* POWER MANAGEMENT CONTROL Registers */
|
||||
|
||||
#define PWRCON 0xF800
|
||||
#define CLKPRS 0xF804
|
||||
|
||||
/* DMA UNIT REGISTERS -- SLOT 15 ADDRESSES */
|
||||
#define DMA0TAR 0xF000
|
||||
#define DMA0BYC 0xF001
|
||||
#define DMA1TAR 0xF002
|
||||
#define DMA1BYC 0xF003
|
||||
#define DMACMD1 0xF008
|
||||
#define DMASTS 0xF008
|
||||
#define DMASRR 0xF009
|
||||
#define DMAMSK 0xF00A
|
||||
#define DMAMOD1 0xF00B
|
||||
#define DMACLRBP 0xF00C
|
||||
#define DMACLR 0xF00D
|
||||
#define DMACLRMSK 0xF00E
|
||||
#define DMAGRPMSK 0xF00F
|
||||
#define DMA0REQL 0xF010
|
||||
#define DMA0REQH 0xF011
|
||||
#define DMA1REQL 0xF012
|
||||
#define DMA1REQH 0xF013
|
||||
#define DMABSR 0xF018
|
||||
#define DMACHR 0xF019
|
||||
#define DMAIS 0xF019
|
||||
#define DMACMD2 0xF01A
|
||||
#define DMAMOD2 0xF01B
|
||||
#define DMAIEN 0xF01C
|
||||
#define DMAOVFE 0xF01D
|
||||
#define DMACLRTC 0xF01E
|
||||
#define DMA1TARPL 0xF083
|
||||
#define DMA1TARPH 0xF085
|
||||
#define DMA0TARPH 0xF086
|
||||
#define DMA0TARPL 0xF087
|
||||
#define DMA0BYCH 0xF098
|
||||
#define DMA1BYCH 0xF099
|
||||
|
||||
/* DMA UNIT REGISTERS -- SLOT 0 ADDRESSES */
|
||||
#define DMA0TARDOS 0x0000
|
||||
#define DMA0BYCDOS 0x0001
|
||||
#define DMA1TARDOS 0x0002
|
||||
#define DMA1BYCDOS 0x0003
|
||||
#define DMACMD1DOS 0x0008
|
||||
#define DMASTSDOS 0x0008
|
||||
#define DMASRRDOS 0x0009
|
||||
#define DMAMSKDOS 0x000A
|
||||
#define DMAMOD1DOS 0x000B
|
||||
#define DMACLRBPDOS 0x000C
|
||||
#define DMACLRDOS 0x000D
|
||||
#define DMACLRMSKDOS 0x000E
|
||||
#define DMAGRPMSKDOS 0x000F
|
||||
#define DMA1TARPLDOS 0x0083
|
||||
#define DMA0TARPLDOS 0x0087
|
||||
|
||||
/* A20GATE AND FAST CPU RESET -- SLOT 15 ADDRESS */
|
||||
#define PORT92 0xF092
|
||||
/* A20GATE AND FAST CPU RESET -- SLOT 0 ADDRESS */
|
||||
#define PORT92DOS 0x0092
|
||||
|
||||
/* end of include file */
|
||||
252
c/src/lib/libbsp/i386/ts_386ex/start/80386ex.inc
Normal file
252
c/src/lib/libbsp/i386/ts_386ex/start/80386ex.inc
Normal file
@@ -0,0 +1,252 @@
|
||||
/*
|
||||
* Submitted by:
|
||||
*
|
||||
* Erik Ivanenko
|
||||
* University of Toronto
|
||||
* erik.ivanenko@utoronto.ca
|
||||
*
|
||||
* 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$
|
||||
*/
|
||||
|
||||
/* REMAP ADDRESSING Registers */
|
||||
.set REMAPCFGH , 0x0023
|
||||
.set REMAPCFGL , 0x0022
|
||||
.set REMAPCFG , 0x0022
|
||||
/* INTERRUPT CONTROL REGISTERS -- SLOT 15 ADDRESSES */
|
||||
.set ICW1M , 0xF020
|
||||
.set ICW1S , 0xF0A0
|
||||
.set ICW2M , 0xF021
|
||||
.set ICW2S , 0xF0A1
|
||||
.set ICW3M , 0xF021
|
||||
.set ICW3S , 0xF0A1
|
||||
.set ICW4M , 0xF021
|
||||
.set ICW4S , 0xF0A1
|
||||
.set OCW1M , 0xF021
|
||||
.set OCW1S , 0xF0A1
|
||||
.set OCW2M , 0xF020
|
||||
.set OCW2S , 0xF0A0
|
||||
.set OCW3M , 0xF020
|
||||
.set OCW3S , 0xF0A0
|
||||
/* INTERRUPT CONTROL REGISTERS -- SLOT 0 ADDRESSES */
|
||||
.set ICW1MDOS , 0x0020
|
||||
.set ICW1SDOS , 0x00A0
|
||||
.set ICW2MDOS , 0x0021
|
||||
.set ICW2SDOS , 0x00A1
|
||||
.set ICW3MDOS , 0x0021
|
||||
.set ICW3SDOS , 0x00A1
|
||||
.set ICW4MDOS , 0x0021
|
||||
.set ICW4SDOS , 0x00A1
|
||||
.set OCW1MDOS , 0x0021
|
||||
.set OCW1SDOS , 0x00A1
|
||||
.set OCW2MDOS , 0x0020
|
||||
.set OCW2SDOS , 0x00A0
|
||||
.set OCW3MDOS , 0x0020
|
||||
.set OCW3SDOS , 0x00A0
|
||||
|
||||
|
||||
/* CONFIGURATION Registers */
|
||||
.set DMACFG , 0xF830
|
||||
.set INTCFG , 0xF832
|
||||
.set TMRCFG , 0xF834
|
||||
.set SIOCFG , 0xF836
|
||||
.set P1CFG , 0xF820
|
||||
.set P2CFG , 0xF822
|
||||
.set P3CFG , 0xF824
|
||||
.set PINCFG , 0xF826
|
||||
|
||||
/* WATCHDOG TIMER Registers */
|
||||
.set WDTRLDH , 0xF4C0
|
||||
.set WDTRLDL , 0xF4C2
|
||||
.set WDTCNTH , 0xF4C4
|
||||
.set WDTCNTL , 0xF4C6
|
||||
.set WDTCLR , 0xF4C8
|
||||
.set WDTSTATUS , 0xF4CA
|
||||
|
||||
/* TIMER CONTROL REGISTERS -- SLOT 15 ADDRESSES */
|
||||
.set TMR0 , 0xF040
|
||||
.set TMR1 , 0xF041
|
||||
.set TMR2 , 0xF042
|
||||
.set TMRCON , 0xF043
|
||||
/* TIMER CONTROL REGISTERS -- SLOT 0 ADDRESSES */
|
||||
.set TMR0DOS , 0x0040
|
||||
.set TMR1DOS , 0x0041
|
||||
.set TMR2DOS , 0x0042
|
||||
.set TMRCONDOS , 0x0043
|
||||
|
||||
/* INPUT/OUTPUT PORT UNIT Registers */
|
||||
.set P1PIN , 0xF860
|
||||
.set P1LTC , 0xF862
|
||||
.set P1DIR , 0xF864
|
||||
.set P2PIN , 0xF868
|
||||
.set P2LTC , 0xF86A
|
||||
.set P2DIR , 0xF86C
|
||||
.set P3PIN , 0xF870
|
||||
.set P3LTC , 0xF872
|
||||
.set P3DIR , 0xF874
|
||||
|
||||
/* ASYNCHRONOUS SERIAL CHANNEL 0 -- SLOT 15 ADDRESSES */
|
||||
.set RBR0 , 0xF4F8
|
||||
.set THR0 , 0xF4F8
|
||||
.set TBR0 , 0xF4F8
|
||||
.set DLL0 , 0xF4F8
|
||||
.set IER0 , 0xF4F9
|
||||
.set DLH0 , 0xF4F9
|
||||
.set IIR0 , 0xF4FA
|
||||
.set LCR0 , 0xF4FB
|
||||
.set MCR0 , 0xF4FC
|
||||
.set LSR0 , 0xF4FD
|
||||
.set MSR0 , 0xF4FE
|
||||
.set SCR0 , 0xF4FF
|
||||
/* ASYNCHRONOUS SERIAL CHANNEL 0 -- SLOT 0 ADDRESSES */
|
||||
.set RBR0DOS , 0x03F8
|
||||
.set THR0DOS , 0x03F8
|
||||
.set TBR0DOS , 0x03F8
|
||||
.set DLL0DOS , 0x03F8
|
||||
.set IER0DOS , 0x03F9
|
||||
.set DLH0DOS , 0x03F9
|
||||
.set IIR0DOS , 0x03FA
|
||||
.set LCR0DOS , 0x03FB
|
||||
.set MCR0DOS , 0x03FC
|
||||
.set LSR0DOS , 0x03FD
|
||||
.set MSR0DOS , 0x03FE
|
||||
.set SCR0DOS , 0x03FF
|
||||
|
||||
/* ASYNCHRONOUS SERIAL CHANNEL 1 -- SLOT 15 ADDRESSES */
|
||||
.set RBR1 , 0xF8F8
|
||||
.set THR1 , 0xF8F8
|
||||
.set TBR1 , 0XF8F8
|
||||
.set DLL1 , 0xF8F8
|
||||
.set IER1 , 0xF8F9
|
||||
.set DLH1 , 0xF8F9
|
||||
.set IIR1 , 0xF8FA
|
||||
.set LCR1 , 0xF8FB
|
||||
.set MCR1 , 0xF8FC
|
||||
.set LSR1 , 0xF8FD
|
||||
.set MSR1 , 0xF8FE
|
||||
.set SCR1 , 0xF8FF
|
||||
/* ASYNCHRONOUS SERIAL CHANNEL 1 -- SLOT 0 ADDRESSES */
|
||||
.set RBR1DOS , 0x02F8
|
||||
.set THR1DOS , 0x02F8
|
||||
.set TBR1DOS , 0x02F8
|
||||
.set DLL1DOS , 0x02F8
|
||||
.set IER1DOS , 0x02F9
|
||||
.set DLH1DOS , 0x02F9
|
||||
.set IIR1DOS , 0x02FA
|
||||
.set LCR1DOS , 0x02FB
|
||||
.set MCR1DOS , 0x02FC
|
||||
.set LSR1DOS , 0x02FD
|
||||
.set MSR1DOS , 0x02FE
|
||||
.set SCR1DOS , 0x02FF
|
||||
|
||||
/* SYNCHRONOUS SERIAL CHANNEL REGISTERS */
|
||||
.set SSIOTBUF , 0xF480
|
||||
.set SSIORBUF , 0xF482
|
||||
.set SSIOBAUD , 0xF484
|
||||
.set SSIOCON1 , 0xF486
|
||||
.set SSIOCON2 , 0xF488
|
||||
.set SSIOCTR , 0xF48A
|
||||
|
||||
/* CHIP SELECT UNIT Registers */
|
||||
.set CS0ADL , 0xF400
|
||||
.set CS0ADH , 0xF402
|
||||
.set CS0MSKL , 0xF404
|
||||
.set CS0MSKH , 0xF406
|
||||
.set CS1ADL , 0xF408
|
||||
.set CS1ADH , 0xF40A
|
||||
.set CS1MSKL , 0xF40C
|
||||
.set CS1MSKH , 0xF40E
|
||||
.set CS2ADL , 0xF410
|
||||
.set CS2ADH , 0xF412
|
||||
.set CS2MSKL , 0xF414
|
||||
.set CS2MSKH , 0xF416
|
||||
.set CS3ADL , 0xF418
|
||||
.set CS3ADH , 0xF41A
|
||||
.set CS3MSKL , 0xF41C
|
||||
.set CS3MSKH , 0xF41E
|
||||
.set CS4ADL , 0xF420
|
||||
.set CS4ADH , 0xF422
|
||||
.set CS4MSKL , 0xF424
|
||||
.set CS4MSKH , 0xF426
|
||||
.set CS5ADL , 0xF428
|
||||
.set CS5ADH , 0xF42A
|
||||
.set CS5MSKL , 0xF42C
|
||||
.set CS5MSKH , 0xF42E
|
||||
.set CS6ADL , 0xF430
|
||||
.set CS6ADH , 0xF432
|
||||
.set CS6MSKL , 0xF434
|
||||
.set CS6MSKH , 0xF436
|
||||
.set UCSADL , 0xF438
|
||||
.set UCSADH , 0xF43A
|
||||
.set UCSMSKL , 0xF43C
|
||||
.set UCSMSKH , 0xF43E
|
||||
|
||||
/* REFRESH CONTROL UNIT Registers */
|
||||
|
||||
.set RFSBAD , 0xF4A0
|
||||
.set RFSCIR , 0xF4A2
|
||||
.set RFSCON , 0xF4A4
|
||||
.set RFSADD , 0xF4A6
|
||||
|
||||
/* POWER MANAGEMENT CONTROL Registers */
|
||||
|
||||
.set PWRCON , 0xF800
|
||||
.set CLKPRS , 0xF804
|
||||
|
||||
/* DMA UNIT REGISTERS -- SLOT 15 ADDRESSES */
|
||||
.set DMA0TAR , 0xF000
|
||||
.set DMA0BYC , 0xF001
|
||||
.set DMA1TAR , 0xF002
|
||||
.set DMA1BYC , 0xF003
|
||||
.set DMACMD1 , 0xF008
|
||||
.set DMASTS , 0xF008
|
||||
.set DMASRR , 0xF009
|
||||
.set DMAMSK , 0xF00A
|
||||
.set DMAMOD1 , 0xF00B
|
||||
.set DMACLRBP , 0xF00C
|
||||
.set DMACLR , 0xF00D
|
||||
.set DMACLRMSK , 0xF00E
|
||||
.set DMAGRPMSK , 0xF00F
|
||||
.set DMA0REQL , 0xF010
|
||||
.set DMA0REQH , 0xF011
|
||||
.set DMA1REQL , 0xF012
|
||||
.set DMA1REQH , 0xF013
|
||||
.set DMABSR , 0xF018
|
||||
.set DMACHR , 0xF019
|
||||
.set DMAIS , 0xF019
|
||||
.set DMACMD2 , 0xF01A
|
||||
.set DMAMOD2 , 0xF01B
|
||||
.set DMAIEN , 0xF01C
|
||||
.set DMAOVFE , 0xF01D
|
||||
.set DMACLRTC , 0xF01E
|
||||
.set DMA1TARPL , 0xF083
|
||||
.set DMA1TARPH , 0xF085
|
||||
.set DMA0TARPH , 0xF086
|
||||
.set DMA0TARPL , 0xF087
|
||||
.set DMA0BYCH , 0xF098
|
||||
.set DMA1BYCH , 0xF099
|
||||
|
||||
/* DMA UNIT REGISTERS -- SLOT 0 ADDRESSES */
|
||||
.set DMA0TARDOS , 0x0000
|
||||
.set DMA0BYCDOS , 0x0001
|
||||
.set DMA1TARDOS , 0x0002
|
||||
.set DMA1BYCDOS , 0x0003
|
||||
.set DMACMD1DOS , 0x0008
|
||||
.set DMASTSDOS , 0x0008
|
||||
.set DMASRRDOS , 0x0009
|
||||
.set DMAMSKDOS , 0x000A
|
||||
.set DMAMOD1DOS , 0x000B
|
||||
.set DMACLRBPDOS , 0x000C
|
||||
.set DMACLRDOS , 0x000D
|
||||
.set DMACLRMSKDOS , 0x000E
|
||||
.set DMAGRPMSKDOS , 0x000F
|
||||
.set DMA1TARPLDOS , 0x0083
|
||||
.set DMA0TARPLDOS , 0x0087
|
||||
|
||||
/* A20GATE AND FAST CPU RESET -- SLOT 15 ADDRESS */
|
||||
.set PORT92 , 0xF092
|
||||
/* A20GATE AND FAST CPU RESET -- SLOT 0 ADDRESS */
|
||||
.set PORT92DOS , 0x0092
|
||||
72
c/src/lib/libbsp/i386/ts_386ex/start/Makefile.in
Normal file
72
c/src/lib/libbsp/i386/ts_386ex/start/Makefile.in
Normal file
@@ -0,0 +1,72 @@
|
||||
#
|
||||
# $Id$
|
||||
#
|
||||
|
||||
@SET_MAKE@
|
||||
srcdir = @srcdir@
|
||||
top_srcdir = @top_srcdir@
|
||||
top_builddir = ../../../../../../..
|
||||
subdir = c/src/lib/libbsp/i386/ts_386ex/start
|
||||
|
||||
INSTALL = @INSTALL@
|
||||
|
||||
RTEMS_ROOT = $(top_srcdir)/@RTEMS_TOPdir@
|
||||
PROJECT_ROOT = @PROJECT_ROOT@
|
||||
|
||||
VPATH = @srcdir@
|
||||
|
||||
RTEMS_GAS_CODE16 = @RTEMS_GAS_CODE16@
|
||||
|
||||
PGMS=${ARCH}/start.o
|
||||
|
||||
# C source names, if any, go here -- minus the .c
|
||||
C_PIECES=
|
||||
C_FILES=$(C_PIECES:%=%.c)
|
||||
C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
|
||||
|
||||
H_FILES=
|
||||
|
||||
# Assembly source names, if any, go here -- minus the .S
|
||||
S_PIECES=start
|
||||
S_FILES=$(S_PIECES:%=%.S)
|
||||
S_O_FILES=$(S_FILES:%.S=${ARCH}/%.o)
|
||||
|
||||
SRCS=$(C_FILES) $(H_FILES) $(S_FILES)
|
||||
OBJS=$(C_O_FILES) $(S_O_FILES)
|
||||
|
||||
include $(RTEMS_ROOT)/make/custom/$(RTEMS_BSP).cfg
|
||||
include $(RTEMS_ROOT)/make/leaf.cfg
|
||||
|
||||
#
|
||||
# (OPTIONAL) Add local stuff here using +=
|
||||
#
|
||||
|
||||
ifeq ($(RTEMS_GAS_CODE16),yes)
|
||||
CPPFLAGS += -DNEW_GAS
|
||||
endif
|
||||
|
||||
CFLAGS +=
|
||||
|
||||
LD_PATHS +=
|
||||
LD_LIBS +=
|
||||
LDFLAGS +=
|
||||
|
||||
#
|
||||
# Add your list of files to delete here. The config files
|
||||
# already know how to delete some stuff, so you may want
|
||||
# to just run 'make clean' first to see what gets missed.
|
||||
# 'make clobber' already includes 'make clean'
|
||||
#
|
||||
|
||||
CLEAN_ADDITIONS +=
|
||||
CLOBBER_ADDITIONS +=
|
||||
|
||||
all: ${ARCH} $(SRCS) $(OBJS) $(PGM)
|
||||
$(INSTALL_VARIANT) -m 555 ${PGMS} ${PROJECT_RELEASE}/lib
|
||||
|
||||
# Install the program(s), appending _g or _p as appropriate.
|
||||
# for include files, just use $(INSTALL_CHANGE)
|
||||
|
||||
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
||||
cd $(top_builddir) \
|
||||
&& CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
|
||||
115
c/src/lib/libbsp/i386/ts_386ex/start/macros.inc
Normal file
115
c/src/lib/libbsp/i386/ts_386ex/start/macros.inc
Normal file
@@ -0,0 +1,115 @@
|
||||
/* macros.inc
|
||||
*
|
||||
* This file assists the board independent startup code
|
||||
* by initializing the chip-select channels to
|
||||
* reflect the proper memory configuration.
|
||||
*
|
||||
* NOTE: No stack has been established when this routine
|
||||
* is invoked. It returns to start.s through ldsegs
|
||||
*
|
||||
* Submitted by:
|
||||
*
|
||||
* Erik Ivanenko
|
||||
* University of Toronto
|
||||
* erik.ivanenko@utoronto.ca
|
||||
*
|
||||
* 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$
|
||||
*/
|
||||
|
||||
.set GDT_CODE_PTR , 0x08
|
||||
.set GDT_DATA_PTR , 0x10
|
||||
|
||||
.set BOARD_SELECT , 0x301
|
||||
.set BOARD_DATA , 0x302
|
||||
.set BOARD_LATCH , 0x303
|
||||
|
||||
|
||||
#define SetExRegByte(_register,_value) \
|
||||
movb $ ## _value, al; \
|
||||
movw $ ## _register, dx; \
|
||||
outb al, dx
|
||||
|
||||
#define SetExRegWord(_register,_value) \
|
||||
movw $ ## _value, ax; \
|
||||
movw $ ## _register, dx ; \
|
||||
outw ax, dx
|
||||
|
||||
|
||||
#define DESC2(lim_0_15, bas_0_15, bas_16_23, access, gran, bas_24_31) \
|
||||
.word lim_0_15 ; \
|
||||
.word bas_0_15 ; \
|
||||
.byte bas_16_23 ; \
|
||||
.byte access ; \
|
||||
.byte gran ; \
|
||||
.byte bas_24_31
|
||||
|
||||
#define DESC3( _base, _limit) \
|
||||
.word _limit ; \
|
||||
.long _base
|
||||
|
||||
/* THE GET_ACCESS IS CHANGED FROM 8E TO 9E */
|
||||
|
||||
#define INTERRUPT_GATE( _vector ) \
|
||||
.word _vector ; \
|
||||
.word GDT_CODE_PTR ; \
|
||||
.byte 0x0 ; \
|
||||
.byte 0x8E ; \
|
||||
.word 0x0
|
||||
|
||||
#define rLOAD_INDEX( _selector, _segment_register) \
|
||||
movl _selector , _segment_register ; \
|
||||
addb al, ( eax )
|
||||
|
||||
#define rLOAD_SEGMENT( _reg, _segment_register) \
|
||||
mov _reg , _segment_register ; \
|
||||
|
||||
/* #define rLOAD_SEGMENT( _reg, _segment_register) \
|
||||
.code16 ; \
|
||||
mov _reg , _segment_register ; \
|
||||
.code32
|
||||
*/
|
||||
#define pLOAD_SEGMENT( _selector, _segment_register) \
|
||||
movl $ ## _selector , eax ; .code16 ; \
|
||||
mov ax, _segment_register ; .code32
|
||||
|
||||
/* #define MOVE_WORD( _immed32, _reg ) \
|
||||
data16 ; \
|
||||
movl _immed32, _reg
|
||||
*/
|
||||
|
||||
#define MOVE_WORD( _immed32, _reg ) \
|
||||
movw _immed32, _reg
|
||||
|
||||
/* #define MOVE_IMMED_WORD( _immed32, _reg ) \
|
||||
data16 ; \
|
||||
mov $ ## _immed32, _reg
|
||||
|
||||
#define CS_OFF( _cs_symbol, _reg ) \
|
||||
data16 ; \
|
||||
mov _cs_symbol, _reg ; \
|
||||
data16 ;\
|
||||
andl $0x000ffff, _reg
|
||||
|
||||
#define _16_NOPS \
|
||||
nop ; \
|
||||
nop ; \
|
||||
nop ; \
|
||||
nop ; \
|
||||
nop ; \
|
||||
nop ; \
|
||||
nop ; \
|
||||
nop ; \
|
||||
nop ; \
|
||||
nop ; \
|
||||
nop ; \
|
||||
nop ; \
|
||||
nop ; \
|
||||
nop ; \
|
||||
nop ; \
|
||||
nop ;
|
||||
*/
|
||||
|
||||
501
c/src/lib/libbsp/i386/ts_386ex/start/start.S
Normal file
501
c/src/lib/libbsp/i386/ts_386ex/start/start.S
Normal file
@@ -0,0 +1,501 @@
|
||||
/*
|
||||
* This file is the main boot and configuration file for the TS-1325. It is
|
||||
* solely responsible for initializing the internal register set to reflect
|
||||
* the proper board configuration. This version is modified from the i386ex
|
||||
* BSP startup:
|
||||
*
|
||||
* 1) 1 MB RAM @ 0x0100000
|
||||
* 2) 1 MB RAM @ 0x0 but with standard DOS memory usage.
|
||||
* 3) Timer0 used as RTEMS clock ticker, 1 msec tick rate.
|
||||
* 4) READY# is generated by CPU
|
||||
*
|
||||
* The file describes the ".initial" section, which contains:
|
||||
* 1) device configuration code
|
||||
* 2) interrupt descriptor table
|
||||
* 3) global descriptor table
|
||||
* 4) and initial boot code
|
||||
*
|
||||
* Modified by:
|
||||
*
|
||||
* Tony Ambardar
|
||||
* University of British Columbia
|
||||
* tonya@ece.ubc.ca
|
||||
*
|
||||
* 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 "asm.h"
|
||||
#include "macros.inc"
|
||||
#include "80386ex.inc"
|
||||
|
||||
#include "ts_1325.inc" /* controls for LED and button */
|
||||
|
||||
/*
|
||||
* NEW_GAS Needed for binutils 2.9.1.0.7 and higher
|
||||
*/
|
||||
|
||||
EXTERN (boot_card) /* exits to bspstart */
|
||||
EXTERN (_DOS_seg_base) /* defined in startup/linkcmds */
|
||||
EXTERN (Clock_exit)
|
||||
|
||||
PUBLIC (Interrupt_descriptor_table)
|
||||
PUBLIC ( SYM(IDTR) )
|
||||
PUBLIC (_Global_descriptor_table)
|
||||
PUBLIC ( SYM(GDTR) )
|
||||
|
||||
PUBLIC( SYM(_init_i386ex) )
|
||||
|
||||
|
||||
.section .initial
|
||||
|
||||
/*
|
||||
* Enable access to peripheral register at expanded I/O addresses
|
||||
*/
|
||||
SYM(_init_i386ex):
|
||||
.code16
|
||||
/*
|
||||
LED_GREEN
|
||||
WAIT_BUTTON
|
||||
*/
|
||||
# cli Move this up for now for debug.
|
||||
movw $0x8000 , ax
|
||||
outb al , $REMAPCFGH
|
||||
xchg al , ah
|
||||
outb al , $REMAPCFGL
|
||||
outw ax , $REMAPCFG ;
|
||||
/*
|
||||
LED_OFF
|
||||
WAIT_BUTTON
|
||||
*/
|
||||
/*
|
||||
* Configure operation of the A20 Address Line
|
||||
*/
|
||||
SYM(A20):
|
||||
movw $PORT92 , dx
|
||||
|
||||
inb dx , al # clear A20 port reset
|
||||
andb $0xfe , al # b0 Fast Reset(0)=disabled,(1)=reset triggered
|
||||
orb $0x02 , al # Bit 1 Fast A20 = 0 (always 0) else enabled.
|
||||
outb al , dx
|
||||
/*
|
||||
LED_YELLOW
|
||||
WAIT_BUTTON
|
||||
*/
|
||||
SYM(Watchdog):
|
||||
movw $WDTSTATUS , dx # address the WDT status port
|
||||
inb dx , al # get the WDT status
|
||||
orb $0x01 , al # set the CLKDIS bit
|
||||
outb al , dx # disable the clock to the WDT
|
||||
/*
|
||||
LED_GREEN
|
||||
WAIT_BUTTON
|
||||
*/
|
||||
/*
|
||||
* Initialize Refresh Control Unit for:
|
||||
* Refresh Address = 0x0000
|
||||
|
||||
* Refresh gate between rows is 20.0 (???) uSec
|
||||
* Using a CLK2 frequency of 50Mhz ( 25Mhz CPU )
|
||||
* The refresh unit is enabled
|
||||
* The refresh pin is not used.
|
||||
*
|
||||
* Different TS units might have different refresh intervals, so
|
||||
* comment out. Will be set up anyway after booting to DOS.
|
||||
*/
|
||||
|
||||
/*
|
||||
SYM(InitRCU):
|
||||
SetExRegWord( RFSCIR , 0x1F4) # refresh interval 500
|
||||
SetExRegWord( RFSBAD , 0x0) # base address
|
||||
SetExRegWord( RFSADD , 0x0) # address register
|
||||
SetExRegWord( RFSCON , 0x8000) # enable bit
|
||||
*/
|
||||
|
||||
/*
|
||||
LED_OFF
|
||||
WAIT_BUTTON
|
||||
*/
|
||||
/*
|
||||
* Initialize clock and power mgmt unit for:
|
||||
* Clock Frequency = 50 Mhz
|
||||
* Prescaled clock output = 1 Mhz
|
||||
* Normal halt instructions
|
||||
*
|
||||
* NOTE: Hope this doesn't change the COMCLK frequency
|
||||
*/
|
||||
|
||||
SYM(InitClk):
|
||||
SetExRegByte( PWRCON, 0x0 )
|
||||
SetExRegWord( CLKPRS, 0x17) # 0x13 for 1.19318 MHz. 0x17 for 1MHz.
|
||||
|
||||
/**************************************************************
|
||||
* Initialize the Pin Configurations
|
||||
*************************************************************/
|
||||
/*
|
||||
LED_YELLOW
|
||||
WAIT_BUTTON
|
||||
*/
|
||||
/*
|
||||
* Initialize I/O port 1 for:
|
||||
* PIN 0 = 0, Inport for external push-button switch
|
||||
* PIN 1 = 1, RTS0# to package pin
|
||||
* PIN 2 = 1, DTR0# to package pin
|
||||
* PIN 3 = 1, DSR0# to package pin
|
||||
* PIN 4 = 0, Inport ???
|
||||
* PIN 5 = 0, Outport (Green LED, 1 = ON)
|
||||
* PIN 6 = 0, Outport (Red LED, 1 = OFF)
|
||||
* PIN 7 = 0, Inport ???
|
||||
*/
|
||||
|
||||
SYM(InitPort1):
|
||||
SetExRegByte( P1LTC , 0xd1 )
|
||||
SetExRegByte( P1DIR , 0x91)
|
||||
SetExRegByte( P1CFG , 0x0e)
|
||||
/*
|
||||
LED_GREEN
|
||||
WAIT_BUTTON
|
||||
*/
|
||||
/*
|
||||
* Initialize I/O port 2 for:
|
||||
* PIN 0 = 0, Outport ???
|
||||
* PIN 1 = 0, Outport ???
|
||||
* PIN 2 = 0, Outport ???
|
||||
* PIN 3 = 0, Outport ???
|
||||
* PIN 4 = 0, Outport ???
|
||||
* PIN 5 = 1, Int. periph, RXD0
|
||||
* PIN 6 = 1, Int. periph, TXD0
|
||||
* PIN 7 = 0, Outport ???
|
||||
*/
|
||||
|
||||
SYM(InitPort2):
|
||||
SetExRegByte( P2LTC , 0x1f )
|
||||
SetExRegByte( P2DIR , 0x00 )
|
||||
SetExRegByte( P2CFG , 0x60)
|
||||
/*
|
||||
LED_OFF
|
||||
WAIT_BUTTON
|
||||
*/
|
||||
/*
|
||||
* Initialize I/O port 3 P3CFG
|
||||
* PIN 0 = 1, Int. periph, TMROUT0
|
||||
* PIN 1 = 1, Int. periph, TMROUT1
|
||||
* PIN 2 = 1, Int. periph, INT0 (IR1)
|
||||
* PIN 3 = 1, Int. periph, INT1 (IR5)
|
||||
* PIN 4 = 1, Int. periph, INT2 (IR6)
|
||||
* PIN 5 = 1, Int. periph, INT2 (IR7)
|
||||
* PIN 6 = 0, Outport ???
|
||||
* PIN 7 = 1, Int. periph, COMCLK used for serial I/O
|
||||
*/
|
||||
|
||||
SYM(InitPort3):
|
||||
SetExRegByte( P3LTC , 0x00 )
|
||||
SetExRegByte( P3DIR , 0xbf )
|
||||
SetExRegByte( P3CFG , 0xbf ) # can check TMROUT0
|
||||
/*
|
||||
LED_YELLOW
|
||||
WAIT_BUTTON
|
||||
*/
|
||||
/*
|
||||
* Initialize Peripheral Pin Configurations:
|
||||
* PIN 0 = 1, Select RTS1#
|
||||
* PIN 1 = 1, Select DTR1#
|
||||
* PIN 2 = 1, Select TXD1#
|
||||
* PIN 3 = 1, Select CTS1#
|
||||
* PIN 4 = 1, CS5
|
||||
* PIN 5 = 1, Timer2 pins enabled
|
||||
* PIN 6 = 0, Select CS6#
|
||||
* PIN 7 = 0, Don't care
|
||||
*/
|
||||
|
||||
SYM(InitPeriph):
|
||||
SetExRegByte( PINCFG , 0x3f)
|
||||
/*
|
||||
LED_GREEN
|
||||
WAIT_BUTTON
|
||||
*/
|
||||
/*
|
||||
* Initialize the Asynchronous Serial Ports:
|
||||
* BIT 7 = 1, Internal SIO1 modem signals
|
||||
* BIT 6 = 1, Internal SIO0 modem signals
|
||||
* BIT 2 = 0, PSCLK for SSIO clock
|
||||
* BIT 1 = 1, SERCLK for SIO1 clock
|
||||
* BIT 0 = 1, SERCLK for SIO0 clock
|
||||
*/
|
||||
|
||||
SYM(InitSIO):
|
||||
SetExRegByte( SIOCFG, 0x00 ) # COMCLK -> baud-rate generator
|
||||
# modem signals -> package pins
|
||||
SetExRegByte( LCR0, 0x80 ) # latch DLL0, DLH0
|
||||
SetExRegByte( DLL0, 0x01 ) # 0x0C sets to 9600 baud 0x6 = 19.2K
|
||||
SetExRegByte( DLH0, 0x00 ) # 0x4 is 28.8K baud, 0x1 is 115K baud
|
||||
SetExRegByte( LCR0, 0x03 ) # enable r/w buffers, IER0 accessible
|
||||
# mode 8-n-1
|
||||
SetExRegByte( IER0, 0x00 ) # no generated interrupts
|
||||
|
||||
SetExRegByte( LCR1, 0x80 ) # latch DLL0, DLH0
|
||||
SetExRegByte( DLL1, 0x01 ) # 0x0C set to 9600 baud, 0x6 = 19.2K
|
||||
SetExRegByte( DLH1, 0x00 ) # 0x4 is 28.8K baud
|
||||
SetExRegByte( LCR1, 0x03 ) # enable r/w buffers, IER1 accessible
|
||||
# reg 8-n-1
|
||||
SetExRegByte( IER1, 0x00 ) # no generated intrrupts
|
||||
/*
|
||||
LED_OFF
|
||||
WAIT_BUTTON
|
||||
*/
|
||||
SYM(InitMCR):
|
||||
SetExRegByte( MCR0, 0x03 ) # standard mode, RTS,DTR activated
|
||||
SetExRegByte( MCR1, 0x03 ) # standard mode, RTS,DTR activated
|
||||
|
||||
/*
|
||||
* Initialize Timer for:
|
||||
* BIT 7 = 1, Timer clocks disabled
|
||||
* BIT 6 = 0, Reserved
|
||||
* BIT 5 = 1, TMRCLK2 instead of Vcc to Gate2
|
||||
* BIT 4 = 0, PSCLK to CLK2
|
||||
* BIT 3 = 1, TMRCLK1 instead of Vcc to Gate1
|
||||
* BIT 2 = 0, PSCLK to Gate1
|
||||
* BIT 1 = 0, Vcc to Gate0
|
||||
* BIT 0 = 0, PSCLK to Gate0
|
||||
*/
|
||||
/*
|
||||
LED_YELLOW
|
||||
WAIT_BUTTON
|
||||
*/
|
||||
SYM(InitTimer):
|
||||
SetExRegByte(TMRCFG , 0x80 ) # All counters disabled, Gates 0,1
|
||||
# and 2 are set to Vcc
|
||||
|
||||
SetExRegByte(TMRCON , 0x34 ) # prepare to write counter 0 LSB,MSB
|
||||
SetExRegByte(TMR0 , 0x00 ) # sfa
|
||||
SetExRegByte(TMR0 , 0x00 ) # sfa
|
||||
|
||||
|
||||
SetExRegByte(TMRCON , 0x70 ) # mode 0 disables on Gate= Vcc
|
||||
SetExRegByte(TMR1 , 0x00 ) # sfa
|
||||
SetExRegByte(TMR1 , 0x00 ) # sfa
|
||||
|
||||
SetExRegByte(TMRCON , 0xB0 ) # mode 0 disables on gate =Vcc
|
||||
SetExRegByte(TMR2 , 0x00 ) #
|
||||
SetExRegByte(TMR2 , 0x00 ) #
|
||||
|
||||
/*
|
||||
LED_GREEN
|
||||
WAIT_BUTTON
|
||||
*/
|
||||
/*
|
||||
* Initialize the DMACFG register for:
|
||||
* BIT 7 = 1 , Disable DACK#1
|
||||
* BITs 6:4 = 100, TMROUT2 connected to DRQ1
|
||||
* BIT 3 = 1 , Disable DACK0#
|
||||
* BIT 2:0 = 000, Pin is connected to DRQ0
|
||||
*
|
||||
* NOTE: not 100% sure of this...
|
||||
*/
|
||||
|
||||
SetExRegByte(DMACFG , 0xC0 )
|
||||
SetExRegByte(DMACMD1, 0x00 ) # disable both DMA channels
|
||||
SetExRegByte(DMAMOD1, 0x40 ) # DMA0 single transer mode
|
||||
/*
|
||||
LED_OFF
|
||||
WAIT_BUTTON
|
||||
*/
|
||||
/*
|
||||
* Initialize the INTCFG register for:
|
||||
* BIT 7 = 0, 8259 cascade disabled
|
||||
* BIT 3 = 0, SLAVE IR6 connected to Vss
|
||||
* BIT 2 = 0, SLAVE IR5 connected to Vss
|
||||
* BIT 1 = 0, SLAVE IR1 connected to SSIOINT
|
||||
* BIT 0 = 0, SLAVE IR0 connected to Vss
|
||||
*
|
||||
* NOTE: not 100% sure of this either... Why IR5 active?
|
||||
*/
|
||||
|
||||
SYM(InitInt):
|
||||
|
||||
cli # !
|
||||
/*
|
||||
LED_YELLOW
|
||||
WAIT_BUTTON
|
||||
*/
|
||||
SetExRegByte(ICW1S , 0x11 ) # EDGE TRIGGERED
|
||||
SetExRegByte(ICW2S , 0x28 ) # Slave base vector after Master
|
||||
SetExRegByte(ICW3S , 0x02 ) # slave cascaded to IR2 on master
|
||||
SetExRegByte(ICW4S , 0x01 ) # fully nested mode, no EOI
|
||||
|
||||
SetExRegByte(ICW1M , 0x11 ) # edge triggered
|
||||
SetExRegByte(ICW2M , 0x20 ) # base vector starts at byte 32
|
||||
SetExRegByte(ICW3M , 0x04) # internal slave cascaded from master IR2
|
||||
SetExRegByte(ICW4M , 0x01 ) # idem
|
||||
|
||||
SetExRegByte(OCW1M , 0xfb ) # mask master IRQs, but not IR2 (cascade)
|
||||
SetExRegByte(OCW1S , 0xff ) # mask all slave IRQs
|
||||
SetExRegByte(INTCFG , 0x00 ) # slave IRs -> Vss or SSIOINT
|
||||
|
||||
/* The i8259s_cache (IRQ mask) location is in BSS, which is zeroed later!
|
||||
* So to initialize the cache we should do the following command after
|
||||
* the BSS is zeroed, and in 32-bit protected mode.
|
||||
*
|
||||
* movw $0xFFFB, SYM(i8259s_cache)
|
||||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
NOTE: not sure about this so comment out...
|
||||
|
||||
SYM(SetCS4):
|
||||
SetExRegWord(CS4ADL , 0x702) #Configure chip select 4
|
||||
SetExRegWord(CS4ADH , 0x00)
|
||||
SetExRegWord(CS4MSKH, 0x03F)
|
||||
SetExRegWord(CS4MSKL, 0xFC01)
|
||||
*/
|
||||
/*
|
||||
LED_GREEN
|
||||
WAIT_BUTTON
|
||||
*/
|
||||
/*****************************
|
||||
* Load the Global Descriptor
|
||||
* Table Register
|
||||
****************************/
|
||||
|
||||
movl $SYM(GDTR), eax
|
||||
andl $0xFFFF, eax
|
||||
|
||||
#ifdef NEW_GAS
|
||||
addr32
|
||||
data32
|
||||
#endif
|
||||
|
||||
lgdt (eax) # location of GDT in segment
|
||||
|
||||
/*
|
||||
NOTE: not sure about this either so comment out for now...
|
||||
SYM(SetUCS):
|
||||
SetExRegWord(UCSADL, 0xC503) # values taken from TS-1325 memory
|
||||
SetExRegWord(UCSADH, 0x000D)
|
||||
SetExRegWord(UCSMSKH, 0x0000)
|
||||
SetExRegWord(UCSMSKL, 0x3C01) # configure upper chip select
|
||||
*/
|
||||
/*
|
||||
LED_OFF
|
||||
WAIT_BUTTON
|
||||
*/
|
||||
/***************************
|
||||
* Switch to Protected Mode
|
||||
***************************/
|
||||
mov cr0, eax
|
||||
orw $0x1, ax
|
||||
mov eax, cr0
|
||||
|
||||
/**************************
|
||||
* Flush prefetch queue,
|
||||
* and load CS selector
|
||||
*********************/
|
||||
/*
|
||||
LED_YELLOW
|
||||
WAIT_BUTTON
|
||||
*/
|
||||
ljmpl $ GDT_CODE_PTR , $ SYM(_load_segment_registers) # sets the code selector
|
||||
|
||||
/*
|
||||
* Load the segment registers
|
||||
*/
|
||||
SYM(_load_segment_registers):
|
||||
.code32
|
||||
/*
|
||||
LED_GREEN
|
||||
WAIT_BUTTON
|
||||
*/
|
||||
pLOAD_SEGMENT( GDT_DATA_PTR, fs)
|
||||
pLOAD_SEGMENT( GDT_DATA_PTR, gs)
|
||||
pLOAD_SEGMENT( GDT_DATA_PTR, ss)
|
||||
pLOAD_SEGMENT( GDT_DATA_PTR, ds)
|
||||
pLOAD_SEGMENT( GDT_DATA_PTR, es)
|
||||
|
||||
/*
|
||||
* Set up the stack
|
||||
*/
|
||||
/*
|
||||
LED_OFF
|
||||
WAIT_BUTTON
|
||||
*/
|
||||
SYM(lidtr):
|
||||
lidt SYM(IDTR)
|
||||
/*
|
||||
LED_YELLOW
|
||||
WAIT_BUTTON
|
||||
*/
|
||||
SYM (_establish_stack):
|
||||
movl $_ebss, eax # stack starts right after bss
|
||||
movl $stack_origin, esp # this is the high starting address
|
||||
movl $stack_origin, ebp
|
||||
/*
|
||||
LED_GREEN
|
||||
WAIT_BUTTON
|
||||
*/
|
||||
/*
|
||||
* Zero out the BSS segment
|
||||
*/
|
||||
SYM (zero_bss):
|
||||
cld # make direction flag count up
|
||||
movl $ SYM (_ebss),ecx # find end of .bss
|
||||
movl $ SYM (_bss_start),edi # edi = beginning of .bss
|
||||
subl edi,ecx # ecx = size of .bss in bytes
|
||||
shrl ecx # size of .bss in longs
|
||||
shrl ecx
|
||||
xorl eax,eax # value to clear out memory
|
||||
repne # while ecx != 0
|
||||
stosl # clear a long in the bss
|
||||
/*
|
||||
* Now we can initialize the IRQ mask in i8259s_cache
|
||||
*/
|
||||
movw $0xFFFB, SYM(i8259s_cache)
|
||||
/*
|
||||
LED_YELLOW # Indicate ready to run
|
||||
WAIT_BUTTON
|
||||
*/
|
||||
LED_GREEN # Indicate RTEMS running!
|
||||
|
||||
/*
|
||||
* Transfer control to User's Board Support Package
|
||||
*/
|
||||
pushl $0 # environp
|
||||
pushl $0 # argv
|
||||
pushl $0 # argc
|
||||
call SYM(boot_card)
|
||||
addl $12,esp
|
||||
|
||||
LED_RED # Indicate RTEMS exited
|
||||
/*
|
||||
WAIT_BUTTON
|
||||
*/
|
||||
cli # stops interrupts after hlt!
|
||||
hlt # shutdown
|
||||
|
||||
|
||||
.balign 4 # align tables to 4 byte boundary
|
||||
|
||||
SYM(IDTR): DESC3( SYM(Interrupt_descriptor_table), 0x07ff );
|
||||
|
||||
SYM(Interrupt_descriptor_table): /* Now in data section */
|
||||
.rept 256
|
||||
.word 0,0,0,0
|
||||
.endr
|
||||
|
||||
|
||||
/*
|
||||
* Use the first (null) entry in the the GDT as a self-pointer for the GDTR.
|
||||
* (looks like a common trick)
|
||||
*/
|
||||
|
||||
SYM (_Global_descriptor_table):
|
||||
SYM(GDTR): DESC3( GDTR, 0x17 ); # one less than the size
|
||||
.word 0 # padding to DESC2 size
|
||||
SYM(GDT_CODE): DESC2(0xffff,0,0x0,0x9B,0xDF,0x00);
|
||||
SYM(GDT_DATA): DESC2(0xffff,0,0x0,0x92,0xDF,0x00); # was CF
|
||||
SYM(GDT_END):
|
||||
|
||||
END
|
||||
50
c/src/lib/libbsp/i386/ts_386ex/start/ts_1325.inc
Normal file
50
c/src/lib/libbsp/i386/ts_386ex/start/ts_1325.inc
Normal file
@@ -0,0 +1,50 @@
|
||||
/*
|
||||
These are just some useful macros that control the TS-1325's
|
||||
LEDs and push-button switch. Useful for debugging.
|
||||
|
||||
NOTE: This *must* be 16-bit compatible code to work in start.s
|
||||
|
||||
Tony Ambardar
|
||||
*/
|
||||
|
||||
.macro LED_OFF
|
||||
movw $P1LTC, dx
|
||||
inb dx, al
|
||||
orb $0b01000000, al
|
||||
andb $0b11011111, al
|
||||
outb al, dx
|
||||
.endm
|
||||
|
||||
.macro LED_GREEN
|
||||
movw $P1LTC, dx
|
||||
inb dx, al
|
||||
orb $0b01100000, al
|
||||
outb al, dx
|
||||
.endm
|
||||
|
||||
.macro LED_YELLOW
|
||||
movw $P1LTC, dx
|
||||
inb dx, al
|
||||
orb $0b00100000, al
|
||||
andb $0b10111111, al
|
||||
outb al, dx
|
||||
.endm
|
||||
|
||||
.macro LED_RED
|
||||
movw $P1LTC, dx
|
||||
inb dx, al
|
||||
andb $0b10011111, al
|
||||
outb al, dx
|
||||
.endm
|
||||
|
||||
.macro WAIT_BUTTON # Wait till the button is pressed for a bit.
|
||||
movw $P1PIN, dx # ~25-30 cycles per loop, 25MHz -> 1 sec.
|
||||
movl $300000,ecx # "Timer" count determines how long.
|
||||
0: inb dx, al
|
||||
andb $0b00000001,al
|
||||
jnz 0b # Button pressed?
|
||||
decl ecx
|
||||
jnz 0b # CX count expired?
|
||||
.endm
|
||||
|
||||
|
||||
79
c/src/lib/libbsp/i386/ts_386ex/startup/Makefile.in
Normal file
79
c/src/lib/libbsp/i386/ts_386ex/startup/Makefile.in
Normal file
@@ -0,0 +1,79 @@
|
||||
#
|
||||
# $Id$
|
||||
#
|
||||
|
||||
@SET_MAKE@
|
||||
srcdir = @srcdir@
|
||||
top_srcdir = @top_srcdir@
|
||||
top_builddir = ../../../../../../..
|
||||
subdir = c/src/lib/libbsp/i386/ts_386ex/startup
|
||||
|
||||
INSTALL = @INSTALL@
|
||||
|
||||
RTEMS_ROOT = $(top_srcdir)/@RTEMS_TOPdir@
|
||||
PROJECT_ROOT = @PROJECT_ROOT@
|
||||
|
||||
VPATH = @srcdir@:@srcdir@/../../../shared:@srcdir@/../../shared/comm:@srcdir@/../../shared/irq:@srcdir@/../../shared/io
|
||||
|
||||
PGM=${ARCH}/startup.rel
|
||||
|
||||
# C source names, if any, go here -- minus the .c
|
||||
C_PIECES=bspclean bsplibc bsppost bspstart main sbrk irq irq_init i386-stub-glue uart i386-stub
|
||||
|
||||
C_FILES=$(C_PIECES:%=%.c)
|
||||
C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
|
||||
|
||||
H_FILES=
|
||||
|
||||
# Assembly source names, if any, go here -- minus the .S
|
||||
# removed initcsu piece, ldsegs piece and flush
|
||||
S_PIECES=irq_asm
|
||||
S_FILES=$(S_PIECES:%=%.S)
|
||||
S_O_FILES=$(S_FILES:%.S=${ARCH}/%.o)
|
||||
|
||||
SRCS=$(srcdir)/linkcmds $(C_FILES) $(CC_FILES) $(H_FILES) $(S_FILES)
|
||||
OBJS=$(C_O_FILES) $(CC_O_FILES) $(S_O_FILES)
|
||||
|
||||
include $(RTEMS_ROOT)/make/custom/$(RTEMS_BSP).cfg
|
||||
include $(RTEMS_ROOT)/make/leaf.cfg
|
||||
|
||||
#
|
||||
# (OPTIONAL) Add local stuff here using +=
|
||||
#
|
||||
|
||||
#DEFINES += -DPRINTON
|
||||
|
||||
DEFINES += -I$(srcdir)
|
||||
CPPFLAGS +=
|
||||
CFLAGS +=
|
||||
|
||||
LD_PATHS +=
|
||||
LD_LIBS +=
|
||||
LDFLAGS +=
|
||||
|
||||
#
|
||||
# Add your list of files to delete here. The config files
|
||||
# already know how to delete some stuff, so you may want
|
||||
# to just run 'make clean' first to see what gets missed.
|
||||
# 'make clobber' already includes 'make clean'
|
||||
#
|
||||
|
||||
CLEAN_ADDITIONS +=
|
||||
CLOBBER_ADDITIONS +=
|
||||
|
||||
preinstall:
|
||||
$(INSTALL_CHANGE) ${IMPORT_SRC} .
|
||||
|
||||
# ${CP} ${IMPORT_SRC} .
|
||||
|
||||
${PGM}: ${SRCS} ${OBJS}
|
||||
$(make-rel)
|
||||
all: ${ARCH} preinstall $(SRCS) $(PGM)
|
||||
$(INSTALL_CHANGE) $(srcdir)/linkcmds ${PROJECT_RELEASE}/lib
|
||||
|
||||
# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
|
||||
install: all
|
||||
|
||||
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
||||
cd $(top_builddir) \
|
||||
&& CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
|
||||
17
c/src/lib/libbsp/i386/ts_386ex/startup/README
Normal file
17
c/src/lib/libbsp/i386/ts_386ex/startup/README
Normal file
@@ -0,0 +1,17 @@
|
||||
#
|
||||
# $Id$
|
||||
#
|
||||
|
||||
|
||||
The requirements for this BSP are only that the GAS used supports the
|
||||
.code16 directive. The GAS released with any GCC version 2.8.0 or better
|
||||
is required. The BSP was built with an egcs snapshot pre-1.0.2 and
|
||||
post-1.0.1. However, any egcs should work.
|
||||
|
||||
|
||||
The only "real" differences are in bspstart.c, where the initialization now
|
||||
configures all available RAM, (after setting up the Workspaces) as heap.
|
||||
The location of the stack was changed so that the heap was not trapped
|
||||
between low memory and the stack; the stack comes before the heap.
|
||||
|
||||
|
||||
161
c/src/lib/libbsp/i386/ts_386ex/startup/bspstart.c
Normal file
161
c/src/lib/libbsp/i386/ts_386ex/startup/bspstart.c
Normal file
@@ -0,0 +1,161 @@
|
||||
/*
|
||||
* This routine starts the application. It includes application,
|
||||
* board, and monitor specific initialization and configuration.
|
||||
* The generic CPU dependent initialization has been performed
|
||||
* before this routine is invoked.
|
||||
*
|
||||
* COPYRIGHT (c) 1989-1998.
|
||||
* On-Line Applications Research Corporation (OAR).
|
||||
* Copyright assigned to U.S. Government, 1994.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* Ported to the i386ex and submitted by:
|
||||
*
|
||||
* Erik Ivanenko
|
||||
* University of Toronto
|
||||
* erik.ivanenko@utoronto.ca
|
||||
*
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
void bsp_clean_up(void);
|
||||
|
||||
#include <bsp.h>
|
||||
#include <rtems/libio.h>
|
||||
|
||||
#include <libcsupport.h>
|
||||
|
||||
/*
|
||||
* The original table from the application and our copy of it with
|
||||
* some changes.
|
||||
*/
|
||||
|
||||
extern rtems_configuration_table Configuration;
|
||||
rtems_configuration_table BSP_Configuration;
|
||||
|
||||
rtems_cpu_table Cpu_table;
|
||||
|
||||
/*
|
||||
* Tells us where to put the workspace in case remote debugger is present.
|
||||
*/
|
||||
|
||||
extern rtems_unsigned32 rdb_start;
|
||||
|
||||
/*
|
||||
* Use the shared implementations of the following routines
|
||||
*/
|
||||
|
||||
void bsp_postdriver_hook(void);
|
||||
void bsp_libc_init( void *, unsigned32, int );
|
||||
|
||||
/*
|
||||
* Function: bsp_pretasking_hook
|
||||
* Created: 95/03/10
|
||||
*
|
||||
* Description:
|
||||
* BSP pretasking hook. Called just before drivers are initialized.
|
||||
* Used to setup libc and install any BSP extensions.
|
||||
*
|
||||
* NOTES:
|
||||
* Must not use libc (to do io) from here, since drivers are
|
||||
* not yet initialized.
|
||||
*
|
||||
*/
|
||||
|
||||
void bsp_pretasking_hook(void)
|
||||
{
|
||||
extern int heap_bottom;
|
||||
rtems_unsigned32 heap_start;
|
||||
rtems_unsigned32 heap_size;
|
||||
|
||||
heap_start = (rtems_unsigned32) &heap_bottom;
|
||||
if (heap_start & (CPU_ALIGNMENT-1))
|
||||
heap_start = (heap_start + CPU_ALIGNMENT) & ~(CPU_ALIGNMENT-1);
|
||||
|
||||
heap_size = BSP_Configuration.work_space_start -(void *) heap_start ;
|
||||
heap_size &= 0xfffffff0; /* keep it as a multiple of 16 bytes */
|
||||
|
||||
heap_size &= 0xfffffff0; /* keep it as a multiple of 16 bytes */
|
||||
bsp_libc_init((void *) heap_start, heap_size, 0);
|
||||
|
||||
|
||||
#ifdef RTEMS_DEBUG
|
||||
rtems_debug_enable( RTEMS_DEBUG_ALL_MASK );
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
* bsp_start
|
||||
*
|
||||
* This routine does the bulk of the system initialization.
|
||||
*/
|
||||
|
||||
void bsp_start( void )
|
||||
{
|
||||
/*
|
||||
* we do not use the pretasking_hook.
|
||||
*/
|
||||
|
||||
Cpu_table.pretasking_hook = bsp_pretasking_hook; /* init libc, etc. */
|
||||
Cpu_table.postdriver_hook = bsp_postdriver_hook;
|
||||
Cpu_table.interrupt_table_segment = get_ds();
|
||||
Cpu_table.interrupt_table_offset = (void *)Interrupt_descriptor_table;
|
||||
Cpu_table.interrupt_stack_size = 8192;
|
||||
/*
|
||||
#if defined(RTEMS_POSIX_API)
|
||||
BSP_Configuration.work_space_size *= 3;
|
||||
#endif
|
||||
*/
|
||||
BSP_Configuration.work_space_start = (void *)
|
||||
RAM_END - BSP_Configuration.work_space_size;
|
||||
|
||||
/*
|
||||
* Account for the console's resources
|
||||
*/
|
||||
console_reserve_resources( &BSP_Configuration );
|
||||
|
||||
/*
|
||||
* Init rtems_interrupt_management
|
||||
*/
|
||||
rtems_irq_mngt_init();
|
||||
|
||||
/*
|
||||
* Init rtems exceptions management
|
||||
*/
|
||||
rtems_exception_init_mngt();
|
||||
|
||||
/*
|
||||
* The following information is very useful when debugging.
|
||||
*/
|
||||
|
||||
#ifdef BSP_DEBUG
|
||||
printk( "RAM_START = 0x%x\nRAM_END = 0x%x\n", RAM_START, RAM_END );
|
||||
printk( "work_space_start = 0x%x\n",
|
||||
BSP_Configuration.work_space_start );
|
||||
printk( "work_space_size = 0x%x\n",
|
||||
BSP_Configuration.work_space_size );
|
||||
printk( "maximum_extensions = 0x%x\n",
|
||||
BSP_Configuration.maximum_extensions );
|
||||
printk( "microseconds_per_tick = 0x%x\n",
|
||||
BSP_Configuration.microseconds_per_tick );
|
||||
printk( "ticks_per_timeslice = 0x%x\n",
|
||||
BSP_Configuration.ticks_per_timeslice );
|
||||
printk( "maximum_devices = 0x%x\n",
|
||||
BSP_Configuration.maximum_devices );
|
||||
printk( "number_of_device_drivers = 0x%x\n",
|
||||
BSP_Configuration.number_of_device_drivers );
|
||||
printk( "Device_driver_table = 0x%x\n",
|
||||
BSP_Configuration.Device_driver_table );
|
||||
|
||||
/* printk( "_heap_size = 0x%x\n", _heap_size );
|
||||
printk( "_stack_size = 0x%x\n", _stack_size ); */
|
||||
#endif
|
||||
}
|
||||
|
||||
void bsp_clean_up(void) {
|
||||
printk("bsp_cleanup called\n");
|
||||
}
|
||||
|
||||
124
c/src/lib/libbsp/i386/ts_386ex/startup/linkcmds
Normal file
124
c/src/lib/libbsp/i386/ts_386ex/startup/linkcmds
Normal file
@@ -0,0 +1,124 @@
|
||||
/*
|
||||
* This file contains directives for the GNU linker which are specific
|
||||
* to the Technologic Systems TS-1325 (i386ex) board.
|
||||
*
|
||||
* Copyright (c) 1989-1998.
|
||||
* On-Line Applications Research Corporation (OAR).
|
||||
* Copyright assigned to U.S. Government, 1994.
|
||||
*
|
||||
* 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$
|
||||
*
|
||||
* Memory layout:
|
||||
*
|
||||
* 0x0008000 -> ... : initial section ( init 386ex, goto protected mode)
|
||||
* ... -> ... : text section ( executable code )
|
||||
* ... -> 0x00A0000 : data section ( initialized storage )
|
||||
* 0x0100000 -> 0x0200000 : bss section, stack space, heap storage
|
||||
*/
|
||||
|
||||
ENTRY(_init_i386ex) ;
|
||||
SECTIONS
|
||||
{
|
||||
|
||||
/***************************************************************************
|
||||
* initial section:
|
||||
*
|
||||
* This section is the first in memory, preceding the text and data sections.
|
||||
* It initializes the i386ex, sets up the gdt in RAM, loads the gdt,
|
||||
* jumps to protected mode, loads the idt, zeros the bss section, sets up
|
||||
* the stack and calls the rest of the RTEMS initialization.
|
||||
***************************************************************************/
|
||||
|
||||
_DOS_ld_addr = 0x0008000 ;
|
||||
|
||||
.initial _DOS_ld_addr :
|
||||
{
|
||||
*(.initial);
|
||||
}
|
||||
|
||||
/***************************************************************************
|
||||
* text section:
|
||||
*
|
||||
* Nobody here but us opcodes.
|
||||
***************************************************************************/
|
||||
|
||||
.text BLOCK(0x10) :
|
||||
{
|
||||
CREATE_OBJECT_SYMBOLS
|
||||
text_start = . ;
|
||||
_text_start = . ;
|
||||
*(.text ) ;
|
||||
. = ALIGN (16);
|
||||
|
||||
*(.eh_fram)
|
||||
. = ALIGN (16);
|
||||
|
||||
/*
|
||||
* C++ constructors
|
||||
*/
|
||||
__CTOR_LIST__ = .;
|
||||
LONG((__CTOR_END__ - __CTOR_LIST__) / 4 - 2)
|
||||
*(.ctors)
|
||||
LONG(0)
|
||||
__CTOR_END__ = .;
|
||||
. = ALIGN (4) ;
|
||||
__DTOR_LIST__ = .;
|
||||
LONG((__DTOR_END__ - __DTOR_LIST__) / 4 - 2)
|
||||
*(.dtors)
|
||||
LONG(0)
|
||||
__DTOR_END__ = .;
|
||||
_rodata_start = . ;
|
||||
*(.rodata)
|
||||
*(.gnu.linkonce.r*)
|
||||
_erodata = ALIGN( 0x10 ) ;
|
||||
_etext = ALIGN( 0x10 );
|
||||
_endtext = . ;
|
||||
}
|
||||
|
||||
/***************************************************************************
|
||||
* data section:
|
||||
*
|
||||
* This section defines the location of the data section in RAM.
|
||||
***************************************************************************/
|
||||
|
||||
.data BLOCK(0x10) :
|
||||
{
|
||||
_sdata = .;
|
||||
*(.data);
|
||||
_edata = .;
|
||||
}
|
||||
_data_size = _edata - _sdata ;
|
||||
|
||||
/***************************************************************************
|
||||
* bss section:
|
||||
*
|
||||
* The bss section is the first section in extended RAM ( > 1MB).
|
||||
***************************************************************************/
|
||||
|
||||
.bss 0x100000 (NOLOAD) :
|
||||
{
|
||||
_bss_start = .;
|
||||
*(.bss);
|
||||
*(COMMON);
|
||||
_ebss = ALIGN(0x10);
|
||||
}
|
||||
_bss_size = _ebss - _bss_start ;
|
||||
|
||||
/***************************************************************************
|
||||
* General variables:
|
||||
*
|
||||
* The stack_size variable is customizable here. The heap is located directly
|
||||
* after the stack in RAM. A routine within bspstart.c uses these variables
|
||||
* to ensure that the heap used by RTEMS is as large as the RAM remaining
|
||||
* after all workspace configurations are complete.
|
||||
***************************************************************************/
|
||||
|
||||
stack_size = 0x8000 ;
|
||||
stack_origin = _ebss + stack_size ;
|
||||
heap_bottom = stack_origin + 4 ;
|
||||
|
||||
}
|
||||
55
c/src/lib/libbsp/i386/ts_386ex/startup/setvec.c
Normal file
55
c/src/lib/libbsp/i386/ts_386ex/startup/setvec.c
Normal file
@@ -0,0 +1,55 @@
|
||||
/* set_vector
|
||||
*
|
||||
* This routine installs an interrupt vector on the Force CPU-386.
|
||||
*
|
||||
* INPUT:
|
||||
* handler - interrupt handler entry point
|
||||
* vector - vector number
|
||||
* type - 0 indicates raw hardware connect
|
||||
* 1 indicates RTEMS interrupt connect
|
||||
*
|
||||
* RETURNS:
|
||||
* address of previous interrupt handler
|
||||
*
|
||||
* COPYRIGHT (c) 1989-1998.
|
||||
* On-Line Applications Research Corporation (OAR).
|
||||
* Copyright assigned to U.S. Government, 1994.
|
||||
*
|
||||
* 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 <rtems.h>
|
||||
#include <bsp.h>
|
||||
|
||||
i386_isr_entry set_vector( /* returns old vector */
|
||||
rtems_isr_entry handler, /* isr routine */
|
||||
rtems_vector_number vector, /* vector number */
|
||||
int type /* RTEMS or RAW intr */
|
||||
)
|
||||
{
|
||||
i386_isr_entry previous_isr;
|
||||
interrupt_gate_descriptor idt;
|
||||
|
||||
if ( type )
|
||||
rtems_interrupt_catch( handler, vector, (rtems_isr_entry *) &previous_isr );
|
||||
else {
|
||||
/* get the address of the old handler */
|
||||
|
||||
idt = Interrupt_descriptor_table[ vector ];
|
||||
|
||||
previous_isr = (i386_isr_entry)
|
||||
((idt.offset_16_31 << 16) | idt.offset_0_15);
|
||||
|
||||
/* build the IDT entry */
|
||||
create_interrupt_gate_descriptor( &idt, handler );
|
||||
|
||||
/* install the IDT entry */
|
||||
Interrupt_descriptor_table[ vector ] = idt;
|
||||
}
|
||||
return previous_isr;
|
||||
}
|
||||
|
||||
70
c/src/lib/libbsp/i386/ts_386ex/timer/Makefile.in
Normal file
70
c/src/lib/libbsp/i386/ts_386ex/timer/Makefile.in
Normal file
@@ -0,0 +1,70 @@
|
||||
#
|
||||
# $Id$
|
||||
#
|
||||
|
||||
@SET_MAKE@
|
||||
srcdir = @srcdir@
|
||||
top_srcdir = @top_srcdir@
|
||||
top_builddir = ../../../../../../..
|
||||
subdir = c/src/lib/libbsp/i386/ts_386ex/timer
|
||||
|
||||
INSTALL = @INSTALL@
|
||||
|
||||
RTEMS_ROOT = $(top_srcdir)/@RTEMS_TOPdir@
|
||||
PROJECT_ROOT = @PROJECT_ROOT@
|
||||
|
||||
VPATH = @srcdir@
|
||||
|
||||
PGM=${ARCH}/timer.rel
|
||||
|
||||
# C source names, if any, go here -- minus the .c
|
||||
C_PIECES=timer
|
||||
C_FILES=$(C_PIECES:%=%.c)
|
||||
C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
|
||||
|
||||
H_FILES=
|
||||
|
||||
# Assembly source names, if any, go here -- minus the .S
|
||||
S_PIECES=timerisr
|
||||
S_FILES=$(S_PIECES:%=%.S)
|
||||
S_O_FILES=$(S_FILES:%.S=${ARCH}/%.o)
|
||||
|
||||
SRCS=$(C_FILES) $(CC_FILES) $(H_FILES) $(S_FILES)
|
||||
OBJS=$(C_O_FILES) $(CC_O_FILES) $(S_O_FILES)
|
||||
|
||||
include $(RTEMS_ROOT)/make/custom/$(RTEMS_BSP).cfg
|
||||
include $(RTEMS_ROOT)/make/leaf.cfg
|
||||
|
||||
#
|
||||
# (OPTIONAL) Add local stuff here using +=
|
||||
#
|
||||
|
||||
DEFINES +=
|
||||
CPPFLAGS +=
|
||||
CFLAGS +=
|
||||
|
||||
LD_PATHS +=
|
||||
LD_LIBS +=
|
||||
LDFLAGS +=
|
||||
|
||||
#
|
||||
# Add your list of files to delete here. The config files
|
||||
# already know how to delete some stuff, so you may want
|
||||
# to just run 'make clean' first to see what gets missed.
|
||||
# 'make clobber' already includes 'make clean'
|
||||
#
|
||||
|
||||
CLEAN_ADDITIONS +=
|
||||
CLOBBER_ADDITIONS +=
|
||||
|
||||
${PGM}: ${SRCS} ${OBJS}
|
||||
$(make-rel)
|
||||
|
||||
all: ${ARCH} $(SRCS) $(PGM)
|
||||
|
||||
# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
|
||||
install: all
|
||||
|
||||
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
||||
cd $(top_builddir) \
|
||||
&& CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
|
||||
195
c/src/lib/libbsp/i386/ts_386ex/timer/timer.c
Normal file
195
c/src/lib/libbsp/i386/ts_386ex/timer/timer.c
Normal file
@@ -0,0 +1,195 @@
|
||||
/* Timer_init()
|
||||
*
|
||||
* This routine initializes the timer on the FORCE CPU-386 board.
|
||||
*
|
||||
* Input parameters: NONE
|
||||
*
|
||||
* Output parameters: NONE
|
||||
*
|
||||
* NOTE: This routine will not work if the optimizer is enabled
|
||||
* for some compilers. The multiple writes to the Z8036
|
||||
* may be optimized away.
|
||||
*
|
||||
* It is important that the timer start/stop overhead be
|
||||
* determined when porting or modifying this code.
|
||||
*
|
||||
* COPYRIGHT (c) 1989-1998.
|
||||
* On-Line Applications Research Corporation (OAR).
|
||||
* Copyright assigned to U.S. Government, 1994.
|
||||
*
|
||||
* 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 <rtems.h>
|
||||
#include <bsp.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
volatile rtems_unsigned32 Ttimer_val; /* Updated from ISR!!! */
|
||||
rtems_boolean Timer_driver_Find_average_overhead;
|
||||
|
||||
extern void timerisr();
|
||||
|
||||
/*
|
||||
* Number of us per timer interrupt. Note: 1 us == 1 tick.
|
||||
*/
|
||||
|
||||
#define US_PER_ISR 250
|
||||
|
||||
void TimerOn(const rtems_raw_irq_connect_data* used)
|
||||
{
|
||||
|
||||
Ttimer_val = 0; /* clear timer ISR count */
|
||||
|
||||
/* Select timer, stay in mode 0 */
|
||||
outport_byte (TIMER_MODE, TIMER_SEL0|TIMER_16BIT|TIMER_RATEGEN);
|
||||
|
||||
/* Set to 250 usec interval */
|
||||
outport_byte (TIMER_CNTR0, US_PER_ISR & 0xFF );
|
||||
outport_byte (TIMER_CNTR0, (US_PER_ISR >> 8) & 0xFF );
|
||||
|
||||
/* Enable all timers */
|
||||
outport_byte (TIMER_CONFIG, 0x00);
|
||||
|
||||
/*
|
||||
* enable interrrupt at i8259 level
|
||||
*/
|
||||
BSP_irq_enable_at_i8259s(used->idtIndex - BSP_IRQ_VECTOR_BASE);
|
||||
}
|
||||
|
||||
static int TimerIsOn (const rtems_raw_irq_connect_data *used)
|
||||
{
|
||||
return BSP_irq_enabled_at_i8259s(used->idtIndex - BSP_IRQ_VECTOR_BASE);
|
||||
}
|
||||
|
||||
void TimerOff(const rtems_raw_irq_connect_data* used)
|
||||
{
|
||||
/* Disable all timers */
|
||||
outport_byte (TIMER_CONFIG, 0x80);
|
||||
|
||||
/*
|
||||
* disable interrrupt at i8259 level
|
||||
*/
|
||||
BSP_irq_disable_at_i8259s(used->idtIndex - BSP_IRQ_VECTOR_BASE);
|
||||
/* reset timer mode to standard (DOS) value */
|
||||
}
|
||||
|
||||
static rtems_raw_irq_connect_data timer_raw_irq_data = {
|
||||
BSP_PERIODIC_TIMER + BSP_IRQ_VECTOR_BASE,
|
||||
timerisr,
|
||||
TimerOn,
|
||||
TimerOff,
|
||||
TimerIsOn
|
||||
};
|
||||
|
||||
static rtems_raw_irq_connect_data old_raw_irq_data = {
|
||||
BSP_PERIODIC_TIMER + BSP_IRQ_VECTOR_BASE,
|
||||
};
|
||||
|
||||
void Timer_exit()
|
||||
{
|
||||
if (!i386_delete_idt_entry(&timer_raw_irq_data)) {
|
||||
printk("Timer_exit:Timer raw handler removal failed\n");
|
||||
rtems_fatal_error_occurred(1);
|
||||
}
|
||||
}
|
||||
|
||||
void Timer_initialize(void)
|
||||
{
|
||||
|
||||
static rtems_boolean First = TRUE;
|
||||
|
||||
if (First)
|
||||
{
|
||||
First = FALSE;
|
||||
|
||||
if (!i386_get_current_idt_entry (&old_raw_irq_data)) {
|
||||
printk("Timer_initialize: failed to get old raw irq entry.\n");
|
||||
rtems_fatal_error_occurred(1);
|
||||
}
|
||||
|
||||
if (!i386_delete_idt_entry (&old_raw_irq_data)) {
|
||||
printk("Timer_initialize: failed to delete old raw irq entry.\n");
|
||||
rtems_fatal_error_occurred(1);
|
||||
}
|
||||
|
||||
atexit(Timer_exit); /* Try not to hose the system at exit. */
|
||||
if (!i386_set_idt_entry (&timer_raw_irq_data)) {
|
||||
printk("Timer_initialize: raw handler installation failed.\n");
|
||||
rtems_fatal_error_occurred(1);
|
||||
}
|
||||
}
|
||||
|
||||
/* wait for ISR to be called at least once */
|
||||
Ttimer_val = 0;
|
||||
while (Ttimer_val == 0)
|
||||
continue;
|
||||
Ttimer_val = 0;
|
||||
}
|
||||
|
||||
|
||||
#define AVG_OVERHEAD 3 /* It typically takes 3.0 microseconds */
|
||||
/* (3 ticks) to start/stop the timer. */
|
||||
#define LEAST_VALID 4 /* Don't trust a value lower than this */
|
||||
|
||||
int Read_timer(void)
|
||||
{
|
||||
register rtems_unsigned32 clicks, total;
|
||||
register rtems_unsigned8 lsb, msb;
|
||||
|
||||
/* latch the count */
|
||||
outport_byte (TIMER_MODE, TIMER_SEL0|TIMER_LATCH );
|
||||
|
||||
/* read the count */
|
||||
inport_byte (TIMER_CNTR0, lsb );
|
||||
inport_byte (TIMER_CNTR0, msb );
|
||||
|
||||
/*
|
||||
* Timer ISR increments Ttimer_val every US_PER_ISR clock ticks,
|
||||
* where 1 tick == 1 us. Below, 'click' is in microseconds.
|
||||
*
|
||||
* This assumes the timer input clocks are sourced from the system's
|
||||
* prescaled clock (PSCLK), which is set to be at 1MHz.
|
||||
*/
|
||||
clicks = (msb << 8) | lsb;
|
||||
total = Ttimer_val * US_PER_ISR + (US_PER_ISR - clicks);
|
||||
|
||||
if ( Timer_driver_Find_average_overhead == 1 )
|
||||
return total; /* in one microsecond units */
|
||||
else if ( total < LEAST_VALID )
|
||||
return 0; /* below timer resolution */
|
||||
else
|
||||
return (total - AVG_OVERHEAD);
|
||||
}
|
||||
|
||||
rtems_status_code Empty_function( void )
|
||||
{
|
||||
return RTEMS_SUCCESSFUL;
|
||||
}
|
||||
|
||||
void Set_find_average_overhead(
|
||||
rtems_boolean find_flag
|
||||
)
|
||||
{
|
||||
Timer_driver_Find_average_overhead = find_flag;
|
||||
}
|
||||
|
||||
/*
|
||||
* Wait_X_ms: a delay loop used by the network driver...
|
||||
*/
|
||||
|
||||
#define SLOW_DOWN_IO 0x80 /* I/O port which does nothing */
|
||||
#define LOOP1MS 320 /* Just a guess.... */
|
||||
|
||||
void Wait_X_ms (unsigned timeToWait)
|
||||
{
|
||||
unsigned i, j;
|
||||
|
||||
for (j=0; j<timeToWait; j++)
|
||||
for (i=0; i<LOOP1MS; i++)
|
||||
outport_byte (SLOW_DOWN_IO, 0);
|
||||
}
|
||||
40
c/src/lib/libbsp/i386/ts_386ex/timer/timerisr.S
Normal file
40
c/src/lib/libbsp/i386/ts_386ex/timer/timerisr.S
Normal file
@@ -0,0 +1,40 @@
|
||||
/* timer_isr()
|
||||
*
|
||||
* This routine provides the ISR for the Z8036 timer on the MVME136
|
||||
* board. The timer is set up to generate an interrupt at maximum
|
||||
* intervals.
|
||||
*
|
||||
* Input parameters: NONE
|
||||
*
|
||||
* Output parameters: NONE
|
||||
*
|
||||
* COPYRIGHT (c) 1989-1998.
|
||||
* On-Line Applications Research Corporation (OAR).
|
||||
* Copyright assigned to U.S. Government, 1994.
|
||||
*
|
||||
* 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 "asm.h"
|
||||
|
||||
BEGIN_CODE
|
||||
|
||||
EXTERN (Ttimer_val)
|
||||
|
||||
PUBLIC (timerisr)
|
||||
SYM (timerisr):
|
||||
incl SYM (Ttimer_val) # add another tick
|
||||
pushl eax
|
||||
movb 0xa0,al /* signal generic End Of Interrupt (EOI) to slave PIC */
|
||||
outb al, $0x20
|
||||
movb $0x20, al
|
||||
outb al, $0x20 /* signal generic EOI to Master PIC */
|
||||
popl eax
|
||||
iret
|
||||
|
||||
END_CODE
|
||||
END
|
||||
26
c/src/lib/libbsp/i386/ts_386ex/tools/Makefile.in
Normal file
26
c/src/lib/libbsp/i386/ts_386ex/tools/Makefile.in
Normal file
@@ -0,0 +1,26 @@
|
||||
#
|
||||
# $Id$
|
||||
#
|
||||
|
||||
@SET_MAKE@
|
||||
srcdir = @srcdir@
|
||||
top_srcdir = @top_srcdir@
|
||||
top_builddir = ../../../../../../..
|
||||
subdir = c/src/lib/libbsp/i386/ts_386ex/timer
|
||||
|
||||
INSTALL = @INSTALL@
|
||||
|
||||
RTEMS_ROOT = $(top_srcdir)/@RTEMS_TOPdir@
|
||||
PROJECT_ROOT = @PROJECT_ROOT@
|
||||
|
||||
VPATH = @srcdir@
|
||||
|
||||
include $(RTEMS_ROOT)/make/custom/$(RTEMS_BSP).cfg
|
||||
include $(RTEMS_ROOT)/make/leaf.cfg
|
||||
|
||||
CLEAN_ADDITIONS +=
|
||||
CLOBBER_ADDITIONS +=
|
||||
|
||||
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
||||
cd $(top_builddir) \
|
||||
&& CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
|
||||
68
c/src/lib/libbsp/i386/ts_386ex/tools/README
Normal file
68
c/src/lib/libbsp/i386/ts_386ex/tools/README
Normal file
@@ -0,0 +1,68 @@
|
||||
This directory contains various support software for using RTEMS on
|
||||
the TS-1325. Descriptions follow.
|
||||
|
||||
|
||||
DOS Loader
|
||||
==========
|
||||
|
||||
The dos_sup directory contains a DOS-based loader (loader.com) for
|
||||
RTEMS executables on the TS-1325. Fully commented source code is
|
||||
included.
|
||||
|
||||
Once an application has been compiled and the resulting COFF
|
||||
executable converted to raw binary format and transferred to the
|
||||
TS-1325, the DOS loader program must be used to load and execute
|
||||
it. The loader is simply invoked as "loader filename", where the
|
||||
filename cannot contain an explicit path.
|
||||
|
||||
The loader will work with files stored either on the C: ram disk or
|
||||
the A: flash disk. Since Zmodem transfers to the C: ram disk are much
|
||||
faster than to the A: disk, most development work will be done using
|
||||
the C: disk. Once completed, an application may copied to the
|
||||
(non-volatile) A: disk. Additionally, one may add the line "loader
|
||||
filename" to the AUTOEXEC.BAT file, allow ing the application to be
|
||||
run automatically at boot time.
|
||||
|
||||
Note that the DOS loader will abort and exit if it detects that the
|
||||
push-button switch is pressed, thus allowing one to break out of a
|
||||
patho logical "boot loop" situation.
|
||||
|
||||
|
||||
coff2bin
|
||||
========
|
||||
|
||||
The coff2bin script is just a convenient wrapper for the objcopy
|
||||
command. It can convert a list of RTEMS-generated COFF files to raw
|
||||
binary images that can be loaded on the TS-1325. The converted files
|
||||
are saved in the current directory with a ".bin" extension.
|
||||
|
||||
|
||||
TS-1325 Ada95 Support
|
||||
=====================
|
||||
|
||||
The TS-1325 includes a few peripherals which are very useful for
|
||||
embedded development: a push-button switch, an LED, and a parallel
|
||||
port which may be used for digital I/O. Note that the pinout for the
|
||||
parallel port is given in the TS-1325 manual.
|
||||
|
||||
These devices are all supported by Ada packages allowing easy access;
|
||||
they may be found in the ts_1325_ada directory. Doing a make command
|
||||
here will build a program that tests and exercises all these support
|
||||
packages. Plugging in some kind of parallel-port "loop-back" connector
|
||||
would be useful during this test.
|
||||
|
||||
Brief descriptions of the main packages are as follows:
|
||||
|
||||
* ts1325-button: allows one to check or wait for a button press.
|
||||
|
||||
* ts1325-led: allows safe reading and setting of the LED colour.
|
||||
|
||||
* ts1325-parallel: used to read and write byte date to the parallel
|
||||
port.
|
||||
|
||||
* i386_ports: code to access the I/O address space, using Ada
|
||||
inline assembly.
|
||||
|
||||
|
||||
Tony Ambardar, 4/21/99
|
||||
|
||||
23
c/src/lib/libbsp/i386/ts_386ex/tools/coff2bin
Executable file
23
c/src/lib/libbsp/i386/ts_386ex/tools/coff2bin
Executable file
@@ -0,0 +1,23 @@
|
||||
#!/bin/sh
|
||||
# Just a Q&D prog to convert a bunch of RTEMS generated COFF files to raw
|
||||
# binary images that can be loaded on the TS-1325. The converted files are
|
||||
# saved in the current directory.
|
||||
#
|
||||
# Tony Ambardar
|
||||
|
||||
OBJCOPY=/usr/local/rtems/bin/i386-rtems-objcopy
|
||||
|
||||
if [ $# = 0 ]
|
||||
then
|
||||
echo "Description: Convert RTEMS coff files to raw binary files."
|
||||
echo "Usage: coff2bin <list-of-coff-files>"
|
||||
echo
|
||||
exit 1
|
||||
fi
|
||||
|
||||
for i in $*
|
||||
do
|
||||
OUTFILE=$(basename `echo $i | sed 's/\.[a-zA-Z0-9]*$//g'`.bin)
|
||||
$OBJCOPY -O binary $i $OUTFILE
|
||||
done
|
||||
|
||||
BIN
c/src/lib/libbsp/i386/ts_386ex/tools/dos_sup/loader.com
Normal file
BIN
c/src/lib/libbsp/i386/ts_386ex/tools/dos_sup/loader.com
Normal file
Binary file not shown.
@@ -0,0 +1,575 @@
|
||||
; loader_hybrid_com.asm
|
||||
;
|
||||
; This is a DOS command-line loader for RTEMS executables running on
|
||||
; the Technologic Systems TS-1325 Embedded PC.
|
||||
;
|
||||
; It loads a DOS file given on the command line to the address `KernelBase',
|
||||
; and then transfers control there. It uses DOS file I/O commands to read from
|
||||
; the A: flash disk, and direct memory access to read from the C: ramdisk.
|
||||
;
|
||||
; Copying uses protected flat mode, so kernelbase could be above 1MB.
|
||||
; It does not initialize protected mode before transferring control
|
||||
; to the RTEMS executable image.
|
||||
;
|
||||
; Compile with: nasm -o loader.com loader_hybrid_com.asm
|
||||
;
|
||||
; Tony Ambardar (c) 1999
|
||||
; E.C.E. Department
|
||||
; University of British Columbia
|
||||
|
||||
%include "ts1325.inc" ; Some useful LED and button macros
|
||||
|
||||
; IMPORTANT: [org xxx] MUST be the same as RelocAddr below.
|
||||
|
||||
[org E000h]
|
||||
[bits 16]
|
||||
|
||||
; Only these three definitions may need to change
|
||||
|
||||
KernelBase equ 08000h ; Where (32-bit) to locate and run RTEMS executable
|
||||
|
||||
RelocSeg equ 9000h ; Segment to relocate code.
|
||||
RelocAddr equ 0E000h ; Address to relocate code, same as "org" above
|
||||
|
||||
; Next three used in GDT
|
||||
|
||||
RelocBase equ RelocSeg*16
|
||||
Reloc15 equ RelocBase & 0FFFFh
|
||||
Reloc23 equ RelocBase / 10000h
|
||||
|
||||
Buffer equ RelocAddr+400h ; In same segment as RelocSeg
|
||||
BuffSiz equ 200h ; Size of disk read + copy
|
||||
|
||||
StackSeg equ RelocSeg
|
||||
StackSiz equ 40h
|
||||
StackAddr equ Buffer+BuffSiz+StackSiz
|
||||
|
||||
; Used to jump to kernel in real mode
|
||||
|
||||
KernelAddr equ KernelBase & 0FFFFh
|
||||
KernelSeg equ (KernelBase - KernelAddr) / 16
|
||||
|
||||
; Used to load from the ramdisk
|
||||
|
||||
Extended equ 100000h ; Start of extended memory / C: ramdisk
|
||||
OffsetBPB equ 0Bh ; Start of BIOS param block in bootsector
|
||||
|
||||
; Command-line parameters
|
||||
|
||||
ParamLen equ 80h ; Byte length of command line params
|
||||
ParamStr equ 82h ; Start of param string
|
||||
|
||||
; The ORG address above means pre-relocation addresses are wrong. The
|
||||
; following macro fixes these up.
|
||||
|
||||
%define PRE_RELOC_ADDR(addr) (addr-CodeStart+100h)
|
||||
|
||||
CodeStart:
|
||||
|
||||
mov dx, PRE_RELOC_ADDR(Greet)
|
||||
mov ah, 9h
|
||||
int 21h
|
||||
|
||||
mov ax, 0b021h ; Exit to DOS if push-button switch pressed
|
||||
int 15h
|
||||
and al, 01h ; Bit 0 == 0 if button pressed
|
||||
jz ButtonExit
|
||||
|
||||
xor cx, cx
|
||||
mov cl, [ParamLen] ; See if there is a command line arg
|
||||
jcxz NameError
|
||||
|
||||
dec cx ; Nix leading space. Is this standard?
|
||||
cmp cx, 12 ; Limit to 12 chars: e.g. ABCDEFGH.IJK
|
||||
jg NameError
|
||||
; Damn. Should make sure of no ':' or '\' chars too.
|
||||
|
||||
; Required by "relocated" [org] statement above
|
||||
|
||||
mov di, PRE_RELOC_ADDR(FName)
|
||||
mov si, ParamStr
|
||||
repne
|
||||
movsb ; Copy command line arg
|
||||
|
||||
; Make sure no ':' in filename. This forces using the default dir.
|
||||
|
||||
mov di, PRE_RELOC_ADDR(FName)
|
||||
mov al, ':'
|
||||
mov cx, 12
|
||||
repne
|
||||
scasb
|
||||
je NameError
|
||||
|
||||
jmp Relocate
|
||||
|
||||
ButtonExit:
|
||||
mov dx, PRE_RELOC_ADDR(Button)
|
||||
jmp short DosPrint
|
||||
|
||||
NameError:
|
||||
mov dx, PRE_RELOC_ADDR(FError)
|
||||
jmp short DosPrint
|
||||
|
||||
DosError: ; Only call this AFTER relocation
|
||||
mov dx, RError
|
||||
|
||||
DosPrint:
|
||||
mov ah, 9h
|
||||
int 21h
|
||||
|
||||
DosExit:
|
||||
mov ax, 04C00h ; DOS Function: Exit program
|
||||
int 21h ; Call DOS. Terminate Program
|
||||
|
||||
Relocate: ; Move this code down to RelocAddr
|
||||
|
||||
cld
|
||||
mov ax, RelocSeg
|
||||
mov es, ax ; Set destination = RelocSeg:RelocAddr
|
||||
mov di, RelocAddr
|
||||
mov si, 100h ; Source is ds:0100h i.e. a COM file
|
||||
mov cx, CodeEnd - CodeStart ; Size of all code
|
||||
|
||||
repne
|
||||
movsb
|
||||
|
||||
; continue in copied code
|
||||
|
||||
jmp RelocSeg:RelocAddr + (RelocStart - CodeStart)
|
||||
|
||||
RelocStart:
|
||||
cli
|
||||
mov ax, StackSeg
|
||||
mov ss, ax
|
||||
mov sp, StackAddr
|
||||
mov ax, cs
|
||||
mov ds, ax
|
||||
mov es, ax ; Setup segments and stack
|
||||
sti
|
||||
|
||||
mov ah, 19h
|
||||
int 21h
|
||||
mov [DDrive], al ; Save current default drive
|
||||
|
||||
mov ax, 3d00h ; DOS Function: Open the file for reading
|
||||
mov dx, FName ; Presume DS points at filename segment
|
||||
int 21h
|
||||
jc DosError
|
||||
|
||||
GoodOpen:
|
||||
mov [FHndl], ax ; Save file handle
|
||||
|
||||
mov al, [DDrive] ; Check if loading from C: drive (ramdisk)
|
||||
cmp al, 2
|
||||
je LoadRamdisk
|
||||
|
||||
LoadDosdisk:
|
||||
|
||||
; Here we are loading from A: drive. Use DOS calls to load the file into
|
||||
; extended memory. Then copy from extended memory to `KernelBase'. This way
|
||||
; we avoid overwriting DOS file I/O structures if reading directly into
|
||||
; conventional (<640K) memory.
|
||||
|
||||
mov edi, Extended ; Destination for code read @ 1 Meg
|
||||
|
||||
ReadLoop:
|
||||
|
||||
mov ah,3fh ; DOS Function: Read data from the file
|
||||
mov bx, [FHndl]
|
||||
mov dx, Buffer ; Address of data buffer
|
||||
mov cx, BuffSiz ; Request BuffSiz bytes
|
||||
int 21h
|
||||
jc DosError
|
||||
|
||||
GoodRead:
|
||||
|
||||
cmp ax, cx ; EOF reached? AX = # bytes read
|
||||
pushf
|
||||
|
||||
add ax, 3
|
||||
shr ax, 2 ; Copy buffer by dwords, # = (ax + 3)/4
|
||||
movzx ecx, ax
|
||||
mov esi, RelocBase + Buffer ; Source for copy, destination is in edi
|
||||
|
||||
call CopyData32 ; Do protected-mode copy
|
||||
|
||||
popf
|
||||
je ReadLoop ; Still data left, so read next chunk
|
||||
|
||||
mov esi, Extended ; Source for copy @ 1 Meg
|
||||
mov ecx, edi ; Make count in dwords
|
||||
sub ecx, esi
|
||||
add ecx, 3
|
||||
shr ecx, 2
|
||||
mov edi, KernelBase ; Destination copy
|
||||
|
||||
call CopyData32 ; Move code into conventional memory
|
||||
jmp RunKernel
|
||||
|
||||
LoadRamdisk:
|
||||
|
||||
; Here we are loading from C: drive. Use protected mode to directly access
|
||||
; the virtual disk sectors in extended memory and copy to `KernelBase'.
|
||||
; This way we avoid using DOS file I/O calls, except for an `open' earlier
|
||||
; which tells us the file exists.
|
||||
|
||||
; Copy C: "bootsector" to buffer and save the BIOS parameter block
|
||||
|
||||
mov esi, Extended
|
||||
mov edi, RelocBase + Buffer ; Must be a 32-but address...
|
||||
mov ecx, 80h
|
||||
call CopyData32
|
||||
|
||||
mov si, Buffer + OffsetBPB
|
||||
mov di, SavBPB
|
||||
mov cx, EndBPB - SavBPB
|
||||
repne
|
||||
movsb
|
||||
|
||||
; Calculate FAT, root dir, and data start addresses for the ramdisk
|
||||
|
||||
xor eax, eax
|
||||
mov ebx, eax
|
||||
mov ecx, ebx
|
||||
|
||||
mov ax, [ResSec]
|
||||
|
||||
mov bl, [NumFAT]
|
||||
imul bx, [SecFAT]
|
||||
|
||||
mov cx, [NRoot]
|
||||
shr cx, 4 ; 10h directory entries per sector
|
||||
|
||||
add bx, ax
|
||||
add cx, bx
|
||||
|
||||
mov dx, [BpSect]
|
||||
imul ax, dx
|
||||
imul bx, dx
|
||||
imul cx, dx
|
||||
|
||||
add eax, Extended
|
||||
add ebx, Extended
|
||||
add ecx, Extended
|
||||
|
||||
mov [BegFAT], eax
|
||||
mov [BegRoot], ebx
|
||||
mov [BegData], ecx
|
||||
|
||||
; Convert the saved filename to format used in directory entry. Assume
|
||||
; there's a `.' in it. Hopefully this won't haunt us later...
|
||||
|
||||
mov di, FName ; Find the `.'
|
||||
mov al, '.'
|
||||
mov cx, 12
|
||||
repne
|
||||
scasb
|
||||
|
||||
mov bx, di ; di points to filename extension
|
||||
|
||||
mov di, DirName
|
||||
mov si, FName
|
||||
mov cx, bx ; Make count
|
||||
sub cx, si
|
||||
dec cx
|
||||
repne ; Copy initial part of filename
|
||||
movsb
|
||||
|
||||
mov di, bx ; Find the terminating zero
|
||||
xor al,al
|
||||
mov cx, 4
|
||||
repne
|
||||
scasb
|
||||
|
||||
mov cx, di ; Make count
|
||||
sub cx, bx
|
||||
dec cx
|
||||
mov si, bx
|
||||
mov di, DirName + 8
|
||||
repne ; Copy filename extension
|
||||
movsb
|
||||
|
||||
mov si, DirName ; Convert the stupid thing to upper case
|
||||
mov di, si
|
||||
mov cx, 11
|
||||
|
||||
Cvt2Upper:
|
||||
|
||||
lodsb
|
||||
cmp al, 'a'
|
||||
jb NotLow
|
||||
cmp al, 'z'
|
||||
ja NotLow
|
||||
xor al, 20h
|
||||
|
||||
NotLow:
|
||||
|
||||
stosb
|
||||
loop Cvt2Upper
|
||||
|
||||
; Now load in the root directory (temporarily) to find the first cluster
|
||||
; of our file. Use KernelSeg:KernelAddr as temporary storage.
|
||||
|
||||
mov esi, [BegRoot]
|
||||
mov edi, KernelBase
|
||||
xor ecx, ecx
|
||||
mov cx, [NRoot]
|
||||
shl cx, 3 ; Each root entry is 8 dwords
|
||||
call CopyData32
|
||||
|
||||
mov dx, [NRoot] ; Max # of dir entries
|
||||
|
||||
mov cx, KernelSeg ; Setup segment selector for comparison
|
||||
mov es, cx
|
||||
mov di, KernelAddr
|
||||
|
||||
FindEntry:
|
||||
|
||||
mov cx, 11
|
||||
mov si, DirName
|
||||
push di
|
||||
rep cmpsb
|
||||
pop di
|
||||
je GotEntry
|
||||
add di, 20h ; Point to next dir entry
|
||||
dec dx
|
||||
jnz FindEntry
|
||||
|
||||
int 3h ; Should never get here...
|
||||
|
||||
GotEntry:
|
||||
|
||||
mov eax, KernelBase ; Setup initial address for copy
|
||||
mov [CurrDst], eax
|
||||
|
||||
add di, 32 - 6 ; Load first cluster number
|
||||
mov ax, [es:di]
|
||||
mov cx, ds ; Fix `es' selector just in case
|
||||
mov es, cx
|
||||
|
||||
LoadKernel:
|
||||
|
||||
call LoadCluster ; Load cluster `ax' to [CurrDst], update [CurrDst]
|
||||
|
||||
call NextCluster ; Get next cluster number in ax
|
||||
|
||||
cmp ax, 0FF8h ; Repeat until EOF
|
||||
jb LoadKernel
|
||||
|
||||
RunKernel:
|
||||
|
||||
mov ax, KernelSeg ; Setup data segment and transfer control
|
||||
mov ds, ax
|
||||
|
||||
jmp KernelSeg:KernelAddr ; Huzzah!!
|
||||
|
||||
|
||||
; Load cluster `ax' to [CurrDst], update [CurrDst]
|
||||
|
||||
LoadCluster:
|
||||
|
||||
push ax
|
||||
sub ax, 2 ; Cluster numbers start at 2
|
||||
movzx eax, ax
|
||||
|
||||
xor ecx, ecx ; Calculate bytes in a cluster
|
||||
mov cl, [SpClst]
|
||||
imul cx, [BpSect]
|
||||
|
||||
imul eax, ecx
|
||||
add eax, [BegData] ; Start of cluster
|
||||
|
||||
shr ecx, 2 ; Cluster size in dwords
|
||||
mov esi, eax ; Copy source
|
||||
mov edi, [CurrDst] ; Copy destination
|
||||
call CopyData32
|
||||
|
||||
mov [CurrDst], edi ; Update dest
|
||||
pop ax ; Restore cluster number
|
||||
|
||||
ret
|
||||
|
||||
; Search FAT (FAT12 format) for next cluster in file after `ax'.
|
||||
|
||||
NextCluster:
|
||||
|
||||
movzx ecx, ax ; Calculate offset into FAT
|
||||
shr ax, 1
|
||||
pushf
|
||||
add cx, ax
|
||||
|
||||
mov esi, [BegFAT] ; Copy word containing next cluster to buffer
|
||||
add esi, ecx
|
||||
mov edi, RelocBase + Buffer
|
||||
xor ecx, ecx
|
||||
inc ecx
|
||||
call CopyData32
|
||||
|
||||
mov ax, [Buffer] ; Handle odd/even cluster numbers
|
||||
popf
|
||||
jnc EvenCluster
|
||||
shr ax, 4
|
||||
|
||||
EvenCluster:
|
||||
|
||||
and ax, 0FFFh
|
||||
ret
|
||||
|
||||
; Enable the A20 line for accesses to extended memory.
|
||||
|
||||
EnableA20:
|
||||
in al,92h
|
||||
or al,2
|
||||
jmp short $+2
|
||||
jmp short $+2
|
||||
jmp short $+2
|
||||
out 92h,al
|
||||
ret
|
||||
|
||||
; The CopyData32 routine copies ecx dwords from esi to edi. Both esi
|
||||
; and edi hold 32-bit values. CopyData32 runs in 32-bit protected mode.
|
||||
|
||||
CopyData32:
|
||||
cli
|
||||
|
||||
call EnableA20 ; Put here in case file I/O screws with this
|
||||
; or with the GDTR
|
||||
|
||||
lgdt [GDTStart] ; Initialize GDTR for 32-bit protected mode
|
||||
|
||||
mov eax, cr0
|
||||
or al, 1
|
||||
mov cr0, eax ;go to real flat mode
|
||||
|
||||
; LED_GRN
|
||||
; PSW_WAIT
|
||||
|
||||
jmp dword 8h : RelocBase+ProtJmp
|
||||
[bits 32]
|
||||
ProtJmp:
|
||||
; LED_YEL
|
||||
; PSW_WAIT
|
||||
|
||||
mov ax, 10h
|
||||
mov ds, ax
|
||||
mov es, ax
|
||||
mov ss, ax
|
||||
|
||||
rep movsd ;copy the sector to where it should be
|
||||
|
||||
mov ax, 20h
|
||||
mov ds, ax
|
||||
mov es, ax
|
||||
mov ss, ax
|
||||
|
||||
; LED_RED
|
||||
; PSW_WAIT
|
||||
|
||||
jmp 18h : RealJmp1 ;use code segment with 64K limit
|
||||
[bits 16]
|
||||
RealJmp1:
|
||||
; LED_OFF
|
||||
; PSW_WAIT
|
||||
|
||||
mov eax, cr0 ;back to real segmented mode
|
||||
and eax, 0fffffffeh
|
||||
mov cr0, eax
|
||||
|
||||
jmp RelocSeg : RealJmp2
|
||||
RealJmp2:
|
||||
; LED_GRN
|
||||
; PSW_WAIT
|
||||
|
||||
mov ax, cs
|
||||
mov es, ax
|
||||
mov ds, ax
|
||||
mov ss, ax
|
||||
|
||||
sti
|
||||
ret
|
||||
|
||||
; Storage for a Dos 3+ BIOS Parameter Block (for the C: ramdisk)
|
||||
|
||||
SavBPB:
|
||||
|
||||
BpSect dw 0h ; Bytes per sector, always 512
|
||||
SpClst db 0h ; Sectors per cluster
|
||||
ResSec dw 0h ; Num of reserved sectors
|
||||
NumFAT db 0h ; Num of FATs
|
||||
NRoot dw 0h ; Num of root directory entries
|
||||
TotSec dw 0h ; Total sectors
|
||||
Media db 0h ; Media descriptor byte
|
||||
SecFAT dw 0h ; Sectors per FAT
|
||||
|
||||
EndBPB:
|
||||
|
||||
CurrDst dd 0h ; Current destination address for copying RTEMS exec
|
||||
|
||||
; Important (32-bit) address for the C: ramdisk
|
||||
|
||||
BegFAT dd 0h ; Start of the FAT
|
||||
BegRoot dd 0h ; Start of root directory
|
||||
BegData dd 0h ; Start of data clusters
|
||||
|
||||
DDrive db 0h ; Default drive: 0h = A:, 2h = C:
|
||||
|
||||
DirName times 11 db 32 ; Room for 8.3 directory entry name
|
||||
|
||||
FName times 13 db 0 ; Room for a 12 character null-terminated string
|
||||
FHndl dw 0000h
|
||||
|
||||
Greet db "RTEMS DOS Loader (c) 1999 Tony R. Ambardar",13,10,"$"
|
||||
Button db "Button pressed -- Aborting.",13,10,"$"
|
||||
FError db "Missing or incorrect file name.",13,10,"$"
|
||||
RError db "Error opening or reading file.",13,10,"$"
|
||||
|
||||
; Global Descriptor Table used for protectd mode.
|
||||
; Store the GDTR in the first null GDT entry
|
||||
|
||||
GDTStart:
|
||||
|
||||
dw GDTEnd - GDTStart - 1
|
||||
dd RelocBase + GDTStart
|
||||
dw 0
|
||||
|
||||
; base=0h, limit=4Gb, present, code, exec/read, conform, 32-bit
|
||||
|
||||
dw 0ffffh ;seg. lim. [15:0]
|
||||
dw 0 ;base[15:0]
|
||||
db 0 ;base[23:16]
|
||||
db 9eh ;p=1,dpl=0,s=1 ; code: execute/read, conforming
|
||||
db 0cfh ;c: gran=4K, D/B=1(32-bit) ; f: seg. lim. [19:16]
|
||||
db 0 ;base[31:24]
|
||||
|
||||
; base=0h, limit=4Gb, present, data, read/write exp. up, 32-bit SP
|
||||
|
||||
dw 0ffffh ;seg. lim. [15:0]
|
||||
dw 0 ;base[15:0]
|
||||
db 0 ;base[23:16]
|
||||
db 92h ;p=1,dpl=0,s=1 ; data: read/write expand-up
|
||||
db 0cfh ;c: gran=4K, D/B=1(32-bit) ; f: seg. lim. [19:16]
|
||||
db 0 ;base[31:24]
|
||||
|
||||
; base=0h, limit=ffffh, present, code, exec/read, conform, 16-bit
|
||||
; NOTE: this descriptor is used to change back to real mode.
|
||||
|
||||
dw 0ffffh ;seg. lim. [15:0]
|
||||
dw Reloc15 ;base[15:0]
|
||||
db Reloc23 ;base[23:16]
|
||||
db 9eh ;p=1,dpl=0,s=1 ; code: execute/read, conforming
|
||||
db 000h ;4: gran=1 byte, D/B=0(16-bit) ; 0: seg. lim. [19:16]
|
||||
db 0 ;base[31:24]
|
||||
|
||||
; base=0h, limit=ffffh, present, data, read/write exp. up, 16-bit SP
|
||||
; NOTE: this descriptor is used to change back to real mode.
|
||||
|
||||
dw 0ffffh ;seg. lim. [15:0]
|
||||
dw Reloc15 ;base[15:0]
|
||||
db Reloc23 ;base[23:16]
|
||||
db 92h ;p=1,dpl=0,s=1 ; data: read/write expand-up
|
||||
db 000h ;0: gran=1 byte, D/B=0(16-bit) ; 0: seg. lim. [19:16]
|
||||
db 0 ;base[31:24]
|
||||
|
||||
GDTEnd:
|
||||
|
||||
CodeEnd: ; end-of-code marker for copy
|
||||
48
c/src/lib/libbsp/i386/ts_386ex/tools/dos_sup/ts1325.inc
Normal file
48
c/src/lib/libbsp/i386/ts_386ex/tools/dos_sup/ts1325.inc
Normal file
@@ -0,0 +1,48 @@
|
||||
; Some nasm macros to turn on TS-1325 LEDs and wait for button presses.
|
||||
; This should be '%include'ed in your nasm source file.
|
||||
;
|
||||
; Tony Ambardar
|
||||
|
||||
P1LTC equ 0F862h
|
||||
P1PIN equ 0F860h
|
||||
|
||||
%macro LED_OFF 0
|
||||
mov dx, P1LTC
|
||||
in al, dx
|
||||
or al, 01000000b ; turn off red
|
||||
and al, 11011111b ; turn off green
|
||||
out dx, al
|
||||
%endmacro
|
||||
|
||||
%macro LED_GRN 0
|
||||
mov dx, P1LTC
|
||||
in al, dx
|
||||
or al, 01100000b ; turn off red, turn on green
|
||||
out dx, al
|
||||
%endmacro
|
||||
|
||||
%macro LED_YEL 0
|
||||
mov dx, P1LTC
|
||||
in al, dx
|
||||
or al, 00100000b ; turn on green
|
||||
and al, 10111111b ; turn on red
|
||||
out dx, al
|
||||
%endmacro
|
||||
|
||||
%macro LED_RED 0
|
||||
mov dx, P1LTC
|
||||
in al, dx
|
||||
and al, 10011111b ; turn on red, turn off green
|
||||
out dx, al
|
||||
%endmacro
|
||||
|
||||
%macro PSW_WAIT 0
|
||||
mov dx, P1PIN ; Get PSW state
|
||||
mov ecx, 80000h
|
||||
%%read in al, dx
|
||||
test al, 00000001b ; is PSW asserted?
|
||||
jnz %%read ; if not, we're done
|
||||
dec ecx
|
||||
jnz %%read
|
||||
%endmacro
|
||||
|
||||
41
c/src/lib/libbsp/i386/ts_386ex/tools/ts_1325_ada/Makefile
Normal file
41
c/src/lib/libbsp/i386/ts_386ex/tools/ts_1325_ada/Makefile
Normal file
@@ -0,0 +1,41 @@
|
||||
#
|
||||
# Makefile for TS-1325 Utilities example
|
||||
#
|
||||
|
||||
MAIN=ts1325_test
|
||||
|
||||
# Tool paths
|
||||
tooldir=/usr/local/rtems
|
||||
rtemsdir=${tooldir}/rtems/ts_386ex
|
||||
|
||||
# Tool names
|
||||
GCC=${tooldir}/bin/i386-rtems-gcc
|
||||
GNATMAKE=${tooldir}/bin/i386-rtems-gnatmake
|
||||
SIZE=${tooldir}/bin/i386-rtems-size
|
||||
SIS=${tooldir}/bin/sis
|
||||
GDB=${tooldir}/bin/sis-gdb
|
||||
|
||||
CARGS=-B${rtemsdir}/lib/ -specs bsp_specs -qrtems \
|
||||
-msoft-float -mno-fp-ret-in-387
|
||||
#CARGS=-B/usr/local/rtems/tools/build-i386-rtems/ts_386ex/lib/ -specs bsp_specs -qrtems
|
||||
|
||||
all: init.o
|
||||
$(GNATMAKE) -O -gnata -gnatE -gnato $(MAIN) -g \
|
||||
-bargs -r \
|
||||
-cargs $(CARGS) \
|
||||
-largs $(CARGS) init.o
|
||||
$(SIZE) $(MAIN)
|
||||
|
||||
|
||||
|
||||
init.o: init.c
|
||||
$(GCC) -O4 -g -Wall -ansi -fasm $(CARGS) -c init.c
|
||||
|
||||
run:
|
||||
$(SIS) $(MAIN)
|
||||
|
||||
gdb:
|
||||
$(GDB) $(MAIN)
|
||||
|
||||
clean:
|
||||
rm -f b_$(MAIN).c b_$(MAIN).o *.o *.ali $(MAIN)
|
||||
@@ -0,0 +1,41 @@
|
||||
#
|
||||
# Makefile for TS-1325 Utilities example
|
||||
#
|
||||
|
||||
MAIN=ts1325_test
|
||||
|
||||
# Tool paths
|
||||
tooldir=/usr/local/rtems
|
||||
rtemsdir=${tooldir}/rtems/ts_386ex
|
||||
|
||||
# Tool names
|
||||
GCC=${tooldir}/bin/i386-rtems-gcc
|
||||
GNATMAKE=${tooldir}/bin/i386-rtems-gnatmake
|
||||
SIZE=${tooldir}/bin/i386-rtems-size
|
||||
SIS=${tooldir}/bin/sis
|
||||
GDB=${tooldir}/bin/sis-gdb
|
||||
|
||||
CARGS=-B${rtemsdir}/lib/ -specs bsp_specs -qrtems \
|
||||
-msoft-float -mno-fp-ret-in-387
|
||||
#CARGS=-B/usr/local/rtems/tools/build-i386-rtems/ts_386ex/lib/ -specs bsp_specs -qrtems
|
||||
|
||||
all: init.o
|
||||
$(GNATMAKE) -O -gnata -gnatE -gnato $(MAIN) -g \
|
||||
-bargs -r \
|
||||
-cargs $(CARGS) \
|
||||
-largs $(CARGS) init.o
|
||||
$(SIZE) $(MAIN)
|
||||
|
||||
|
||||
|
||||
init.o: init.c
|
||||
$(GCC) -O4 -g -Wall -ansi -fasm $(CARGS) -c init.c
|
||||
|
||||
run:
|
||||
$(SIS) $(MAIN)
|
||||
|
||||
gdb:
|
||||
$(GDB) $(MAIN)
|
||||
|
||||
clean:
|
||||
rm -f b_$(MAIN).c b_$(MAIN).o *.o *.ali $(MAIN)
|
||||
@@ -0,0 +1,29 @@
|
||||
with System.Machine_Code;
|
||||
use System.Machine_Code;
|
||||
|
||||
package body I386_Ports is
|
||||
|
||||
procedure Outport (Addr: in Port_Address; Data: in Byte) is
|
||||
begin
|
||||
Asm ("movb %0, %%al;" &
|
||||
"movw %1, %%dx;" &
|
||||
"outb %%al, %%dx",
|
||||
No_Output_Operands,
|
||||
(Byte'Asm_Input ("g", Data),
|
||||
Port_Address'Asm_Input ("g", Addr)),
|
||||
Clobber => "al dx",
|
||||
Volatile => True);
|
||||
end Outport;
|
||||
|
||||
procedure Inport (Addr: in Port_Address; Data: out Byte) is
|
||||
begin
|
||||
Asm ("movw %1, %%dx;" &
|
||||
"inb %%dx, %%al;" &
|
||||
"movb %%al, %0",
|
||||
Byte'Asm_Output ("=g", Data),
|
||||
Port_Address'Asm_Input ("g", Addr),
|
||||
Clobber => "dx al",
|
||||
Volatile => True);
|
||||
end Inport;
|
||||
|
||||
end I386_Ports;
|
||||
@@ -0,0 +1,47 @@
|
||||
with Interfaces;
|
||||
|
||||
package I386_Ports is
|
||||
|
||||
type Port_Address is new Interfaces.Unsigned_16;
|
||||
|
||||
type Byte is new Interfaces.Unsigned_8;
|
||||
|
||||
type Word is new Interfaces.Unsigned_16;
|
||||
|
||||
type Long is new Interfaces.Unsigned_32;
|
||||
|
||||
procedure Outport (Addr: in Port_Address; Data: in Byte);
|
||||
|
||||
procedure Inport (Addr: in Port_Address; Data: out Byte);
|
||||
|
||||
P1PIN: constant Port_Address;
|
||||
P1LTC: constant Port_Address;
|
||||
P1DIR: constant Port_Address;
|
||||
|
||||
P2PIN: constant Port_Address;
|
||||
P2LTC: constant Port_Address;
|
||||
P2DIR: constant Port_Address;
|
||||
|
||||
P3PIN: constant Port_Address;
|
||||
P3LTC: constant Port_Address;
|
||||
P3DIR: constant Port_Address;
|
||||
|
||||
private
|
||||
|
||||
pragma Inline (Outport, Inport);
|
||||
|
||||
P1PIN: constant Port_Address := 16#F860#;
|
||||
P1LTC: constant Port_Address := 16#F862#;
|
||||
P1DIR: constant Port_Address := 16#F864#;
|
||||
|
||||
P2PIN: constant Port_Address := 16#F868#;
|
||||
P2LTC: constant Port_Address := 16#F86A#;
|
||||
P2DIR: constant Port_Address := 16#F86C#;
|
||||
|
||||
P3PIN: constant Port_Address := 16#F870#;
|
||||
P3LTC: constant Port_Address := 16#F872#;
|
||||
P3DIR: constant Port_Address := 16#F874#;
|
||||
|
||||
end I386_Ports;
|
||||
|
||||
|
||||
86
c/src/lib/libbsp/i386/ts_386ex/tools/ts_1325_ada/init.c
Normal file
86
c/src/lib/libbsp/i386/ts_386ex/tools/ts_1325_ada/init.c
Normal file
@@ -0,0 +1,86 @@
|
||||
/*
|
||||
* COPYRIGHT (c) 1989-1997.
|
||||
* On-Line Applications Research Corporation (OAR).
|
||||
* Copyright assigned to U.S. Government, 1994.
|
||||
*
|
||||
* 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 <bsp.h>
|
||||
|
||||
#include <assert.h>
|
||||
#include <pthread.h>
|
||||
|
||||
#ifdef GNAT_PID
|
||||
#include <unistd.h>
|
||||
pid_t getpid()
|
||||
{
|
||||
return GNAT_PID;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* By having the POSIX_Init thread create a second thread just
|
||||
* to invoke gnat_main, we can override all default attributes
|
||||
* of the "Ada environment task". Otherwise, we would be
|
||||
* stuck with the defaults set by RTEMS.
|
||||
*/
|
||||
|
||||
void *start_gnat_main( void * argument )
|
||||
{
|
||||
extern int gnat_main ( int argc, char **argv, char **envp );
|
||||
|
||||
(void) gnat_main ( 0, 0, 0 );
|
||||
|
||||
exit( 0 );
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void *POSIX_Init( void *argument )
|
||||
{
|
||||
pthread_t thread_id;
|
||||
pthread_attr_t attr;
|
||||
int status;
|
||||
|
||||
status = pthread_attr_init( &attr );
|
||||
assert( !status );
|
||||
|
||||
#ifdef GNAT_MAIN_STACKSPACE
|
||||
status = pthread_attr_setstacksize( &attr, GNAT_MAIN_STACKSPACE );
|
||||
assert( !status );
|
||||
#endif
|
||||
|
||||
status = pthread_create( &thread_id, &attr, start_gnat_main, NULL );
|
||||
assert( !status );
|
||||
|
||||
pthread_exit( 0 );
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* configuration information */
|
||||
|
||||
#define CONFIGURE_SPTEST
|
||||
#define CONFIGURE_GNAT_RTEMS
|
||||
|
||||
#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
|
||||
#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
|
||||
|
||||
#define CONFIGURE_MICROSECONDS_PER_TICK RTEMS_MILLISECONDS_TO_MICROSECONDS(1)
|
||||
|
||||
#define CONFIGURE_POSIX_INIT_THREAD_TABLE
|
||||
|
||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 20
|
||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 20
|
||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 30
|
||||
#define CONFIGURE_MAXIMUM_POSIX_CONDITION_VARIABLES 20
|
||||
|
||||
#define CONFIGURE_INIT
|
||||
|
||||
#include <confdefs.h>
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
package body TS1325.Button is
|
||||
|
||||
function Is_Button_Pressed return Boolean is
|
||||
State: Byte;
|
||||
begin
|
||||
Inport (Button_Port, State);
|
||||
return (State and Button_Mask) /= Button_Mask;
|
||||
end Is_Button_Pressed;
|
||||
|
||||
procedure Wait_For_Button_Press is
|
||||
begin
|
||||
Poll_Loop:
|
||||
loop
|
||||
if Is_Button_Pressed then
|
||||
delay Minimum_Press_Time;
|
||||
exit Poll_Loop when Is_Button_Pressed;
|
||||
end if;
|
||||
delay Poll_Interval;
|
||||
end loop Poll_Loop;
|
||||
end Wait_For_Button_Press;
|
||||
|
||||
end TS1325.Button;
|
||||
@@ -0,0 +1,22 @@
|
||||
with I386_Ports;
|
||||
use I386_Ports;
|
||||
|
||||
package TS1325.Button is
|
||||
|
||||
function Is_Button_Pressed return Boolean;
|
||||
|
||||
procedure Wait_For_Button_Press;
|
||||
|
||||
private
|
||||
|
||||
pragma Inline (Is_Button_Pressed, Wait_For_Button_Press);
|
||||
|
||||
Poll_Interval: constant Duration := 0.3;
|
||||
|
||||
Minimum_Press_Time: constant Duration := 0.3;
|
||||
|
||||
Button_Mask: constant Byte := 2#0000_0001#;
|
||||
|
||||
Button_Port: Port_Address renames P1PIN;
|
||||
|
||||
end TS1325.Button;
|
||||
@@ -0,0 +1,46 @@
|
||||
package body TS1325.LED is
|
||||
|
||||
protected body LED_State is
|
||||
|
||||
function Get return LED_Colour is
|
||||
State: Byte;
|
||||
Red_On, Green_On: Boolean;
|
||||
begin
|
||||
Inport (LED_Port, State);
|
||||
|
||||
Green_On := (State and Green_Bit) = Green_Bit;
|
||||
Red_On := (State and Red_Bit) /= Red_Bit;
|
||||
|
||||
if not (Green_On or Red_On) then
|
||||
return Off;
|
||||
elsif Green_On and not Red_On then
|
||||
return Green;
|
||||
elsif Green_On and Red_On then
|
||||
return Yellow;
|
||||
else
|
||||
return Red;
|
||||
end if;
|
||||
end Get;
|
||||
|
||||
procedure Set (Col: in LED_Colour) is
|
||||
State: Byte;
|
||||
begin
|
||||
Inport (LED_Port, State);
|
||||
|
||||
case Col is
|
||||
when Off =>
|
||||
State := (State and not Green_Bit) or Red_Bit;
|
||||
when Green =>
|
||||
State := State or Green_Bit or Red_Bit;
|
||||
when Yellow =>
|
||||
State := (State or Green_Bit) and not Red_Bit;
|
||||
when Red =>
|
||||
State := State and not (Green_Bit or Red_Bit);
|
||||
end case;
|
||||
|
||||
Outport (LED_Port, State);
|
||||
end Set;
|
||||
|
||||
end LED_State;
|
||||
|
||||
end TS1325.LED;
|
||||
@@ -0,0 +1,26 @@
|
||||
with I386_Ports;
|
||||
use I386_Ports;
|
||||
|
||||
package TS1325.LED is
|
||||
|
||||
type LED_Colour is (Off, Green, Yellow, Red);
|
||||
|
||||
protected LED_State is
|
||||
|
||||
function Get return LED_Colour;
|
||||
|
||||
procedure Set (Col: in LED_Colour);
|
||||
|
||||
end LED_State;
|
||||
|
||||
private
|
||||
|
||||
Green_Bit: constant Byte := 2#0010_0000#; -- bit set = LED on
|
||||
|
||||
Red_Bit: constant Byte := 2#0100_0000#; -- bit clear = LED on
|
||||
|
||||
LED_Mask: constant Byte := 2#0110_0000#;
|
||||
|
||||
LED_Port: Port_Address renames P1LTC;
|
||||
|
||||
end TS1325.LED;
|
||||
@@ -0,0 +1,13 @@
|
||||
package body TS1325.Parallel is
|
||||
|
||||
procedure Read_Parallel_Port (Data: out Byte) is
|
||||
begin
|
||||
Inport (Parallel_Port_In, Data);
|
||||
end Read_Parallel_Port;
|
||||
|
||||
procedure Write_Parallel_Port (Data: in Byte) is
|
||||
begin
|
||||
Outport (Parallel_Port_Out, Data);
|
||||
end Write_Parallel_Port;
|
||||
|
||||
end TS1325.Parallel;
|
||||
@@ -0,0 +1,21 @@
|
||||
with I386_Ports;
|
||||
use I386_Ports;
|
||||
|
||||
package TS1325.Parallel is
|
||||
|
||||
procedure Read_Parallel_Port (Data: out Byte);
|
||||
|
||||
procedure Write_Parallel_Port (Data: in Byte);
|
||||
|
||||
private
|
||||
|
||||
pragma Inline (Read_Parallel_Port, Write_Parallel_Port);
|
||||
|
||||
-- These are non-standard IO locations, which is why they are here instead
|
||||
-- of in the I386_Ports package.
|
||||
|
||||
Parallel_Port_In: constant Port_Address := 16#75#;
|
||||
|
||||
Parallel_Port_Out: constant Port_Address := 16#74#;
|
||||
|
||||
end TS1325.Parallel;
|
||||
@@ -0,0 +1,2 @@
|
||||
package TS1325 is
|
||||
end TS1325;
|
||||
115
c/src/lib/libbsp/i386/ts_386ex/tools/ts_1325_ada/ts1325_test.adb
Normal file
115
c/src/lib/libbsp/i386/ts_386ex/tools/ts_1325_ada/ts1325_test.adb
Normal file
@@ -0,0 +1,115 @@
|
||||
--
|
||||
-- A test program that uses the TS1325 Button and LED packages.
|
||||
--
|
||||
|
||||
with Text_IO;
|
||||
|
||||
with I386_Ports;
|
||||
use I386_Ports;
|
||||
|
||||
with TS1325.LED;
|
||||
use TS1325.LED;
|
||||
|
||||
with TS1325.Button;
|
||||
use TS1325.Button;
|
||||
|
||||
with TS1325.Parallel;
|
||||
use TS1325.Parallel;
|
||||
|
||||
procedure Ts1325_Test is
|
||||
|
||||
Test_Parallel_Interval: Duration := 1.0;
|
||||
Read_Button_Interval: Duration := 1.0;
|
||||
Read_LED_Interval: Duration := 1.0;
|
||||
Set_LED_Interval: Duration := 0.2;
|
||||
|
||||
task Test_Parallel is
|
||||
entry Start;
|
||||
end Test_Parallel;
|
||||
|
||||
task body Test_Parallel is
|
||||
W_Data, R_Data: I386_Ports.Byte := 0;
|
||||
begin
|
||||
accept Start;
|
||||
|
||||
loop
|
||||
W_Data := W_Data + 1;
|
||||
Write_Parallel_Port (W_Data);
|
||||
Read_Parallel_Port (R_Data);
|
||||
Text_IO.Put_Line ("Parallel Port Loopback: Data Write = " &
|
||||
I386_Ports.Byte'Image (W_Data) &
|
||||
", Data Read = " &
|
||||
I386_Ports.Byte'Image (R_Data));
|
||||
delay Test_Parallel_Interval;
|
||||
end loop;
|
||||
end Test_Parallel;
|
||||
|
||||
task Read_Button is
|
||||
entry Start;
|
||||
end Read_Button;
|
||||
|
||||
task body Read_Button is
|
||||
begin
|
||||
accept Start;
|
||||
|
||||
loop
|
||||
if Is_Button_Pressed then
|
||||
Text_IO.Put_Line ("Button is pressed.");
|
||||
else
|
||||
Text_IO.Put_Line ("Button is not pressed.");
|
||||
end if;
|
||||
delay Read_Button_Interval;
|
||||
end loop;
|
||||
end Read_Button;
|
||||
|
||||
task Read_Colour is
|
||||
entry Start;
|
||||
end Read_Colour;
|
||||
|
||||
task body Read_Colour is
|
||||
begin
|
||||
accept Start;
|
||||
|
||||
loop
|
||||
Text_IO.Put_Line ("Reading LED colour as " &
|
||||
LED_Colour'Image (LED_State.Get));
|
||||
delay Read_LED_Interval;
|
||||
end loop;
|
||||
end Read_Colour;
|
||||
|
||||
task Set_Colour is
|
||||
entry Start;
|
||||
end Set_Colour;
|
||||
|
||||
task body Set_Colour is
|
||||
Colour: LED_Colour := Off;
|
||||
begin
|
||||
accept Start;
|
||||
|
||||
loop
|
||||
LED_State.Set (Colour);
|
||||
|
||||
if Colour = LED_Colour'Last then
|
||||
Colour := LED_Colour'First;
|
||||
else
|
||||
Colour := LED_Colour'Succ (Colour);
|
||||
end if;
|
||||
|
||||
delay Set_LED_Interval;
|
||||
end loop;
|
||||
end Set_Colour;
|
||||
|
||||
begin
|
||||
Text_IO.Put_Line ("TS-1325 Utilities Test");
|
||||
Text_IO.Put_Line ("======================");
|
||||
Text_IO.New_Line;
|
||||
Text_IO.Put_Line ("-=> Press the button to begin.");
|
||||
Text_IO.New_Line;
|
||||
|
||||
Wait_For_Button_Press;
|
||||
|
||||
Set_Colour.Start;
|
||||
Read_Colour.Start;
|
||||
Read_Button.Start;
|
||||
Test_Parallel.Start;
|
||||
end Ts1325_Test;
|
||||
70
c/src/lib/libbsp/i386/ts_386ex/wrapup/Makefile.in
Normal file
70
c/src/lib/libbsp/i386/ts_386ex/wrapup/Makefile.in
Normal file
@@ -0,0 +1,70 @@
|
||||
#
|
||||
# $Id$
|
||||
#
|
||||
|
||||
@SET_MAKE@
|
||||
srcdir = @srcdir@
|
||||
top_srcdir = @top_srcdir@
|
||||
top_builddir = ../../../../../../..
|
||||
subdir = c/src/lib/libbsp/i386/ts_386ex/wrapup
|
||||
|
||||
INSTALL = @INSTALL@
|
||||
|
||||
# We only build the Network library if HAS_NETWORKING was defined
|
||||
NETWORK_yes_V = network
|
||||
NETWORK = $(NETWORK_$(HAS_NETWORKING)_V)
|
||||
|
||||
RTEMS_ROOT = $(top_srcdir)/@RTEMS_TOPdir@
|
||||
PROJECT_ROOT = @PROJECT_ROOT@
|
||||
|
||||
VPATH = @srcdir@
|
||||
|
||||
BSP_PIECES=startup clock console timer $(NETWORK)
|
||||
GENERIC_PIECES=
|
||||
|
||||
# bummer; have to use $foreach since % pattern subst rules only replace 1x
|
||||
OBJS=$(foreach piece, $(BSP_PIECES), ../$(piece)/$(ARCH)/$(piece).rel) \
|
||||
$(foreach piece, $(GENERIC_PIECES), ../../../$(piece)/$(ARCH)/$(piece).rel)
|
||||
LIB=$(ARCH)/libbsp.a
|
||||
|
||||
include $(RTEMS_ROOT)/make/custom/$(RTEMS_BSP).cfg
|
||||
include $(RTEMS_ROOT)/make/lib.cfg
|
||||
|
||||
#
|
||||
# (OPTIONAL) Add local stuff here using +=
|
||||
#
|
||||
|
||||
DEFINES +=
|
||||
CPPFLAGS +=
|
||||
CFLAGS +=
|
||||
|
||||
LD_PATHS +=
|
||||
LD_LIBS +=
|
||||
LDFLAGS +=
|
||||
|
||||
#
|
||||
# Add your list of files to delete here. The config files
|
||||
# already know how to delete some stuff, so you may want
|
||||
# to just run 'make clean' first to see what gets missed.
|
||||
# 'make clobber' already includes 'make clean'
|
||||
#
|
||||
|
||||
CLEAN_ADDITIONS +=
|
||||
CLOBBER_ADDITIONS +=
|
||||
|
||||
$(LIB): ${OBJS}
|
||||
$(make-library)
|
||||
|
||||
all: ${ARCH} $(SRCS) $(LIB)
|
||||
$(INSTALL_VARIANT) -m 644 $(LIB) ${PROJECT_RELEASE}/lib
|
||||
|
||||
install: all
|
||||
|
||||
$(PROJECT_ROOT)/${RTEMS_BSP}/lib/bsp_specs: ../bsp_specs
|
||||
$(INSTALL_DATA) $< $@
|
||||
|
||||
preinstall: $(PROJECT_ROOT)/${RTEMS_BSP}/lib/bsp_specs
|
||||
|
||||
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
||||
cd $(top_builddir) \
|
||||
&& CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
|
||||
93
make/custom/ts_386ex.cfg
Normal file
93
make/custom/ts_386ex.cfg
Normal file
@@ -0,0 +1,93 @@
|
||||
#
|
||||
# Config file for the ts-386ex BSP
|
||||
#
|
||||
# $Id$
|
||||
#
|
||||
|
||||
include $(RTEMS_ROOT)/make/custom/default.cfg
|
||||
|
||||
RTEMS_CPU=i386
|
||||
RTEMS_CPU_MODEL=i386_nofp
|
||||
|
||||
# This is the actual bsp directory used during the build process.
|
||||
RTEMS_BSP_FAMILY=ts_386ex
|
||||
|
||||
# This contains the compiler options necessary to select the CPU model
|
||||
# and (hopefully) optimize for it. Enables software floating-point
|
||||
# emulation since we don't have a i387 co-processor.
|
||||
#
|
||||
CPU_CFLAGS =-msoft-float -mno-fp-ret-in-387
|
||||
|
||||
# optimize flag: typically -0, could use -O4 or -fast
|
||||
# -O4 is ok for RTEMS
|
||||
CFLAGS_OPTIMIZE_V=-O4 -fomit-frame-pointer
|
||||
|
||||
# This target does support the TCP/IP stack so honour requests
|
||||
# to enable it.
|
||||
HAS_NETWORKING=yes
|
||||
|
||||
# This section makes the target dependent options file.
|
||||
|
||||
# NDEBUG (C library)
|
||||
# if defined asserts do not generate code. This is commonly used
|
||||
# as a command line option.
|
||||
#
|
||||
# RTEMS_TEST_NO_PAUSE (RTEMS tests)
|
||||
# do not pause between screens of output in the rtems tests
|
||||
#
|
||||
# RTEMS_DEBUG (RTEMS)
|
||||
# If defined, debug checks in RTEMS and support library code are enabled.
|
||||
#
|
||||
# BSP_DEBUG (BSP)
|
||||
# Enables some debugging in the BSP package.
|
||||
#
|
||||
# LOAD_RTC_AT_START (BSP)
|
||||
# Initialize RTC and load into system clock at startup. This will break
|
||||
# some tests.
|
||||
|
||||
define make-target-options
|
||||
@echo "/* #define NDEBUG 1 */ " >>$@
|
||||
@echo "#define RTEMS_TEST_NO_PAUSE 1" >>$@
|
||||
@echo "#define RTEMS_DEBUG 1" >>$@
|
||||
@echo "#define UARTDEBUG 1" >>$@
|
||||
@echo "#define BSP_DEBUG 1" >>$@
|
||||
@echo "#define LOAD_RTC_AT_START 1" >>$@
|
||||
endef
|
||||
|
||||
# Something like this should produce a map file but this does not work.
|
||||
|
||||
# -Xlinker "-Map $(basename $@).map" $(LINK_OBJS)
|
||||
#
|
||||
# This is a good way to get debug information. The rdmp file is large
|
||||
# though (1.9 Mb for hello) and greatly slows the build process.
|
||||
# $(OBJDUMP) -x -m i386 -d $(basename $@).coff > $(basename $@).rdmp
|
||||
|
||||
# The following are definitions of make-exe which will work using ld as
|
||||
# is currently required. It is expected that as of gcc 2.8, the end user
|
||||
# will be able to override parts of the compilers specs and link using gcc.
|
||||
|
||||
ifeq ($(RTEMS_USE_GCC272),yes)
|
||||
define make-exe
|
||||
$(LD) $(LDFLAGS) -N -T $(LINKCMDS) -o $(basename $@).coff \
|
||||
-noinhibit-exec -Map $(basename $@).map \
|
||||
$(START_FILE) $(LINK_OBJS) --start-group $(LINK_LIBS) --end-group
|
||||
$(OBJCOPY) -O srec $(basename $@).coff $(basename $@).i
|
||||
$(SED) -e 's/.$$//' -e '/^S0/d' $(basename $@).i | \
|
||||
$(PROJECT_TOOLS)/packhex > $(basename $@).exe
|
||||
$(NM) -g -n $(basename $@).coff > $(basename $@).num
|
||||
$(SIZE) $(basename $@).coff
|
||||
endef
|
||||
else
|
||||
define make-exe
|
||||
$(CC) $(CPPFLAGS) $(CFLAGS) $(CFLAGS_LD) -o $(basename $@).coff \
|
||||
$(LINK_OBJS) $(LINK_LIBS)
|
||||
$(OBJCOPY) -O srec $(basename $@).coff $(basename $@).i
|
||||
$(SED) -e 's/.$$//' -e '/^S0/d' $(basename $@).i | \
|
||||
$(PROJECT_TOOLS)/packhex > $(basename $@).exe
|
||||
$(NM) -g -n $(basename $@).coff > $(basename $@).num
|
||||
$(SIZE) $(basename $@).coff
|
||||
endef
|
||||
endif
|
||||
|
||||
# Miscellaneous additions go here
|
||||
|
||||
Reference in New Issue
Block a user