2000-08-11 Charles-Antoine Gauthier <charles.gauthier@nrc.ca>

* README:
	* console/console.c:
	* include/bsp.h:
	* network/network.c:
	* startup/bspstart.c:
	Add support for configuration parameters in NVRAM
This commit is contained in:
Joel Sherrill
2000-08-25 17:24:49 +00:00
parent 060d5387a4
commit 00ff4cd6ac
6 changed files with 570 additions and 158 deletions

View File

@@ -1,3 +1,12 @@
2000-08-11 Charles-Antoine Gauthier <charles.gauthier@nrc.ca>
* README:
* console/console.c:
* include/bsp.h:
* network/network.c:
* startup/bspstart.c:
Add support for configuration parameters in NVRAM
2000-08-11 Charles-Antoine Gauthier <charles.gauthier@nrc.ca> 2000-08-11 Charles-Antoine Gauthier <charles.gauthier@nrc.ca>
* console/console.c: Fix polled input. * console/console.c: Fix polled input.

View File

@@ -1,16 +1,24 @@
#
# $Id$
#
This is a README file for the MBX860/MBX821 port of RTEMS 4.5.0 This is a README file for the MBX860/MBX821 port of RTEMS 4.5.0
Please send any comments, improvements, or bug reports to: Please send any comments, improvements, or bug reports to:
Darlene A. Stewart Charles-Antoine Gauthier
charles.gauthier@nrc.ca
or
Darlene Stewart
Darlene.Stewart@nrc.ca
Software Engineering Group Software Engineering Group
Institute for Information Technology Institute for Information Technology
National Research Council of Canada National Research Council of Canada
Ottawa, ON, K1A 0R6 Ottawa, ON, K1A 0R6
Canada Canada
Darlene.Stewart@nrc.ca
Disclaimer Disclaimer
@@ -124,10 +132,10 @@ On-chip resources:
Board description Board description
----------------- -----------------
Clock rate: 50MHz Entry level boards, 40 MHz others. Clock rate: 50MHz Entry level boards, 40 MHz others.
Bus width: 8/32 bit Flash, 32 bit DRAM Bus width: 8/32 bit Flash, 32 bit DRAM
FLASH: 2-4MB, 120ns FLASH: 2-4MB, 120ns
RAM: 4-16MB EDO, 60ns DRAM DIMM RAM: 4-16MB EDO, 60ns DRAM DIMM
Installation Installation
@@ -165,11 +173,12 @@ Port Description
Console driver Console driver
--------------- ---------------
This BSP includes an termios-capable asynchronous serial line driver This BSP includes an termios-capable asynchronous serial line driver that
that supports SMC1, SMC2, SCC2, and SCC3 and SCC4 if present. The RTEMS supports SMC1, SMC2, SCC2, and SCC3 and SCC4 if present. The RTEMS console is
console is selected in rtems/make/custom/mbx8xx.cfg with the selected in rtems/make/custom/mbx8xx.cfg with the CONSOLE_MINOR variable, or
CONSOLE_MINOR variable. We normally run with the RTEMS application in NVRAM if that option is enabled in the rtems/make/custom/mbx8xx.cfg file.
console on SMC2. SMC1 is used by the debugger. We normally run with the RTEMS application console on SMC2. SMC1 is used by
the debugger.
Support is provided for five different modes of operation: Support is provided for five different modes of operation:
@@ -180,20 +189,24 @@ Support is provided for five different modes of operation:
5. interrupt-driven I/O done by the supplied device driver with termios 5. interrupt-driven I/O done by the supplied device driver with termios
support. support.
The mode of operation of the serial driver is determined at build time If NVRAM_CONFIGURE is set to 1 in rtems/make/custom/mbx8xx.cfg, the mode of
by the value of the UARTS_IO_MODE constant in rtems/make/custom/mbx8xx.cfg. operation of the driver is determined at boot time from the values stored
Edit the file to select the type of I/O desired before building RTEMS. in the user area in NVRAM. See the Configuration Parameters section below for
The choices are: instructions on setting up NVRAM. Otherwise, the mode of operation of the
serial driver is determined at build time in part by the value of the
UARTS_IO_MODE constant in rtems/make/custom/mbx8xx.cfg. Edit the file to select
the type of I/O desired before building RTEMS. The choices are:
0 - polled I/O done by the supplied device driver, 0 - polled I/O done by the supplied device driver,
1 - interrupt-driven I/O done by the supplied device driver, 1 - interrupt-driven I/O done by the supplied device driver,
2 - polled I/O done by EPPC-Bug. 2 - polled I/O done by EPPC-Bug.
Also set the value of UARTS_USE_TERMIOS to select whether termios should Also, if NVRAM_CONFIGURE is not set to 1 in rtems/make/custom/mbx8xx.cfg, set
be used to perform buffering and input/output processing. Without termios the value of UARTS_USE_TERMIOS to select whether termios should be used to
support, input processing is limited to the substitution of LF for a perform buffering and input/output processing. Without termios support, input
received CR, and output processing is limited to the transmission of a processing is limited to the substitution of LF for a received CR, and output
CR following the transmission of a LF. The choices for UARTS_USE_TERMIOS are: processing is limited to the transmission of a CR following the transmission of
a LF. The choices for UARTS_USE_TERMIOS are:
0 - do not use termios 0 - do not use termios
1 - use termios 1 - use termios
@@ -226,21 +239,31 @@ interrupts disabled.
Support is provided to send printk output to any port. Specify the desired Support is provided to send printk output to any port. Specify the desired
port at build time in rtems/make/custom/mbx8xx.cfg by setting the value port at build time in rtems/make/custom/mbx8xx.cfg by setting the value
of PRINTK_MINOR to one of SMC1_MINOR, SMC2_MINOR, SCC2_MINOR, SCC3_MINOR, of PRINTK_MINOR to one of SMC1_MINOR, SMC2_MINOR, SCC2_MINOR, SCC3_MINOR,
or SCC4_MINOR. or SCC4_MINOR. Alternatively, if NVRAM_CONFIGURE is set to 1 in
rtems/make/custom/mbx8xx.cfg, the printk port is selected based on data that
is stored in the user area in NVRAM. See the Configuration Parameters section
below for instructions on setting up NVRAM.
Select the type of output desired for printk() by setting the value of Select the type of output desired for printk() by setting the value of
PRINTK_IO_MODE in rtems/make/custom/mbx8xx.cfg. The choices are: PRINTK_IO_MODE in rtems/make/custom/mbx8xx.cfg. The choices are:
0 - polled I/O done by the supplied device driver, 0 - polled I/O done by the supplied device driver,
1 - interrupt-driven I/O done by the supplied device driver, 1 - polled I/O done by the supplied device driver,
2 - polled I/O done by EPPC-Bug. 2 - polled I/O done by EPPC-Bug.
printk() does not use termios. printk() does not use termios.
If the printk() port is opened by RTEMS, then PRINK_IO_MODE mode must have If the printk() port is opened by RTEMS, then PRINK_IO_MODE mode must have
the same value as UARTS_IO_MODE, otherwise the I/O functions will be in the same value as UARTS_IO_MODE, otherwise the I/O functions will be in
conflict. Interrupt-driven printk() output is only possible if the port is conflict. Interrupt-driven printk() output did not work, although we think
opened before hand by an RTEMS application, and is of dubious value... that it should have. It would have been of dubious value anyways. If
interrupt-driven I/O is selected (value of 1), the driver defaults to using
polled I/O through the RTEMS driver.
IMPORTANT: Polled I/O through the RTEMS driver requires that the driver be
initialized. Consequently, to debug startup code using printk prior to the
initialization of the serial driver, use mode 2: polled I/O through EPPC-Bug,
and read the next section.
EPPC-Bug and I/O EPPC-Bug and I/O
@@ -305,10 +328,15 @@ set language auto
end end
IMPORTANT: When using EPPC-Bug on SMC1, either for debugging or for polled I/O, IMPORTANT: When using EPPC-Bug on SMC1, either for debugging or for polled I/O,
EPPCBUG_SMC1 must be defined in rtems/make/custom/mbx8xx.cfg. Defining this EPPCBUG_SMC1 must be defined in rtems/make/custom/mbx8xx.cfg, or the eppc_bug
constant prevents the device driver from re-initializing SMC1. It also causes field set to non-zero in NVRAM. Defining this constant prevents the device
the network driver, the clock driver, and the asynchronous serial line driver driver from re-initializing SMC1. It also causes the network driver, the clock
to maintain simask_copy for use by gdb. driver, and the asynchronous serial line driver to maintain simask_copy for use
by gdb.
Polled I/O through EPPC-Bug is pretty funky... If your are old enough, it might
bring back fond memories of the days of 300 baud modems. If not, you can
experience for yourself what the state of the art used to be.
Floating-point Floating-point
@@ -319,6 +347,89 @@ get compiled with the appropriate -mcpu flag. The nof variants of the gcc
runtime libraries should be used for linking. runtime libraries should be used for linking.
Configuration Parameters
------------------------
If NVRAM_CONFIGURE is set in rtems/make/custom/mbx8xx.cfg, certain
configuration parameters will be read from the first 31 bytes of the NVRAM
User Area, which starts at 0xFA001000. The user is responsible for writing
the appropriate values in NVRAM (via EPPC-Bug). The paramaters
that are configurable and their default settings are described below.
Cache Mode (0xFA001000 - 1 byte)
Set the following bits in the byte to control the caches:
bit 0
0 - data cache disable
1 - data cache enable
bit 1
0 - instruction cache disable
1 - instruction cache enable
If enabled, all of RAM except for the last 512 KB will be cached using
copyback mode. The last 512 KB of RAMis for the use of EPPC-Bug.
Console driver I/O mode (0xFA001001 - 1 byte)
Set the following bits in the byte to set the desired I/O mode
for the rtems ports:
bit 0
0 - do not use termios
1 - use termios
bit 2 & 1
00 - polled I/O through RTEMS driver
01 - interrupt-driven I/O
10 - polled I/O through EPPC-Bug
Set the following bits in the byte to set the desired I/O mode
for printk:
bit 5 & 4
00 - polled I/O through RTEMS driver
01 - polled I/O through RTEMS driver
10 - polled I/O through EPPC-Bug
Console driver ports (0xFA001002 - 1 byte)
Set the following bits in the byte to select the console and printk ports:
bit 2, 1 & 0 select the RTEMS console port
000 - /dev/tty0, SMC1
001 - /dev/tty1, SMC2
011 - /dev/tty2, SCC2
100 - /dev/tty3, SCC3
101 - /dev/tty4, SCC4
bit 6, 5 & 4 select the RTEMS printk port
000 - /dev/tty0, SMC1
001 - /dev/tty1, SMC2
011 - /dev/tty2, SCC2
100 - /dev/tty3, SCC3
101 - /dev/tty4, SCC4
If the printk port is the same as some other port that will be opened by an
RTEMS application, then the driver must use polled I/O, or the printk port
must not be used.
EPPC-Bug in use on SMC1 (0xFA001003 - 1 byte)
Set to non-zero to indicate that EPPC-Bug is using SMC1. This will prevent
the SMC1 port from being re-initialized.
IP Address (0xFA001004 - 4 bytes)
Write the hexadecimal representation of the IP address of the board in this
location, e.g. 192.168.1.2 = 0xC0A80102
Netmask (0xFA001008 - 4 bytes)
Write the hexadecimal representation of the netmask in this location
for example, 255.255.255.0 = 0xFFFFFF00
Ethernet Address (0xFA00100C - 6 bytes)
Write the Ethernet address of the board in this location
Processor ID (0xFA001012 - 2 bytes)
Reserved for future use
RMA start (0xFA001014 - 4 bytes)
Reserved for future use
VMA start (0xFA001018 - 4 bytes)
Reserved for future use
RamSize (0xFA00101C - 4 bytes)
Reserved for future use
Miscellaneous Miscellaneous
------------- -------------
@@ -349,42 +460,18 @@ should have been documented in the rtems/c/src/tests/PROBLEMS file. The moral
of this story is: do not do I/O from the constructors or destructors of static of this story is: do not do I/O from the constructors or destructors of static
objects. objects.
The cpuuse and malloctest tests do not work properly, either with polled I/O When using interrupt-driven I/O, psx08 fails with an internal assertion error.
or interrupt-driven I/O. They are known not to work with interrupt-driven I/O,
but should work with polled I/O?
Output stops prematurely in the termios test when the console is operating in
interrupt-driven mode because the serial port is re-initialized before all
characters in the last raw output buffer are sent. Adding calls to tcdrain()
in the test task helps, but it does not solve the problem. What happens is
that the CD2401 raises a transmit interrupt when the last character in the
DMA buffer is written into the transmit FIFO, not when the last character
has been transmitted. When tcdrain() returns, there might be up to 16
characters in the output FIFO. The call to tcsetattr() causes the serial port
to re-initialize, at which point the output FIFO is cleared. We could not find
a way to detect whether characters are still in the FIFO and to wait for them
to be transmitted.
The first raw buffer to be transmitted after the console is re-initialized
with tcsetattr() is garbled. At this time, it does not seem worth while to
track this problem down.
In the stackchk test, an access fault exception is raised after the stack is
blown. This is one case were overwritting the first or last 16 bytes of the
stack does cause problems (but hey, an exception occurred, which is better
than propagating the error).
When using interrupt-driven I/O, psx08 produces all the expected output, but
it does not return control to 167Bug. Is this test supposed to work with
interrupt-driven console I/O?
What's new What is new
---------- ----------
All known problems with use of the caches on the MBX860-002 and MBX821-001 All known problems with use of the caches on the MBX860-002 and MBX821-001
have been resolved. have been resolved.
Configuration of the console and network is now possible at boot time through
NVRAM parameters.
Thanks Thanks
------ ------

