forked from Imagelibrary/rtems
added Motorola MVME147 BSP submitted by Dominique le Campion
(Dominique.LECAMPION@enst-bretagne.fr), for Telecom Bretagne and T.N.I. (Brest, France)
This commit is contained in:
86
c/src/lib/libbsp/m68k/mvme147/README
Normal file
86
c/src/lib/libbsp/m68k/mvme147/README
Normal file
@@ -0,0 +1,86 @@
|
|||||||
|
#
|
||||||
|
# $Id$
|
||||||
|
#
|
||||||
|
|
||||||
|
Notes about the MVME147 bsp
|
||||||
|
|
||||||
|
MVME147 port for TNI - Telecom Bretagne
|
||||||
|
by Dominique LE CAMPION (Dominique.LECAMPION@enst-bretagne.fr)
|
||||||
|
May 1996
|
||||||
|
|
||||||
|
|
||||||
|
This bsp is essentially based on the mvme136 bsp.
|
||||||
|
|
||||||
|
Summary of the modifications that were made:
|
||||||
|
|
||||||
|
* include
|
||||||
|
|
||||||
|
- bsp.h
|
||||||
|
Peripheral Channel Controller memory mapping
|
||||||
|
Z8530 memory mapping
|
||||||
|
|
||||||
|
* startup
|
||||||
|
|
||||||
|
- bspstart.c
|
||||||
|
main () setup for VME roundrobin mode
|
||||||
|
setup for the PCC interrupt vector base
|
||||||
|
- bspclean.c
|
||||||
|
bsp_cleanup () disable timer 1 & 2 interruptions
|
||||||
|
- linkcmds set the RAM start (0x5000) and size (4Meg - 0x5000)
|
||||||
|
- setvec.c unchanged
|
||||||
|
- sbrk.c unchanged
|
||||||
|
|
||||||
|
* console
|
||||||
|
|
||||||
|
- console.c taken from the dmv152 bsp (Zilog Z8530)
|
||||||
|
with no modification
|
||||||
|
|
||||||
|
* clock
|
||||||
|
|
||||||
|
- ckinit.c entirely rewritten for the PCC tick timer 2
|
||||||
|
|
||||||
|
* timer
|
||||||
|
|
||||||
|
- timerisr.s and timer.c
|
||||||
|
entirely rewritten for the PCC tick timer 1
|
||||||
|
now gives results un 6.25 us units (mininum timer delay,
|
||||||
|
suprising big grain)
|
||||||
|
|
||||||
|
* times
|
||||||
|
|
||||||
|
- updated results for the mvme147 (beware of the 6.25 us grain)
|
||||||
|
|
||||||
|
* Makefiles
|
||||||
|
|
||||||
|
- compilation of shmsupp simply removed
|
||||||
|
|
||||||
|
|
||||||
|
To be done:
|
||||||
|
|
||||||
|
* add VMEchip memory mapping to include/bsp.h
|
||||||
|
|
||||||
|
* update the overheads in coverhead.h
|
||||||
|
|
||||||
|
* add support for serila ports 2,3 and 4.
|
||||||
|
|
||||||
|
Other notes:
|
||||||
|
|
||||||
|
* There is no MP support (no more shmsupp) because I have no
|
||||||
|
experience of the VME bus. The mvme136 shared memory support
|
||||||
|
does not seem applicable on the VMEchip of the mvme147, so
|
||||||
|
I don't know where to start. Suggestions are welcome.
|
||||||
|
|
||||||
|
* All the timing tests and sp tests have been run except tmoverhd.
|
||||||
|
The test hangs during the pause (where the task should be suspended
|
||||||
|
until a return). Maybe the rtems_initialize_executive is no more
|
||||||
|
reentrant with this bsp.
|
||||||
|
|
||||||
|
Future work:
|
||||||
|
|
||||||
|
* Add gdb serial remote support.
|
||||||
|
|
||||||
|
* Shared memory support (I don't really need it, but I can do
|
||||||
|
it if it's simple).
|
||||||
|
|
||||||
|
* Message passing on VME bus, with Ada 95 annex E (distributed
|
||||||
|
systems) in mind.
|
||||||
142
c/src/lib/libbsp/m68k/mvme147/clock/ckinit.c
Normal file
142
c/src/lib/libbsp/m68k/mvme147/clock/ckinit.c
Normal file
@@ -0,0 +1,142 @@
|
|||||||
|
/* Clock_init()
|
||||||
|
*
|
||||||
|
* This routine initializes the Tick Timer 2 on the MVME147 board.
|
||||||
|
* The tick frequency is 1 millisecond.
|
||||||
|
*
|
||||||
|
* Input parameters: NONE
|
||||||
|
*
|
||||||
|
* Output parameters: NONE
|
||||||
|
*
|
||||||
|
* COPYRIGHT (c) 1989, 1990, 1991, 1992, 1993, 1994.
|
||||||
|
* On-Line Applications Research Corporation (OAR).
|
||||||
|
* All rights assigned to U.S. Government, 1994.
|
||||||
|
*
|
||||||
|
* This material may be reproduced by or for the U.S. Government pursuant
|
||||||
|
* to the copyright license under the clause at DFARS 252.227-7013. This
|
||||||
|
* notice must appear in all copies of this file and its derivatives.
|
||||||
|
*
|
||||||
|
* MVME147 port for TNI - Telecom Bretagne
|
||||||
|
* by Dominique LE CAMPION (Dominique.LECAMPION@enst-bretagne.fr)
|
||||||
|
* May 1996
|
||||||
|
*
|
||||||
|
* $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include <bsp.h>
|
||||||
|
#include <rtems/libio.h>
|
||||||
|
|
||||||
|
#define MS_COUNT 65376 /* 1ms */
|
||||||
|
/* MS_COUNT = 0x10000 - 1e-3/6.25e-6 */
|
||||||
|
#define CLOCK_INT_LEVEL 6 /* T2's interrupt level */
|
||||||
|
|
||||||
|
rtems_unsigned32 Clock_isrs; /* ISRs until next tick */
|
||||||
|
volatile rtems_unsigned32 Clock_driver_ticks; /* ticks since initialization */
|
||||||
|
rtems_isr_entry Old_ticker;
|
||||||
|
|
||||||
|
void Clock_exit( void );
|
||||||
|
|
||||||
|
/*
|
||||||
|
* These are set by clock driver during its init
|
||||||
|
*/
|
||||||
|
|
||||||
|
rtems_device_major_number rtems_clock_major = ~0;
|
||||||
|
rtems_device_minor_number rtems_clock_minor;
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ISR Handler
|
||||||
|
*/
|
||||||
|
|
||||||
|
rtems_isr Clock_isr(rtems_vector_number vector)
|
||||||
|
{
|
||||||
|
Clock_driver_ticks += 1;
|
||||||
|
pcc->timer2_int_control |= 0x80; /* Acknowledge interr. */
|
||||||
|
|
||||||
|
if (Clock_isrs == 1) {
|
||||||
|
rtems_clock_tick();
|
||||||
|
Clock_isrs = BSP_Configuration.microseconds_per_tick / 1000;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
Clock_isrs -= 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Install_clock(rtems_isr_entry clock_isr )
|
||||||
|
{
|
||||||
|
|
||||||
|
Clock_driver_ticks = 0;
|
||||||
|
Clock_isrs = BSP_Configuration.microseconds_per_tick / 1000;
|
||||||
|
|
||||||
|
if ( BSP_Configuration.ticks_per_timeslice ) {
|
||||||
|
Old_ticker =
|
||||||
|
(rtems_isr_entry) set_vector( clock_isr, TIMER_2_VECTOR, 1 );
|
||||||
|
|
||||||
|
pcc->timer2_int_control = 0x00; /* Disable T2 Interr. */
|
||||||
|
pcc->timer2_preload = MS_COUNT;
|
||||||
|
/* write preload value */
|
||||||
|
pcc->timer2_control = 0x07; /* clear T2 overflow counter, enable counter */
|
||||||
|
pcc->timer2_int_control = CLOCK_INT_LEVEL|0x08;
|
||||||
|
/* Enable Timer 2 and set its int. level */
|
||||||
|
|
||||||
|
atexit( Clock_exit );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Clock_exit( void )
|
||||||
|
{
|
||||||
|
if ( BSP_Configuration.ticks_per_timeslice ) {
|
||||||
|
pcc->timer2_int_control = 0x00; /* Disable T2 Interr. */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
rtems_device_driver Clock_initialize(
|
||||||
|
rtems_device_major_number major,
|
||||||
|
rtems_device_minor_number minor,
|
||||||
|
void *pargp
|
||||||
|
)
|
||||||
|
{
|
||||||
|
Install_clock( Clock_isr );
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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_unsigned32 isrlevel;
|
||||||
|
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(TIMER_2_VECTOR);
|
||||||
|
}
|
||||||
|
else if (args->command == rtems_build_name('N', 'E', 'W', ' '))
|
||||||
|
{
|
||||||
|
rtems_interrupt_disable( isrlevel );
|
||||||
|
(void) set_vector( args->buffer, TIMER_2_VECTOR, 1 );
|
||||||
|
rtems_interrupt_enable( isrlevel );
|
||||||
|
}
|
||||||
|
|
||||||
|
done:
|
||||||
|
return RTEMS_SUCCESSFUL;
|
||||||
|
}
|
||||||
|
|
||||||
258
c/src/lib/libbsp/m68k/mvme147/console/console.c
Normal file
258
c/src/lib/libbsp/m68k/mvme147/console/console.c
Normal file
@@ -0,0 +1,258 @@
|
|||||||
|
/*
|
||||||
|
* This file contains the MVME147 console IO package.
|
||||||
|
*
|
||||||
|
* COPYRIGHT (c) 1989, 1990, 1991, 1992, 1993, 1994.
|
||||||
|
* On-Line Applications Research Corporation (OAR).
|
||||||
|
* All rights assigned to U.S. Government, 1994.
|
||||||
|
*
|
||||||
|
* This material may be reproduced by or for the U.S. Government pursuant
|
||||||
|
* to the copyright license under the clause at DFARS 252.227-7013. This
|
||||||
|
* notice must appear in all copies of this file and its derivatives.
|
||||||
|
*
|
||||||
|
* MVME147 port for TNI - Telecom Bretagne
|
||||||
|
* by Dominique LE CAMPION (Dominique.LECAMPION@enst-bretagne.fr)
|
||||||
|
* May 1996
|
||||||
|
*
|
||||||
|
* This file was taken from the DMV152 bsp
|
||||||
|
*
|
||||||
|
* $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define M147_INIT
|
||||||
|
|
||||||
|
#include <bsp.h>
|
||||||
|
#include <rtems/libio.h>
|
||||||
|
#include <z8530.h>
|
||||||
|
|
||||||
|
|
||||||
|
/* console_initialize
|
||||||
|
*
|
||||||
|
* This routine initializes the console IO driver.
|
||||||
|
*
|
||||||
|
* Input parameters: NONE
|
||||||
|
*
|
||||||
|
* Output parameters: NONE
|
||||||
|
*
|
||||||
|
* Return values:
|
||||||
|
*/
|
||||||
|
|
||||||
|
rtems_device_driver console_initialize(
|
||||||
|
rtems_device_major_number major,
|
||||||
|
rtems_device_minor_number minor,
|
||||||
|
void *arg
|
||||||
|
)
|
||||||
|
{
|
||||||
|
rtems_status_code status;
|
||||||
|
|
||||||
|
status = rtems_io_register_name(
|
||||||
|
"/dev/console",
|
||||||
|
major,
|
||||||
|
(rtems_device_minor_number) 0
|
||||||
|
);
|
||||||
|
|
||||||
|
if (status != RTEMS_SUCCESSFUL)
|
||||||
|
rtems_fatal_error_occurred(status);
|
||||||
|
|
||||||
|
return RTEMS_SUCCESSFUL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* is_character_ready
|
||||||
|
*
|
||||||
|
* This routine returns TRUE if a character is available.
|
||||||
|
*
|
||||||
|
* Input parameters: NONE
|
||||||
|
*
|
||||||
|
* Output parameters: NONE
|
||||||
|
*
|
||||||
|
* Return values:
|
||||||
|
*/
|
||||||
|
|
||||||
|
rtems_boolean is_character_ready(
|
||||||
|
char *ch
|
||||||
|
)
|
||||||
|
{
|
||||||
|
rtems_unsigned8 rr_0;
|
||||||
|
|
||||||
|
for ( ; ; ) {
|
||||||
|
Z8x30_READ_CONTROL( CONSOLE_CONTROL, RR_0, rr_0 );
|
||||||
|
if ( !(rr_0 & RR_0_RX_DATA_AVAILABLE) )
|
||||||
|
return( FALSE );
|
||||||
|
|
||||||
|
Z8x30_READ_DATA( CONSOLE_DATA, *ch );
|
||||||
|
return( TRUE );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* inbyte
|
||||||
|
*
|
||||||
|
* This routine reads a character from the SCC.
|
||||||
|
*
|
||||||
|
* Input parameters: NONE
|
||||||
|
*
|
||||||
|
* Output parameters: NONE
|
||||||
|
*
|
||||||
|
* Return values:
|
||||||
|
* character read from SCC
|
||||||
|
*/
|
||||||
|
|
||||||
|
char inbyte( void )
|
||||||
|
{
|
||||||
|
rtems_unsigned8 rr_0;
|
||||||
|
char ch;
|
||||||
|
|
||||||
|
for ( ; ; ) {
|
||||||
|
Z8x30_READ_CONTROL( CONSOLE_CONTROL, RR_0, rr_0 );
|
||||||
|
if ( (rr_0 & RR_0_RX_DATA_AVAILABLE) != 0 )
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
Z8x30_READ_DATA( CONSOLE_DATA, ch );
|
||||||
|
return ( ch );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* outbyte
|
||||||
|
*
|
||||||
|
* This routine transmits a character out the SCC. It supports
|
||||||
|
* XON/XOFF flow control.
|
||||||
|
*
|
||||||
|
* Input parameters:
|
||||||
|
* ch - character to be transmitted
|
||||||
|
*
|
||||||
|
* Output parameters: NONE
|
||||||
|
*/
|
||||||
|
|
||||||
|
void outbyte(
|
||||||
|
char ch
|
||||||
|
)
|
||||||
|
{
|
||||||
|
rtems_unsigned8 rr_0;
|
||||||
|
char flow_control;
|
||||||
|
|
||||||
|
for ( ; ; ) {
|
||||||
|
Z8x30_READ_CONTROL( CONSOLE_CONTROL, RR_0, rr_0 );
|
||||||
|
if ( (rr_0 & RR_0_TX_BUFFER_EMPTY) != 0 )
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
for ( ; ; ) {
|
||||||
|
Z8x30_READ_CONTROL( CONSOLE_CONTROL, RR_0, rr_0 );
|
||||||
|
if ( (rr_0 & RR_0_RX_DATA_AVAILABLE) == 0 )
|
||||||
|
break;
|
||||||
|
|
||||||
|
Z8x30_READ_DATA( CONSOLE_DATA, flow_control );
|
||||||
|
|
||||||
|
if ( flow_control == XOFF )
|
||||||
|
do {
|
||||||
|
do {
|
||||||
|
Z8x30_READ_CONTROL( CONSOLE_CONTROL, RR_0, rr_0 );
|
||||||
|
} while ( (rr_0 & RR_0_RX_DATA_AVAILABLE) == 0 );
|
||||||
|
Z8x30_READ_DATA( CONSOLE_DATA, flow_control );
|
||||||
|
} while ( flow_control != XON );
|
||||||
|
}
|
||||||
|
|
||||||
|
Z8x30_WRITE_DATA( CONSOLE_DATA, ch );
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Open entry point
|
||||||
|
*/
|
||||||
|
|
||||||
|
rtems_device_driver console_open(
|
||||||
|
rtems_device_major_number major,
|
||||||
|
rtems_device_minor_number minor,
|
||||||
|
void * arg
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return RTEMS_SUCCESSFUL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Close entry point
|
||||||
|
*/
|
||||||
|
|
||||||
|
rtems_device_driver console_close(
|
||||||
|
rtems_device_major_number major,
|
||||||
|
rtems_device_minor_number minor,
|
||||||
|
void * arg
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return RTEMS_SUCCESSFUL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* read bytes from the serial port. We only have stdin.
|
||||||
|
*/
|
||||||
|
|
||||||
|
rtems_device_driver console_read(
|
||||||
|
rtems_device_major_number major,
|
||||||
|
rtems_device_minor_number minor,
|
||||||
|
void * arg
|
||||||
|
)
|
||||||
|
{
|
||||||
|
rtems_libio_rw_args_t *rw_args;
|
||||||
|
char *buffer;
|
||||||
|
int maximum;
|
||||||
|
int count = 0;
|
||||||
|
|
||||||
|
rw_args = (rtems_libio_rw_args_t *) arg;
|
||||||
|
|
||||||
|
buffer = rw_args->buffer;
|
||||||
|
maximum = rw_args->count;
|
||||||
|
|
||||||
|
for (count = 0; count < maximum; count++) {
|
||||||
|
buffer[ count ] = inbyte();
|
||||||
|
if (buffer[ count ] == '\n' || buffer[ count ] == '\r') {
|
||||||
|
buffer[ count++ ] = '\n';
|
||||||
|
buffer[ count ] = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
rw_args->bytes_moved = count;
|
||||||
|
return (count >= 0) ? RTEMS_SUCCESSFUL : RTEMS_UNSATISFIED;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* write bytes to the serial port. Stdout and stderr are the same.
|
||||||
|
*/
|
||||||
|
|
||||||
|
rtems_device_driver console_write(
|
||||||
|
rtems_device_major_number major,
|
||||||
|
rtems_device_minor_number minor,
|
||||||
|
void * arg
|
||||||
|
)
|
||||||
|
{
|
||||||
|
int count;
|
||||||
|
int maximum;
|
||||||
|
rtems_libio_rw_args_t *rw_args;
|
||||||
|
char *buffer;
|
||||||
|
|
||||||
|
rw_args = (rtems_libio_rw_args_t *) arg;
|
||||||
|
|
||||||
|
buffer = rw_args->buffer;
|
||||||
|
maximum = rw_args->count;
|
||||||
|
|
||||||
|
for (count = 0; count < maximum; count++) {
|
||||||
|
if ( buffer[ count ] == '\n') {
|
||||||
|
outbyte('\r');
|
||||||
|
}
|
||||||
|
outbyte( buffer[ count ] );
|
||||||
|
}
|
||||||
|
|
||||||
|
rw_args->bytes_moved = maximum;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* IO Control entry point
|
||||||
|
*/
|
||||||
|
|
||||||
|
rtems_device_driver console_control(
|
||||||
|
rtems_device_major_number major,
|
||||||
|
rtems_device_minor_number minor,
|
||||||
|
void * arg
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return RTEMS_SUCCESSFUL;
|
||||||
|
}
|
||||||
|
|
||||||
189
c/src/lib/libbsp/m68k/mvme147/include/bsp.h
Normal file
189
c/src/lib/libbsp/m68k/mvme147/include/bsp.h
Normal file
@@ -0,0 +1,189 @@
|
|||||||
|
/* bsp.h
|
||||||
|
*
|
||||||
|
* This include file contains all MVME147 board IO definitions.
|
||||||
|
*
|
||||||
|
* COPYRIGHT (c) 1989, 1990, 1991, 1992, 1993, 1994.
|
||||||
|
* On-Line Applications Research Corporation (OAR).
|
||||||
|
* All rights assigned to U.S. Government, 1994.
|
||||||
|
*
|
||||||
|
* This material may be reproduced by or for the U.S. Government pursuant
|
||||||
|
* to the copyright license under the clause at DFARS 252.227-7013. This
|
||||||
|
* notice must appear in all copies of this file and its derivatives.
|
||||||
|
*
|
||||||
|
* MVME147 port for TNI - Telecom Bretagne
|
||||||
|
* by Dominique LE CAMPION (Dominique.LECAMPION@enst-bretagne.fr)
|
||||||
|
* May 1996
|
||||||
|
*
|
||||||
|
* $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __MVME147_h
|
||||||
|
#define __MVME147_h
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <rtems.h>
|
||||||
|
#include <clockdrv.h>
|
||||||
|
#include <console.h>
|
||||||
|
#include <iosupp.h>
|
||||||
|
|
||||||
|
/* Constants */
|
||||||
|
|
||||||
|
#define RAM_START 0x00005000
|
||||||
|
#define RAM_END 0x00400000
|
||||||
|
|
||||||
|
/* MVME 147 Peripheral controller chip
|
||||||
|
see MVME147/D1, 3.4 */
|
||||||
|
|
||||||
|
struct pcc_map {
|
||||||
|
/* 32 bit registers */
|
||||||
|
rtems_unsigned32 dma_table_address; /* 0xfffe1000 */
|
||||||
|
rtems_unsigned32 dma_data_address; /* 0xfffe1004 */
|
||||||
|
rtems_unsigned32 dma_bytecount; /* 0xfffe1008 */
|
||||||
|
rtems_unsigned32 dma_data_holding; /* 0xfffe100c */
|
||||||
|
|
||||||
|
/* 16 bit registers */
|
||||||
|
rtems_unsigned16 timer1_preload; /* 0xfffe1010 */
|
||||||
|
rtems_unsigned16 timer1_count; /* 0xfffe1012 */
|
||||||
|
rtems_unsigned16 timer2_preload; /* 0xfffe1014 */
|
||||||
|
rtems_unsigned16 timer2_count; /* 0xfffe1016 */
|
||||||
|
|
||||||
|
/* 8 bit registers */
|
||||||
|
rtems_unsigned8 timer1_int_control; /* 0xfffe1018 */
|
||||||
|
rtems_unsigned8 timer1_control; /* 0xfffe1019 */
|
||||||
|
rtems_unsigned8 timer2_int_control; /* 0xfffe101a */
|
||||||
|
rtems_unsigned8 timer2_control; /* 0xfffe101b */
|
||||||
|
|
||||||
|
rtems_unsigned8 acfail_int_control; /* 0xfffe101c */
|
||||||
|
rtems_unsigned8 watchdog_control; /* 0xfffe101d */
|
||||||
|
|
||||||
|
rtems_unsigned8 printer_int_control; /* 0xfffe101e */
|
||||||
|
rtems_unsigned8 printer_control; /* 0xfffe102f */
|
||||||
|
|
||||||
|
rtems_unsigned8 dma_int_control; /* 0xfffe1020 */
|
||||||
|
rtems_unsigned8 dma_control; /* 0xfffe1021 */
|
||||||
|
rtems_unsigned8 bus_error_int_control; /* 0xfffe1022 */
|
||||||
|
rtems_unsigned8 dma_status; /* 0xfffe1023 */
|
||||||
|
rtems_unsigned8 abort_int_control; /* 0xfffe1024 */
|
||||||
|
rtems_unsigned8 table_address_function_code; /* 0xfffe1025 */
|
||||||
|
rtems_unsigned8 serial_port_int_control; /* 0xfffe1026 */
|
||||||
|
rtems_unsigned8 general_purpose_control; /* 0xfffe1027 */
|
||||||
|
rtems_unsigned8 lan_int_control; /* 0xfffe1028 */
|
||||||
|
rtems_unsigned8 general_purpose_status; /* 0xfffe1029 */
|
||||||
|
rtems_unsigned8 scsi_port_int_control; /* 0xfffe102a */
|
||||||
|
rtems_unsigned8 slave_base_address; /* 0xfffe102b */
|
||||||
|
rtems_unsigned8 software_int_1_control; /* 0xfffe102c */
|
||||||
|
rtems_unsigned8 int_base_vector; /* 0xfffe102d */
|
||||||
|
rtems_unsigned8 software_int_2_control; /* 0xfffe102e */
|
||||||
|
rtems_unsigned8 revision_level; /* 0xfffe102f */
|
||||||
|
};
|
||||||
|
|
||||||
|
#define pcc ((volatile struct pcc_map * const) 0xfffe1000)
|
||||||
|
|
||||||
|
#define z8530 0xfffe3001
|
||||||
|
|
||||||
|
|
||||||
|
/* interrupt vectors - see MVME146/D1 4.14 */
|
||||||
|
#define PCC_BASE_VECTOR 0x40 /* First user int */
|
||||||
|
#define SCC_VECTOR PCC_BASE_VECTOR+3
|
||||||
|
#define TIMER_1_VECTOR PCC_BASE_VECTOR+8
|
||||||
|
#define TIMER_2_VECTOR PCC_BASE_VECTOR+9
|
||||||
|
#define SOFT_1_VECTOR PCC_BASE_VECTOR+10
|
||||||
|
#define SOFT_2_VECTOR PCC_BASE_VECTOR+11
|
||||||
|
|
||||||
|
#define USE_CHANNEL_A 1 /* 1 = use channel A for console */
|
||||||
|
#define USE_CHANNEL_B 0 /* 1 = use channel B for console */
|
||||||
|
|
||||||
|
#if (USE_CHANNEL_A == 1)
|
||||||
|
#define CONSOLE_CONTROL 0xfffe3002
|
||||||
|
#define CONSOLE_DATA 0xfffe3003
|
||||||
|
#elif (USE_CHANNEL_B == 1)
|
||||||
|
#define CONSOLE_CONTROL 0xfffe3000
|
||||||
|
#define CONSOLE_DATA 0xfffe3001
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#define FOREVER 1 /* infinite loop */
|
||||||
|
|
||||||
|
#ifdef M147_INIT
|
||||||
|
#undef EXTERN
|
||||||
|
#define EXTERN
|
||||||
|
#else
|
||||||
|
#undef EXTERN
|
||||||
|
#define EXTERN extern
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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 the MPCSR vector for the MVME147
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define MUST_WAIT_FOR_INTERRUPT 0
|
||||||
|
|
||||||
|
#define Install_tm27_vector( handler ) set_vector( (handler), \
|
||||||
|
SOFT_1_VECTOR, 1 )
|
||||||
|
|
||||||
|
#define Cause_tm27_intr() pcc->software_int_1_control = 0x0c
|
||||||
|
/* generate level 4 sotware int. */
|
||||||
|
|
||||||
|
#define Clear_tm27_intr() pcc->software_int_1_control = 0x00
|
||||||
|
|
||||||
|
#define Lower_tm27_intr()
|
||||||
|
|
||||||
|
|
||||||
|
/* miscellaneous stuff assumed to exist */
|
||||||
|
|
||||||
|
extern rtems_configuration_table BSP_Configuration;
|
||||||
|
|
||||||
|
extern m68k_isr_entry M68Kvec[]; /* vector table address */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Device Driver Table Entries
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* NOTE: Use the standard Console driver entry
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* NOTE: Use the standard Clock driver entry
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* How many libio files we want
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define BSP_LIBIO_MAX_FDS 20
|
||||||
|
|
||||||
|
/* functions */
|
||||||
|
|
||||||
|
void bsp_cleanup( void );
|
||||||
|
|
||||||
|
m68k_isr_entry set_vector(
|
||||||
|
rtems_isr_entry handler,
|
||||||
|
rtems_vector_number vector,
|
||||||
|
int type
|
||||||
|
);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
/* end of include file */
|
||||||
|
|
||||||
104
c/src/lib/libbsp/m68k/mvme147/include/coverhd.h
Normal file
104
c/src/lib/libbsp/m68k/mvme147/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, 1990, 1991, 1992, 1993, 1994.
|
||||||
|
* On-Line Applications Research Corporation (OAR).
|
||||||
|
* All rights assigned to U.S. Government, 1994.
|
||||||
|
*
|
||||||
|
* This material may be reproduced by or for the U.S. Government pursuant
|
||||||
|
* to the copyright license under the clause at DFARS 252.227-7013. This
|
||||||
|
* notice must appear in all copies of this file and its derivatives.
|
||||||
|
*
|
||||||
|
* $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __COVERHD_h
|
||||||
|
#define __COVERHD_h
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define CALLING_OVERHEAD_INITIALIZE_EXECUTIVE 2
|
||||||
|
#define CALLING_OVERHEAD_SHUTDOWN_EXECUTIVE 1
|
||||||
|
#define CALLING_OVERHEAD_TASK_CREATE 3
|
||||||
|
#define CALLING_OVERHEAD_TASK_IDENT 2
|
||||||
|
#define CALLING_OVERHEAD_TASK_START 2
|
||||||
|
#define CALLING_OVERHEAD_TASK_RESTART 2
|
||||||
|
#define CALLING_OVERHEAD_TASK_DELETE 1
|
||||||
|
#define CALLING_OVERHEAD_TASK_SUSPEND 1
|
||||||
|
#define CALLING_OVERHEAD_TASK_RESUME 2
|
||||||
|
#define CALLING_OVERHEAD_TASK_SET_PRIORITY 2
|
||||||
|
#define CALLING_OVERHEAD_TASK_MODE 2
|
||||||
|
#define CALLING_OVERHEAD_TASK_GET_NOTE 2
|
||||||
|
#define CALLING_OVERHEAD_TASK_SET_NOTE 2
|
||||||
|
#define CALLING_OVERHEAD_TASK_WAKE_WHEN 4
|
||||||
|
#define CALLING_OVERHEAD_TASK_WAKE_AFTER 1
|
||||||
|
#define CALLING_OVERHEAD_INTERRUPT_CATCH 2
|
||||||
|
#define CALLING_OVERHEAD_CLOCK_GET 5
|
||||||
|
#define CALLING_OVERHEAD_CLOCK_SET 4
|
||||||
|
#define CALLING_OVERHEAD_CLOCK_TICK 1
|
||||||
|
|
||||||
|
#define CALLING_OVERHEAD_TIMER_CREATE 2
|
||||||
|
#define CALLING_OVERHEAD_TIMER_IDENT 1
|
||||||
|
#define CALLING_OVERHEAD_TIMER_DELETE 2
|
||||||
|
#define CALLING_OVERHEAD_TIMER_FIRE_AFTER 2
|
||||||
|
#define CALLING_OVERHEAD_TIMER_FIRE_WHEN 5
|
||||||
|
#define CALLING_OVERHEAD_TIMER_RESET 1
|
||||||
|
#define CALLING_OVERHEAD_TIMER_CANCEL 1
|
||||||
|
#define CALLING_OVERHEAD_SEMAPHORE_CREATE 3
|
||||||
|
#define CALLING_OVERHEAD_SEMAPHORE_DELETE 1
|
||||||
|
#define CALLING_OVERHEAD_SEMAPHORE_IDENT 2
|
||||||
|
#define CALLING_OVERHEAD_SEMAPHORE_OBTAIN 2
|
||||||
|
#define CALLING_OVERHEAD_SEMAPHORE_RELEASE 1
|
||||||
|
#define CALLING_OVERHEAD_MESSAGE_QUEUE_CREATE 2
|
||||||
|
#define CALLING_OVERHEAD_MESSAGE_QUEUE_IDENT 2
|
||||||
|
#define CALLING_OVERHEAD_MESSAGE_QUEUE_DELETE 1
|
||||||
|
#define CALLING_OVERHEAD_MESSAGE_QUEUE_SEND 2
|
||||||
|
#define CALLING_OVERHEAD_MESSAGE_QUEUE_URGENT 2
|
||||||
|
#define CALLING_OVERHEAD_MESSAGE_QUEUE_BROADCAST 2
|
||||||
|
#define CALLING_OVERHEAD_MESSAGE_QUEUE_RECEIVE 3
|
||||||
|
#define CALLING_OVERHEAD_MESSAGE_QUEUE_FLUSH 2
|
||||||
|
|
||||||
|
#define CALLING_OVERHEAD_EVENT_SEND 2
|
||||||
|
#define CALLING_OVERHEAD_EVENT_RECEIVE 2
|
||||||
|
#define CALLING_OVERHEAD_SIGNAL_CATCH 2
|
||||||
|
#define CALLING_OVERHEAD_SIGNAL_SEND 2
|
||||||
|
#define CALLING_OVERHEAD_PARTITION_CREATE 3
|
||||||
|
#define CALLING_OVERHEAD_PARTITION_IDENT 2
|
||||||
|
#define CALLING_OVERHEAD_PARTITION_DELETE 1
|
||||||
|
#define CALLING_OVERHEAD_PARTITION_GET_BUFFER 2
|
||||||
|
#define CALLING_OVERHEAD_PARTITION_RETURN_BUFFER 2
|
||||||
|
#define CALLING_OVERHEAD_REGION_CREATE 3
|
||||||
|
#define CALLING_OVERHEAD_REGION_IDENT 2
|
||||||
|
#define CALLING_OVERHEAD_REGION_DELETE 2
|
||||||
|
#define CALLING_OVERHEAD_REGION_GET_SEGMENT 3
|
||||||
|
#define CALLING_OVERHEAD_REGION_RETURN_SEGMENT 2
|
||||||
|
#define CALLING_OVERHEAD_PORT_CREATE 3
|
||||||
|
#define CALLING_OVERHEAD_PORT_IDENT 2
|
||||||
|
#define CALLING_OVERHEAD_PORT_DELETE 1
|
||||||
|
#define CALLING_OVERHEAD_PORT_EXTERNAL_TO_INTERNAL 2
|
||||||
|
#define CALLING_OVERHEAD_PORT_INTERNAL_TO_EXTERNAL 2
|
||||||
|
|
||||||
|
#define CALLING_OVERHEAD_IO_INITIALIZE 2
|
||||||
|
#define CALLING_OVERHEAD_IO_OPEN 2
|
||||||
|
#define CALLING_OVERHEAD_IO_CLOSE 3
|
||||||
|
#define CALLING_OVERHEAD_IO_READ 2
|
||||||
|
#define CALLING_OVERHEAD_IO_WRITE 2
|
||||||
|
#define CALLING_OVERHEAD_IO_CONTROL 2
|
||||||
|
#define CALLING_OVERHEAD_FATAL_ERROR_OCCURRED 1
|
||||||
|
#define CALLING_OVERHEAD_RATE_MONOTONIC_CREATE 2
|
||||||
|
#define CALLING_OVERHEAD_RATE_MONOTONIC_IDENT 2
|
||||||
|
#define CALLING_OVERHEAD_RATE_MONOTONIC_DELETE 1
|
||||||
|
#define CALLING_OVERHEAD_RATE_MONOTONIC_CANCEL 1
|
||||||
|
#define CALLING_OVERHEAD_RATE_MONOTONIC_PERIOD 2
|
||||||
|
#define CALLING_OVERHEAD_MULTIPROCESSING_ANNOUNCE 1
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
/* end of include file */
|
||||||
45
c/src/lib/libbsp/m68k/mvme147/startup/bspclean.c
Normal file
45
c/src/lib/libbsp/m68k/mvme147/startup/bspclean.c
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
/*
|
||||||
|
* This routine returns control to 147Bug.
|
||||||
|
*
|
||||||
|
* COPYRIGHT (c) 1989, 1990, 1991, 1992, 1993, 1994.
|
||||||
|
* On-Line Applications Research Corporation (OAR).
|
||||||
|
* All rights assigned to U.S. Government, 1994.
|
||||||
|
*
|
||||||
|
* This material may be reproduced by or for the U.S. Government pursuant
|
||||||
|
* to the copyright license under the clause at DFARS 252.227-7013. This
|
||||||
|
* notice must appear in all copies of this file and its derivatives.
|
||||||
|
*
|
||||||
|
* MVME147 port for TNI - Telecom Bretagne
|
||||||
|
* by Dominique LE CAMPION (Dominique.LECAMPION@enst-bretagne.fr)
|
||||||
|
* May 1996
|
||||||
|
*
|
||||||
|
* $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <rtems.h>
|
||||||
|
#include <bsp.h>
|
||||||
|
#include <clockdrv.h>
|
||||||
|
|
||||||
|
void bsp_return_to_monitor_trap()
|
||||||
|
{
|
||||||
|
extern void start( void );
|
||||||
|
|
||||||
|
register volatile void *start_addr;
|
||||||
|
|
||||||
|
m68k_set_vbr( 0 ); /* restore 147Bug vectors */
|
||||||
|
asm volatile( "trap #15" ); /* trap to 147Bug */
|
||||||
|
asm volatile( ".short 0x63" ); /* return to 147Bug (.RETURN) */
|
||||||
|
/* restart program */
|
||||||
|
start_addr = start;
|
||||||
|
|
||||||
|
asm volatile ( "jmp %0@" : "=a" (start_addr) : "0" (start_addr) );
|
||||||
|
}
|
||||||
|
|
||||||
|
void bsp_cleanup( void )
|
||||||
|
{
|
||||||
|
pcc->timer1_int_control = 0; /* Disable Timer 1 */
|
||||||
|
pcc->timer2_int_control = 0; /* Disable Timer 2 */
|
||||||
|
|
||||||
|
M68Kvec[ 45 ] = bsp_return_to_monitor_trap; /* install handler */
|
||||||
|
asm volatile( "trap #13" ); /* insures SUPV mode */
|
||||||
|
}
|
||||||
245
c/src/lib/libbsp/m68k/mvme147/startup/bspstart.c
Normal file
245
c/src/lib/libbsp/m68k/mvme147/startup/bspstart.c
Normal file
@@ -0,0 +1,245 @@
|
|||||||
|
/* bsp_start()
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* INPUT: NONE
|
||||||
|
*
|
||||||
|
* OUTPUT: NONE
|
||||||
|
*
|
||||||
|
* COPYRIGHT (c) 1989, 1990, 1991, 1992, 1993, 1994.
|
||||||
|
* On-Line Applications Research Corporation (OAR).
|
||||||
|
* All rights assigned to U.S. Government, 1994.
|
||||||
|
*
|
||||||
|
* This material may be reproduced by or for the U.S. Government pursuant
|
||||||
|
* to the copyright license under the clause at DFARS 252.227-7013. This
|
||||||
|
* notice must appear in all copies of this file and its derivatives.
|
||||||
|
*
|
||||||
|
* MVME147 port for TNI - Telecom Bretagne
|
||||||
|
* by Dominique LE CAMPION (Dominique.LECAMPION@enst-bretagne.fr)
|
||||||
|
* May 1996
|
||||||
|
*
|
||||||
|
* $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <bsp.h>
|
||||||
|
#include <rtems/libio.h>
|
||||||
|
|
||||||
|
#include <libcsupport.h>
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
|
||||||
|
#ifdef STACK_CHECKER_ON
|
||||||
|
#include <stackchk.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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;
|
||||||
|
|
||||||
|
char *rtems_progname;
|
||||||
|
|
||||||
|
/* Initialize whatever libc we are using
|
||||||
|
* called from postdriver hook
|
||||||
|
*/
|
||||||
|
|
||||||
|
void bsp_libc_init()
|
||||||
|
{
|
||||||
|
extern int end;
|
||||||
|
rtems_unsigned32 heap_start;
|
||||||
|
|
||||||
|
heap_start = (rtems_unsigned32) &end;
|
||||||
|
if (heap_start & (CPU_ALIGNMENT-1))
|
||||||
|
heap_start = (heap_start + CPU_ALIGNMENT) & ~(CPU_ALIGNMENT-1);
|
||||||
|
|
||||||
|
RTEMS_Malloc_Initialize((void *) heap_start, 64 * 1024, 0);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Init the RTEMS libio facility to provide UNIX-like system
|
||||||
|
* calls for use by newlib (ie: provide __open, __close, etc)
|
||||||
|
* Uses malloc() to get area for the iops, so must be after malloc init
|
||||||
|
*/
|
||||||
|
|
||||||
|
rtems_libio_init();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set up for the libc handling.
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (BSP_Configuration.ticks_per_timeslice > 0)
|
||||||
|
libc_init(1); /* reentrant if possible */
|
||||||
|
else
|
||||||
|
libc_init(0); /* non-reentrant */
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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)
|
||||||
|
{
|
||||||
|
bsp_libc_init();
|
||||||
|
|
||||||
|
#ifdef STACK_CHECKER_ON
|
||||||
|
/*
|
||||||
|
* Initialize the stack bounds checker
|
||||||
|
* We can either turn it on here or from the app.
|
||||||
|
*/
|
||||||
|
|
||||||
|
Stack_check_Initialize();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef RTEMS_DEBUG
|
||||||
|
rtems_debug_enable( RTEMS_DEBUG_ALL_MASK );
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* After drivers are setup, register some "filenames"
|
||||||
|
* and open stdin, stdout, stderr files
|
||||||
|
*
|
||||||
|
* Newlib will automatically associate the files with these
|
||||||
|
* (it hardcodes the numbers)
|
||||||
|
*/
|
||||||
|
|
||||||
|
void
|
||||||
|
bsp_postdriver_hook(void)
|
||||||
|
{
|
||||||
|
int stdin_fd, stdout_fd, stderr_fd;
|
||||||
|
int error_code;
|
||||||
|
|
||||||
|
error_code = 'S' << 24 | 'T' << 16;
|
||||||
|
|
||||||
|
if ((stdin_fd = __open("/dev/console", O_RDONLY, 0)) == -1)
|
||||||
|
rtems_fatal_error_occurred( error_code | 'D' << 8 | '0' );
|
||||||
|
|
||||||
|
if ((stdout_fd = __open("/dev/console", O_WRONLY, 0)) == -1)
|
||||||
|
rtems_fatal_error_occurred( error_code | 'D' << 8 | '1' );
|
||||||
|
|
||||||
|
if ((stderr_fd = __open("/dev/console", O_WRONLY, 0)) == -1)
|
||||||
|
rtems_fatal_error_occurred( error_code | 'D' << 8 | '2' );
|
||||||
|
|
||||||
|
if ((stdin_fd != 0) || (stdout_fd != 1) || (stderr_fd != 2))
|
||||||
|
rtems_fatal_error_occurred( error_code | 'I' << 8 | 'O' );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int main(
|
||||||
|
int argc,
|
||||||
|
char **argv,
|
||||||
|
char **environp
|
||||||
|
)
|
||||||
|
{
|
||||||
|
m68k_isr_entry *monitors_vector_table;
|
||||||
|
int index;
|
||||||
|
|
||||||
|
if ((argc > 0) && argv && argv[0])
|
||||||
|
rtems_progname = argv[0];
|
||||||
|
else
|
||||||
|
rtems_progname = "RTEMS";
|
||||||
|
|
||||||
|
monitors_vector_table = (m68k_isr_entry *)0; /* 135Bug Vectors are at 0 */
|
||||||
|
m68k_set_vbr( monitors_vector_table );
|
||||||
|
|
||||||
|
for ( index=2 ; index<=255 ; index++ )
|
||||||
|
M68Kvec[ index ] = monitors_vector_table[ 32 ];
|
||||||
|
|
||||||
|
M68Kvec[ 2 ] = monitors_vector_table[ 2 ]; /* bus error vector */
|
||||||
|
M68Kvec[ 4 ] = monitors_vector_table[ 4 ]; /* breakpoints vector */
|
||||||
|
M68Kvec[ 9 ] = monitors_vector_table[ 9 ]; /* trace vector */
|
||||||
|
M68Kvec[ 47 ] = monitors_vector_table[ 47 ]; /* system call vector */
|
||||||
|
|
||||||
|
m68k_set_vbr( &M68Kvec );
|
||||||
|
|
||||||
|
pcc->int_base_vector = PCC_BASE_VECTOR; /* Set the PCC int vectors base */
|
||||||
|
|
||||||
|
(*(rtems_unsigned8 *)0xfffe2001) = 0x08;
|
||||||
|
/* make VME access round-robin */
|
||||||
|
|
||||||
|
m68k_enable_caching();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* we only use a hook to get the C library initialized.
|
||||||
|
*/
|
||||||
|
|
||||||
|
Cpu_table.pretasking_hook = bsp_pretasking_hook; /* init libc, etc. */
|
||||||
|
|
||||||
|
Cpu_table.predriver_hook = NULL;
|
||||||
|
|
||||||
|
Cpu_table.postdriver_hook = bsp_postdriver_hook;
|
||||||
|
|
||||||
|
Cpu_table.idle_task = NULL; /* do not override system IDLE task */
|
||||||
|
|
||||||
|
Cpu_table.do_zero_of_workspace = TRUE;
|
||||||
|
|
||||||
|
Cpu_table.interrupt_vector_table = (m68k_isr_entry *) &M68Kvec;
|
||||||
|
|
||||||
|
Cpu_table.interrupt_stack_size = 4096;
|
||||||
|
|
||||||
|
Cpu_table.extra_mpci_receive_server_stack = 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copy the table
|
||||||
|
*/
|
||||||
|
|
||||||
|
BSP_Configuration = Configuration;
|
||||||
|
|
||||||
|
BSP_Configuration.work_space_start = (void *)
|
||||||
|
(RAM_END - BSP_Configuration.work_space_size);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Add 1 region for the RTEMS Malloc
|
||||||
|
*/
|
||||||
|
|
||||||
|
BSP_Configuration.maximum_regions++;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Add 1 extension for newlib libc
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef RTEMS_NEWLIB
|
||||||
|
BSP_Configuration.maximum_extensions++;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Add another extension if using the stack checker
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef STACK_CHECKER_ON
|
||||||
|
BSP_Configuration.maximum_extensions++;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Tell libio how many fd's we want and allow it to tweak config
|
||||||
|
*/
|
||||||
|
|
||||||
|
rtems_libio_config(&BSP_Configuration, BSP_LIBIO_MAX_FDS);
|
||||||
|
|
||||||
|
rtems_initialize_executive( &BSP_Configuration, &Cpu_table );
|
||||||
|
/* does not return */
|
||||||
|
|
||||||
|
bsp_cleanup();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
52
c/src/lib/libbsp/m68k/mvme147/startup/linkcmds
Normal file
52
c/src/lib/libbsp/m68k/mvme147/startup/linkcmds
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
/*
|
||||||
|
* This file contains directives for the GNU linker which are specific
|
||||||
|
* to the Motorola MVME147 boards.
|
||||||
|
*
|
||||||
|
* COPYRIGHT (c) 1989, 1990, 1991, 1992, 1993, 1994.
|
||||||
|
* On-Line Applications Research Corporation (OAR).
|
||||||
|
* All rights assigned to U.S. Government, 1994.
|
||||||
|
*
|
||||||
|
* This material may be reproduced by or for the U.S. Government pursuant
|
||||||
|
* to the copyright license under the clause at DFARS 252.227-7013. This
|
||||||
|
* notice must appear in all copies of this file and its derivatives.
|
||||||
|
*
|
||||||
|
* MVME147 port for TNI - Telecom Bretagne
|
||||||
|
* by Dominique LE CAMPION (Dominique.LECAMPION@enst-bretagne.fr)
|
||||||
|
* May 1996
|
||||||
|
*
|
||||||
|
* $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
MEMORY
|
||||||
|
{
|
||||||
|
ram : org = 0x5000, l = 0x3fafff
|
||||||
|
}
|
||||||
|
|
||||||
|
SECTIONS
|
||||||
|
{
|
||||||
|
.text 0x5000 :
|
||||||
|
{
|
||||||
|
text_start = . ;
|
||||||
|
_text_start = . ;
|
||||||
|
*(.text)
|
||||||
|
etext = ALIGN( 0x10 ) ;
|
||||||
|
_etext = .;
|
||||||
|
}
|
||||||
|
.data ADDR( .text ) + SIZEOF( .text ):
|
||||||
|
{
|
||||||
|
data_start = . ;
|
||||||
|
_data_start = .;
|
||||||
|
*(.data)
|
||||||
|
edata = ALIGN( 0x10 ) ;
|
||||||
|
_edata = .;
|
||||||
|
}
|
||||||
|
.bss ADDR( .data ) + SIZEOF( .data ):
|
||||||
|
{
|
||||||
|
bss_start = . ;
|
||||||
|
_bss_start = . ;
|
||||||
|
*(.bss)
|
||||||
|
*(COMMON)
|
||||||
|
end = . ;
|
||||||
|
_end = . ;
|
||||||
|
}
|
||||||
|
}
|
||||||
84
c/src/lib/libbsp/m68k/mvme147/timer/timer.c
Normal file
84
c/src/lib/libbsp/m68k/mvme147/timer/timer.c
Normal file
@@ -0,0 +1,84 @@
|
|||||||
|
/* Timer_init()
|
||||||
|
*
|
||||||
|
* This routine initializes the PCC timer on the MVME147 board.
|
||||||
|
*
|
||||||
|
* Input parameters: NONE
|
||||||
|
*
|
||||||
|
* Output parameters: NONE
|
||||||
|
*
|
||||||
|
* NOTE: It is important that the timer start/stop overhead be
|
||||||
|
* determined when porting or modifying this code.
|
||||||
|
*
|
||||||
|
* COPYRIGHT (c) 1989, 1990, 1991, 1992, 1993, 1994.
|
||||||
|
* On-Line Applications Research Corporation (OAR).
|
||||||
|
* All rights assigned to U.S. Government, 1994.
|
||||||
|
*
|
||||||
|
* This material may be reproduced by or for the U.S. Government pursuant
|
||||||
|
* to the copyright license under the clause at DFARS 252.227-7013. This
|
||||||
|
* notice must appear in all copies of this file and its derivatives.
|
||||||
|
*
|
||||||
|
* MVME147 port for TNI - Telecom Bretagne
|
||||||
|
* by Dominique LE CAMPION (Dominique.LECAMPION@enst-bretagne.fr)
|
||||||
|
* May 1996
|
||||||
|
*
|
||||||
|
* $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <bsp.h>
|
||||||
|
|
||||||
|
#define TIMER_INT_LEVEL 6
|
||||||
|
|
||||||
|
#define COUNTDOWN_VALUE 0
|
||||||
|
/* Allows 0.4096 second delay betwin ints */
|
||||||
|
/* Each tick is 6.25 us */
|
||||||
|
|
||||||
|
int Ttimer_val;
|
||||||
|
rtems_boolean Timer_driver_Find_average_overhead;
|
||||||
|
|
||||||
|
rtems_isr timerisr();
|
||||||
|
|
||||||
|
void Timer_initialize()
|
||||||
|
{
|
||||||
|
(void) set_vector(timerisr, TIMER_1_VECTOR, 0); /* install ISR */
|
||||||
|
|
||||||
|
Ttimer_val = 0; /* clear timer ISR count */
|
||||||
|
pcc->timer1_int_control = 0x00; /* Disable T1 Interr. */
|
||||||
|
pcc->timer1_preload = COUNTDOWN_VALUE;
|
||||||
|
/* write countdown preload value */
|
||||||
|
pcc->timer1_control = 0x00; /* load preload value */
|
||||||
|
pcc->timer1_control = 0x07; /* clear T1 overflow counter, enable counter */
|
||||||
|
pcc->timer1_int_control = TIMER_INT_LEVEL|0x08;
|
||||||
|
/* Enable Timer 1 and set its int. level */
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#define AVG_OVERHEAD 0 /* No need to start/stop the timer to read
|
||||||
|
its value on the MVME147 PCC: reads are not
|
||||||
|
synchronized whith the counter updates*/
|
||||||
|
#define LEAST_VALID 10 /* Don't trust a value lower than this */
|
||||||
|
|
||||||
|
int Read_timer()
|
||||||
|
{
|
||||||
|
rtems_unsigned32 total;
|
||||||
|
rtems_unsigned16 counter_value;
|
||||||
|
|
||||||
|
counter_value = pcc->timer1_count; /* read the counter value */
|
||||||
|
|
||||||
|
total = ((Ttimer_val * 0x10000) + counter_value); /* in 6.25 us units */
|
||||||
|
/* DC note : just look at the assembly generated
|
||||||
|
to see gcc's impressive optimization ! */
|
||||||
|
return total;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
28
c/src/lib/libbsp/m68k/mvme147/timer/timerisr.s
Normal file
28
c/src/lib/libbsp/m68k/mvme147/timer/timerisr.s
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
# timer_isr()
|
||||||
|
#
|
||||||
|
# This routine provides the ISR for the PCC timer on the MVME147
|
||||||
|
# board. The timer is set up to generate an interrupt at maximum
|
||||||
|
# intervals.
|
||||||
|
#
|
||||||
|
# MVME147 port for TNI - Telecom Bretagne
|
||||||
|
# by Dominique LE CAMPION (Dominique.LECAMPION@enst-bretagne.fr)
|
||||||
|
# May 1996
|
||||||
|
#
|
||||||
|
# $Id$
|
||||||
|
#
|
||||||
|
|
||||||
|
#include "asm.h"
|
||||||
|
|
||||||
|
BEGIN_CODE
|
||||||
|
|
||||||
|
.set T1_CONTROL_REGISTER, 0xfffe1018 | timer 1 control register
|
||||||
|
|
||||||
|
PUBLIC (timerisr)
|
||||||
|
SYM (timerisr):
|
||||||
|
orb #0x80, T1_CONTROL_REGISTER | clear T1 int status bit
|
||||||
|
addql #1, SYM (Ttimer_val) | increment timer value
|
||||||
|
end_timerisr:
|
||||||
|
rte
|
||||||
|
|
||||||
|
END_CODE
|
||||||
|
END
|
||||||
194
c/src/lib/libbsp/m68k/mvme147/times
Normal file
194
c/src/lib/libbsp/m68k/mvme147/times
Normal file
@@ -0,0 +1,194 @@
|
|||||||
|
#
|
||||||
|
# Timing Test Suite Results for the Motorola MVME147 BSP
|
||||||
|
#
|
||||||
|
# MVME147 port for TNI - Telecom Bretagne
|
||||||
|
# by Dominique LE CAMPION (Dominique.LECAMPION@enst-bretagne.fr)
|
||||||
|
# May 1996
|
||||||
|
#
|
||||||
|
# $Id$
|
||||||
|
#
|
||||||
|
|
||||||
|
Board: Motorola MVME147S
|
||||||
|
CPU: Motorola MC68030 + MC68882 FPU
|
||||||
|
Clock Speed: 20 Mhz
|
||||||
|
Memory Configuration: DRAM w/no cache
|
||||||
|
Wait States: ? wait state
|
||||||
|
|
||||||
|
Times Reported in: microseconds (6.25 us grain)
|
||||||
|
Timer Source: MVME147 Peripheral Channel Controller tick timer
|
||||||
|
|
||||||
|
Column A: 3.5.1 pre-release
|
||||||
|
|
||||||
|
# DESCRIPTION A
|
||||||
|
== ================================================================= ====
|
||||||
|
1 rtems_semaphore_create 69
|
||||||
|
rtems_semaphore_delete 69
|
||||||
|
rtems_semaphore_obtain: available 44
|
||||||
|
rtems_semaphore_obtain: not available -- NO_WAIT 44
|
||||||
|
rtems_semaphore_release: no waiting tasks 56
|
||||||
|
|
||||||
|
2 rtems_semaphore_obtain: not available -- caller blocks 125
|
||||||
|
|
||||||
|
3 rtems_semaphore_release: task readied -- preempts caller 106
|
||||||
|
|
||||||
|
4 rtems_task_restart: blocked task -- preempts caller 181
|
||||||
|
rtems_task_restart: ready task -- preempts caller 169
|
||||||
|
rtems_semaphore_release: task readied -- returns to caller 81
|
||||||
|
rtems_task_create 169
|
||||||
|
rtems_task_start 87
|
||||||
|
rtems_task_restart: suspended task -- returns to caller 106
|
||||||
|
rtems_task_delete: suspended task 169
|
||||||
|
rtems_task_restart: ready task -- returns to caller 112
|
||||||
|
rtems_task_restart: blocked task -- returns to caller 150
|
||||||
|
rtems_task_delete: blocked task 175
|
||||||
|
|
||||||
|
5 rtems_task_suspend: calling task 87
|
||||||
|
rtems_task_resume: task readied -- preempts caller 75
|
||||||
|
|
||||||
|
6 rtems_task_restart: calling task 112
|
||||||
|
rtems_task_suspend: returns to caller 56
|
||||||
|
rtems_task_resume: task readied -- returns to caller 50
|
||||||
|
rtems_task_delete: ready task 169
|
||||||
|
|
||||||
|
7 rtems_task_restart: suspended task -- preempts caller 143
|
||||||
|
|
||||||
|
8 rtems_task_set_priority: obtain current priority 37
|
||||||
|
rtems_task_set_priority: returns to caller 75
|
||||||
|
rtems_task_mode: obtain current mode 6
|
||||||
|
rtems_task_mode: no reschedule 6
|
||||||
|
rtems_task_mode: reschedule -- returns to caller 19
|
||||||
|
rtems_task_mode: reschedule -- preempts caller 75
|
||||||
|
rtems_task_set_note 37
|
||||||
|
rtems_task_get_note 37
|
||||||
|
rtems_clock_set 87
|
||||||
|
rtems_clock_get 0
|
||||||
|
|
||||||
|
9 rtems_message_queue_create 225
|
||||||
|
rtems_message_queue_send: no waiting tasks 112
|
||||||
|
rtems_message_queue_urgent: no waiting tasks 112
|
||||||
|
rtems_message_queue_receive: available 87
|
||||||
|
rtems_message_queue_flush: no messages flushed 37
|
||||||
|
rtems_message_queue_flush: messages flushed 50
|
||||||
|
rtems_message_queue_delete 106
|
||||||
|
|
||||||
|
10 rtems_message_queue_receive: not available -- NO_WAIT 44
|
||||||
|
rtems_message_queue_receive: not available -- caller blocks 125
|
||||||
|
|
||||||
|
11 rtems_message_queue_send: task readied -- preempts caller 144
|
||||||
|
|
||||||
|
12 rtems_message_queue_send: task readied -- returns to caller 119
|
||||||
|
|
||||||
|
13 rtems_message_queue_urgent: task readied -- preempts caller 144
|
||||||
|
|
||||||
|
14 rtems_message_queue_urgent: task readied -- returns to caller 119
|
||||||
|
|
||||||
|
15 rtems_event_receive: obtain current events 0
|
||||||
|
rtems_event_receive: not available -- NO_WAIT 25
|
||||||
|
rtems_event_receive: not available -- caller blocks 100
|
||||||
|
rtems_event_send: no task readied 31
|
||||||
|
rtems_event_receive: available 37
|
||||||
|
rtems_event_send: task readied -- returns to caller 69
|
||||||
|
|
||||||
|
16 rtems_event_send: task readied -- preempts caller 100
|
||||||
|
|
||||||
|
17 rtems_task_set_priority: preempts caller 125
|
||||||
|
|
||||||
|
18 rtems_task_delete: calling task 200
|
||||||
|
|
||||||
|
19 rtems_signal_catch 19
|
||||||
|
rtems_signal_send: returns to caller 50
|
||||||
|
rtems_signal_send: signal to self 56
|
||||||
|
exit ASR overhead: returns to calling task 44
|
||||||
|
exit ASR overhead: returns to preempting task 75
|
||||||
|
|
||||||
|
20 rtems_partition_create 81
|
||||||
|
rtems_region_create 75
|
||||||
|
rtems_partition_get_buffer: available 44
|
||||||
|
rtems_partition_get_buffer: not available 44
|
||||||
|
rtems_partition_return_buffer 56
|
||||||
|
rtems_partition_delete 62
|
||||||
|
rtems_region_get_segment: available 56
|
||||||
|
rtems_region_get_segment: not available -- NO_WAIT 56
|
||||||
|
rtems_region_return_segment: no waiting tasks 69
|
||||||
|
rtems_region_get_segment: not available -- caller blocks 144
|
||||||
|
rtems_region_return_segment: task readied -- preempts caller 169
|
||||||
|
rtems_region_return_segment: task readied -- returns to caller 137
|
||||||
|
rtems_region_delete 56
|
||||||
|
rtems_io_initialize 0
|
||||||
|
rtems_io_open 0
|
||||||
|
rtems_io_close 0
|
||||||
|
rtems_io_read 0
|
||||||
|
rtems_io_write 0
|
||||||
|
rtems_io_control 0
|
||||||
|
|
||||||
|
21 rtems_task_ident 375
|
||||||
|
rtems_message_queue_ident 362
|
||||||
|
rtems_semaphore_ident 394
|
||||||
|
rtems_partition_ident 362
|
||||||
|
rtems_region_ident 369
|
||||||
|
rtems_port_ident 362
|
||||||
|
rtems_timer_ident 369
|
||||||
|
rtems_rate_monotonic_ident 362
|
||||||
|
|
||||||
|
22 rtems_message_queue_broadcast: task readied -- returns to caller 131
|
||||||
|
rtems_message_queue_broadcast: no waiting tasks 62
|
||||||
|
rtems_message_queue_broadcast: task readied -- preempts caller 156
|
||||||
|
|
||||||
|
23 rtems_timer_create 31
|
||||||
|
rtems_timer_fire_after: inactive 69
|
||||||
|
rtems_timer_fire_after: active 69
|
||||||
|
rtems_timer_cancel: active 44
|
||||||
|
rtems_timer_cancel: inactive 37
|
||||||
|
rtems_timer_reset: inactive 69
|
||||||
|
rtems_timer_reset: active 69
|
||||||
|
rtems_timer_fire_when: inactive 87
|
||||||
|
rtems_timer_fire_when: active 87
|
||||||
|
rtems_timer_delete: active 56
|
||||||
|
rtems_timer_delete: inactive 50
|
||||||
|
rtems_task_wake_when 125
|
||||||
|
|
||||||
|
24 rtems_task_wake_after: yield -- returns to caller 19
|
||||||
|
rtems_task_wake_after: yields -- preempts caller 69
|
||||||
|
|
||||||
|
25 rtems_clock_tick 19
|
||||||
|
|
||||||
|
26 _ISR_Disable 6
|
||||||
|
_ISR_Flash 6
|
||||||
|
_ISR_Enable 6
|
||||||
|
_Thread_Disable_dispatch 6
|
||||||
|
_Thread_Enable_dispatch 25
|
||||||
|
_Thread_Set_state 31
|
||||||
|
_Thread_Disptach (NO FP) 62
|
||||||
|
context switch: no floating point contexts 50
|
||||||
|
context switch: self 12
|
||||||
|
context switch: to another task 12
|
||||||
|
context switch: restore 1st FP task 56
|
||||||
|
fp context switch: save idle, restore idle 87
|
||||||
|
fp context switch: save idle, restore initialized 75
|
||||||
|
fp context switch: save initialized, restore initialized 75
|
||||||
|
_Thread_Resume 25
|
||||||
|
_Thread_Unblock 25
|
||||||
|
_Thread_Ready 31
|
||||||
|
_Thread_Get 12
|
||||||
|
_Semaphore_Get 6
|
||||||
|
_Thread_Get: invalid id 0
|
||||||
|
|
||||||
|
27 interrupt entry overhead: returns to interrupted task 12
|
||||||
|
interrupt exit overhead: returns to interrupted task 12
|
||||||
|
interrupt entry overhead: returns to nested interrupt 19
|
||||||
|
interrupt exit overhead: returns to nested interrupt 6
|
||||||
|
interrupt entry overhead: returns to preempting task 12
|
||||||
|
interrupt exit overhead: returns to preempting task 81
|
||||||
|
|
||||||
|
28 rtems_port_create 37
|
||||||
|
rtems_port_external_to_internal 31
|
||||||
|
rtems_port_internal_to_external 31
|
||||||
|
rtems_port_delete 56
|
||||||
|
|
||||||
|
29 rtems_rate_monotonic_create 44
|
||||||
|
rtems_rate_monotonic_period: initiate period -- returns to caller 62
|
||||||
|
rtems_rate_monotonic_period: obtain status 37
|
||||||
|
rtems_rate_monotonic_cancel 56
|
||||||
|
rtems_rate_monotonic_delete: inactive 62
|
||||||
|
rtems_rate_monotonic_delete: active 69
|
||||||
|
rtems_rate_monotonic_period: conclude periods -- caller blocks 87
|
||||||
Reference in New Issue
Block a user