The word "RTEMS" almost completely removed from the core.

Configuration Table Template file added and all tests
modified to use this.  All gvar.h and conftbl.h files
removed from test directories.

Configuration parameter maximum_devices added.

Core semaphore and mutex handlers added and RTEMS API Semaphore
Manager updated to reflect this.

Initialization sequence changed to invoke API specific initialization
routines.  Initialization tasks table now owned by RTEMS Tasks Manager.

Added user extension for post-switch.

Utilized user extensions to implement API specific functionality
like signal dispatching.

Added extensions to the System Initialization Thread so that an
API can register a function to be invoked while the system
is being initialized.  These are largely equivalent to the
pre-driver and post-driver hooks.

Added the Modules file oar-go32_p5, modified oar-go32, and modified
the file make/custom/go32.cfg to look at an environment varable which
determines what CPU model is being used.

All BSPs updated to reflect named devices and clock driver's IOCTL
used by the Shared Memory Driver.  Also merged clock isr into
main file and removed ckisr.c where possible.

Updated spsize to reflect new and moved variables.

Makefiles for the executive source and include files updated to show
break down of files into Core, RTEMS API, and Neither.

Header and inline files installed into subdirectory based on whether
logically in the Core or a part of the RTEMS API.
This commit is contained in:
Joel Sherrill
1995-09-11 19:35:39 +00:00
parent 5072b07691
commit 3a4ae6c210
883 changed files with 20949 additions and 11404 deletions

View File

@@ -22,14 +22,43 @@ extern "C" {
#endif
#define CONSOLE_DRIVER_TABLE_ENTRY \
{ console_initialize, NULL, NULL, NULL, NULL, NULL }
{ console_initialize, console_open, console_close, \
console_read, console_write, console_control }
rtems_device_driver console_initialize(
rtems_device_major_number,
rtems_device_minor_number,
void *,
rtems_id,
rtems_unsigned32 *
void *
);
rtems_device_driver console_open(
rtems_device_major_number,
rtems_device_minor_number,
void *
);
rtems_device_driver console_close(
rtems_device_major_number,
rtems_device_minor_number,
void *
);
rtems_device_driver console_read(
rtems_device_major_number,
rtems_device_minor_number,
void *
);
rtems_device_driver console_write(
rtems_device_major_number,
rtems_device_minor_number,
void *
);
rtems_device_driver console_control(
rtems_device_major_number,
rtems_device_minor_number,
void *
);
#ifdef __cplusplus

View File

@@ -66,18 +66,6 @@ extern void Clock_delay(rtems_unsigned32 microseconds);
#define delay( microseconds ) \
Clock_delay(microseconds);
/*
* Todo: this should be put somewhere else
*/
#undef CLOCK_DRIVER_TABLE_ENTRY
#define CLOCK_DRIVER_TABLE_ENTRY { Clock_initialize, NULL, NULL, NULL, NULL, Clock_control }
rtems_device_driver Clock_control(
rtems_device_major_number major,
rtems_device_minor_number minor,
void *pargp
);
/*
* We printf() to a buffer if multiprocessing, *or* if this is set.
* ref: src/lib/libbsp/hppa/simhppa/iosupp/consupp.c
@@ -85,6 +73,10 @@ rtems_device_driver Clock_control(
extern int use_print_buffer;
/*
* Device Driver Table Entries
*/
/*
* When not doing printf to a buffer, we do printf thru RTEMS libio
* and our tty driver. Set it up so that console is right.
@@ -93,6 +85,10 @@ extern int use_print_buffer;
#define CONSOLE_DRIVER_TABLE_ENTRY \
{ tty_initialize, tty_open, tty_close, tty_read, tty_write, tty_control }
/*
* NOTE: Use the standard Clock driver entry
*/
/*
* How many libio files we want
*/

View File

@@ -131,7 +131,7 @@ bsp_libc_init(void)
RTEMS_Malloc_Initialize((void *) heap_start, 64 * 1024, 0);
/*
* Init the RTEMS libio facility to provide UNIX-like system
* 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
*/

View File

@@ -19,33 +19,44 @@
*/
#include <bsp.h>
#include <clockdrv.h>
#include <rtems/libio.h>
#include <stdlib.h>
volatile rtems_unsigned32 Clock_driver_ticks;
#define CLOCK_VECTOR 0x38
rtems_unsigned32 Clock_isrs; /* ISRs until next tick */
volatile rtems_unsigned32 Clock_driver_ticks;
rtems_isr_entry Old_ticker;
rtems_device_driver Clock_initialize(
rtems_device_major_number major,
rtems_device_minor_number minor,
void *pargp,
rtems_id tid,
rtems_unsigned32 *rval
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.
*/
rtems_isr Clock_isr(
rtems_vector_number vector
)
{
Install_clock( Clock_isr );
}
void ReInstall_clock(
rtems_isr_entry clock_isr
)
{
rtems_unsigned32 isrlevel = 0;
rtems_interrupt_disable( isrlevel );
(void) set_vector( clock_isr, 0x38, 1 );
rtems_interrupt_enable( isrlevel );
/* enable_tracing(); */
Clock_driver_ticks += 1;
if ( Clock_isrs == 1 ) {
rtems_clock_tick();
Clock_isrs = BSP_Configuration.microseconds_per_tick / 1000;
}
else
Clock_isrs -= 1;
}
void Install_clock(
@@ -56,7 +67,7 @@ void Install_clock(
Clock_isrs = BSP_Configuration.microseconds_per_tick / 1000;
if ( BSP_Configuration.ticks_per_timeslice ) {
Old_ticker = ( rtems_isr_entry ) set_vector( clock_isr, 0x38, 1 );
Old_ticker = ( rtems_isr_entry ) set_vector( clock_isr, CLOCK_VECTOR, 1 );
outport_byte( TBCR, 0x14 ); /* reset it, delay mode, 50X */
outport_byte( TBDR, 0x50 ); /* 1 millisecond */
outport_byte( IERA, 0x41 ); /* enable interrupt for B */
@@ -64,6 +75,17 @@ void Install_clock(
atexit( Clock_exit );
}
void ReInstall_clock(
rtems_isr_entry clock_isr
)
{
rtems_unsigned32 isrlevel = 0;
rtems_interrupt_disable( isrlevel );
(void) set_vector( clock_isr, CLOCK_VECTOR, 1 );
rtems_interrupt_enable( isrlevel );
}
void Clock_exit( void )
{
if ( BSP_Configuration.ticks_per_timeslice ) {
@@ -73,3 +95,49 @@ void Clock_exit( void )
}
}
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_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(CLOCK_VECTOR);
}
else if (args->command == rtems_build_name('N', 'E', 'W', ' '))
{
ReInstall_clock(args->buffer);
}
done:
return RTEMS_SUCCESSFUL;
}

View File

@@ -14,11 +14,10 @@
#define F386_INIT
#include <stdlib.h>
#include <bsp.h>
#include <rtems/libio.h>
#include <rtems.h>
#include "console.h"
#include "bsp.h"
#include <stdlib.h>
/* console_cleanup
*
@@ -61,18 +60,29 @@ void console_cleanup( void )
rtems_device_driver console_initialize(
rtems_device_major_number major,
rtems_device_minor_number minor,
void *arg,
rtems_id self,
rtems_unsigned32 *status
void *arg
)
{
/*
* flush the console now and at exit. Just in case.
*/
rtems_status_code status;
console_cleanup();
/*
* flush the console now and at exit. Just in case.
*/
atexit( console_cleanup );
console_cleanup();
status = rtems_io_register_name(
"/dev/console",
major,
(rtems_device_minor_number) 0
);
if (status != RTEMS_SUCCESSFUL)
rtems_fatal_error_occurred(status);
atexit( console_cleanup );
return RTEMS_SUCCESSFUL;
}
@@ -172,48 +182,103 @@ void outbyte(
}
/*
* __read -- read bytes from the serial port. Ignore fd, since
* we only have stdin.
* Open entry point
*/
int __read(
int fd,
char *buf,
int nbytes
rtems_device_driver console_open(
rtems_device_major_number major,
rtems_device_minor_number minor,
void * arg
)
{
int i = 0;
for (i = 0; i < nbytes; i++) {
*(buf + i) = inbyte();
if ((*(buf + i) == '\n') || (*(buf + i) == '\r')) {
(*(buf + i++)) = '\n';
(*(buf + i)) = 0;
break;
}
}
return (i);
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;
}
/*
* __write -- write bytes to the serial port. Ignore fd, since
* stdout and stderr are the same. Since we have no filesystem,
* open will only return an error.
* read bytes from the serial port. We only have stdin.
*/
int __write(
int fd,
char *buf,
int nbytes
rtems_device_driver console_read(
rtems_device_major_number major,
rtems_device_minor_number minor,
void * arg
)
{
int i;
for (i = 0; i < nbytes; i++) {
if (*(buf + i) == '\n') {
outbyte ('\r');
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;
}
outbyte (*(buf + i));
}
return (nbytes);
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 ] );
}
return maximum;
}
/*
* IO Control entry point
*/
rtems_device_driver console_control(
rtems_device_major_number major,
rtems_device_minor_number minor,
void * arg
)
{
return RTEMS_SUCCESSFUL;
}

View File

@@ -22,6 +22,8 @@ extern "C" {
#include <rtems.h>
#include <iosupp.h>
#include <console.h>
#include <clockdrv.h>
/*
* Define the time limits for RTEMS Test Suite test durations.
@@ -128,6 +130,24 @@ extern "C" {
#define BSP_EXTERN extern
#endif
/*
* 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
/* miscellaneous stuff assumed to exist */
extern rtems_configuration_table BSP_Configuration;

View File

@@ -20,11 +20,16 @@
* $Id$
*/
#include <rtems.h>
#include <bsp.h>
#include <rtems/libio.h>
#include <libcsupport.h>
#include <fcntl.h>
#ifdef STACK_CHECKER_ON
#include <stackchk.h>
#endif
/*
* The original table from the application and our copy of it with
@@ -36,6 +41,8 @@ rtems_configuration_table BSP_Configuration;
rtems_cpu_table Cpu_table;
char *rtems_progname;
/* Initialize whatever libc we are using
* called from postdriver hook
*/
@@ -51,6 +58,14 @@ void bsp_libc_init()
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.
*/
@@ -70,12 +85,44 @@ void bsp_libc_init()
}
int bsp_start(
/*
* 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;
if ((stdin_fd = __open("/dev/console", O_RDONLY, 0)) == -1)
rtems_fatal_error_occurred('STD0');
if ((stdout_fd = __open("/dev/console", O_WRONLY, 0)) == -1)
rtems_fatal_error_occurred('STD1');
if ((stderr_fd = __open("/dev/console", O_WRONLY, 0)) == -1)
rtems_fatal_error_occurred('STD2');
if ((stdin_fd != 0) || (stdout_fd != 1) || (stderr_fd != 2))
rtems_fatal_error_occurred('STIO');
}
int main(
int argc,
char **argv,
char **environp
)
{
if ((argc > 0) && argv && argv[0])
rtems_progname = argv[0];
else
rtems_progname = "RTEMS";
/*
* FORCE documentation incorrectly states that the bus request
* level is initialized to 3. It is actually initialized by
@@ -92,7 +139,7 @@ int bsp_start(
Cpu_table.predriver_hook = bsp_libc_init; /* RTEMS resources available */
Cpu_table.postdriver_hook = NULL; /* Call our main() for constructors */
Cpu_table.postdriver_hook = bsp_postdriver_hook;
Cpu_table.idle_task = NULL; /* do not override system IDLE task */
@@ -137,6 +184,12 @@ int bsp_start(
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 */
/* no cleanup necessary for Force CPU-386 */

View File

@@ -11,67 +11,81 @@
*/
#include <bsp.h>
#include <clockdrv.h>
#include <rtems/libio.h>
#include <stdlib.h>
volatile rtems_unsigned32 Clock_driver_ticks;
rtems_unsigned32 Clock_isrs_per_tick; /* ISRs per tick */
rtems_unsigned32 Clock_isrs; /* ISRs until next tick */
rtems_unsigned32 Clock_isrs_per_tick; /* ISRs per tick */
rtems_unsigned32 Clock_isrs; /* ISRs until next tick */
rtems_isr_entry Old_ticker;
rtems_device_driver Clock_initialize(
rtems_device_major_number major,
rtems_device_minor_number minor,
void *pargp,
rtems_id tid,
rtems_unsigned32 *rval
#define CLOCK_VECTOR 0x8
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;
rtems_isr Clock_isr(
rtems_vector_number vector
)
{
Install_clock( Clock_isr );
}
/* touch interrupt controller for irq0 (0x20+0) */
outport_byte( 0x20, 0x20 );
void ReInstall_clock(
rtems_isr_entry clock_isr
)
{
rtems_unsigned32 isrlevel = 0;
Clock_driver_ticks += 1;
rtems_interrupt_disable( isrlevel );
(void) set_vector( clock_isr, 0x8, 1 );
rtems_interrupt_enable( isrlevel );
#if 0 && defined(pentium)
{
extern long long Last_RDTSC;
__asm __volatile( ".byte 0x0F, 0x31" : "=A" (Last_RDTSC) );
}
#endif
if ( Clock_isrs == 1 ) {
rtems_clock_tick();
Clock_isrs = Clock_isrs_per_tick;
} else {
Clock_isrs -= 1;
}
}
void Install_clock(
rtems_isr_entry clock_isr
)
{
unsigned int microseconds_per_isr;
unsigned int microseconds_per_isr;
#if 0
/* Initialize clock from on-board real time clock. This breaks the */
/* 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;
extern void init_rtc( void );
extern long rtc_read( rtems_time_of_day * tod );
init_rtc();
if ( rtc_read( &Now ) >= 0 )
clock_set( &Now );
}
rtems_time_of_day Now;
extern void init_rtc( void );
extern long rtc_read( rtems_time_of_day * tod );
init_rtc();
if ( rtc_read( &Now ) >= 0 )
clock_set( &Now );
}
#endif
/* Start by assuming hardware counter is large enough, then */
/* scale it until it actually fits. */
/* Start by assuming hardware counter is large enough, then */
/* scale it until it actually fits. */
Clock_driver_ticks = 0;
Clock_isrs_per_tick = 1;
if ( BSP_Configuration.microseconds_per_tick == 0 )
microseconds_per_isr = 10000; /* default 10 ms */
microseconds_per_isr = 10000; /* default 10 ms */
else
microseconds_per_isr = BSP_Configuration.microseconds_per_tick;
microseconds_per_isr = BSP_Configuration.microseconds_per_tick;
while ( US_TO_TICK(microseconds_per_isr) > 65535 ) {
Clock_isrs_per_tick *= 10;
microseconds_per_isr /= 10;
Clock_isrs_per_tick *= 10;
microseconds_per_isr /= 10;
}
/* Initialize count in ckisr.c */
@@ -83,43 +97,101 @@ void Install_clock(
#endif
if ( BSP_Configuration.ticks_per_timeslice ) {
/* 105/88 approximates TIMER_TICK*1e-6 */
unsigned int count = US_TO_TICK( microseconds_per_isr );
/* 105/88 approximates TIMER_TICK*1e-6 */
unsigned int count = US_TO_TICK( microseconds_per_isr );
Old_ticker = (rtems_isr_entry) set_vector( clock_isr, 0x8, 1 );
outport_byte( TIMER_MODE, TIMER_SEL0|TIMER_16BIT|TIMER_RATEGEN );
outport_byte( TIMER_CNTR0, count >> 0 & 0xff );
outport_byte( TIMER_CNTR0, count >> 8 & 0xff );
Old_ticker = (rtems_isr_entry) set_vector( clock_isr, CLOCK_VECTOR, 1 );
outport_byte( TIMER_MODE, TIMER_SEL0|TIMER_16BIT|TIMER_RATEGEN );
outport_byte( TIMER_CNTR0, count >> 0 & 0xff );
outport_byte( TIMER_CNTR0, count >> 8 & 0xff );
}
atexit( Clock_exit );
}
void ReInstall_clock(
rtems_isr_entry clock_isr
)
{
rtems_unsigned32 isrlevel = 0;
rtems_interrupt_disable( isrlevel );
(void) set_vector( clock_isr, CLOCK_VECTOR, 1 );
rtems_interrupt_enable( isrlevel );
}
void Clock_exit( void )
{
if ( BSP_Configuration.ticks_per_timeslice ) {
extern void rtc_set_dos_date( void );
extern void rtc_set_dos_date( void );
/* reset to DOS value: */
outport_byte( TIMER_MODE, TIMER_SEL0|TIMER_16BIT|TIMER_RATEGEN );
outport_byte( TIMER_CNTR0, 0 );
outport_byte( TIMER_CNTR0, 0 );
/* reset to DOS value: */
outport_byte( TIMER_MODE, TIMER_SEL0|TIMER_16BIT|TIMER_RATEGEN );
outport_byte( TIMER_CNTR0, 0 );
outport_byte( TIMER_CNTR0, 0 );
/* reset time-of-day */
rtc_set_dos_date();
/* re-enable old handler: assume it was one of ours */
set_vector( (rtems_isr_entry)Old_ticker, 0x8, 1 );
/* reset time-of-day */
rtc_set_dos_date();
/* re-enable old handler: assume it was one of ours */
set_vector( (rtems_isr_entry)Old_ticker, CLOCK_VECTOR, 1 );
}
}
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_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(CLOCK_VECTOR);
}
else if (args->command == rtems_build_name('N', 'E', 'W', ' '))
{
ReInstall_clock(args->buffer);
}
done:
return RTEMS_SUCCESSFUL;
}
#if 0 && defined(pentium)
/* This can be used to get extremely accurate timing on a pentium. */
/* It isn't supported. [bryce] */
/* This can be used to get extremely accurate timing on a pentium. */
/* It isn't supported. [bryce] */
#define HZ 90.0
volatile long long Last_RDTSC;
#define RDTSC()\
({ long long _now; __asm __volatile (".byte 0x0F,0x31":"=A"(_now)); _now; })
long long Kernel_Time_ns( void )
{
extern rtems_unsigned32 _TOD_Ticks_per_second;
@@ -128,7 +200,7 @@ long long Kernel_Time_ns( void )
int flags;
disable_intr( flags );
now = 1e9 * Clock_driver_ticks / isrs_per_second
+ (RDTSC() - Last_RDTSC) * (1000.0/HZ);
+ (RDTSC() - Last_RDTSC) * (1000.0/HZ);
enable_intr( flags );
return now;
}

View File

@@ -8,9 +8,8 @@
#include <stdlib.h>
#include <rtems.h>
#include "console.h"
#include "bsp.h"
#include <bsp.h>
#include <rtems/libio.h>
#include <dpmi.h>
#include <go32.h>
@@ -42,40 +41,55 @@ void console_cleanup( void )
* Return values:
*/
/* Set this if console I/O should use go32 (DOS) read/write calls. */
/* Otherwise, direct hardware accesses will be used. */
int _IBMPC_Use_Go32_IO = 0;
/* Set this if console I/O should use go32 (DOS) read/write calls. */
/* Otherwise, direct hardware accesses will be used. */
static rtems_isr_entry old_keyboard_isr = NULL;
extern void _IBMPC_keyboard_isr( rtems_unsigned32 interrupt );
int _IBMPC_Use_Go32_IO = 0;
static rtems_isr_entry old_keyboard_isr = NULL;
extern void _IBMPC_keyboard_isr( rtems_unsigned32 interrupt );
rtems_device_driver console_initialize(
rtems_device_major_number major,
rtems_device_minor_number minor,
void *arg,
rtems_id self,
rtems_unsigned32 *status
void *arg
)
{
if ( _IBMPC_Use_Go32_IO ) {
/* Nothing. We let DOS and go32 do all the work. */
} else {
/* Grap the keyboard interrupt so DOS doesn't steal our */
/* keystrokes. */
rtems_status_code status;
status = rtems_interrupt_catch( _IBMPC_keyboard_isr, 9,
&old_keyboard_isr );
if ( status ) {
int write( int, void *, int );
void exit( int );
char msg[] = "error initializing keyboard\n";
write( 2, msg, sizeof msg - 1 );
exit( 1 );
}
}
rtems_status_code status;
atexit( console_cleanup );
if ( _IBMPC_Use_Go32_IO ) {
/* Nothing. We let DOS and go32 do all the work. */
} else {
/* Grap the keyboard interrupt so DOS doesn't steal our */
/* keystrokes. */
rtems_status_code status;
status =
rtems_interrupt_catch( _IBMPC_keyboard_isr, 9, &old_keyboard_isr );
if ( status ) {
int write( int, void *, int );
void exit( int );
char msg[] = "error initializing keyboard\n";
write( 2, msg, sizeof msg - 1 );
exit( 1 );
}
}
status = rtems_io_register_name(
"/dev/console",
major,
(rtems_device_minor_number) 0
);
if (status != RTEMS_SUCCESSFUL)
rtems_fatal_error_occurred(status);
atexit( console_cleanup );
return RTEMS_SUCCESSFUL;
}
@@ -117,7 +131,7 @@ char inbyte( void )
void outbyte( char ch );
outbyte( ch );
if ( ch == '\r' )
outbyte( '\n' );
outbyte( '\n' );
#endif
return ch;
}
@@ -138,49 +152,104 @@ void outbyte( char ch )
}
/*
* __read -- read bytes from the console. Ignore fd, since
* we only have stdin.
* Open entry point
*/
int __read(
int fd,
char *buf,
int nbytes
rtems_device_driver console_open(
rtems_device_major_number major,
rtems_device_minor_number minor,
void * arg
)
{
int i = 0;
for ( i = 0; i < nbytes; i++ ) {
buf[i] = inbyte();
if ( buf[i] == '\r' ) {
/* What if this goes past the end of the buffer? We're hosed. [bhc] */
buf[i++] = '\n';
buf[i] = '\0';
break;
}
}
return i;
return RTEMS_SUCCESSFUL;
}
/*
* __write -- write bytes to the console. Ignore fd, since
* stdout and stderr are the same. Since we have no filesystem,
* open will only return an error.
* Close entry point
*/
int __write(
int fd,
char *buf,
int nbytes
rtems_device_driver console_close(
rtems_device_major_number major,
rtems_device_minor_number minor,
void * arg
)
{
int i;
for (i = 0; i < nbytes; i++) {
if (*(buf + i) == '\n') {
outbyte ('\r');
}
outbyte (*(buf + i));
}
return (nbytes);
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') {
/* What if this goes past the end of the buffer? We're hosed. [bhc] */
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 ] );
}
return maximum;
}
/*
* IO Control entry point
*/
rtems_device_driver console_control(
rtems_device_major_number major,
rtems_device_minor_number minor,
void * arg
)
{
return RTEMS_SUCCESSFUL;
}