View File

@@ -81,19 +81,12 @@
#include <rtems/libio.h> #include <rtems/libio.h>
#include <termios.h> #include <termios.h>
#if UARTS_IO_MODE == 0
#define BSP_WRITE m8xx_uart_pollWrite
#define BSP_READ m8xx_uart_pollRead
#elif UARTS_IO_MODE == 1
#define BSP_WRITE m8xx_uart_write
#elif UARTS_IO_MODE == 2
#define BSP_WRITE _EPPCBug_pollWrite
#define BSP_READ _EPPCBug_pollRead
#endif
static int _EPPCBug_pollRead( int minor ); static int _EPPCBug_pollRead( int minor );
static int _EPPCBug_pollWrite( int minor, const char *buf, int len ); static int _EPPCBug_pollWrite( int minor, const char *buf, int len );
static void _BSP_output_char( char c ); static void _BSP_output_char( char c );
static rtems_status_code do_poll_read( rtems_device_major_number major, rtems_device_minor_number minor, void * arg);
static rtems_status_code do_poll_write( rtems_device_major_number major, rtems_device_minor_number minor, void * arg);
BSP_output_char_function_type BSP_output_char = _BSP_output_char; BSP_output_char_function_type BSP_output_char = _BSP_output_char;
@@ -112,7 +105,7 @@ BSP_output_char_function_type BSP_output_char = _BSP_output_char;
* Return value: char returned as positive signed int * Return value: char returned as positive signed int
* -1 if no character is present in the input FIFO. * -1 if no character is present in the input FIFO.
*/ */
int _EPPCBug_pollRead( static int _EPPCBug_pollRead(
int minor int minor
) )
{ {
@@ -220,7 +213,7 @@ int _EPPCBug_pollRead(
* *
* Return value: IGNORED * Return value: IGNORED
*/ */
int _EPPCBug_pollWrite( static int _EPPCBug_pollWrite(
int minor, int minor,
const char *buf, const char *buf,
int len int len
@@ -330,17 +323,183 @@ error:
} }
/*
* do_poll_read
*
* Input characters through polled I/O. Returns has soon as a character has
* been received. Otherwise, if we wait for the number of requested characters,
* we could be here forever!
*
* CR is converted to LF on input. The terminal should not send a CR/LF pair
* when the return or enter key is pressed.
*
* Input parameters:
* major - ignored. Should be the major number for this driver.
* minor - selected channel.
* arg->buffer - where to put the received characters.
* arg->count - number of characters to receive before returning--Ignored.
*
* Output parameters:
* arg->bytes_moved - the number of characters read. Always 1.
*
* Return value: RTEMS_SUCCESSFUL
*
* CANNOT BE COMBINED WITH INTERRUPT DRIVEN I/O!
*/
static rtems_status_code do_poll_read(
rtems_device_major_number major,
rtems_device_minor_number minor,
void * arg
)
{
rtems_libio_rw_args_t *rw_args = arg;
int c;
#if NVRAM_CONFIGURE == 1
int (*pollRead)( int minor );
if ( (nvram->console_mode & 0x06) == 0x04 )
pollRead = _EPPCBug_pollRead;
else
pollRead = m8xx_uart_pollRead;
while( (c = (*pollRead)(minor)) == -1 );
rw_args->buffer[0] = (unsigned8)c;
if( rw_args->buffer[0] == '\r' )
rw_args->buffer[0] = '\n';
rw_args->bytes_moved = 1;
return RTEMS_SUCCESSFUL;
#else
#if UARTS_IO_MODE == 2
#define BSP_READ _EPPCBug_pollRead
#else
#define BSP_READ m8xx_uart_pollRead
#endif
while( (c = BSP_READ(minor)) == -1 );
rw_args->buffer[0] = (unsigned8)c;
if( rw_args->buffer[0] == '\r' )
rw_args->buffer[0] = '\n';
rw_args->bytes_moved = 1;
return RTEMS_SUCCESSFUL;
#endif
}
/*
* do_poll_write
*
* Output characters through polled I/O. Returns only once every character has
* been sent.
*
* CR is transmitted AFTER a LF on output.
*
* Input parameters:
* major - ignored. Should be the major number for this driver.
* minor - selected channel
* arg->buffer - where to get the characters to transmit.
* arg->count - the number of characters to transmit before returning.
*
* Output parameters:
* arg->bytes_moved - the number of characters read
*
* Return value: RTEMS_SUCCESSFUL
*
* CANNOT BE COMBINED WITH INTERRUPT DRIVEN I/O!
*/
static rtems_status_code do_poll_write(
rtems_device_major_number major,
rtems_device_minor_number minor,
void * arg
)
{
rtems_libio_rw_args_t *rw_args = arg;
unsigned32 i;
char cr ='\r';
#if NVRAM_CONFIGURE == 1
int (*pollWrite)(int minor, const char *buf, int len);
if ( (nvram->console_mode & 0x06) == 0x04 )
pollWrite = _EPPCBug_pollWrite;
else
pollWrite = m8xx_uart_pollWrite;
for( i = 0; i < rw_args->count; i++ ) {
(*pollWrite)(minor, &(rw_args->buffer[i]), 1);
if ( rw_args->buffer[i] == '\n' )
(*pollWrite)(minor, &cr, 1);
}
rw_args->bytes_moved = i;
return RTEMS_SUCCESSFUL;
#else
#if UARTS_IO_MODE == 2
#define BSP_WRITE _EPPCBug_pollWrite
#else
#define BSP_WRITE m8xx_uart_pollWrite
#endif
for( i = 0; i < rw_args->count; i++ ) {
BSP_WRITE(minor, &(rw_args->buffer[i]), 1);
if ( rw_args->buffer[i] == '\n' )
BSP_WRITE(minor, &cr, 1);
}
rw_args->bytes_moved = i;
return RTEMS_SUCCESSFUL;
#endif
}
/* /*
* Print functions prototyped in bspIo.h * Print functions prototyped in bspIo.h
*/ */
void _BSP_output_char( char c ) static void _BSP_output_char( char c )
{ {
char cr = '\r'; char cr = '\r';
BSP_WRITE( PRINTK_MINOR, &c, 1 ); /*
* Can't rely on console_initialize having been called before this function
* is used, so it may fail unless output is done through EPPC-Bug.
*/
#if NVRAM_CONFIGURE == 1
rtems_device_minor_number printk_minor;
/* Use NVRAM info for configuration */
printk_minor = (nvram->console_printk_port & 0x70) >> 4;
if( (nvram->console_mode & 0x30) == 0x20 ) {
_EPPCBug_pollWrite( printk_minor, &c, 1 );
if( c == '\n' )
_EPPCBug_pollWrite( printk_minor, &cr, 1 );
}
else {
m8xx_uart_pollWrite( printk_minor, &c, 1 );
if( c == '\n' )
m8xx_uart_pollWrite( PRINTK_MINOR, &cr, 1 );
}
#else
#if PRINTK_IO_MODE == 2
#define PRINTK_WRITE _EPPCBug_pollWrite
#else
#define PRINTK_WRITE m8xx_uart_pollWrite
#endif
PRINTK_WRITE( PRINTK_MINOR, &c, 1 );
if( c == '\n' ) if( c == '\n' )
BSP_WRITE( PRINTK_MINOR, &cr, 1 ); PRINTK_WRITE( PRINTK_MINOR, &cr, 1 );
#endif
} }
@@ -362,13 +521,62 @@ rtems_device_driver console_initialize(
) )
{ {
rtems_status_code status; rtems_status_code status;
rtems_device_minor_number console_minor;
/* /*
* Set up TERMIOS * Set up TERMIOS if needed
*/ */
#if NVRAM_CONFIGURE == 1
/* Use NVRAM info for configuration */
console_minor = nvram->console_printk_port & 0x07;
if ( nvram->console_mode & 0x01 )
/* termios */
rtems_termios_initialize ();
/*
* Do common initialization.
*/
m8xx_uart_initialize();
/*
* Do device-specific initialization
*/
if ( !nvram->eppcbug_smc1 &&
( ((nvram->console_mode & 0x30) != 0x20) ||
(((nvram->console_printk_port & 0x30) >> 4) != SMC1_MINOR) ) )
m8xx_uart_smc_initialize(SMC1_MINOR); /* /dev/tty0 */
if ( ((nvram->console_mode & 0x30) != 0x20) ||
(((nvram->console_printk_port & 0x30) >> 4) != SMC2_MINOR) )
m8xx_uart_smc_initialize(SMC2_MINOR); /* /dev/tty1 */
if ( ((nvram->console_mode & 0x30) != 0x20) ||
(((nvram->console_printk_port & 0x30) >> 4) != SCC2_MINOR) )
m8xx_uart_scc_initialize(SCC2_MINOR); /* /dev/tty2 */
#ifdef mpc860
if ( ((nvram->console_mode & 0x30) != 0x20) ||
(((nvram->console_printk_port & 0x30) >> 4) != SCC3_MINOR) )
m8xx_uart_scc_initialize(SCC3_MINOR); /* /dev/tty3 */
if ( ((nvram->console_mode & 0x30) != 0x20) ||
(((nvram->console_printk_port & 0x30) >> 4) != SCC4_MINOR) )
m8xx_uart_scc_initialize(SCC4_MINOR); /* /dev/tty4 */
#endif /* mpc860 */
#else /* NVRAM_CONFIGURE != 1 */
console_minor = CONSOLE_MINOR;
#if UARTS_USE_TERMIOS == 1 #if UARTS_USE_TERMIOS == 1
rtems_termios_initialize();
#endif rtems_termios_initialize ();
#endif /* UARTS_USE_TERMIOS */
/* /*
* Do common initialization. * Do common initialization.
*/ */
@@ -401,6 +609,9 @@ rtems_device_driver console_initialize(
#endif /* mpc860 */ #endif /* mpc860 */
#endif /* NVRAM_CONFIGURE != 1 */
/* /*
* Set up interrupts * Set up interrupts
*/ */
@@ -430,7 +641,7 @@ rtems_device_driver console_initialize(
#endif /* mpc860 */ #endif /* mpc860 */
/* Now register the RTEMS console */ /* Now register the RTEMS console */
status = rtems_io_register_name ("/dev/console", major, CONSOLE_MINOR); status = rtems_io_register_name ("/dev/console", major, console_minor);
if (status != RTEMS_SUCCESSFUL) if (status != RTEMS_SUCCESSFUL)
rtems_fatal_error_occurred (status); rtems_fatal_error_occurred (status);
@@ -448,14 +659,11 @@ rtems_device_driver console_open(
) )
{ {
/* Used to track termios private data for callbacks */ /* Used to track termios private data for callbacks */
#if UARTS_IO_MODE == 1
extern struct rtems_termios_tty *ttyp[]; extern struct rtems_termios_tty *ttyp[];
rtems_libio_open_close_args_t *args = arg; rtems_libio_open_close_args_t *args = arg;
#endif
rtems_status_code sc; rtems_status_code sc;
#if UARTS_USE_TERMIOS == 1
static const rtems_termios_callbacks sccEPPCBugCallbacks = { static const rtems_termios_callbacks sccEPPCBugCallbacks = {
NULL, /* firstOpen */ NULL, /* firstOpen */
NULL, /* lastClose */ NULL, /* lastClose */
@@ -465,6 +673,7 @@ rtems_device_driver console_open(
NULL, /* startRemoteTx */ NULL, /* startRemoteTx */
0 /* outputUsesInterrupts */ 0 /* outputUsesInterrupts */
}; };
static const rtems_termios_callbacks intrCallbacks = { static const rtems_termios_callbacks intrCallbacks = {
NULL, /* firstOpen */ NULL, /* firstOpen */
NULL, /* lastClose */ NULL, /* lastClose */
@@ -475,6 +684,7 @@ rtems_device_driver console_open(
NULL, /* startRemoteTx */ NULL, /* startRemoteTx */
1 /* outputUsesInterrupts */ 1 /* outputUsesInterrupts */
}; };
static const rtems_termios_callbacks pollCallbacks = { static const rtems_termios_callbacks pollCallbacks = {
NULL, /* firstOpen */ NULL, /* firstOpen */
NULL, /* lastClose */ NULL, /* lastClose */
@@ -485,35 +695,53 @@ rtems_device_driver console_open(
NULL, /* startRemoteTx */ NULL, /* startRemoteTx */
0 /* outputUsesInterrupts */ 0 /* outputUsesInterrupts */
}; };
#endif
if ( minor > NUM_PORTS-1 ) if ( minor > NUM_PORTS-1 )
return RTEMS_INVALID_NUMBER; return RTEMS_INVALID_NUMBER;
#if NVRAM_CONFIGURE == 1
/* Use NVRAM info for configuration */
if ( nvram->console_mode & 0x01 ) {
/* Use termios */
if ( (nvram->console_mode & 0x06) == 0x02 ) {
/* interrupt-driven I/O */
sc = rtems_termios_open( major, minor, arg, &intrCallbacks );
ttyp[minor] = args->iop->data1; /* Keep cookie returned by termios_open */
return sc;
}
else if ( (nvram->console_mode & 0x06) == 0x04 )
/* polled I/O through EPPC-Bug, better be through SMC1 */
return rtems_termios_open( major, minor, arg, &sccEPPCBugCallbacks );
else
/* normal polled I/O */
return rtems_termios_open( major, minor, arg, &pollCallbacks );
}
else
/* no termios -- default to polled I/O */
return RTEMS_SUCCESSFUL;
#else /* NVRAM_CONFIGURE != 1 */
#if UARTS_USE_TERMIOS == 1 #if UARTS_USE_TERMIOS == 1
#if UARTS_IO_MODE == 2 /* EPPCBug polled I/O with termios */ #if UARTS_IO_MODE == 2 /* EPPCBug polled I/O with termios */
sc = rtems_termios_open( major, minor, arg, &sccEPPCBugCallbacks );
sc = rtems_termios_open (major, minor, arg, &sccEPPCBugCallbacks);
#elif UARTS_IO_MODE == 1 /* RTEMS interrupt-driven I/O with termios */ #elif UARTS_IO_MODE == 1 /* RTEMS interrupt-driven I/O with termios */
sc = rtems_termios_open( major, minor, arg, &intrCallbacks );
sc = rtems_termios_open (major, minor, arg, &intrCallbacks);
ttyp[minor] = args->iop->data1; /* Keep cookie returned by termios_open */ ttyp[minor] = args->iop->data1; /* Keep cookie returned by termios_open */
#else /* RTEMS polled I/O with termios */ #else /* RTEMS polled I/O with termios */
sc = rtems_termios_open( major, minor, arg, &pollCallbacks );
sc = rtems_termios_open (major, minor, arg, &pollCallbacks);
#endif #endif
#else /* Nothing to do if termios is not used */ #else /* UARTS_USE_TERMIOS != 1 */
/* no termios -- default to polled I/O */
sc = RTEMS_SUCCESSFUL; sc = RTEMS_SUCCESSFUL;
#endif /* UARTS_USE_TERMIOS != 1 */
#endif
return sc; return sc;
#endif /* NVRAM_CONFIGURE != 1 */
} }
@@ -529,11 +757,25 @@ rtems_device_driver console_close(
if ( minor > NUM_PORTS-1 ) if ( minor > NUM_PORTS-1 )
return RTEMS_INVALID_NUMBER; return RTEMS_INVALID_NUMBER;
#if NVRAM_CONFIGURE == 1
/* Use NVRAM info for configuration */
if ( nvram->console_mode & 0x01 )
/* use termios */
return rtems_termios_close( arg );
else
/* no termios */
return RTEMS_SUCCESSFUL;
#else /* NVRAM_CONFIGURE != 1 */
#if UARTS_USE_TERMIOS == 1 #if UARTS_USE_TERMIOS == 1
return rtems_termios_close (arg); return rtems_termios_close( arg );
#else #else
return RTEMS_SUCCESSFUL; return RTEMS_SUCCESSFUL;
#endif #endif
#endif /* NVRAM_CONFIGURE != 1 */
} }
@@ -546,33 +788,25 @@ rtems_device_driver console_read(
void *arg void *arg
) )
{ {
#if UARTS_USE_TERMIOS != 1
rtems_libio_rw_args_t *rw_args = arg;
int c;
#endif
if ( minor > NUM_PORTS-1 ) if ( minor > NUM_PORTS-1 )
return RTEMS_INVALID_NUMBER; return RTEMS_INVALID_NUMBER;
#if UARTS_USE_TERMIOS == 1 #if NVRAM_CONFIGURE == 1
/* Use NVRAM info for configuration */
if ( nvram->console_mode & 0x01 )
/* use termios */
return rtems_termios_read( arg );
else
/* no termios -- default to polled */
return do_poll_read( major, minor, arg );
return rtems_termios_read(arg);
#else #else
#if UARTS_IO_MODE != 1 /* Polled I/O without termios */ #if UARTS_USE_TERMIOS == 1
return rtems_termios_read( arg );
while( (c = BSP_READ( minor )) == -1 ); #else
rw_args->buffer[0] = (unsigned8)c; return do_poll_read( major, minor, arg );
if( rw_args->buffer[0] == '\r' )
rw_args->buffer[0] = '\n';
rw_args->bytes_moved = 1;
return RTEMS_SUCCESSFUL;
#else /* RTEMS interrupt-driven I/O without termios */
#error "Interrupt-driven input without termios is not yet supported"
#endif #endif
#endif #endif
@@ -588,36 +822,26 @@ rtems_device_driver console_write(
void *arg void *arg
) )
{ {
#if UARTS_USE_TERMIOS != 1
rtems_libio_rw_args_t *rw_args = arg;
unsigned32 i;
char cr = '\r';
#endif
if ( minor > NUM_PORTS-1 ) if ( minor > NUM_PORTS-1 )
return RTEMS_INVALID_NUMBER; return RTEMS_INVALID_NUMBER;
#if UARTS_USE_TERMIOS == 1 #if NVRAM_CONFIGURE == 1
/* Use NVRAM info for configuration */
if ( nvram->console_mode & 0x01 )
/* use termios */
return rtems_termios_write( arg );
else
/* no termios -- default to polled */
return do_poll_write( major, minor, arg );
return rtems_termios_write(arg);
#else #else
#if UARTS_IO_MODE != 1 /* Polled I/O without termios*/ #if UARTS_USE_TERMIOS == 1
return rtems_termios_write( arg );
/* Must add carriage return to line feeds */ #else
for( i = 0; i < rw_args->count; i++ ) { /* no termios -- default to polled */
BSP_WRITE( minor, &(rw_args->buffer[i]), 1 ); return do_poll_write( major, minor, arg );
if( rw_args->buffer[i] == '\n' )
BSP_WRITE( minor, &cr, 1 );
}
rw_args->bytes_moved = i;
return RTEMS_SUCCESSFUL;
#else /* RTEMS interrupt-driven I/O without termios */
#error "Interrupt-driven output without termios is not yet supported"
#endif #endif
#endif #endif
@@ -636,10 +860,24 @@ rtems_device_driver console_control(
if ( minor > NUM_PORTS-1 ) if ( minor > NUM_PORTS-1 )
return RTEMS_INVALID_NUMBER; return RTEMS_INVALID_NUMBER;
#if NVRAM_CONFIGURE == 1
/* Uuse NVRAM info for configuration */
if ( nvram->console_mode & 0x01 )
/* termios */
return rtems_termios_ioctl( arg );
else
/* no termios -- default to polled */
return RTEMS_SUCCESSFUL;
#else
#if UARTS_USE_TERMIOS == 1 #if UARTS_USE_TERMIOS == 1
return rtems_termios_ioctl (arg); return rtems_termios_ioctl( arg );
#else #else
return RTEMS_SUCCESSFUL; return RTEMS_SUCCESSFUL;
#endif #endif
#endif
} }

View File

@@ -30,6 +30,30 @@ extern "C" {
#include <mpc8xx/mmu.h> #include <mpc8xx/mmu.h>
#include <mpc8xx/console.h> #include <mpc8xx/console.h>
/*
* Representation of initialization data in NVRAM
*/
typedef volatile struct nvram_config_ {
unsigned char cache_mode; /* 0xFA001000 */
unsigned char console_mode; /* 0xFA001001 */
unsigned char console_printk_port; /* 0xFA001002 */
unsigned char eppcbug_smc1; /* 0xFA001003 */
unsigned long ipaddr; /* 0xFA001004 */
unsigned long netmask; /* 0xFA001008 */
unsigned char enaddr[6]; /* 0xFA00100C */
unsigned short processor_id; /* 0xFA001012 */
unsigned long rma_start; /* 0xFA001014 */
unsigned long vma_start; /* 0xFA001018 */
unsigned long ramsize; /* 0xFA00101C */
} nvram_config;
/*
* Pointer to the base of User Area NVRAM
*/
#define nvram ((nvram_config * const) 0xFA001000)
/* /*
* Network driver configuration * Network driver configuration
*/ */
@@ -70,11 +94,6 @@ extern int rtems_enet_driver_attach (struct rtems_bsdnet_ifconfig *config, int a
#define Lower_tm27_intr() #define Lower_tm27_intr()
/* Constants -- THESE SHOULD BE DEFINED IN THE LINKER SCRIPT */
#define RAM_START 0
#define RAM_END 0x100000
/* miscellaneous stuff assumed to exist */ /* miscellaneous stuff assumed to exist */
extern rtems_configuration_table BSP_Configuration; extern rtems_configuration_table BSP_Configuration;

View File

@@ -52,6 +52,9 @@
#define TX_BUF_COUNT 8 #define TX_BUF_COUNT 8
#define TX_BD_PER_BUF 4 #define TX_BD_PER_BUF 4
#define INET_ADDR_MAX_BUF_SIZE (sizeof "255.255.255.255")
/* /*
* RTEMS event used by interrupt handler to signal daemons. * RTEMS event used by interrupt handler to signal daemons.
* This must *not* be the same event used by the TCP/IP task synchronization. * This must *not* be the same event used by the TCP/IP task synchronization.
@@ -1537,6 +1540,8 @@ rtems_scc1_driver_attach (struct rtems_bsdnet_ifconfig *config)
int mtu; int mtu;
int unitNumber; int unitNumber;
char *unitName; char *unitName;
char *pAddr;
unsigned long addr;
/* /*
* Parse driver name * Parse driver name
@@ -1561,12 +1566,60 @@ rtems_scc1_driver_attach (struct rtems_bsdnet_ifconfig *config)
/* /*
* Process options * Process options
*/ */
#if NVRAM_CONFIGURE == 1
/* Configure from NVRAM */
if ( (addr = nvram->ipaddr) ) {
/* We have a non-zero entry, copy the value */
if ( (pAddr = malloc ( INET_ADDR_MAX_BUF_SIZE, 0, M_NOWAIT )) )
config->ip_address = (char *)inet_ntop(AF_INET, &addr, pAddr, INET_ADDR_MAX_BUF_SIZE -1 );
else
rtems_panic("Can't allocate ip_address buffer!\n");
}
if ( (addr = nvram->netmask) ) {
/* We have a non-zero entry, copy the value */
if ( (pAddr = malloc ( INET_ADDR_MAX_BUF_SIZE, 0, M_NOWAIT )) )
config->ip_netmask = (char *)inet_ntop(AF_INET, &addr, pAddr, INET_ADDR_MAX_BUF_SIZE -1 );
else
rtems_panic("Can't allocate ip_netmask buffer!\n");
}
/* Ethernet address requires special handling -- it must be copied into
* the arpcom struct. The following if construct serves only to give the
* User Area NVRAM parameter the highest priority.
*
* If the ethernet address is specified in NVRAM, go ahead and copy it.
* (ETHER_ADDR_LEN = 6 bytes).
*/
if ( nvram->enaddr[0] || nvram->enaddr[1] || nvram->enaddr[2] ) {
/* Anything in the first three bytes indicates a non-zero entry, copy value */
memcpy ((void *)sc->arpcom.ac_enaddr, &nvram->enaddr, ETHER_ADDR_LEN);
}
else if ( config->hardware_address ) {
/* There is no entry in NVRAM, but there is in the ifconfig struct, so use it. */
memcpy ((void *)sc->arpcom.ac_enaddr, config->hardware_address, ETHER_ADDR_LEN);
}
else {
/* There is no ethernet address provided, so it could be read
* from the Ethernet protocol block of SCC1 in DPRAM.
*/
rtems_panic("No Ethernet address specified!\n");
}
#else /* NVRAM_CONFIGURE != 1 */
if (config->hardware_address) { if (config->hardware_address) {
memcpy (sc->arpcom.ac_enaddr, config->hardware_address, ETHER_ADDR_LEN); memcpy (sc->arpcom.ac_enaddr, config->hardware_address, ETHER_ADDR_LEN);
} }
else { else {
/* FIXME to read the enaddr from NVRAM */ /* There is no ethernet address provided, so it could be read
* from the Ethernet protocol block of SCC1 in DPRAM.
*/
rtems_panic("No Ethernet address specified!\n");
} }
#endif /* NVRAM_CONFIGURE != 1 */
if (config->mtu) if (config->mtu)
mtu = config->mtu; mtu = config->mtu;

View File

@@ -135,13 +135,19 @@ void bsp_start(void)
/* /*
* Enable instruction and data caches. Do not force writethrough mode. * Enable instruction and data caches. Do not force writethrough mode.
*/ */
#ifdef INSTRUCTION_CACHE_ENABLE #if NVRAM_CONFIGURE == 1
rtems_cache_enable_instruction(); if ( nvram->cache_mode & 0x02 )
#endif rtems_cache_enable_instruction();
if ( nvram->cache_mode & 0x01 )
#ifdef DATA_CACHE_ENABLE rtems_cache_enable_data();
rtems_cache_enable_data(); #else
#endif #ifdef INSTRUCTION_CACHE_ENABLE
rtems_cache_enable_instruction();
#endif
#ifdef DATA_CACHE_ENABLE
rtems_cache_enable_data();
#endif
#endif
/* /*
* Allocate the memory for the RTEMS Work Space. This can come from * Allocate the memory for the RTEMS Work Space. This can come from