mirror of
https://gitlab.rtems.org/rtems/rtos/rtems.git
synced 2025-11-30 12:45:45 +00:00
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:
@@ -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>
|
||||
|
||||
* console/console.c: Fix polled input.
|
||||
|
||||
@@ -1,16 +1,24 @@
|
||||
#
|
||||
# $Id$
|
||||
#
|
||||
|
||||
This is a README file for the MBX860/MBX821 port of RTEMS 4.5.0
|
||||
|
||||
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
|
||||
Institute for Information Technology
|
||||
National Research Council of Canada
|
||||
Ottawa, ON, K1A 0R6
|
||||
Canada
|
||||
|
||||
Darlene.Stewart@nrc.ca
|
||||
|
||||
Canada
|
||||
|
||||
|
||||
Disclaimer
|
||||
@@ -124,10 +132,10 @@ On-chip resources:
|
||||
|
||||
Board description
|
||||
-----------------
|
||||
Clock rate: 50MHz Entry level boards, 40 MHz others.
|
||||
Bus width: 8/32 bit Flash, 32 bit DRAM
|
||||
FLASH: 2-4MB, 120ns
|
||||
RAM: 4-16MB EDO, 60ns DRAM DIMM
|
||||
Clock rate: 50MHz Entry level boards, 40 MHz others.
|
||||
Bus width: 8/32 bit Flash, 32 bit DRAM
|
||||
FLASH: 2-4MB, 120ns
|
||||
RAM: 4-16MB EDO, 60ns DRAM DIMM
|
||||
|
||||
|
||||
Installation
|
||||
@@ -165,11 +173,12 @@ Port Description
|
||||
Console driver
|
||||
---------------
|
||||
|
||||
This BSP includes an termios-capable asynchronous serial line driver
|
||||
that supports SMC1, SMC2, SCC2, and SCC3 and SCC4 if present. The RTEMS
|
||||
console is selected in rtems/make/custom/mbx8xx.cfg with the
|
||||
CONSOLE_MINOR variable. We normally run with the RTEMS application
|
||||
console on SMC2. SMC1 is used by the debugger.
|
||||
This BSP includes an termios-capable asynchronous serial line driver that
|
||||
supports SMC1, SMC2, SCC2, and SCC3 and SCC4 if present. The RTEMS console is
|
||||
selected in rtems/make/custom/mbx8xx.cfg with the CONSOLE_MINOR variable, or
|
||||
in NVRAM if that option is enabled in the rtems/make/custom/mbx8xx.cfg file.
|
||||
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:
|
||||
|
||||
@@ -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
|
||||
support.
|
||||
|
||||
The mode of operation of the serial driver is determined at build time
|
||||
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:
|
||||
If NVRAM_CONFIGURE is set to 1 in rtems/make/custom/mbx8xx.cfg, the mode of
|
||||
operation of the driver is determined at boot time from the values stored
|
||||
in the user area in NVRAM. See the Configuration Parameters section below for
|
||||
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,
|
||||
1 - interrupt-driven I/O done by the supplied device driver,
|
||||
2 - polled I/O done by EPPC-Bug.
|
||||
|
||||
Also set the value of UARTS_USE_TERMIOS to select whether termios should
|
||||
be used to perform buffering and input/output processing. Without termios
|
||||
support, input processing is limited to the substitution of LF for a
|
||||
received CR, and output processing is limited to the transmission of a
|
||||
CR following the transmission of a LF. The choices for UARTS_USE_TERMIOS are:
|
||||
Also, if NVRAM_CONFIGURE is not set to 1 in rtems/make/custom/mbx8xx.cfg, set
|
||||
the value of UARTS_USE_TERMIOS to select whether termios should be used to
|
||||
perform buffering and input/output processing. Without termios support, input
|
||||
processing is limited to the substitution of LF for a received CR, and output
|
||||
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
|
||||
1 - use termios
|
||||
@@ -226,21 +239,31 @@ interrupts disabled.
|
||||
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
|
||||
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
|
||||
PRINTK_IO_MODE in rtems/make/custom/mbx8xx.cfg. The choices are:
|
||||
|
||||
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.
|
||||
|
||||
printk() does not use termios.
|
||||
|
||||
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
|
||||
conflict. Interrupt-driven printk() output is only possible if the port is
|
||||
opened before hand by an RTEMS application, and is of dubious value...
|
||||
conflict. Interrupt-driven printk() output did not work, although we think
|
||||
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
|
||||
@@ -305,10 +328,15 @@ set language auto
|
||||
end
|
||||
|
||||
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
|
||||
constant prevents the device driver from re-initializing SMC1. It also causes
|
||||
the network driver, the clock driver, and the asynchronous serial line driver
|
||||
to maintain simask_copy for use by gdb.
|
||||
EPPCBUG_SMC1 must be defined in rtems/make/custom/mbx8xx.cfg, or the eppc_bug
|
||||
field set to non-zero in NVRAM. Defining this constant prevents the device
|
||||
driver from re-initializing SMC1. It also causes the network driver, the clock
|
||||
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
|
||||
@@ -319,6 +347,89 @@ get compiled with the appropriate -mcpu flag. The nof variants of the gcc
|
||||
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
|
||||
-------------
|
||||
|
||||
@@ -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
|
||||
objects.
|
||||
|
||||
The cpuuse and malloctest tests do not work properly, either with polled I/O
|
||||
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?
|
||||
When using interrupt-driven I/O, psx08 fails with an internal assertion error.
|
||||
|
||||
|
||||
What's new
|
||||
What is new
|
||||
----------
|
||||
|
||||
All known problems with use of the caches on the MBX860-002 and MBX821-001
|
||||
have been resolved.
|
||||
|
||||
Configuration of the console and network is now possible at boot time through
|
||||
NVRAM parameters.
|
||||
|
||||
|
||||
Thanks
|
||||
------
|
||||
|
||||
@@ -81,19 +81,12 @@
|
||||
#include <rtems/libio.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_pollWrite( int minor, const char *buf, int len );
|
||||
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;
|
||||
|
||||
@@ -112,7 +105,7 @@ BSP_output_char_function_type BSP_output_char = _BSP_output_char;
|
||||
* Return value: char returned as positive signed int
|
||||
* -1 if no character is present in the input FIFO.
|
||||
*/
|
||||
int _EPPCBug_pollRead(
|
||||
static int _EPPCBug_pollRead(
|
||||
int minor
|
||||
)
|
||||
{
|
||||
@@ -220,7 +213,7 @@ int _EPPCBug_pollRead(
|
||||
*
|
||||
* Return value: IGNORED
|
||||
*/
|
||||
int _EPPCBug_pollWrite(
|
||||
static int _EPPCBug_pollWrite(
|
||||
int minor,
|
||||
const char *buf,
|
||||
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
|
||||
*/
|
||||
|
||||
void _BSP_output_char( char c )
|
||||
static void _BSP_output_char( char c )
|
||||
{
|
||||
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' )
|
||||
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_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
|
||||
rtems_termios_initialize();
|
||||
#endif
|
||||
|
||||
rtems_termios_initialize ();
|
||||
|
||||
#endif /* UARTS_USE_TERMIOS */
|
||||
|
||||
/*
|
||||
* Do common initialization.
|
||||
*/
|
||||
@@ -401,6 +609,9 @@ rtems_device_driver console_initialize(
|
||||
|
||||
#endif /* mpc860 */
|
||||
|
||||
#endif /* NVRAM_CONFIGURE != 1 */
|
||||
|
||||
|
||||
/*
|
||||
* Set up interrupts
|
||||
*/
|
||||
@@ -430,7 +641,7 @@ rtems_device_driver console_initialize(
|
||||
#endif /* mpc860 */
|
||||
|
||||
/* 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)
|
||||
rtems_fatal_error_occurred (status);
|
||||
|
||||
@@ -448,14 +659,11 @@ rtems_device_driver console_open(
|
||||
)
|
||||
{
|
||||
/* Used to track termios private data for callbacks */
|
||||
#if UARTS_IO_MODE == 1
|
||||
extern struct rtems_termios_tty *ttyp[];
|
||||
|
||||
rtems_libio_open_close_args_t *args = arg;
|
||||
#endif
|
||||
|
||||
rtems_status_code sc;
|
||||
|
||||
#if UARTS_USE_TERMIOS == 1
|
||||
|
||||
static const rtems_termios_callbacks sccEPPCBugCallbacks = {
|
||||
NULL, /* firstOpen */
|
||||
NULL, /* lastClose */
|
||||
@@ -465,6 +673,7 @@ rtems_device_driver console_open(
|
||||
NULL, /* startRemoteTx */
|
||||
0 /* outputUsesInterrupts */
|
||||
};
|
||||
|
||||
static const rtems_termios_callbacks intrCallbacks = {
|
||||
NULL, /* firstOpen */
|
||||
NULL, /* lastClose */
|
||||
@@ -475,6 +684,7 @@ rtems_device_driver console_open(
|
||||
NULL, /* startRemoteTx */
|
||||
1 /* outputUsesInterrupts */
|
||||
};
|
||||
|
||||
static const rtems_termios_callbacks pollCallbacks = {
|
||||
NULL, /* firstOpen */
|
||||
NULL, /* lastClose */
|
||||
@@ -485,35 +695,53 @@ rtems_device_driver console_open(
|
||||
NULL, /* startRemoteTx */
|
||||
0 /* outputUsesInterrupts */
|
||||
};
|
||||
#endif
|
||||
|
||||
if ( minor > NUM_PORTS-1 )
|
||||
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_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 */
|
||||
|
||||
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 */
|
||||
|
||||
#else /* RTEMS polled I/O with termios */
|
||||
|
||||
sc = rtems_termios_open (major, minor, arg, &pollCallbacks);
|
||||
|
||||
sc = rtems_termios_open( major, minor, arg, &pollCallbacks );
|
||||
#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;
|
||||
|
||||
#endif
|
||||
#endif /* UARTS_USE_TERMIOS != 1 */
|
||||
|
||||
return sc;
|
||||
|
||||
#endif /* NVRAM_CONFIGURE != 1 */
|
||||
}
|
||||
|
||||
|
||||
@@ -529,11 +757,25 @@ rtems_device_driver console_close(
|
||||
if ( minor > NUM_PORTS-1 )
|
||||
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
|
||||
return rtems_termios_close (arg);
|
||||
return rtems_termios_close( arg );
|
||||
#else
|
||||
return RTEMS_SUCCESSFUL;
|
||||
#endif
|
||||
|
||||
#endif /* NVRAM_CONFIGURE != 1 */
|
||||
}
|
||||
|
||||
|
||||
@@ -546,33 +788,25 @@ rtems_device_driver console_read(
|
||||
void *arg
|
||||
)
|
||||
{
|
||||
#if UARTS_USE_TERMIOS != 1
|
||||
rtems_libio_rw_args_t *rw_args = arg;
|
||||
int c;
|
||||
#endif
|
||||
|
||||
if ( minor > NUM_PORTS-1 )
|
||||
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
|
||||
|
||||
#if UARTS_IO_MODE != 1 /* Polled I/O without termios */
|
||||
|
||||
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;
|
||||
|
||||
#else /* RTEMS interrupt-driven I/O without termios */
|
||||
|
||||
#error "Interrupt-driven input without termios is not yet supported"
|
||||
|
||||
#if UARTS_USE_TERMIOS == 1
|
||||
return rtems_termios_read( arg );
|
||||
#else
|
||||
return do_poll_read( major, minor, arg );
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -588,36 +822,26 @@ rtems_device_driver console_write(
|
||||
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 )
|
||||
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
|
||||
|
||||
#if UARTS_IO_MODE != 1 /* Polled I/O without termios*/
|
||||
|
||||
/* Must add carriage return to line feeds */
|
||||
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;
|
||||
|
||||
#else /* RTEMS interrupt-driven I/O without termios */
|
||||
|
||||
#error "Interrupt-driven output without termios is not yet supported"
|
||||
|
||||
#if UARTS_USE_TERMIOS == 1
|
||||
return rtems_termios_write( arg );
|
||||
#else
|
||||
/* no termios -- default to polled */
|
||||
return do_poll_write( major, minor, arg );
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -636,10 +860,24 @@ rtems_device_driver console_control(
|
||||
if ( minor > NUM_PORTS-1 )
|
||||
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
|
||||
return rtems_termios_ioctl (arg);
|
||||
return rtems_termios_ioctl( arg );
|
||||
#else
|
||||
return RTEMS_SUCCESSFUL;
|
||||
#endif
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
@@ -30,6 +30,30 @@ extern "C" {
|
||||
#include <mpc8xx/mmu.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
|
||||
*/
|
||||
@@ -70,11 +94,6 @@ extern int rtems_enet_driver_attach (struct rtems_bsdnet_ifconfig *config, int a
|
||||
|
||||
#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 */
|
||||
|
||||
extern rtems_configuration_table BSP_Configuration;
|
||||
|
||||
@@ -52,6 +52,9 @@
|
||||
#define TX_BUF_COUNT 8
|
||||
#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.
|
||||
* 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 unitNumber;
|
||||
char *unitName;
|
||||
char *pAddr;
|
||||
unsigned long addr;
|
||||
|
||||
/*
|
||||
* Parse driver name
|
||||
@@ -1561,12 +1566,60 @@ rtems_scc1_driver_attach (struct rtems_bsdnet_ifconfig *config)
|
||||
/*
|
||||
* 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) {
|
||||
memcpy (sc->arpcom.ac_enaddr, config->hardware_address, ETHER_ADDR_LEN);
|
||||
}
|
||||
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)
|
||||
mtu = config->mtu;
|
||||
|
||||
@@ -135,13 +135,19 @@ void bsp_start(void)
|
||||
/*
|
||||
* Enable instruction and data caches. Do not force writethrough mode.
|
||||
*/
|
||||
#ifdef INSTRUCTION_CACHE_ENABLE
|
||||
rtems_cache_enable_instruction();
|
||||
#endif
|
||||
|
||||
#ifdef DATA_CACHE_ENABLE
|
||||
rtems_cache_enable_data();
|
||||
#endif
|
||||
#if NVRAM_CONFIGURE == 1
|
||||
if ( nvram->cache_mode & 0x02 )
|
||||
rtems_cache_enable_instruction();
|
||||
if ( nvram->cache_mode & 0x01 )
|
||||
rtems_cache_enable_data();
|
||||
#else
|
||||
#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
|
||||
|
||||
Reference in New Issue
Block a user