View File

@@ -22,6 +22,8 @@ extern "C" {
#include <rtems.h>
#include <iosupp.h>
#include <console.h>
#include <clockdrv.h>
/*
* Define the time limits for RTEMS Test Suite test durations.
@@ -124,6 +126,24 @@ extern "C" {
#define BSP_EXTERN extern
#endif
/*
* 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 */
int _IBMPC_chrdy( char * ch );
@@ -134,15 +154,6 @@ void _IBMPC_outch( unsigned char );
extern rtems_configuration_table BSP_Configuration;
#if 0
extern i386_IDT_slot Interrupt_descriptor_table[ 256 ];
extern i386_GDT_slot Global_descriptor_table[ 8192 ];
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;
#endif
/* routines */
i386_isr_entry set_vector(

View File

@@ -20,11 +20,18 @@
* $Id$
*/
#include <rtems.h>
#include <bsp.h>
#include <rtems/libio.h>
#include <libcsupport.h>
#include <z8036.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
@@ -36,6 +43,8 @@ rtems_configuration_table BSP_Configuration;
rtems_cpu_table Cpu_table;
char *rtems_progname;
/* Initialize whatever libc we are using
* called from postdriver hook
*/
@@ -56,6 +65,14 @@ void bsp_libc_init()
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.
*/
@@ -74,60 +91,116 @@ void bsp_libc_init()
#endif
}
void bsp_start()
/*
* 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)
{
extern void * sbrk( int );
int stdin_fd, stdout_fd, stderr_fd;
if ((stdin_fd = __open("/dev/console", O_RDONLY, 0)) == -1)
rtems_fatal_error_occurred('STD0');
if ((stdout_fd = __open("/dev/console", O_WRONLY, 0)) == -1)
rtems_fatal_error_occurred('STD1');
if ((stderr_fd = __open("/dev/console", O_WRONLY, 0)) == -1)
rtems_fatal_error_occurred('STD2');
if ((stdin_fd != 0) || (stdout_fd != 1) || (stderr_fd != 2))
rtems_fatal_error_occurred('STIO');
}
Cpu_table.pretasking_hook = NULL;
Cpu_table.predriver_hook = bsp_libc_init; /* RTEMS resources available */
Cpu_table.postdriver_hook = NULL; /* Call our main() for constructors */
Cpu_table.idle_task = NULL; /* do not override system IDLE task */
Cpu_table.do_zero_of_workspace = TRUE;
Cpu_table.interrupt_table_segment = 0;/* get_ds(); */
Cpu_table.interrupt_table_offset = (void *)0;
Cpu_table.interrupt_stack_size = 4096;
Cpu_table.extra_system_initialization_stack = 0;
/* This is the original command line passed from DOS */
char ** Go32_Argv;
/*
* Copy the table
*/
BSP_Configuration = Configuration;
int main(
int argc,
char **argv,
char **environp
)
{
extern void * sbrk( int );
extern volatile void _exit( int );
BSP_Configuration.work_space_start = sbrk( Configuration.work_space_size );
if ( BSP_Configuration.work_space_start == 0 ) {
/* Big trouble */
int write( int, void *, int );
void _exit( int );
char msg[] = "bsp_start() couldn't sbrk() RTEMS work space\n";
write( 2, msg, sizeof msg - 1 );
_exit( 1 );
}
/* Set up arguments that we can access later */
Go32_Argv = argv;
/*
* Add 1 region for Malloc in libc_low
*/
if ((argc > 0) && argv && argv[0])
rtems_progname = argv[0];
else
rtems_progname = "RTEMS";
BSP_Configuration.maximum_regions++;
Cpu_table.pretasking_hook = NULL;
Cpu_table.predriver_hook = bsp_libc_init; /* RTEMS resources available */
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_table_segment = 0;/* get_ds(); */
Cpu_table.interrupt_table_offset = (void *)0;
Cpu_table.interrupt_stack_size = 4096;
Cpu_table.extra_system_initialization_stack = 0;
/*
* Add 1 extension for newlib libc
*/
/*
* Copy the table
*/
BSP_Configuration = Configuration;
BSP_Configuration.work_space_start = sbrk( Configuration.work_space_size );
if ( BSP_Configuration.work_space_start == 0 ) {
/* Big trouble */
int write( int, void *, int );
char msg[] = "bsp_start() couldn't sbrk() RTEMS work space\n";
write( 2, msg, sizeof msg - 1 );
_exit( 1 );
}
/*
* Add 1 region for Malloc in libc_low
*/
BSP_Configuration.maximum_regions++;
/*
* Add 1 extension for newlib libc
*/
#ifdef RTEMS_NEWLIB
BSP_Configuration.maximum_extensions++;
BSP_Configuration.maximum_extensions++;
#endif
/*
* Add another extension if using the stack checker
*/
/*
* Add another extension if using the stack checker
*/
#ifdef STACK_CHECKER_ON
BSP_Configuration.maximum_extensions++;
BSP_Configuration.maximum_extensions++;
#endif
rtems_initialize_executive( &BSP_Configuration, &Cpu_table );
/* does not return */
/*
* Tell libio how many fd's we want and allow it to tweak config
*/
/* no cleanup necessary for GO32 */
rtems_libio_config(&BSP_Configuration, BSP_LIBIO_MAX_FDS);
rtems_initialize_executive( &BSP_Configuration, &Cpu_table );
/* does not return */
/* We only return here if the executive has finished. This happens */
/* when the task has called exit(). */
/* At this point we call _exit() which resides in djgcc. */
for (;;)
_exit( 0 );
/* no cleanup necessary for GO32 */
return 0;
}

View File

@@ -20,32 +20,28 @@
#include <stdlib.h>
#include <rtems.h>
#include <bsp.h>
#include <clockdrv.h>
#include <rtems/libio.h>
#define CLOCK_VECTOR 5
rtems_unsigned32 Clock_isrs; /* ISRs until next tick */
i960_isr_entry Old_ticker;
volatile rtems_unsigned32 Clock_driver_ticks;
/* ticks since initialization */
rtems_device_driver Clock_initialize(
rtems_device_major_number major,
rtems_device_minor_number minor,
void *pargp,
rtems_id id,
rtems_unsigned32 *rval )
{
Install_clock( Clock_isr );
atexit( Clock_exit );
}
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;
void ReInstall_clock(
rtems_isr_entry clock_isr
)
{
(void) set_vector( clock_isr, 5, 1 );
}
/* this is later in the file to avoid it being inlined */
rtems_isr Clock_isr( rtems_vector_number vector );
void Install_clock(
rtems_isr_entry clock_isr
@@ -57,13 +53,20 @@ void Install_clock(
Clock_isrs = BSP_Configuration.microseconds_per_tick / 1000;
if ( BSP_Configuration.ticks_per_timeslice ) {
Old_ticker = set_vector( clock_isr, 5, 1 );
Old_ticker = set_vector( clock_isr, CLOCK_VECTOR, 1 );
victimer = (volatile unsigned char *) 0xa00000c3;
*victimer = 0x12;
*victimer = 0x92; /* 1000 HZ */
}
}
void ReInstall_clock(
rtems_isr_entry clock_isr
)
{
(void) set_vector( clock_isr, CLOCK_VECTOR, 1 );
}
void Clock_exit()
{
unsigned char *victimer;
@@ -75,3 +78,68 @@ void Clock_exit()
/* do not restore old vector */
}
}
rtems_device_driver Clock_initialize(
rtems_device_major_number major,
rtems_device_minor_number minor,
void *pargp
)
{
Install_clock( Clock_isr );
atexit( Clock_exit );
/*
* 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(CLOCK_VECTOR);
}
else if (args->command == rtems_build_name('N', 'E', 'W', ' '))
{
ReInstall_clock(args->buffer);
}
done:
return RTEMS_SUCCESSFUL;
}
rtems_isr Clock_isr(
rtems_vector_number vector
)
{
/* enable_tracing(); */
Clock_driver_ticks += 1;
if ( Clock_isrs == 1 ) {
rtems_clock_tick();
Clock_isrs = BSP_Configuration.microseconds_per_tick / 1000;
}
else
Clock_isrs -= 1;
i960_clear_intr( 5 );
}

View File

@@ -1,5 +1,5 @@
/*
* This file contains the MVME136 console IO package.
* This file contains the CVME961 console IO package.
*
* COPYRIGHT (c) 1989, 1990, 1991, 1992, 1993, 1994.
* On-Line Applications Research Corporation (OAR).
@@ -14,9 +14,8 @@
#define C961_INIT
#include <rtems.h>
#include "console.h"
#include "bsp.h"
#include <bsp.h>
#include <rtems/libio.h>
/* console_initialize
*
@@ -32,12 +31,21 @@
rtems_device_driver console_initialize(
rtems_device_major_number major,
rtems_device_minor_number minor,
void *arg,
rtems_id self,
rtems_unsigned32 *status
void *arg
)
{
*status = RTEMS_SUCCESSFUL;
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;
}
/*
@@ -100,48 +108,103 @@ void outbyte(
}
/*
* __read -- read bytes from the serial port. Ignore fd, since
* we only have stdin.
* Open entry point
*/
int __read(
int fd,
char *buf,
int nbytes
rtems_device_driver console_open(
rtems_device_major_number major,
rtems_device_minor_number minor,
void * arg
)
{
int i = 0;
for (i = 0; i < nbytes; i++) {
*(buf + i) = inbyte();
if ((*(buf + i) == '\n') || (*(buf + i) == '\r')) {
(*(buf + i++)) = '\n';
(*(buf + i)) = 0;
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;
}
}
return (i);
rw_args->bytes_moved = count;
return (count >= 0) ? RTEMS_SUCCESSFUL : RTEMS_UNSATISFIED;
}
/*
* __write -- write bytes to the serial port. Ignore fd, since
* stdout and stderr are the same. Since we have no filesystem,
* open will only return an error.
* write bytes to the serial port. Stdout and stderr are the same.
*/
int __write(
int fd,
char *buf,
int nbytes
rtems_device_driver console_write(
rtems_device_major_number major,
rtems_device_minor_number minor,
void * arg
)
{
int i;
for (i = 0; i < nbytes; i++) {
if (*(buf + i) == '\n') {
outbyte ('\r');
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 (*(buf + i));
outbyte( buffer[ count ] );
}
return (nbytes);
return maximum;
}
/*
* IO Control entry point
*/
rtems_device_driver console_control(
rtems_device_major_number major,
rtems_device_minor_number minor,
void * arg
)
{
return RTEMS_SUCCESSFUL;
}

View File

@@ -24,6 +24,8 @@ extern "C" {
#include <rtems.h>
#include <iosupp.h>
#include <console.h>
#include <clockdrv.h>
/*
* Define the time limits for RTEMS Test Suite test durations.
@@ -115,6 +117,24 @@ extern rtems_configuration_table BSP_Configuration;
BSP_EXTERN i960ca_PRCB *Prcb;
BSP_EXTERN i960ca_control_table *Ctl_tbl;
/*
* 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 );

View File

@@ -20,12 +20,17 @@
* $Id$
*/
#include <rtems.h>
#include <bsp.h>
#include "libcsupport.h"
#include "stackchk.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
@@ -38,6 +43,8 @@ rtems_configuration_table BSP_Configuration;
rtems_cpu_table Cpu_table;
char *rtems_progname;
/* Initialize whatever libc we are using
* called from postdriver hook
*/
@@ -53,6 +60,14 @@ void bsp_libc_init()
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.
*/
@@ -70,12 +85,43 @@ void bsp_libc_init()
#endif
}
int bsp_start(
/*
* 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;
if ((stdin_fd = __open("/dev/console", O_RDONLY, 0)) == -1)
rtems_fatal_error_occurred('STD0');
if ((stdout_fd = __open("/dev/console", O_WRONLY, 0)) == -1)
rtems_fatal_error_occurred('STD1');
if ((stderr_fd = __open("/dev/console", O_WRONLY, 0)) == -1)
rtems_fatal_error_occurred('STD2');
if ((stdin_fd != 0) || (stdout_fd != 1) || (stderr_fd != 2))
rtems_fatal_error_occurred('STIO');
}
int main(
int argc,
char **argv,
char **environp
)
{
if ((argc > 0) && argv && argv[0])
rtems_progname = argv[0];
else
rtems_progname = "RTEMS";
/* set node number in SQSIO4 CTL REG */
*((rtems_unsigned32 *)0xc00000b0) =
@@ -110,7 +156,7 @@ int bsp_start(
Cpu_table.predriver_hook = bsp_libc_init; /* RTEMS resources available */
Cpu_table.postdriver_hook = NULL; /* Call our main() for constructors */
Cpu_table.postdriver_hook = bsp_postdriver_hook;
Cpu_table.idle_task = NULL; /* do not override system IDLE task */
@@ -150,6 +196,12 @@ int bsp_start(
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);
BSP_Configuration.work_space_start = (void *)
(RAM_END - BSP_Configuration.work_space_size);

View File

@@ -19,36 +19,46 @@
*/
#include <stdlib.h>
#include <rtems.h>
#include <bsp.h>
#include <clockdrv.h>
#include <rtems/libio.h>
rtems_unsigned32 Clock_isrs; /* ISRs until next tick */
volatile rtems_unsigned32 Clock_driver_ticks;
/* ticks since initialization */
rtems_isr_entry Old_ticker;
rtems_device_driver Clock_initialize(
rtems_device_major_number major,
rtems_device_minor_number minor,
void *pargp,
rtems_id tid,
rtems_unsigned32 *rval
void Clock_exit( void );
#define CLOCK_VECTOR TIMER_VECTOR
/*
* 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
)
{
Install_clock( Clock_isr );
}
Clock_driver_ticks += 1;
void ReInstall_clock(
rtems_isr_entry clock_isr
)
{
rtems_unsigned32 isrlevel = 0 ;
Z8x36_WRITE( TIMER, CT1_CMD_STATUS, 0xE2 );
Z8x36_WRITE( TIMER, CT1_CMD_STATUS, 0x22 );
Z8x36_WRITE( TIMER, CT1_CMD_STATUS, 0xC6 );
rtems_interrupt_disable( isrlevel );
(void) set_vector( clock_isr, TIMER_VECTOR, 1 );
rtems_interrupt_enable( isrlevel );
if ( Clock_isrs == 1 ) {
rtems_clock_tick();
Clock_isrs = BSP_Configuration.microseconds_per_tick / 1000;
}
else
Clock_isrs -= 1;
}
void Install_clock(
@@ -61,7 +71,7 @@ void Install_clock(
Clock_isrs = BSP_Configuration.microseconds_per_tick / 1000;
if ( BSP_Configuration.ticks_per_timeslice ) {
Old_ticker = (rtems_isr_entry) set_vector( clock_isr, TIMER_VECTOR, 1 );
Old_ticker = (rtems_isr_entry) set_vector( clock_isr, CLOCK_VECTOR, 1 );
Z8x36_WRITE( TIMER, MASTER_CFG, 0xd4 );
Z8x36_READ ( TIMER, MASTER_INTR, data );
@@ -69,7 +79,7 @@ void Install_clock(
Z8x36_WRITE( TIMER, CT1_TIME_CONST_MSB, 0x04 );
Z8x36_WRITE( TIMER, CT1_TIME_CONST_LSB, 0xCE );
Z8x36_WRITE( TIMER, CT1_MODE_SPEC, 0x83 );
Z8x36_WRITE( TIMER, CNT_TMR_VECTOR, TIMER_VECTOR );
Z8x36_WRITE( TIMER, CNT_TMR_VECTOR, CLOCK_VECTOR );
Z8x36_WRITE( TIMER, CT1_CMD_STATUS, 0x20 );
Z8x36_READ ( TIMER, MASTER_INTR, data );
Z8x36_WRITE( TIMER, MASTER_INTR, (data & 0xDA) | 0x80 );
@@ -87,6 +97,17 @@ void Install_clock(
}
}
void ReInstall_clock(
rtems_isr_entry clock_isr
)
{
rtems_unsigned32 isrlevel = 0 ;
rtems_interrupt_disable( isrlevel );
(void) set_vector( clock_isr, CLOCK_VECTOR, 1 );
rtems_interrupt_enable( isrlevel );
}
void Clock_exit( void )
{
rtems_unsigned8 data;
@@ -99,3 +120,51 @@ void Clock_exit( void )
}
}
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_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(CLOCK_VECTOR);
}
else if (args->command == rtems_build_name('N', 'E', 'W', ' '))
{
ReInstall_clock(args->buffer);
}
done:
return RTEMS_SUCCESSFUL;
}

View File

@@ -14,10 +14,9 @@
#define D152_INIT
#include <rtems.h>
#include "console.h"
#include "bsp.h"
#include <bsp.h>
#include <rtems/libio.h>
/* console_initialize
*
* This routine initializes the console IO driver.
@@ -28,19 +27,27 @@
*
* Return values:
*/
rtems_device_driver console_initialize(
rtems_device_major_number major,
rtems_device_minor_number minor,
void *arg,
rtems_id self,
rtems_unsigned32 *status
void *arg
)
{
*status = RTEMS_SUCCESSFUL;
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.
@@ -139,48 +146,102 @@ void outbyte(
}
/*
* __read -- read bytes from the serial port. Ignore fd, since
* we only have stdin.
* Open entry point
*/
int __read(
int fd,
char *buf,
int nbytes
rtems_device_driver console_open(
rtems_device_major_number major,
rtems_device_minor_number minor,
void * arg
)
{
int i = 0;
return RTEMS_SUCCESSFUL;
}
/*
* Close entry point
*/
for (i = 0; i < nbytes; i++) {
*(buf + i) = inbyte();
if ((*(buf + i) == '\n') || (*(buf + i) == '\r')) {
(*(buf + i++)) = '\n';
(*(buf + i)) = 0;
break;
}
}
return (i);
rtems_device_driver console_close(
rtems_device_major_number major,
rtems_device_minor_number minor,
void * arg
)
{
return RTEMS_SUCCESSFUL;
}
/*
* __write -- write bytes to the serial port. Ignore fd, since
* stdout and stderr are the same. Since we have no filesystem,
* open will only return an error.
* read bytes from the serial port. We only have stdin.
*/
int __write(
int fd,
char *buf,
int nbytes
rtems_device_driver console_read(
rtems_device_major_number major,
rtems_device_minor_number minor,
void * arg
)
{
int i;
rtems_libio_rw_args_t *rw_args;
char *buffer;
int maximum;
int count = 0;
rw_args = (rtems_libio_rw_args_t *) arg;
for (i = 0; i < nbytes; i++) {
if (*(buf + i) == '\n') {
outbyte ('\r');
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;
}
outbyte (*(buf + i));
}
return (nbytes);
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 ] );
}
return maximum;
}
/*
* IO Control entry point
*/
rtems_device_driver console_control(
rtems_device_major_number major,
rtems_device_minor_number minor,
void * arg
)
{
return RTEMS_SUCCESSFUL;
}

View File

@@ -21,7 +21,10 @@ extern "C" {
#endif
#include <rtems.h>
#include <console.h>
#include <clockdrv.h>
#include <iosupp.h>
#include <vmeintr.h>
#include <z8530.h>
#include <z8536.h>
@@ -151,6 +154,24 @@ 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 );

View File

@@ -21,11 +21,17 @@
* $Id$
*/
#include <rtems.h>
#include <bsp.h>
#include <rtems/libio.h>
#include <libcsupport.h>
#include <vmeintr.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.
@@ -36,6 +42,8 @@ rtems_configuration_table BSP_Configuration;
rtems_cpu_table Cpu_table;
char *rtems_progname;
/* Initialize whatever libc we are using
* called from postdriver hook
*/
@@ -51,6 +59,14 @@ void bsp_libc_init()
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.
*/
@@ -69,7 +85,33 @@ void bsp_libc_init()
#endif
}
int bsp_start(
/*
* 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;
if ((stdin_fd = __open("/dev/console", O_RDONLY, 0)) == -1)
rtems_fatal_error_occurred('STD0');
if ((stdout_fd = __open("/dev/console", O_WRONLY, 0)) == -1)
rtems_fatal_error_occurred('STD1');
if ((stderr_fd = __open("/dev/console", O_WRONLY, 0)) == -1)
rtems_fatal_error_occurred('STD2');
if ((stdin_fd != 0) || (stdout_fd != 1) || (stderr_fd != 2))
rtems_fatal_error_occurred('STIO');
}
int main(
int argc,
char **argv,
char **environp
@@ -79,6 +121,11 @@ int bsp_start(
int index;
void *vbr;
if ((argc > 0) && argv && argv[0])
rtems_progname = argv[0];
else
rtems_progname = "RTEMS";
monitors_vector_table = (m68k_isr_entry *)0; /* Monitor Vectors are at 0 */
m68k_set_vbr( monitors_vector_table );
@@ -115,7 +162,7 @@ int bsp_start(
Cpu_table.predriver_hook = bsp_libc_init; /* RTEMS resources available */
Cpu_table.postdriver_hook = NULL; /* Call our main() for constructors */
Cpu_table.postdriver_hook = bsp_postdriver_hook;
Cpu_table.idle_task = NULL; /* do not override system IDLE task */
@@ -159,6 +206,12 @@ int bsp_start(
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 */

View File

@@ -20,11 +20,12 @@
#include <stdlib.h> /* for atexit() */
#include <rtems.h>
#include <bsp.h>
#include <clockdrv.h>
#include <rtems/libio.h>
#include "m68302.h"
#define CLOCK_VECTOR 137
#define TMR1_VAL ( RBIT_TMR_RST /* software reset the timer */\
| RBIT_TMR_ICLK_MASTER16 /* master clock divided by 16 */\
@@ -49,18 +50,35 @@ volatile rtems_unsigned32 Clock_driver_ticks;
*/
rtems_unsigned32 Clock_isrs;
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;
rtems_device_driver Clock_initialize(
rtems_device_major_number major,
rtems_device_minor_number minor,
void *pargp,
rtems_id tid,
rtems_unsigned32 *rval
/*
* ISR Handler
*/
rtems_isr Clock_isr(
rtems_vector_number vector
)
{
Install_clock( Clock_isr );
}
Clock_driver_ticks += 1;
m302.reg.isr = RBIT_ISR_TIMER1; /* clear in-service bit */
m302.reg.ter1 = (RBIT_TER_REF | RBIT_TER_CAP); /* clear timer intr request */
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
@@ -71,7 +89,7 @@ void Install_clock(
Clock_isrs = BSP_Configuration.microseconds_per_tick / 1000;
if ( BSP_Configuration.ticks_per_timeslice ) {
/* set_vector( clock_isr, 137, 1 );*/
/* set_vector( clock_isr, CLOCK_VECTOR, 1 );*/
m302.reg.trr1 = TRR1_VAL; /* set timer reference register */
m302.reg.tmr1 = TMR1_VAL; /* set timer mode register & enable */
@@ -84,6 +102,16 @@ void Install_clock(
}
}
void ReInstall_clock(
rtems_isr_entry clock_isr
)
{
rtems_unsigned32 isrlevel;
rtems_interrupt_disable( isrlevel );
/* (void) set_vector( clock_isr, CLOCK_VECTOR, 1 ); */
rtems_interrupt_enable( isrlevel );
}
void Clock_exit( void )
{
@@ -92,3 +120,51 @@ void Clock_exit( void )
/* do not restore old vector */
}
}
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_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( CLOCK_VECTOR);
}
else if (args->command == rtems_build_name('N', 'E', 'W', ' '))
{
ReInstall_clock(args->buffer);
}
done:
return RTEMS_SUCCESSFUL;
}

View File

@@ -14,9 +14,8 @@
#define GEN68302_INIT
#include <rtems.h>
#include "console.h"
#include <bsp.h>
#include <rtems/libio.h>
#include "m68302.h"
@@ -34,11 +33,10 @@
rtems_device_driver console_initialize(
rtems_device_major_number major,
rtems_device_minor_number minor,
void *arg,
rtems_id self,
rtems_unsigned32 *status
void *arg
)
{
rtems_status_code status;
volatile m302_dualPortRAM_t *p = &m302;
p->reg.pacnt |= 0x0003; /* enable RXD2 and TXD2 signals */
@@ -81,9 +79,18 @@ rtems_device_driver console_initialize(
p->reg.scc[1].sccm = 0x03; /* enable only Tx & Rx interrupts */
p->reg.scc[1].scm = 0x01BD;
*status = RTEMS_SUCCESSFUL;
}
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
*
@@ -194,48 +201,102 @@ void outbyte(
}
/*
* __read -- read bytes from the serial port. Ignore fd, since
* we only have stdin.
* Open entry point
*/
int __read(
int fd,
char *buf,
int nbytes
rtems_device_driver console_open(
rtems_device_major_number major,
rtems_device_minor_number minor,
void * arg
)
{
int i = 0;
return RTEMS_SUCCESSFUL;
}
/*
* Close entry point
*/
for (i = 0; i < nbytes; i++) {
*(buf + i) = inbyte();
if ((*(buf + i) == '\n') || (*(buf + i) == '\r')) {
(*(buf + i++)) = '\n';
(*(buf + i)) = 0;
break;
}
}
return (i);
rtems_device_driver console_close(
rtems_device_major_number major,
rtems_device_minor_number minor,
void * arg
)
{
return RTEMS_SUCCESSFUL;
}
/*
* __write -- write bytes to the serial port. Ignore fd, since
* stdout and stderr are the same. Since we have no filesystem,
* open will only return an error.
* read bytes from the serial port. We only have stdin.
*/
int __write(
int fd,
char *buf,
int nbytes
rtems_device_driver console_read(
rtems_device_major_number major,
rtems_device_minor_number minor,
void * arg
)
{
int i;
rtems_libio_rw_args_t *rw_args;
char *buffer;
int maximum;
int count = 0;
rw_args = (rtems_libio_rw_args_t *) arg;
for (i = 0; i < nbytes; i++) {
if (*(buf + i) == '\n') {
outbyte ('\r');
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;
}
outbyte (*(buf + i));
}
return (nbytes);
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 ] );
}
return maximum;
}
/*
* IO Control entry point
*/
rtems_device_driver console_control(
rtems_device_major_number major,
rtems_device_minor_number minor,
void * arg
)
{
return RTEMS_SUCCESSFUL;
}

View File

@@ -23,7 +23,9 @@ extern "C" {
#endif
#include <rtems.h>
#include <console.h>
#include <iosupp.h>
#include <clockdrv.h>
/*
* Define the time limits for RTEMS Test Suite test durations.
@@ -81,6 +83,24 @@ extern "C" {
#define EXTERN extern
#endif
/*
* 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
/* miscellaneous stuff assumed to exist */
extern rtems_configuration_table BSP_Configuration;

View File

@@ -227,7 +227,10 @@ loop: movel d0,a1@+ | to zero out uninitialized
movec a0,isp | set interrupt stack
#endif
jsr SYM (bsp_start)
move.l #0,a7@- | environp
move.l #0,a7@- | argv
move.l #0,a7@- | argc
jsr SYM (main)
nop
Bad: bra Bad

View File

@@ -227,7 +227,10 @@ loop: movel d0,a1@+ | to zero out uninitialized
movec a0,isp | set interrupt stack
#endif
jsr SYM (bsp_start)
move.l #0,a7@- | environp
move.l #0,a7@- | argv
move.l #0,a7@- | argc
jsr SYM (main)
nop
Bad: bra Bad

View File

@@ -20,10 +20,17 @@
* $Id$
*/
#include <rtems.h>
#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
@@ -35,6 +42,8 @@ rtems_configuration_table BSP_Configuration;
rtems_cpu_table Cpu_table;
char *rtems_progname;
/* Initialize whatever libc we are using
* called from postdriver hook
*/
@@ -57,6 +66,14 @@ void bsp_libc_init()
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.
*/
@@ -75,13 +92,43 @@ void bsp_libc_init()
#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;
if ((stdin_fd = __open("/dev/console", O_RDONLY, 0)) == -1)
rtems_fatal_error_occurred('STD0');
if ((stdout_fd = __open("/dev/console", O_WRONLY, 0)) == -1)
rtems_fatal_error_occurred('STD1');
if ((stderr_fd = __open("/dev/console", O_WRONLY, 0)) == -1)
rtems_fatal_error_occurred('STD2');
if ((stdin_fd != 0) || (stdout_fd != 1) || (stderr_fd != 2))
rtems_fatal_error_occurred('STIO');
}
int bsp_start(
int main(
int argc,
char **argv,
char **environp
)
{
if ((argc > 0) && argv && argv[0])
rtems_progname = argv[0];
else
rtems_progname = "RTEMS";
/*
* Allocate the memory for the RTEMS Work Space. This can come from
* a variety of places: hard coded address, malloc'ed from outside
@@ -90,7 +137,7 @@ int bsp_start(
* of work space from the last physical address on the CPU board.
*/
#if 0
a Cpu_table.interrupt_vector_table = (mc68000_isr *) 0/*&M68Kvec*/;
Cpu_table.interrupt_vector_table = (mc68000_isr *) 0/*&M68Kvec*/;
#endif
@@ -122,6 +169,12 @@ a Cpu_table.interrupt_vector_table = (mc68000_isr *) 0/*&M68Kvec*/;
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);
/*
* Need to "allocate" the memory for the RTEMS Workspace and
* tell the RTEMS configuration where it is. This memory is
@@ -143,7 +196,7 @@ a Cpu_table.interrupt_vector_table = (mc68000_isr *) 0/*&M68Kvec*/;
Cpu_table.predriver_hook = bsp_libc_init; /* RTEMS resources available */
Cpu_table.postdriver_hook = NULL;
Cpu_table.postdriver_hook = bsp_postdriver_hook;
Cpu_table.idle_task = NULL; /* do not override system IDLE task */

View File

@@ -26,9 +26,8 @@
#include <stdlib.h>
#include <rtems.h>
#include <clockdrv.h>
#include <bsp.h>
#include <rtems/libio.h>
rtems_unsigned32 Clock_isrs; /* ISRs until next tick */
volatile rtems_unsigned32 Clock_driver_ticks;
@@ -39,30 +38,53 @@ extern rtems_configuration_table Configuration;
extern void led_putnum();
void Disable_clock();
#define TIMER_VECTOR 0x4D
#define CLOCK_VECTOR 0x4D
rtems_device_driver Clock_initialize(
rtems_device_major_number major,
rtems_device_minor_number minor,
void *pargp,
rtems_id tid,
rtems_unsigned32 *rval
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
*
*
* ((1ms * 6.5 MHz) / 2^5) = 203.125) where 6.5 MHz is the clock rate of the
* MC68230, 2^5 is the prescaler factor, and 1ms is the common interrupt
* interval for the Clock_isr routine.
* Therefore, 203 (decimal) is the number to program into the CPRH-L registers
* of the MC68230 for countdown. However, I have found that 193 instead of
* 203 provides greater accuracy -- why? The crystal should be more accurate
* than that
*/
rtems_isr Clock_isr(
rtems_vector_number vector
)
{
Install_clock( Clock_isr );
Clock_driver_ticks += 1;
/* acknowledge interrupt
TSR = 1; */
MC68230_WRITE (TSR, 1);
if ( Clock_isrs == 1 ) {
rtems_clock_tick();
/* Cast to an integer so that 68EC040 IDP which doesn't have an FPU doesn't
have a heart attack -- if you use newlib1.6 or greater and get
libgcc.a for gcc with software floating point support, this is not
a problem */
Clock_isrs =
(int)(BSP_Configuration.microseconds_per_tick / 1000);
}
else
Clock_isrs -= 1;
}
void ReInstall_clock( clock_isr )
rtems_isr_entry clock_isr;
{
rtems_unsigned32 isrlevel = 0 ;
rtems_interrupt_disable( isrlevel );
(void) set_vector( clock_isr, TIMER_VECTOR, 1 );
rtems_interrupt_enable( isrlevel );
}
/* The following was added for debugging purposes */
void Disable_clock()
{
/* Disable timer */
@@ -77,7 +99,7 @@ rtems_isr_entry clock_isr;
if ( Configuration.ticks_per_timeslice ) {
/* led_putnum('c'); * for debugging purposes */
Old_ticker = (rtems_isr_entry) set_vector( clock_isr, TIMER_VECTOR, 1 );
Old_ticker = (rtems_isr_entry) set_vector( clock_isr, CLOCK_VECTOR, 1 );
/* Disable timer for initialization */
MC68230_WRITE (TCR, 0x00);
@@ -85,8 +107,8 @@ rtems_isr_entry clock_isr;
/* some PI/T initialization stuff here -- see comment in the ckisr.c
file in this directory to understand why I use the values that I do */
/* Set up the interrupt vector on the MC68230 chip:
TIVR = TIMER_VECTOR; */
MC68230_WRITE (TIVR, TIMER_VECTOR);
TIVR = CLOCK_VECTOR; */
MC68230_WRITE (TIVR, CLOCK_VECTOR);
/* Set CPRH through CPRL to 193 (not 203) decimal for countdown--see ckisr.c
CPRH = 0x00;
@@ -108,6 +130,17 @@ rtems_isr_entry clock_isr;
}
}
void ReInstall_clock( clock_isr )
rtems_isr_entry clock_isr;
{
rtems_unsigned32 isrlevel = 0 ;
rtems_interrupt_disable( isrlevel );
(void) set_vector( clock_isr, CLOCK_VECTOR, 1 );
rtems_interrupt_enable( isrlevel );
}
/* The following was added for debugging purposes */
void Clock_exit( void )
{
rtems_unsigned8 data;
@@ -123,3 +156,51 @@ void Clock_exit( void )
/* do not restore old vector */
}
}
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_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(CLOCK_VECTOR);
}
else if (args->command == rtems_build_name('N', 'E', 'W', ' '))
{
ReInstall_clock(args->buffer);
}
done:
return RTEMS_SUCCESSFUL;
}

View File

@@ -11,17 +11,15 @@
#define MIDP_INIT
#include "rtems.h"
#include "console.h"
#include "bsp.h"
#include <bsp.h>
#include <rtems/libio.h>
#include "ringbuf.h"
#include <ringbuf.h>
Ring_buffer_t Buffer[ 2 ];
rtems_isr C_Receive_ISR(rtems_vector_number vector);
/* console_initialize
*
* This routine initializes the console IO driver.
@@ -36,18 +34,44 @@ rtems_isr C_Receive_ISR(rtems_vector_number vector);
rtems_device_driver console_initialize(
rtems_device_major_number major,
rtems_device_minor_number minor,
void *arg,
rtems_id self,
rtems_unsigned32 *status
void *arg
)
{
rtems_status_code status;
Ring_buffer_Initialize( &Buffer[ 0 ] );
Ring_buffer_Initialize( &Buffer[ 1 ] );
init_pit();
*status = RTEMS_SUCCESSFUL;
status = rtems_io_register_name(
"/dev/console",
major,
(rtems_device_minor_number) 0
);
if (status != RTEMS_SUCCESSFUL)
rtems_fatal_error_occurred(status);
status = rtems_io_register_name(
"/dev/tty00",
major,
(rtems_device_minor_number) 0
);
if (status != RTEMS_SUCCESSFUL)
rtems_fatal_error_occurred(status);
status = rtems_io_register_name(
"/dev/tty01",
major,
(rtems_device_minor_number) 1
);
if (status != RTEMS_SUCCESSFUL)
rtems_fatal_error_occurred(status);
return RTEMS_SUCCESSFUL;
}
@@ -151,66 +175,108 @@ void outbyte(
}
/*
* __read -- read bytes from the serial port. Ignore fd, since
* we only have stdin.
* Open entry point
*/
int __read(
int fd,
char *buf,
int nbytes
rtems_device_driver console_open(
rtems_device_major_number major,
rtems_device_minor_number minor,
void * arg
)
{
int i = 0;
int port;
return RTEMS_SUCCESSFUL;
}
/*
* Close entry point
*/
/*
* Map port A to stdin, stdout, and stderr.
* Map everything else to port B.
*/
if ( fd <= 2 ) port = 0;
else port = 1;
for (i = 0; i < nbytes; i++) {
*(buf + i) = inbyte( port );
if ((*(buf + i) == '\n') || (*(buf + i) == '\r')) {
(*(buf + i++)) = '\n';
(*(buf + i)) = 0;
break;
}
}
return (i);
rtems_device_driver console_close(
rtems_device_major_number major,
rtems_device_minor_number minor,
void * arg
)
{
return RTEMS_SUCCESSFUL;
}
/*
* __write -- write bytes to the serial port. Ignore fd, since
* stdout and stderr are the same. Since we have no filesystem,
* open will only return an error.
* read bytes from the serial port. We only have stdin.
*/
int __write(
int fd,
char *buf,
int nbytes
rtems_device_driver console_read(
rtems_device_major_number major,
rtems_device_minor_number minor,
void * arg
)
{
int i;
int port;
rtems_libio_rw_args_t *rw_args;
char *buffer;
int maximum;
int count = 0;
/*
* Map port A to stdin, stdout, and stderr.
* Map everything else to port B.
*/
if ( fd <= 2 ) port = 0;
else port = 1;
for (i = 0; i < nbytes; i++) {
if (*(buf + i) == '\n') {
outbyte ('\r', port );
rw_args = (rtems_libio_rw_args_t *) arg;
buffer = rw_args->buffer;
maximum = rw_args->count;
if ( minor > 1 )
return RTEMS_INVALID_NUMBER;
for (count = 0; count < maximum; count++) {
buffer[ count ] = inbyte( minor );
if (buffer[ count ] == '\n' || buffer[ count ] == '\r') {
buffer[ count++ ] = '\n';
buffer[ count ] = 0;
break;
}
outbyte (*(buf + i), port );
}
return (nbytes);
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;
if ( minor > 1 )
return RTEMS_INVALID_NUMBER;
for (count = 0; count < maximum; count++) {
if ( buffer[ count ] == '\n') {
outbyte('\r', minor );
}
outbyte( buffer[ count ], minor );
}
return maximum;
}
/*
* IO Control entry point
*/
rtems_device_driver console_control(
rtems_device_major_number major,
rtems_device_minor_number minor,
void * arg
)
{
return RTEMS_SUCCESSFUL;
}

View File

@@ -10,6 +10,7 @@
#include <rtems.h>
#include <console.h>
#include <clockdrv.h>
#include <mc68230.h>
#include <mc68681.h>
@@ -52,6 +53,24 @@
#define EXTERN extern
#endif
/*
* 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
/* miscellaneous stuff assumed to exist */
extern rtems_configuration_table BSP_Configuration;

View File

@@ -20,9 +20,17 @@
* $Id$
*/
#include <rtems.h>
#include <bsp.h>
#include <rtems/libio.h>
#include <libcsupport.h>
#include <string.h>
#include <fcntl.h>
#ifdef STACK_CHECKER_ON
#include <stackchk.h>
#endif
unsigned char *duart_base;
extern struct duart_regs duart_info;
@@ -41,6 +49,8 @@ rtems_configuration_table BSP_Configuration;
rtems_cpu_table Cpu_table;
char *rtems_progname;
/* Initialize whatever libc we are using
* called from postdriver hook
*/
@@ -56,6 +66,14 @@ void bsp_libc_init()
/* Create 64 KByte memory region for RTEMS executive */
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.
@@ -76,7 +94,33 @@ void bsp_libc_init()
}
int bsp_start(
/*
* 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;
if ((stdin_fd = __open("/dev/console", O_RDONLY, 0)) == -1)
rtems_fatal_error_occurred('STD0');
if ((stdout_fd = __open("/dev/console", O_WRONLY, 0)) == -1)
rtems_fatal_error_occurred('STD1');
if ((stderr_fd = __open("/dev/console", O_WRONLY, 0)) == -1)
rtems_fatal_error_occurred('STD2');
if ((stdin_fd != 0) || (stdout_fd != 1) || (stderr_fd != 2))
rtems_fatal_error_occurred('STIO');
}
int main(
int argc,
char **argv,
char **environp
@@ -85,6 +129,11 @@ int bsp_start(
m68k_isr_entry *monitors_vector_table;
int index;
if ((argc > 0) && argv && argv[0])
rtems_progname = argv[0];
else
rtems_progname = "RTEMS";
duart_base = (unsigned char *)DUART_ADDR;
/*
@@ -121,7 +170,7 @@ int bsp_start(
Cpu_table.predriver_hook = bsp_libc_init; /* RTEMS resources available */
Cpu_table.postdriver_hook = NULL;
Cpu_table.postdriver_hook = bsp_postdriver_hook;
Cpu_table.idle_task = NULL; /* do not override system IDLE task */
@@ -164,6 +213,12 @@ int bsp_start(
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);
/* led_putnum('e'); * for debugging purposes only */
rtems_initialize_executive( &BSP_Configuration, &Cpu_table );/* does not return */

View File

@@ -20,9 +20,8 @@
#include <stdlib.h>
#include <rtems.h>
#include <bsp.h>
#include <clockdrv.h>
#include <rtems/libio.h>
#include <z8036.h>
#define MICRVAL 0xe2 /* disable lower chain, no vec */
@@ -35,31 +34,43 @@
#define T1CSRVAL 0xc6 /* enable interrupt, allow and */
/* and trigger countdown */
#define TIMER 0xfffb0000
#define RELOAD 0x24 /* clr IP & IUS,allow countdown */
#define CLOCK_VECTOR 66
rtems_unsigned32 Clock_isrs; /* ISRs until next tick */
volatile rtems_unsigned32 Clock_driver_ticks;
/* ticks since initialization */
volatile rtems_unsigned32 Clock_driver_ticks; /* ticks since initialization */
rtems_isr_entry Old_ticker;
rtems_device_driver Clock_initialize(
rtems_device_major_number major,
rtems_device_minor_number minor,
void *pargp,
rtems_id tid,
rtems_unsigned32 *rval
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
)
{
Install_clock( Clock_isr );
}
Clock_driver_ticks += 1;
((volatile struct z8036_map *) TIMER)->CT1_CMD_STATUS = RELOAD;
void ReInstall_clock(
rtems_isr_entry clock_isr
)
{
rtems_unsigned32 isrlevel;
rtems_interrupt_disable( isrlevel );
(void) set_vector( clock_isr, 66, 1 );
rtems_interrupt_enable( isrlevel );
if ( Clock_isrs == 1 ) {
rtems_clock_tick();
Clock_isrs = BSP_Configuration.microseconds_per_tick / 1000;
}
else
Clock_isrs -= 1;
}
void Install_clock(
@@ -72,30 +83,42 @@ void Install_clock(
Clock_isrs = BSP_Configuration.microseconds_per_tick / 1000;
if ( BSP_Configuration.ticks_per_timeslice ) {
Old_ticker = (rtems_isr_entry) set_vector( clock_isr, 66, 1 );
Old_ticker = (rtems_isr_entry) set_vector( clock_isr, CLOCK_VECTOR, 1 );
timer = (struct z8036_map *) 0xfffb0000;
timer->MASTER_INTR = MICRVAL;
timer->CT1_MODE_SPEC = T1MSRVAL;
*((rtems_unsigned16 *)0xfffb0016) = MS_COUNT; /* write countdown value */
/*
timer->CT1_TIME_CONST_MSB = (MS_COUNT >> 8);
timer->CT1_TIME_CONST_LSB = (MS_COUNT & 0xff);
*/
*((rtems_unsigned16 *)0xfffb0016) = MS_COUNT; /* write countdown value */
/*
* timer->CT1_TIME_CONST_MSB = (MS_COUNT >> 8);
* timer->CT1_TIME_CONST_LSB = (MS_COUNT & 0xff);
*/
timer->MASTER_CFG = MCCRVAL;
timer->CT1_CMD_STATUS = T1CSRVAL;
/*
* Enable interrupt via VME interrupt mask register
*/
/*
* Enable interrupt via VME interrupt mask register
*/
(*(rtems_unsigned8 *)0xfffb0038) &= 0xfd;
atexit( Clock_exit );
}
}
void ReInstall_clock(
rtems_isr_entry clock_isr
)
{
rtems_unsigned32 isrlevel;
rtems_interrupt_disable( isrlevel );
(void) set_vector( clock_isr, CLOCK_VECTOR, 1 );
rtems_interrupt_enable( isrlevel );
}
void Clock_exit( void )
{
volatile struct z8036_map *timer;
@@ -109,3 +132,51 @@ void Clock_exit( void )
/* do not restore old vector */
}
}
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_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(CLOCK_VECTOR);
}
else if (args->command == rtems_build_name('N', 'E', 'W', ' '))
{
ReInstall_clock(args->buffer);
}
done:
return RTEMS_SUCCESSFUL;
}

View File

@@ -14,9 +14,8 @@
#define M136_INIT
#include <rtems.h>
#include "console.h"
#include "bsp.h"
#include <bsp.h>
#include <rtems/libio.h>
/* console_initialize
*
@@ -32,14 +31,24 @@
rtems_device_driver console_initialize(
rtems_device_major_number major,
rtems_device_minor_number minor,
void *arg,
rtems_id self,
rtems_unsigned32 *status
void *arg
)
{
rtems_status_code status;
_Write_m681 = ( struct w_m681_info * ) M681ADDR;
_Read_m681 = ( struct r_m681_info * ) M681ADDR;
*status = RTEMS_SUCCESSFUL;
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;
}
@@ -112,48 +121,102 @@ void outbyte(
}
/*
* __read -- read bytes from the serial port. Ignore fd, since
* we only have stdin.
* Open entry point
*/
int __read(
int fd,
char *buf,
int nbytes
rtems_device_driver console_open(
rtems_device_major_number major,
rtems_device_minor_number minor,
void * arg
)
{
int i = 0;
return RTEMS_SUCCESSFUL;
}
/*
* Close entry point
*/
for (i = 0; i < nbytes; i++) {
*(buf + i) = inbyte();
if ((*(buf + i) == '\n') || (*(buf + i) == '\r')) {
(*(buf + i++)) = '\n';
(*(buf + i)) = 0;
break;
}
}
return (i);
rtems_device_driver console_close(
rtems_device_major_number major,
rtems_device_minor_number minor,
void * arg
)
{
return RTEMS_SUCCESSFUL;
}
/*
* __write -- write bytes to the serial port. Ignore fd, since
* stdout and stderr are the same. Since we have no filesystem,
* open will only return an error.
* read bytes from the serial port. We only have stdin.
*/
int __write(
int fd,
char *buf,
int nbytes
rtems_device_driver console_read(
rtems_device_major_number major,
rtems_device_minor_number minor,
void * arg
)
{
int i;
rtems_libio_rw_args_t *rw_args;
char *buffer;
int maximum;
int count = 0;
rw_args = (rtems_libio_rw_args_t *) arg;
for (i = 0; i < nbytes; i++) {
if (*(buf + i) == '\n') {
outbyte ('\r');
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;
}
outbyte (*(buf + i));
}
return (nbytes);
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 ] );
}
return maximum;
}
/*
* IO Control entry point
*/
rtems_device_driver console_control(
rtems_device_major_number major,
rtems_device_minor_number minor,
void * arg
)
{
return RTEMS_SUCCESSFUL;
}

View File

@@ -21,6 +21,8 @@ extern "C" {
#endif
#include <rtems.h>
#include <clockdrv.h>
#include <console.h>
#include <iosupp.h>
/*
@@ -124,6 +126,24 @@ EXTERN volatile struct w_m681_info *_Write_m681; /* M68681 write registers */
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 );

View File

@@ -20,12 +20,18 @@
* $Id$
*/
#include <rtems.h>
#include <bsp.h>
#include <rtems/libio.h>
#include <libcsupport.h>
#include <z8036.h>
#include "stackchk.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
@@ -37,6 +43,8 @@ rtems_configuration_table BSP_Configuration;
rtems_cpu_table Cpu_table;
char *rtems_progname;
/* Initialize whatever libc we are using
* called from postdriver hook
*/
@@ -46,12 +54,24 @@ void bsp_libc_init()
extern int end;
rtems_unsigned32 heap_start;
#ifdef RTEMS_DEBUG
rtems_debug_enable( RTEMS_DEBUG_ALL_MASK );
#endif
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.
*/
@@ -70,7 +90,34 @@ void bsp_libc_init()
#endif
}
int bsp_start(
/*
* 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;
if ((stdin_fd = __open("/dev/console", O_RDONLY, 0)) == -1)
rtems_fatal_error_occurred('STD0');
if ((stdout_fd = __open("/dev/console", O_WRONLY, 0)) == -1)
rtems_fatal_error_occurred('STD1');
if ((stderr_fd = __open("/dev/console", O_WRONLY, 0)) == -1)
rtems_fatal_error_occurred('STD2');
if ((stdin_fd != 0) || (stdout_fd != 1) || (stderr_fd != 2))
rtems_fatal_error_occurred('STIO');
}
int main(
int argc,
char **argv,
char **environp
@@ -79,6 +126,11 @@ int bsp_start(
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 );
@@ -104,7 +156,7 @@ int bsp_start(
Cpu_table.predriver_hook = bsp_libc_init; /* RTEMS resources available */
Cpu_table.postdriver_hook = NULL;
Cpu_table.postdriver_hook = bsp_postdriver_hook;
Cpu_table.idle_task = NULL; /* do not override system IDLE task */
@@ -147,6 +199,12 @@ int bsp_start(
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 */

View File

@@ -27,9 +27,8 @@
#include <stdlib.h>
#include <rtems.h>
#include <bsp.h>
#include <clockdrv.h>
#include <rtems/libio.h>
#define MS_COUNT 1000 /* T2's countdown constant (1 ms) */
#define CLOCK_INT_LEVEL 6 /* T2's interrupt level */
@@ -38,24 +37,33 @@ rtems_unsigned32 Clock_isrs; /* ISRs until next tick */
volatile rtems_unsigned32 Clock_driver_ticks; /* ticks since initialization */
rtems_isr_entry Old_ticker;
rtems_device_driver Clock_initialize(
rtems_device_major_number major,
rtems_device_minor_number minor,
void *pargp,
rtems_id tid,
rtems_unsigned32 *rval
)
{
Install_clock( Clock_isr );
}
void Clock_exit( void );
#define CLOCK_VECTOR (VBR0 * 0x10 + 0x9)
/*
* These are set by clock driver during its init
*/
rtems_device_major_number rtems_clock_major = ~0;
rtems_device_minor_number rtems_clock_minor;
void ReInstall_clock(rtems_isr_entry clock_isr)
{
rtems_unsigned32 isrlevel;
/*
* ISR Handler
*/
rtems_interrupt_disable( isrlevel );
(void) set_vector( clock_isr, VBR0 * 0x10 + 0x9, 1 );
rtems_interrupt_enable( isrlevel );
rtems_isr Clock_isr(rtems_vector_number vector)
{
Clock_driver_ticks += 1;
lcsr->timer_cnt_2 = 0; /* clear counter */
lcsr->intr_clear |= 0x02000000;
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 )
@@ -66,7 +74,7 @@ void Install_clock(rtems_isr_entry clock_isr )
if ( BSP_Configuration.ticks_per_timeslice ) {
Old_ticker =
(rtems_isr_entry) set_vector( clock_isr, VBR0 * 0x10 + 0x9, 1 );
(rtems_isr_entry) set_vector( clock_isr, CLOCK_VECTOR, 1 );
lcsr->vector_base |= MASK_INT; /* unmask VMEchip2 interrupts */
lcsr->to_ctl = 0xE7; /* prescaler to 1 MHz (see Appendix A1) */
lcsr->timer_cmp_2 = MS_COUNT;
@@ -79,10 +87,66 @@ void Install_clock(rtems_isr_entry clock_isr )
atexit( Clock_exit );
}
}
void ReInstall_clock(rtems_isr_entry clock_isr)
{
rtems_unsigned32 isrlevel;
rtems_interrupt_disable( isrlevel );
(void) set_vector( clock_isr, CLOCK_VECTOR, 1 );
rtems_interrupt_enable( isrlevel );
}
void Clock_exit( void )
{
/* Dummy for now. See other m68k BSP's for code examples */
}
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_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(CLOCK_VECTOR);
}
else if (args->command == rtems_build_name('N', 'E', 'W', ' '))
{
ReInstall_clock(args->buffer);
}
done:
return RTEMS_SUCCESSFUL;
}

View File

@@ -21,10 +21,9 @@
#define M162_INIT
#include <rtems.h>
#include "console.h"
#include "bsp.h"
#include "ringbuf.h"
#include <bsp.h>
#include <rtems/libio.h>
#include <ringbuf.h>
Ring_buffer_t Buffer[2];
@@ -54,12 +53,11 @@ rtems_isr C_Receive_ISR(rtems_vector_number vector)
rtems_device_driver console_initialize(
rtems_device_major_number major,
rtems_device_minor_number minor,
void *arg,
rtems_id self,
rtems_unsigned32 *status
void *arg
)
{
int i;
rtems_status_code status;
/*
* Initialise receiver interrupts on both ports
@@ -79,7 +77,34 @@ rtems_device_driver console_initialize(
mcchip->gen_control = 2; /* MIEN */
mcchip->SCC_int_ctl = 0x13; /* SCC IEN, IPL3 */
*status = RTEMS_SUCCESSFUL;
status = rtems_io_register_name(
"/dev/console",
major,
(rtems_device_minor_number) 0
);
if (status != RTEMS_SUCCESSFUL)
rtems_fatal_error_occurred(status);
status = rtems_io_register_name(
"/dev/tty00",
major,
(rtems_device_minor_number) 0
);
if (status != RTEMS_SUCCESSFUL)
rtems_fatal_error_occurred(status);
status = rtems_io_register_name(
"/dev/tty01",
major,
(rtems_device_minor_number) 0
);
if (status != RTEMS_SUCCESSFUL)
rtems_fatal_error_occurred(status);
return RTEMS_SUCCESSFUL;
}
/*
@@ -100,7 +125,7 @@ rtems_boolean char_ready(int port, char *ch)
* Block on char input
*/
char char_wait(int port)
char inbyte(int port)
{
unsigned char tmp_char;
@@ -113,7 +138,7 @@ char char_wait(int port)
* XON/XOFF flow control.
*/
void char_put(int port, char ch)
void outbyte(int port, char ch)
{
while (1) {
if (ZREAD0(port) & TX_BUFFER_EMPTY) break;
@@ -122,45 +147,108 @@ void char_put(int port, char ch)
}
/*
* Map port A (1) to stdin, stdout, and stderr.
* Map everything else to port B (0).
* Open entry point
*/
int __read(int fd, char *buf, int nbytes)
rtems_device_driver console_open(
rtems_device_major_number major,
rtems_device_minor_number minor,
void * arg
)
{
int i, port;
return RTEMS_SUCCESSFUL;
}
/*
* Close entry point
*/
if ( fd <= 2 ) port = 1;
else port = 0;
for (i = 0; i < nbytes; i++) {
*(buf + i) = char_wait(port);
if ((*(buf + i) == '\n') || (*(buf + i) == '\r')) {
(*(buf + i++)) = '\n';
(*(buf + i)) = 0;
break;
}
}
return (i);
rtems_device_driver console_close(
rtems_device_major_number major,
rtems_device_minor_number minor,
void * arg
)
{
return RTEMS_SUCCESSFUL;
}
/*
* Map port A (1) to stdin, stdout, and stderr.
* Map everything else to port B (0).
* read bytes from the serial port. We only have stdin.
*/
int __write(int fd, char *buf, int nbytes)
rtems_device_driver console_read(
rtems_device_major_number major,
rtems_device_minor_number minor,
void * arg
)
{
int i, port;
rtems_libio_rw_args_t *rw_args;
char *buffer;
int maximum;
int count = 0;
if ( fd <= 2 ) port = 1;
else port = 0;
for (i = 0; i < nbytes; i++) {
if (*(buf + i) == '\n') {
char_put (port, '\r');
rw_args = (rtems_libio_rw_args_t *) arg;
buffer = rw_args->buffer;
maximum = rw_args->count;
if ( minor > 1 )
return RTEMS_INVALID_NUMBER;
for (count = 0; count < maximum; count++) {
buffer[ count ] = inbyte( minor );
if (buffer[ count ] == '\n' || buffer[ count ] == '\r') {
buffer[ count++ ] = '\n';
buffer[ count ] = 0;
break;
}
char_put (port, *(buf + i));
}
return (nbytes);
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;
if ( minor > 1 )
return RTEMS_INVALID_NUMBER;
for (count = 0; count < maximum; count++) {
if ( buffer[ count ] == '\n') {
outbyte('\r', minor );
}
outbyte( buffer[ count ], minor );
}
return maximum;
}
/*
* IO Control entry point
*/
rtems_device_driver console_control(
rtems_device_major_number major,
rtems_device_minor_number minor,
void * arg
)
{
return RTEMS_SUCCESSFUL;
}

View File

@@ -28,6 +28,8 @@ extern "C" {
#endif
#include <rtems.h>
#include <clockdrv.h>
#include <console.h>
#include <iosupp.h>
/*
@@ -248,6 +250,24 @@ typedef volatile struct gcsr_regs {
#define EXTERN extern
#endif
/*
* 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
/* miscellaneous stuff assumed to exist */
extern rtems_configuration_table BSP_Configuration;

View File

@@ -27,10 +27,17 @@
* $Id$
*/
#include <rtems.h>
#include <bsp.h>
#include <rtems/libio.h>
#include <libcsupport.h>
#include <z8036.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
@@ -42,6 +49,8 @@ rtems_configuration_table BSP_Configuration;
rtems_cpu_table Cpu_table;
char *rtems_progname;
/* Initialize whatever libc we are using
* called from postdriver hook
*/
@@ -57,6 +66,14 @@ void bsp_libc_init()
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.
*/
@@ -75,7 +92,33 @@ void bsp_libc_init()
#endif
}
int bsp_start(
/*
* 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;
if ((stdin_fd = __open("/dev/console", O_RDONLY, 0)) == -1)
rtems_fatal_error_occurred('STD0');
if ((stdout_fd = __open("/dev/console", O_WRONLY, 0)) == -1)
rtems_fatal_error_occurred('STD1');
if ((stderr_fd = __open("/dev/console", O_WRONLY, 0)) == -1)
rtems_fatal_error_occurred('STD2');
if ((stdin_fd != 0) || (stdout_fd != 1) || (stderr_fd != 2))
rtems_fatal_error_occurred('STIO');
}
int main(
int argc,
char **argv,
char **environp
@@ -84,6 +127,11 @@ int bsp_start(
m68k_isr_entry *monitors_vector_table;
int index;
if ((argc > 0) && argv && argv[0])
rtems_progname = argv[0];
else
rtems_progname = "RTEMS";
/*
* 162Bug Vectors are at 0xFFE00000
*/
@@ -121,7 +169,7 @@ int bsp_start(
Cpu_table.predriver_hook = bsp_libc_init; /* RTEMS resources available */
Cpu_table.postdriver_hook = NULL; /* Call our main() for constructors */
Cpu_table.postdriver_hook = bsp_postdriver_hook;
Cpu_table.idle_task = NULL; /* do not override system IDLE task */
@@ -161,6 +209,12 @@ int bsp_start(
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);
BSP_Configuration.work_space_start = (void *)
(RAM_END - BSP_Configuration.work_space_size);

View File

@@ -60,28 +60,25 @@ rtems_device_minor_number rtems_clock_minor;
rtems_isr_entry Old_ticker;
void Clock_exit( void );
/*
* Reinstall_clock
*
* Install a clock tick handler without reprogramming the chip. This
* is used by the polling shared memory device driver.
* Isr Handler
*/
void ReInstall_clock(
rtems_isr_entry clock_isr
rtems_isr Clock_isr(
rtems_vector_number vector
)
{
rtems_unsigned32 isrlevel = 0;
/*
* Disable interrupts and install the clock ISR vector using the
* BSP dependent set_vector routine. In the below example, the clock
* ISR is on vector 4 and is an RTEMS interrupt.
*/
rtems_interrupt_disable( isrlevel );
(void) set_vector( clock_isr, CLOCK_VECTOR, 1 );
rtems_interrupt_enable( isrlevel );
/*
* bump the number of clock driver ticks since initialization
*
* determine if it is time to announce the passing of tick as configured
* to RTEMS through the rtems_clock_tick directive
*
* perform any timer dependent tasks
*/
}
/*
@@ -123,6 +120,30 @@ void Install_clock(
atexit( Clock_exit );
}
/*
* Reinstall_clock
*
* Install a clock tick handler without reprogramming the chip. This
* is used by the polling shared memory device driver.
*/
void ReInstall_clock(
rtems_isr_entry clock_isr
)
{
rtems_unsigned32 isrlevel = 0;
/*
* Disable interrupts and install the clock ISR vector using the
* BSP dependent set_vector routine. In the below example, the clock
* ISR is on vector 4 and is an RTEMS interrupt.
*/
rtems_interrupt_disable( isrlevel );
(void) set_vector( clock_isr, CLOCK_VECTOR, 1 );
rtems_interrupt_enable( isrlevel );
}
/*
* Clean up before the application exits
*/
@@ -149,14 +170,15 @@ rtems_device_driver Clock_initialize(
void *pargp
)
{
Install_clock((rtems_isr_entry) Clock_isr);
Install_clock( Clock_isr );
/*
* make major/minor avail to others such as shared memory driver
*/
rtems_clock_major = major;
rtems_clock_minor = minor;
rtems_clock_minor = minor;
return RTEMS_SUCCESSFUL;
}

View File

@@ -14,9 +14,8 @@
#define NO_BSP_INIT
#include <rtems.h>
#include "console.h"
#include "bsp.h"
#include <bsp.h>
#include <rtems/libio.h>
/* console_initialize
*
@@ -32,12 +31,21 @@
rtems_device_driver console_initialize(
rtems_device_major_number major,
rtems_device_minor_number minor,
void *arg,
rtems_id self,
rtems_unsigned32 *status
void *arg
)
{
*status = RTEMS_SUCCESSFUL;
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;
}
@@ -110,49 +118,104 @@ void outbyte(
outbyte( '\r' );
}
/*
* __read -- read bytes from the serial port. Ignore fd, since
* we only have stdin.
* Open entry point
*/
int __read(
int fd,
char *buf,
int nbytes
rtems_device_driver console_open(
rtems_device_major_number major,
rtems_device_minor_number minor,
void * arg
)
{
int i = 0;
return RTEMS_SUCCESSFUL;
}
/*
* Close entry point
*/
for (i = 0; i < nbytes; i++) {
*(buf + i) = inbyte();
if ((*(buf + i) == '\n') || (*(buf + i) == '\r')) {
(*(buf + i++)) = '\n';
(*(buf + i)) = 0;
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;
}
}
return (i);
rw_args->bytes_moved = count;
return (count >= 0) ? RTEMS_SUCCESSFUL : RTEMS_UNSATISFIED;
}
/*
* __write -- write bytes to the serial port. Ignore fd, since
* stdout and stderr are the same. Since we have no filesystem,
* open will only return an error.
* write bytes to the serial port. Stdout and stderr are the same.
*/
int __write(
int fd,
char *buf,
int nbytes
rtems_device_driver console_write(
rtems_device_major_number major,
rtems_device_minor_number minor,
void * arg
)
{
int i;
int count;
int maximum;
rtems_libio_rw_args_t *rw_args;
char *buffer;
for (i = 0; i < nbytes; i++) {
if (*(buf + i) == '\n') {
outbyte ('\r');
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 (*(buf + i));
outbyte( buffer[ count ] );
}
return (nbytes);
return maximum;
}
/*
* IO Control entry point
*/
rtems_device_driver console_control(
rtems_device_major_number major,
rtems_device_minor_number minor,
void * arg
)
{
return RTEMS_SUCCESSFUL;
}

View File

@@ -23,6 +23,7 @@ extern "C" {
#endif
#include <rtems.h>
#include <console.h>
#include <clockdrv.h>
/*
@@ -69,19 +70,23 @@ extern "C" {
extern rtems_configuration_table BSP_Configuration;
/*
* Console driver init
* Device Driver Table Entries
*/
/*
* NOTE: Use the standard Console driver entry
*/
rtems_device_driver console_initialize(
rtems_device_major_number, rtems_device_minor_number minor, void *);
#define CONSOLE_DRIVER_TABLE_ENTRY \
{ console_initialize, NULL, NULL, NULL, NULL, NULL }
/*
* NOTE: Use the standard Clock driver entry
*/
/*
* How many libio files we want
*/
#define BSP_LIBIO_MAX_FDS 20
/* functions */
void bsp_cleanup( void );

View File

@@ -20,10 +20,17 @@
* $Id$
*/
#include <rtems.h>
#include <bsp.h>
#include <shm.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
@@ -36,6 +43,8 @@ rtems_configuration_table BSP_Configuration;
rtems_cpu_table Cpu_table;
char *rtems_progname;
/* Initialize whatever libc we are using
* called from postdriver hook
*/
@@ -58,6 +67,14 @@ void bsp_libc_init()
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.
*/
@@ -76,12 +93,43 @@ void bsp_libc_init()
#endif
}
int bsp_start(
/*
* 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;
if ((stdin_fd = __open("/dev/console", O_RDONLY, 0)) == -1)
rtems_fatal_error_occurred('STD0');
if ((stdout_fd = __open("/dev/console", O_WRONLY, 0)) == -1)
rtems_fatal_error_occurred('STD1');
if ((stderr_fd = __open("/dev/console", O_WRONLY, 0)) == -1)
rtems_fatal_error_occurred('STD2');
if ((stdin_fd != 0) || (stdout_fd != 1) || (stderr_fd != 2))
rtems_fatal_error_occurred('STIO');
}
int main(
int argc,
char **argv,
char **environp
)
{
if ((argc > 0) && argv && argv[0])
rtems_progname = argv[0];
else
rtems_progname = "RTEMS";
/*
* Allocate the memory for the RTEMS Work Space. This can come from
* a variety of places: hard coded address, malloc'ed from outside
@@ -118,6 +166,20 @@ int bsp_start(
BSP_Configuration.maximum_extensions++;
#endif
#ifdef STACK_CHECKER_ON
/*
* Add 1 extension for stack checker
*/
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);
/*
* Need to "allocate" the memory for the RTEMS Workspace and
* tell the RTEMS configuration where it is. This memory is
@@ -138,7 +200,7 @@ int bsp_start(
Cpu_table.predriver_hook = bsp_libc_init; /* RTEMS resources available */
Cpu_table.postdriver_hook = NULL;
Cpu_table.postdriver_hook = bsp_postdriver_hook;
Cpu_table.idle_task = NULL; /* do not override system IDLE task */

View File

@@ -43,6 +43,7 @@ extern "C" {
#else
#include <rtems.h>
#include <console.h>
/*
* Define the time limits for RTEMS Test Suite test durations.
@@ -94,6 +95,24 @@ extern "C" {
extern rtems_configuration_table BSP_Configuration; /* owned by BSP */
extern rtems_cpu_table Cpu_table; /* owned by BSP */
/*
* 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_start( void );

View File

@@ -37,10 +37,17 @@
* bspstart.c,v 1.2 1995/05/31 16:56:29 joel Exp
*/
#include <rtems.h>
#include <bsp.h>
#include <shm.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
@@ -53,6 +60,8 @@ rtems_configuration_table BSP_Configuration;
rtems_cpu_table Cpu_table;
char *rtems_progname;
/* Initialize whatever libc we are using
* called from postdriver hook
*/
@@ -75,6 +84,14 @@ void bsp_libc_init()
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.
*/
@@ -93,8 +110,43 @@ void bsp_libc_init()
#endif
}
void bsp_start(void)
/*
* 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;
if ((stdin_fd = __open("/dev/console", O_RDONLY, 0)) == -1)
rtems_fatal_error_occurred('STD0');
if ((stdout_fd = __open("/dev/console", O_WRONLY, 0)) == -1)
rtems_fatal_error_occurred('STD1');
if ((stderr_fd = __open("/dev/console", O_WRONLY, 0)) == -1)
rtems_fatal_error_occurred('STD2');
if ((stdin_fd != 0) || (stdout_fd != 1) || (stderr_fd != 2))
rtems_fatal_error_occurred('STIO');
}
int main(
int argc,
char **argv,
char **environp
)
{
if ((argc > 0) && argv && argv[0])
rtems_progname = argv[0];
else
rtems_progname = "RTEMS";
/*
* Allocate the memory for the RTEMS Work Space. This can come from
* a variety of places: hard coded address, malloc'ed from outside
@@ -131,6 +183,12 @@ void bsp_start(void)
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);
/*
* Need to "allocate" the memory for the RTEMS Workspace and
* tell the RTEMS configuration where it is. This memory is
@@ -154,7 +212,7 @@ void bsp_start(void)
Cpu_table.predriver_hook = bsp_libc_init; /* RTEMS resources available */
Cpu_table.postdriver_hook = NULL;
Cpu_table.postdriver_hook = bsp_postdriver_hook;
Cpu_table.idle_task = NULL; /* do not override system IDLE task */

View File

@@ -3,8 +3,7 @@
* This routine is the shared memory communications initerface
* driver initialization routine.
*
* Input parameters:
* configuration - address of configuration table
* Input parameters: NONE
*
* Output parameters: NONE
*
@@ -33,12 +32,8 @@
rtems_extensions_table MPCI_Shm_extensions;
rtems_mpci_entry Shm_Initialization(
rtems_configuration_table *configuration,
rtems_cpu_table *cpu_configuration,
rtems_multiprocessing_table *mp_configuration
rtems_mpci_entry Shm_Initialization( void )
)
{
rtems_unsigned32 i, all_initialized;
rtems_unsigned32 interrupt_cause, interrupt_value;
@@ -46,6 +41,9 @@ rtems_mpci_entry Shm_Initialization(
Shm_Node_status_control *nscb;
rtems_unsigned32 extension_id; /* for installation of MPCI_Fatal */
rtems_unsigned32 remaining_memory;
/* XXX these should use "public" methods to set their values.... */
rtems_configuration_table *configuration = _Configuration_Table;
rtems_multiprocessing_table *mp_configuration = _Configuration_MP_table;
Shm_RTEMS_Configuration = configuration;
Shm_RTEMS_MP_Configuration = mp_configuration;

View File

@@ -15,8 +15,8 @@
* $Id$
*/
#ifndef __MPCI_h
#define __MPCI_h
#ifndef __SHM_MPCI_h
#define __SHM_MPCI_h
#ifdef __cplusplus
extern "C" {

View File

@@ -493,11 +493,7 @@ rtems_mpci_entry Shm_Get_packet(
rtems_packet_prefix **
);
rtems_mpci_entry Shm_Initialization(
rtems_configuration_table *configuration,
rtems_cpu_table *cpu_configuration,
rtems_multiprocessing_table *mp_configuration
);
rtems_mpci_entry Shm_Initialization( void );
rtems_mpci_entry Shm_Receive_packet(
rtems_packet_prefix **

View File

@@ -493,11 +493,7 @@ rtems_mpci_entry Shm_Get_packet(
rtems_packet_prefix **
);
rtems_mpci_entry Shm_Initialization(
rtems_configuration_table *configuration,
rtems_cpu_table *cpu_configuration,
rtems_multiprocessing_table *mp_configuration
);
rtems_mpci_entry Shm_Initialization( void );
rtems_mpci_entry Shm_Receive_packet(
rtems_packet_prefix **

View File

@@ -3,6 +3,8 @@
*
* These provide UNIX-like read and write calls for the C library.
*
* NOTE: For the most part, this is just a space holder.
*
* COPYRIGHT (c) 1994 by Division Incorporated
*
* To anyone who acknowledges that this file is provided "AS IS"
@@ -31,6 +33,71 @@ console_initialize(rtems_device_major_number major,
void * arg
)
{
return RTEMS_SUCCESSFUL;
return 0;
}
/*
* 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
)
{
return 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
)
{
return -1;
}
/*
* IO Control entry point
*/
rtems_device_driver console_control(
rtems_device_major_number major,
rtems_device_minor_number minor,
void * arg
)
{
return RTEMS_SUCCESSFUL;
}

View File

@@ -22,6 +22,7 @@ extern "C" {
#include <rtems.h>
#include <clockdrv.h>
#include <console.h>
#include <iosupp.h>
#include <libcsupport.h>
#include <signal.h>
@@ -80,19 +81,23 @@ extern rtems_configuration_table BSP_Configuration;
/* #define INTERRUPT_EXTERNAL_MPCI SIGUSR1 */
/*
* Console driver init
* Device Driver Table Entries
*/
/*
* NOTE: Use the standard Console driver entry
*/
rtems_device_driver console_initialize(
rtems_device_major_number, rtems_device_minor_number minor, void *);
#define CONSOLE_DRIVER_TABLE_ENTRY \
{ console_initialize, NULL, NULL, NULL, NULL, NULL }
/*
* NOTE: Use the standard Clock driver entry
*/
/*
* How many libio files we want
*/
#define BSP_LIBIO_MAX_FDS 20
/* functions */
rtems_isr_entry set_vector(rtems_isr_entry, rtems_vector_number, int);

View File

@@ -37,6 +37,8 @@
#include <bsp.h>
#include <libcsupport.h>
#include <rtems/libio.h>
#ifdef STACK_CHECKER_ON
#include <stackchk.h>
#endif
@@ -112,6 +114,14 @@ bsp_libc_init(void)
RTEMS_Malloc_Initialize((void *)heap_start, Heap_size, 1024 * 1024);
/*
* 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();
libc_init(1);
}
@@ -161,6 +171,34 @@ bsp_pretasking_hook(void)
#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)
{
#if 0
int stdin_fd, stdout_fd, stderr_fd;
if ((stdin_fd = __open("/dev/console", O_RDONLY, 0)) == -1)
rtems_fatal_error_occurred('STD0');
if ((stdout_fd = __open("/dev/console", O_WRONLY, 0)) == -1)
rtems_fatal_error_occurred('STD1');
if ((stderr_fd = __open("/dev/console", O_WRONLY, 0)) == -1)
rtems_fatal_error_occurred('STD2');
if ((stdin_fd != 0) || (stdout_fd != 1) || (stderr_fd != 2))
rtems_fatal_error_occurred('STIO');
#endif
}
/*
* Function: bsp_start
* Created: 94/12/6
@@ -261,7 +299,7 @@ bsp_start(void)
Cpu_table.predriver_hook = NULL;
Cpu_table.postdriver_hook = NULL;
Cpu_table.postdriver_hook = bsp_postdriver_hook;
Cpu_table.idle_task = NULL; /* do not override system IDLE task */
@@ -301,22 +339,28 @@ bsp_start(void)
BSP_Configuration.maximum_extensions++;
#endif
/*
* Add 1 extension for MPCI_fatal
*/
/*
* Tell libio how many fd's we want and allow it to tweak config
*/
if (BSP_Configuration.User_multiprocessing_table)
BSP_Configuration.maximum_extensions++;
rtems_libio_config(&BSP_Configuration, BSP_LIBIO_MAX_FDS);
CPU_CLICKS_PER_TICK = 1;
/*
* Add 1 extension for MPCI_fatal
*/
/*
* Start most of RTEMS
* main() will start the rest
*/
if (BSP_Configuration.User_multiprocessing_table)
BSP_Configuration.maximum_extensions++;
bsp_isr_level = rtems_initialize_executive_early(
&BSP_Configuration,
&Cpu_table
);
CPU_CLICKS_PER_TICK = 1;
/*
* Start most of RTEMS
* main() will start the rest
*/
bsp_isr_level = rtems_initialize_executive_early(
&BSP_Configuration,
&Cpu_table
);
}

View File

@@ -91,8 +91,8 @@ rtems_assoc_t rtems_status_assoc[] = {
{ "not owner of resource", RTEMS_NOT_OWNER_OF_RESOURCE , },
{ "directive not implemented", RTEMS_NOT_IMPLEMENTED, },
{ "RTEMS inconsistency detected", RTEMS_INTERNAL_ERROR, },
{ "internal multiprocessing only", RTEMS_PROXY_BLOCKING, },
{ "could not get enough memory", RTEMS_NO_MEMORY, },
{ "internal multiprocessing only", THREAD_STATUS_PROXY_BLOCKING, },
{ 0, 0, 0 },
};
@@ -134,7 +134,7 @@ static int rtems_verror(
if (error_flag & RTEMS_ERROR_ERRNO) /* include errno? */
local_errno = errno;
if (_Configuration_Is_multiprocessing())
if (_System_state_Is_multiprocessing)
fprintf(stderr, "[%d] ", _Configuration_MP_table->node);
if (rtems_progname && *rtems_progname)

View File

@@ -14,8 +14,11 @@
#include <rtems/assoc.h> /* assoc.h not included by rtems.h */
#include <fcntl.h> /* O_RDONLY, et.al. */
#include <sys/fcntl.h> /* O_RDONLY, et.al. */
#if defined(solaris2)
#define O_NDELAY O_NONBLOCK
#elif defined(RTEMS_NEWLIB)
#define O_NDELAY _FNBIO
#endif
#include <errno.h>
#include <string.h> /* strcmp */

View File

@@ -80,11 +80,12 @@ libc_wrapup(void)
}
rtems_extension
rtems_boolean
libc_create_hook(rtems_tcb *current_task,
rtems_tcb *creating_task)
{
MY_task_set_note(creating_task, LIBC_NOTEPAD, 0);
return TRUE;
}
/*
@@ -231,10 +232,10 @@ libc_init(int reentrant)
{
memset(&libc_extension, 0, sizeof(libc_extension));
libc_extension.rtems_task_create = libc_create_hook;
libc_extension.rtems_task_start = libc_start_hook;
libc_extension.task_switch = libc_switch_hook;
libc_extension.rtems_task_delete = libc_delete_hook;
libc_extension.thread_create = libc_create_hook;
libc_extension.thread_start = libc_start_hook;
libc_extension.thread_switch = libc_switch_hook;
libc_extension.thread_delete = libc_delete_hook;
rc = rtems_extension_create(rtems_build_name('L', 'I', 'B', 'C'),
&libc_extension, &extension_id);

View File

@@ -13,8 +13,7 @@
*
*/
#include <rtems/system.h>
#include <rtems/thread.h>
#include <rtems.h>
void MY_task_set_note(
Thread_Control *the_thread,
@@ -22,7 +21,11 @@ void MY_task_set_note(
unsigned32 note
)
{
the_thread->RTEMS_API->Notepads[ notepad ] = note;
RTEMS_API_Control *api;
api = the_thread->API_Extensions[ THREAD_API_RTEMS ];
api->Notepads[ notepad ] = note;
}
@@ -31,7 +34,11 @@ unsigned32 MY_task_get_note(
unsigned32 notepad
)
{
return the_thread->RTEMS_API->Notepads[ notepad ];
RTEMS_API_Control *api;
api = the_thread->API_Extensions[ THREAD_API_RTEMS ];
return api->Notepads[ notepad ];
}
void *MY_CPU_Context_FP_start(

View File

@@ -33,6 +33,7 @@
#include <bsp.h>
#include <clockdrv.h>
#include <rtems/libio.h>
#include <stdlib.h> /* for atexit() */
@@ -42,32 +43,15 @@ volatile rtems_unsigned32 Clock_driver_ticks;
static rtems_unsigned32 pit_value, tick_time;
static rtems_boolean auto_restart;
rtems_device_driver Clock_initialize(
rtems_device_major_number major,
rtems_device_minor_number minor,
void *pargp,
rtems_id tid,
rtems_unsigned32 *rval
)
{
Install_clock(Clock_isr);
}
void
ReInstall_clock(rtems_isr_entry new_clock_isr)
{
rtems_isr_entry previous_isr;
rtems_unsigned32 isrlevel = 0;
rtems_interrupt_disable(isrlevel);
rtems_interrupt_catch(new_clock_isr, PPC_IRQ_PIT,
&previous_isr);
rtems_interrupt_enable(isrlevel);
}
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;
static INLINE rtems_unsigned32 get_itimer(void)
{
register rtems_unsigned32 rc;
@@ -77,61 +61,10 @@ static INLINE rtems_unsigned32 get_itimer(void)
return rc;
}
void Install_clock(rtems_isr_entry clock_isr)
{
rtems_isr_entry previous_isr;
rtems_unsigned32 pvr, iocr;
Clock_driver_ticks = 0;
asm volatile ("mfiocr %0" : "=r" (iocr));
iocr &= ~4;
iocr |= 4; /* Select external timer clock */
asm volatile ("mtiocr %0" : "=r" (iocr) : "0" (iocr));
asm volatile ("mfpvr %0" : "=r" ((pvr)));
if (((pvr & 0xffff0000) >> 16) != 0x0020)
return; /* Not a ppc403 */
if ((pvr & 0xff00) == 0x0000) /* 403GA */
auto_restart = (pvr & 0x00f0) > 0x0000 ? 1 : 0;
else if ((pvr & 0xff00) == 0x0100) /* 403GB */
auto_restart = 1;
pit_value = BSP_Configuration.microseconds_per_tick *
Cpu_table.clicks_per_usec;
if (BSP_Configuration.ticks_per_timeslice)
{
register rtems_unsigned32 tcr;
/*
* initialize the interval here
* First tick is set to right amount of time in the future
* Future ticks will be incremented over last value set
* in order to provide consistent clicks in the face of
* interrupt overhead
*/
rtems_interrupt_catch(clock_isr, PPC_IRQ_PIT,
&previous_isr);
asm volatile ("mtpit %0" : : "r" (pit_value));
asm volatile ("mftcr %0" : "=r" ((tcr)));
tcr &= ~ 0x04400000;
tcr |= (auto_restart ? 0x04400000 : 0x04000000);
tick_time = get_itimer() + pit_value;
asm volatile ("mttcr %0" : "=r" ((tcr)) : "0" ((tcr)));
}
atexit(Clock_exit);
}
/*
* ISR Handler
*/
rtems_isr
Clock_isr(rtems_vector_number vector)
{
@@ -191,6 +124,75 @@ Clock_isr(rtems_vector_number vector)
rtems_clock_tick();
}
void Install_clock(rtems_isr_entry clock_isr)
{
rtems_isr_entry previous_isr;
rtems_unsigned32 pvr, iocr;
Clock_driver_ticks = 0;
asm volatile ("mfiocr %0" : "=r" (iocr));
iocr &= ~4;
iocr |= 4; /* Select external timer clock */
asm volatile ("mtiocr %0" : "=r" (iocr) : "0" (iocr));
asm volatile ("mfpvr %0" : "=r" ((pvr)));
if (((pvr & 0xffff0000) >> 16) != 0x0020)
return; /* Not a ppc403 */
if ((pvr & 0xff00) == 0x0000) /* 403GA */
auto_restart = (pvr & 0x00f0) > 0x0000 ? 1 : 0;
else if ((pvr & 0xff00) == 0x0100) /* 403GB */
auto_restart = 1;
pit_value = BSP_Configuration.microseconds_per_tick *
Cpu_table.clicks_per_usec;
if (BSP_Configuration.ticks_per_timeslice)
{
register rtems_unsigned32 tcr;
/*
* initialize the interval here
* First tick is set to right amount of time in the future
* Future ticks will be incremented over last value set
* in order to provide consistent clicks in the face of
* interrupt overhead
*/
rtems_interrupt_catch(clock_isr, PPC_IRQ_PIT,
&previous_isr);
asm volatile ("mtpit %0" : : "r" (pit_value));
asm volatile ("mftcr %0" : "=r" ((tcr)));
tcr &= ~ 0x04400000;
tcr |= (auto_restart ? 0x04400000 : 0x04000000);
tick_time = get_itimer() + pit_value;
asm volatile ("mttcr %0" : "=r" ((tcr)) : "0" ((tcr)));
}
atexit(Clock_exit);
}
void
ReInstall_clock(rtems_isr_entry new_clock_isr)
{
rtems_isr_entry previous_isr;
rtems_unsigned32 isrlevel = 0;
rtems_interrupt_disable(isrlevel);
rtems_interrupt_catch(new_clock_isr, PPC_IRQ_PIT,
&previous_isr);
rtems_interrupt_enable(isrlevel);
}
/*
* Called via atexit()
* Remove the clock interrupt handler by setting handler to NULL
@@ -213,3 +215,50 @@ Clock_exit(void)
}
}
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_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(PPC_IRQ_PIT);
}
else if (args->command == rtems_build_name('N', 'E', 'W', ' '))
{
ReInstall_clock(args->buffer);
}
done:
return RTEMS_SUCCESSFUL;
}

View File

@@ -31,9 +31,8 @@
#define NO_BSP_INIT
#include <rtems.h>
#include "console.h"
#include "bsp.h"
#include <bsp.h>
#include <rtems/libio.h>
extern rtems_cpu_table Cpu_table; /* owned by BSP */
@@ -139,11 +138,10 @@ static const pasync port = (pasync)0x40000000;
rtems_device_driver console_initialize(
rtems_device_major_number major,
rtems_device_minor_number minor,
void *arg,
rtems_id self,
rtems_unsigned32 *status
void *arg
)
{
rtems_status_code status;
register unsigned tmp;
/* Initialise the serial port */
@@ -164,7 +162,16 @@ rtems_device_driver console_initialize(
port->SPTC = (TCREnable | TCRIntDisable);
port->SPHS = (HSRDsr | HSRCts);
*status = RTEMS_SUCCESSFUL;
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;
}
@@ -280,48 +287,103 @@ void outbyte(
}
/*
* __read -- read bytes from the serial port. Ignore fd, since
* we only have stdin.
* Open entry point
*/
int __read(
int fd,
char *buf,
int nbytes
rtems_device_driver console_open(
rtems_device_major_number major,
rtems_device_minor_number minor,
void * arg
)
{
int i = 0;
for (i = 0; i < nbytes; i++) {
*(buf + i) = inbyte();
if ((*(buf + i) == '\n') || (*(buf + i) == '\r')) {
(*(buf + i++)) = '\n';
(*(buf + i)) = 0;
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;
}
}
return (i);
rw_args->bytes_moved = count;
return (count >= 0) ? RTEMS_SUCCESSFUL : RTEMS_UNSATISFIED;
}
/*
* __write -- write bytes to the serial port. Ignore fd, since
* stdout and stderr are the same. Since we have no filesystem,
* open will only return an error.
* write bytes to the serial port. Stdout and stderr are the same.
*/
int __write(
int fd,
char *buf,
int nbytes
rtems_device_driver console_write(
rtems_device_major_number major,
rtems_device_minor_number minor,
void * arg
)
{
int i;
for (i = 0; i < nbytes; i++) {
if (*(buf + i) == '\n') {
outbyte ('\r');
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 (*(buf + i));
outbyte( buffer[ count ] );
}
return (nbytes);
return maximum;
}
/*
* IO Control entry point
*/
rtems_device_driver console_control(
rtems_device_major_number major,
rtems_device_minor_number minor,
void * arg
)
{
return RTEMS_SUCCESSFUL;
}

View File

@@ -91,8 +91,8 @@ rtems_assoc_t rtems_status_assoc[] = {
{ "not owner of resource", RTEMS_NOT_OWNER_OF_RESOURCE , },
{ "directive not implemented", RTEMS_NOT_IMPLEMENTED, },
{ "RTEMS inconsistency detected", RTEMS_INTERNAL_ERROR, },
{ "internal multiprocessing only", RTEMS_PROXY_BLOCKING, },
{ "could not get enough memory", RTEMS_NO_MEMORY, },
{ "internal multiprocessing only", THREAD_STATUS_PROXY_BLOCKING, },
{ 0, 0, 0 },
};
@@ -134,7 +134,7 @@ static int rtems_verror(
if (error_flag & RTEMS_ERROR_ERRNO) /* include errno? */
local_errno = errno;
if (_Configuration_Is_multiprocessing())
if (_System_state_Is_multiprocessing)
fprintf(stderr, "[%d] ", _Configuration_MP_table->node);
if (rtems_progname && *rtems_progname)

View File

@@ -57,7 +57,8 @@ rtems_monitor_dname_next(
rtems_driver_name_t *table = object_information;
rtems_driver_name_t *np = 0;
for (np = table + n ; n<RTEMS_MAX_DRIVER_NAMES; n++, np++)
/* XXX should we be using _IO_Number_of_devices */
for (np = table + n ; n<_IO_Number_of_devices; n++, np++)
if (np->device_name)
goto done;

View File

@@ -22,20 +22,20 @@ rtems_monitor_extension_canonical(
rtems_extensions_table *e = &rtems_extension->Extension.Callouts;
rtems_monitor_symbol_canonical_by_value(&canonical_extension->create,
e->rtems_task_create);
e->thread_create);
rtems_monitor_symbol_canonical_by_value(&canonical_extension->start,
e->rtems_task_start);
e->thread_start);
rtems_monitor_symbol_canonical_by_value(&canonical_extension->restart,
e->rtems_task_restart);
e->thread_restart);
rtems_monitor_symbol_canonical_by_value(&canonical_extension->delete,
e->rtems_task_delete);
e->thread_delete);
rtems_monitor_symbol_canonical_by_value(&canonical_extension->tswitch,
e->task_switch);
e->thread_switch);
rtems_monitor_symbol_canonical_by_value(&canonical_extension->begin,
e->task_begin);
e->thread_begin);
rtems_monitor_symbol_canonical_by_value(&canonical_extension->exitted,
e->task_exitted);
e->thread_exitted);
rtems_monitor_symbol_canonical_by_value(&canonical_extension->fatal,
e->fatal);
}

View File

@@ -92,7 +92,10 @@ rtems_monitor_object_info_t rtems_monitor_object_info[] =
(rtems_monitor_object_dump_fn) rtems_monitor_driver_dump,
},
{ RTEMS_OBJECT_DNAME,
(void *) &rtems_driver_name_table[0],
/* XXX now that the driver name table is allocated from the */
/* XXX Workspace, this does not work */
(void *) 0,
/* (void *) _IO_Driver_name_table, */
sizeof(rtems_monitor_dname_t),
(rtems_monitor_object_next_fn) rtems_monitor_dname_next,
(rtems_monitor_object_canonical_fn) rtems_monitor_dname_canonical,

View File

@@ -219,7 +219,7 @@ rtems_monitor_server_init(
{
rtems_status_code status;
if (_Configuration_Is_multiprocessing() &&
if (_System_state_Is_multiprocessing &&
(_Configuration_MP_table->maximum_nodes > 1))
{
unsigned32 maximum_nodes = _Configuration_MP_table->maximum_nodes;

View File

@@ -19,6 +19,9 @@ rtems_monitor_task_canonical(
)
{
Thread_Control *rtems_thread = (Thread_Control *) thread_void;
RTEMS_API_Control *api;
api = rtems_thread->API_Extensions[ THREAD_API_RTEMS ];
canonical_task->entry = rtems_thread->Start.entry_point;
canonical_task->argument = rtems_thread->Start.numeric_argument;
@@ -27,11 +30,18 @@ rtems_monitor_task_canonical(
canonical_task->priority = rtems_thread->current_priority;
canonical_task->state = rtems_thread->current_state;
canonical_task->wait_id = rtems_thread->Wait.id;
canonical_task->events = rtems_thread->RTEMS_API->pending_events;
canonical_task->modes = rtems_thread->current_modes;
canonical_task->attributes = 0 /* XXX FIX ME rtems_thread->RTEMS_API->attribute_set */;
(void) memcpy(canonical_task->notepad, rtems_thread->RTEMS_API->Notepads, sizeof(canonical_task->notepad));
canonical_task->events = api->pending_events;
/* XXX modes and attributes only exist in the RTEMS API .. */
/* XXX not directly in the core thread.. they will have to be derived */
/* XXX if they are important enough to include anymore. */
canonical_task->modes = 0; /* XXX FIX ME.... rtems_thread->current_modes; */
canonical_task->attributes = 0 /* XXX FIX ME rtems_thread->API_Extensions[ THREAD_API_RTEMS ]->attribute_set */;
(void) memcpy(canonical_task->notepad, api ->Notepads, sizeof(canonical_task->notepad));
/* XXX more to fix */
/*
(void) memcpy(&canonical_task->wait_args, &rtems_thread->Wait.Extra, sizeof(canonical_task->wait_args));
*/
}

View File

@@ -18,18 +18,9 @@
*
*/
#include <rtems/system.h>
#include <rtems/extension.h>
#include <rtems/fatal.h>
#include <rtems/heap.h>
#include <rtems/stack.h>
#include <rtems/thread.h>
#ifdef XXX_RTEMS_H_FIXED
#include <bsp.h>
#else
#include <rtems/config.h>
#include <rtems.h>
extern rtems_configuration_table BSP_Configuration;
#endif
#include <assert.h>
#include <stdio.h>
@@ -56,6 +47,7 @@ rtems_extensions_table Stack_check_Extension_table = {
0, /* rtems_task_restart */
0, /* rtems_task_delete */
Stack_check_Switch_extension, /* task_switch */
0, /* task_post_switch */
Stack_check_Begin_extension, /* task_begin */
0, /* task_exitted */
Stack_check_Fatal_extension, /* fatal */
@@ -133,9 +125,13 @@ unsigned32 stack_check_initialized = 0;
void Stack_check_Initialize( void )
{
rtems_status_code status;
Objects_Id id_ignored;
unsigned32 *p;
rtems_status_code status;
Objects_Id id_ignored;
unsigned32 *p;
unsigned32 i;
unsigned32 class_index;
Thread_Control *the_thread;
Objects_Information *information;
if (stack_check_initialized)
return;
@@ -171,10 +167,31 @@ void Stack_check_Initialize( void )
* So pretend here that we actually ran create and begin extensions.
*/
/* XXX
*
* Technically this has not been done for any task created before this
* happened. So just run through them and fix the situation.
*/
#if 0
if (_Thread_Executing)
{
Stack_check_Create_extension(_Thread_Executing, _Thread_Executing);
}
#endif
#if 0
for ( class_index = OBJECTS_CLASSES_FIRST ;
class_index <= OBJECTS_CLASSES_LAST ;
class_index++ ) {
information = _Objects_Information_table[ class_index ];
if ( information && information->is_thread ) {
for ( i=1 ; i <= information->maximum ; i++ ) {
the_thread = (Thread_Control *)information->local_table[ i ];
Stack_check_Create_extension( the_thread, the_thread );
}
}
}
#endif
/*
* If appropriate, setup the interrupt stack for high water testing
@@ -197,13 +214,15 @@ void Stack_check_Initialize( void )
* Stack_check_Create_extension
*/
void Stack_check_Create_extension(
boolean Stack_check_Create_extension(
Thread_Control *running,
Thread_Control *the_thread
)
{
if (the_thread && (the_thread != _Thread_Executing))
if (the_thread /* XXX && (the_thread != _Thread_Executing) */ )
stack_check_dope_stack(&the_thread->Start.Initial_stack);
return TRUE;
}
/*PAGE

View File

@@ -50,7 +50,7 @@ typedef struct {
* Stack_check_Create_extension
*/
void Stack_check_Create_extension(
boolean Stack_check_Create_extension(
Thread_Control *running,
Thread_Control *the_thread
);

View File

@@ -80,7 +80,8 @@ init_frames:
*/
ldconst 0,g0
ldconst 0,g1
call _bsp_start
ldconst 0,g2
call _main
ret
END_CODE

View File

@@ -97,7 +97,14 @@ loop: movel #0,a1@+ | to zero out uninitialized
movec a0,isp | set interrupt stack
#endif
jsr SYM (bsp_start)
movel #0,a7@- | push environp
movel #0,a7@- | push argv
movel #0,a7@- | push argc
jsr SYM (main)
addl #12,a7
#if ( M68K_HAS_SEPARATE_STACKS == 1 )
move.l SYM (initial_isp),a0
movec a0,isp