OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /openrisc/trunk/rtos/rtems/c/src/lib/libbsp/powerpc/score603e/console
    from Rev 30 to Rev 173
    Reverse comparison

Rev 30 → Rev 173

/85c30.c
0,0 → 1,434
/*
* This file contains the console driver chip level routines for the
* z85c30 chip.
*
* Currently only polled mode is supported.
*
* COPYRIGHT (c) 1989-1997.
* On-Line Applications Research Corporation (OAR).
* Copyright assigned to U.S. Government, 1994.
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://www.OARcorp.com/rtems/license.html.
*
* $Id:
*/
 
#include <rtems.h>
#include <bsp.h>
#include <rtems/libio.h>
#include <assert.h>
 
#include "85c30.h"
#include "consolebsp.h"
 
#define STATUS_REGISTER 0x00
#define DATA_REGISTER 0x08
 
 
#define Z8530_Status_Is_RX_character_available( _status ) \
( (_status) & 0x01 )
 
#define Z8530_Status_Is_TX_buffer_empty( _status ) \
( (_status) & 0x04 )
 
#define Z8530_Status_Is_break_abort( _status ) \
( (_status) & 0x80 )
 
typedef struct {
unsigned char read_setup;
unsigned char write_setup;
unsigned char mask_value;
} char_size_info;
 
static const char_size_info Char_size_85c30[] = {
{ Z8530_READ_CHARACTER_BITS_8, Z8530_WRITE_CHARACTER_BITS_8, 0xFF },
{ Z8530_READ_CHARACTER_BITS_7, Z8530_WRITE_CHARACTER_BITS_7, 0x7F },
{ Z8530_READ_CHARACTER_BITS_6, Z8530_WRITE_CHARACTER_BITS_6, 0x3F },
{ Z8530_READ_CHARACTER_BITS_5, Z8530_WRITE_CHARACTER_BITS_5, 0x1F }
};
 
static const unsigned char Clock_speed_85c30[] = {
Z8530_x1_CLOCK, Z8530_x16_CLOCK, Z8530_x32_CLOCK, Z8530_x64_CLOCK };
 
static const unsigned char Stop_bit_85c30[] = {
Z8530_STOP_BITS_1, Z8530_STOP_BITS_1_AND_A_HALF, Z8530_STOP_BITS_2 };
 
static const unsigned char Parity_85c30[] = {
Z8530_PARITY_NONE, Z8530_PARITY_ODD, Z8530_PARITY_EVEN };
 
 
/* PAGE
*
* Read_85c30_register
*
* Read a Z85c30 register
*/
static unsigned char Read_85c30_register(
volatile unsigned char *csr, /* IN */
unsigned char register_number /* IN */
)
{
unsigned char Data;
*csr = register_number;
 
delay_in_bus_cycles( 40 );
 
Data = *csr;
delay_in_bus_cycles( 40 );
 
return Data;
}
 
/*
* Write_85c30_register
*
* Write a Z85c30 register
*/
static void Write_85c30_register(
volatile unsigned char *csr, /* IN */
unsigned char register_number, /* IN */
unsigned char data /* IN */
)
{
*csr = register_number;
 
delay_in_bus_cycles( 40 );
 
*csr = data;
 
delay_in_bus_cycles( 40 );
}
 
 
/* PAGE
*
* Reset_85c30_chip
*
* Reset a 85c30 chip. The pointers for the control registers for both
* ports on the chip are used as input.
*/
void Reset_85c30_chip(
volatile unsigned char *ctrl_0, /* IN */
volatile unsigned char *ctrl_1 /* IN */
)
{
Write_85c30_register( ctrl_0, 0x09, 0x80 );
Write_85c30_register( ctrl_1, 0x09, 0x40 );
}
 
/* PAGE
*
* initialize_85c30_port
*
* initialize a z85c30 Port
*/
void initialize_85c30_port(
const Port_85C30_info *Port
)
{
rtems_unsigned16 value;
volatile unsigned char *ctrl;
Console_Protocol *Setup;
rtems_unsigned16 baud_constant;
 
Setup = Port->Protocol;
ctrl = Port->ctrl;
 
baud_constant = _Score603e_Z8530_Baud( Port->Chip->clock_frequency,
Port->Chip->clock_x, Setup->baud_rate );
 
/*
* Using register 4
* Set up the clock rate.
*/
value = Clock_speed_85c30[ Port->Chip->clock_speed ] |
Stop_bit_85c30[ Setup->stop_bits ] |
Parity_85c30[ Setup->parity ];
Write_85c30_register( ctrl, 0x04, value );
 
/*
* Set Write Register 1 to disable all interrupts
*/
Write_85c30_register( ctrl, 1, 0 );
 
#if CONSOLE_USE_INTERRUPTS
/*
* Set Write Register 2 to contain the interrupt vector
*/
Write_85c30_register( ctrl, 2, Port->Chip->vector );
#endif
 
/*
* Set Write Register 3 to disable the Receiver
*/
Write_85c30_register( ctrl, 0x03, 0x00 );
 
/*
* Set Write Register 5 to disable the Transmitter
*/
Write_85c30_register( ctrl, 5, 0x00 );
 
/* WR 6 -- unneeded in asynchronous mode */
 
/* WR 7 -- unneeded in asynchronous mode */
 
/*
* Set Write Register 9 to disable all interrupt sources
*/
Write_85c30_register( ctrl, 9, 0x00 );
 
/*
* Set Write Register 10 for simple Asynchronous operation
*/
Write_85c30_register( ctrl, 0x0a, 0x00 );
 
/*
* Setup the source of the receive and xmit
* clock as BRG output and the transmit clock
* as the output source for TRxC pin via register 11
*/
Write_85c30_register( ctrl, 0x0b, 0x56 );
 
value = baud_constant;
 
/*
* Setup the lower 8 bits time constants = 1E.
* If the time constans = 1E, then the desire
* baud rate will be equilvalent to 9600, via register 12.
*/
Write_85c30_register( ctrl, 0x0c, value & 0xff );
 
/*
* using register 13
* Setup the upper 8 bits time constants = 0
*/
Write_85c30_register( ctrl, 0x0d, value>>8 );
 
/*
* Set the DTR/REQ pin goes low when transmit
* buffer becomes empty and enable the baud
* rate generator enable with clock from the
* SCC's PCLK input via register 14.
*/
Write_85c30_register( ctrl, 0x0e, 0x07 );
 
/*
* Set Write Register 3 : Base Value is xx00_000x
* D6 - D7 : Receive Character Length (configured)
* D5 : Auto Enable (forced value)
* D4 : Enter Hunt Phase (forced value)
* D3 : Receive CRC Enable (forced value)
* D2 : Address Search Mode (0 if not SDLC) (forced value)
* D1 : Sync Character Load Inhibit (forced value)
* D0 : Receiver Enable (configured)
*/
value = 0x01;
value = value | Char_size_85c30[ Setup->read_char_bits ].read_setup;
 
Write_85c30_register( ctrl, 0x03, value );
 
/*
* Set Write Register 5 : Base Value is 0xx0_x000
* D7 : Data Terminal Ready (DTR) (forced value)
* D5 - D6 : Transmit Character Length (configured)
* D4 : Send Break (forced value)
* D3 : Transmitter Enable (configured)
* D2 : CRC Select (forced value)
* D1 : Request to Send (forced value)
* D0 : Transmit CRC Enable (forced value)
*/
value = 0x8a;
value = value | Char_size_85c30[ Setup->write_char_bits ].write_setup;
Write_85c30_register( ctrl, 0x05, value );
/*
* Reset Tx UNDERRUN/EOM LATCH and ERROR
* via register 0
*/
Write_85c30_register( ctrl, 0x00, 0xf0 );
#if CONSOLE_USE_INTERRUPTS
/*
* Set Write Register 1 to interrupt on Rx characters or special condition.
*/
Write_85c30_register( ctrl, 1, 0x10 );
#endif
 
/*
* Set Write Register 15 to disable extended functions.
*/
 
Write_85c30_register( ctrl, 15, 0x00 );
 
/*
* Set the Command Register to Reset Ext/STATUS.
*/
Write_85c30_register( ctrl, 0x00, 0x10 );
 
#if CONSOLE_USE_INTERRUPTS
 
/*
* Set Write Register 1 : Base Value is 0001_0110
* Enables Rx interrupt on all characters and special conditions.
* Enables parity as a special condition.
* Enables Tx interrupt.
*/
Write_85c30_register( ctrl, 1, 0x16 );
 
/*
* Set Write Register 9 to enable all interrupt sources
* Changed from 0 to a
*/
Write_85c30_register( ctrl, 9, 0x0A );
 
 
/* XXX */
 
/*
* Issue reset highest Interrupt Under Service (IUS) command.
*/
Write_85c30_register( Port->ctrl, STATUS_REGISTER, 0x38 );
 
#endif
 
}
 
/* PAGE
*
* outbyte_polled_85c30
*
* This routine transmits a character using polling.
*/
 
void outbyte_polled_85c30(
volatile unsigned char *csr, /* IN */
char ch /* IN */
)
{
unsigned char z8530_status;
rtems_unsigned32 isrlevel;
rtems_interrupt_disable( isrlevel );
 
/*
* Wait for the Transmit buffer to indicate that it is empty.
*/
do {
z8530_status = Read_85c30_register( csr, STATUS_REGISTER );
} while ( !Z8530_Status_Is_TX_buffer_empty( z8530_status ) );
 
/*
* Write the character.
*/
Write_85c30_register( csr, DATA_REGISTER, (unsigned char) ch );
 
rtems_interrupt_enable( isrlevel );
}
 
/* PAGE
*
* inbyte_nonblocking_85c30
*
* This routine polls for a character.
*/
 
int inbyte_nonblocking_85c30(
const Port_85C30_info *Port
)
{
volatile unsigned char *csr;
unsigned char z8530_status;
rtems_unsigned8 data;
 
csr = Port->ctrl;
 
/*
* return -1 if a character is not available.
*/
z8530_status = Read_85c30_register( csr, STATUS_REGISTER );
if ( !Z8530_Status_Is_RX_character_available( z8530_status ) )
return -1;
/*
* Return the character read.
*/
data = Read_85c30_register( csr, DATA_REGISTER );
data &= Char_size_85c30[ Port->Protocol->read_char_bits ].mask_value;
 
return data;
}
 
 
/*
* Interrupt driven console IO
*/
 
#if CONSOLE_USE_INTERRUPTS
 
/*PAGE
*
* Z8530_Async_Channel_ISR
*
*/
/* RR0 */
 
rtems_isr ISR_85c30_Async(
const Port_85C30_info *Port
)
{
rtems_unsigned16 status;
volatile Console_Protocol *Protocol;
unsigned char data;
rtems_boolean did_something = FALSE;
 
Protocol = Port->Protocol;
 
status = Read_85c30_register( Port->ctrl, 0x00 );
 
/*
* Was this a RX interrupt? If so, then process it.
*/
 
if ( Z8530_Status_Is_RX_character_available( status ) ) {
data = Read_85c30_register( Port->ctrl, DATA_REGISTER );
data &= Char_size_85c30[ Port->Protocol->read_char_bits ].mask_value;
rtems_termios_enqueue_raw_characters( Port->Protocol->console_termios_data,
&data, 1 );
did_something = TRUE;
}
 
/*
* Was this a TX empty interrupt? If so, then process it.
*/
 
if (Z8530_Status_Is_TX_buffer_empty( status ) ) {
if ( !Ring_buffer_Is_empty( &Protocol->TX_Buffer ) ) {
Ring_buffer_Remove_character( &Protocol->TX_Buffer, data );
Write_85c30_register( Port->ctrl, DATA_REGISTER, data );
 
} else {
Protocol->Is_TX_active = FALSE;
Write_85c30_register( Port->ctrl, STATUS_REGISTER, 0x28 );
}
 
did_something = TRUE;
}
 
/*
* Issue reset highest Interrupt Under Service (IUS) command.
*/
 
/*
if ( did_something )
*/
Write_85c30_register( Port->ctrl, STATUS_REGISTER, 0x38 );
}
 
#endif
 
/console.c
0,0 → 1,488
/*
* This file contains the TTY driver for the serial ports on the SCORE603e.
*
* This driver uses the termios pseudo driver.
*
* Currently only polled mode is supported.
*
* COPYRIGHT (c) 1989-1997.
* On-Line Applications Research Corporation (OAR).
* Copyright assigned to U.S. Government, 1994.
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://www.OARcorp.com/rtems/license.html.
*
* $Id: console.c,v 1.2 2001-09-27 12:01:03 chris Exp $
*/
 
#include <bsp.h>
#include <rtems/libio.h>
#include <stdlib.h>
#include <assert.h>
 
#include "consolebsp.h"
 
#if (1)
/*
* The Port Used for the Console interface is based upon which
* debugger is being used. The SDS debugger uses a binary
* interface on port 0 as part of the debugger. Thus port 0 can
* not be used as the console port for the SDS debugger.
*/
 
#if (SCORE603E_USE_SDS)
#define USE_FOR_CONSOLE_DEF 1
 
#elif (SCORE603E_USE_OPEN_FIRMWARE)
#define USE_FOR_CONSOLE_DEF 0
 
#elif (SCORE603E_USE_NONE)
#define USE_FOR_CONSOLE_DEF 0
 
#elif (SCORE603E_USE_DINK)
#define USE_FOR_CONSOLE_DEF 0
 
#else
#error "SCORE603E CONSOLE.C -- what ROM monitor are you using"
#endif
 
#endif
 
#if (0)
extern int USE_FOR_CONSOLE;
#endif
 
int USE_FOR_CONSOLE = USE_FOR_CONSOLE_DEF;
 
/*
*
* Console Device Driver Entry Points
*/
/* PAGE
*
* DEBUG_puts
*
* This should be safe in the event of an error. It attempts to insure
* that no TX empty interrupts occur while it is doing polled IO. Then
* it restores the state of that external interrupt.
*
* Input parameters:
* string - pointer to debug output string
*
* Output parameters: NONE
*
* Return values: NONE
*/
 
void DEBUG_puts(
char *string
)
{
char *s;
int console;
volatile rtems_unsigned8 *csr;
 
console = USE_FOR_CONSOLE;
 
csr = Ports_85C30[ console ].ctrl;
 
/* should disable interrupts here */
 
for ( s = string ; *s ; s++ )
outbyte_polled_85c30( csr, *s );
 
outbyte_polled_85c30( csr, '\r' );
outbyte_polled_85c30( csr, '\n' );
 
/* should enable interrupts here */
}
 
/* PAGE
*
* console_inbyte_nonblocking
*
* Console Termios polling input entry point.
*/
 
int console_inbyte_nonblocking(
int minor
)
{
int port = minor;
 
/*
* verify port Number
*/
assert ( port < NUM_Z85C30_PORTS );
/*
* return a character from the 85c30 port.
*/
return inbyte_nonblocking_85c30( &Ports_85C30[ port ] );
}
rtems_device_driver console_close(
rtems_device_major_number major,
rtems_device_minor_number minor,
void * arg
)
{
return rtems_termios_close (arg);
}
rtems_device_driver console_read(
rtems_device_major_number major,
rtems_device_minor_number minor,
void * arg
)
{
return rtems_termios_read (arg);
}
rtems_device_driver console_write(
rtems_device_major_number major,
rtems_device_minor_number minor,
void * arg
)
{
return rtems_termios_write (arg);
}
rtems_device_driver console_control(
rtems_device_major_number major,
rtems_device_minor_number minor,
void * arg
)
{
return rtems_termios_ioctl (arg);
}
 
 
 
/*
* Interrupt driven console IO
*/
 
#if CONSOLE_USE_INTERRUPTS
 
rtems_isr console_isr(
rtems_vector_number vector
)
{
int i;
for (i=0; i < NUM_Z85C30_PORTS; i++){
ISR_85c30_Async( &Ports_85C30[i] );
 
#if (0) /* XXX - TO TEST LOOP BACKS comment this out. */
if ( Ports_85C30[i].Chip->vector == vector ) {
ISR_85c30_Async( &Ports_85C30[i] );
}
#endif
}
}
 
void console_exit()
{
int i;
volatile Ring_buffer_t *buffer;
rtems_unsigned32 ch;
 
for ( i=0 ; i < NUM_Z85C30_PORTS ; i++ ) {
buffer = &( Ports_85C30[i].Protocol->TX_Buffer);
 
while ( !Ring_buffer_Is_empty( buffer ) ) {
Ring_buffer_Remove_character( buffer, ch );
outbyte_polled_85c30( Ports_85C30[i].ctrl, ch );
}
}
}
 
void console_initialize_interrupts( void )
{
volatile Ring_buffer_t *buffer;
Console_Protocol *protocol;
int i;
for ( i=0 ; i < NUM_Z85C30_PORTS ; i++ ) {
protocol = Ports_85C30[i].Protocol;
 
/*
* Initialize the ring buffer and set to not transmitting.
*/
buffer = &protocol->TX_Buffer;
Ring_buffer_Initialize( buffer );
protocol->Is_TX_active = FALSE;
}
 
/*
* Connect each vector to the interupt service routine.
*/
for (i=0; i < NUM_Z85C30_CHIPS; i++)
set_vector( console_isr, Chips_85C30[i].vector, 1 );
 
atexit( console_exit );
}
void console_outbyte_interrupts(
const Port_85C30_info *Port,
char ch
);
 
/* XXXXXX */
#endif
 
 
/* PAGE
*
* console_initialize
*
* Routine called to initialize the console device driver.
*/
rtems_device_driver console_initialize(
rtems_device_major_number major,
rtems_device_minor_number minor,
void *arg
)
{
rtems_status_code status;
rtems_device_minor_number console;
int port, chip, p0,p1;
 
/*
* initialize the termio interface.
*/
rtems_termios_initialize();
 
/*
* Register Device Names
*/
console = USE_FOR_CONSOLE;
status = rtems_io_register_name( "/dev/console", major, console );
if (status != RTEMS_SUCCESSFUL)
rtems_fatal_error_occurred(status);
 
/*
* Initialize Hardware
*/
 
 
/*
* INITIALIZE_COM_PORTS is defined in the linker script. If it is
* true all serial chips on the board are to be reset at startup
* otherwise the reset is assumed to occur elsewhere (ie. in the
* debugger...)
*/
#if ( INITIALIZE_COM_PORTS )
 
/*
* Force to perform a hardware reset w/o
* Master interrupt enable via register 9
*/
for (port=0; port<NUM_Z85C30_PORTS; port++){
p0 = port;
port++;
p1 = port;
Reset_85c30_chip( Ports_85C30[p0].ctrl, Ports_85C30[p1].ctrl );
}
#else
/* TEMP - To see if this makes a diff with the new ports.
* Never reset chip 1 when using the chip as a monitor
*/
for (port=2; port<NUM_Z85C30_PORTS; port++){
p0 = port;
port++;
p1 = port;
Reset_85c30_chip( Ports_85C30[p0].ctrl, Ports_85C30[p1].ctrl );
}
#endif
 
/*
* Initialize each port.
* Note: the ports are numbered such that 0,1 are on the first chip
* 2,3 are on the second ....
*/
 
for (port=0; port<NUM_Z85C30_PORTS; port++) {
chip = port >> 1;
initialize_85c30_port( &Ports_85C30[port] );
}
 
#if CONSOLE_USE_INTERRUPTS
console_initialize_interrupts();
#endif
 
return RTEMS_SUCCESSFUL;
}
 
/* PAGE
*
* console_write_support
*
* Console Termios output entry point.
*
*/
int console_write_support(
int minor,
const char *buf,
int len)
{
int nwrite = 0;
volatile rtems_unsigned8 *csr;
int port = minor;
 
/*
* verify port Number
*/
assert ( port < NUM_Z85C30_PORTS );
 
/*
* Set the csr based upon the port number.
*/
csr = Ports_85C30[ port ].ctrl;
 
/*
* poll each byte in the string out of the port.
*/
while (nwrite < len) {
#if (CONSOLE_USE_INTERRUPTS)
console_outbyte_interrupts( &Ports_85C30[ port ], *buf++ );
#else
outbyte_polled_85c30( csr, *buf++ );
#endif
nwrite++;
}
 
/*
* return the number of bytes written.
*/
return nwrite;
}
 
/* PAGE
*
* console_open
*
* open a port as a termios console.
*
*/
rtems_device_driver console_open(
rtems_device_major_number major,
rtems_device_minor_number minor,
void * arg
)
{
rtems_status_code sc;
int port = minor;
#if (CONSOLE_USE_INTERRUPTS)
rtems_libio_open_close_args_t *args = arg;
static const rtems_termios_callbacks intrCallbacks = {
NULL, /* firstOpen */
NULL, /* lastClose */
NULL, /* pollRead */
console_write_support, /* write */
NULL, /* setAttributes */
NULL, /* stopRemoteTx */
NULL, /* startRemoteTx */
1 /* outputUsesInterrupts */
};
#else
static const rtems_termios_callbacks pollCallbacks = {
NULL, /* firstOpen */
NULL, /* lastClose */
console_inbyte_nonblocking, /* pollRead */
console_write_support, /* write */
NULL, /* setAttributes */
NULL, /* stopRemoteTx */
NULL, /* startRemoteTx */
0 /* outputUsesInterrupts */
};
#endif
 
 
/*
* Verify the minor number is valid.
*/
if (minor < 0)
return RTEMS_INVALID_NUMBER;
 
if ( port > NUM_Z85C30_PORTS )
return RTEMS_INVALID_NUMBER;
 
/*
* open the port as a termios console driver.
*/
 
#if (CONSOLE_USE_INTERRUPTS)
sc = rtems_termios_open( major, minor, arg, &intrCallbacks );
 
Ports_85C30[ minor ].Protocol->console_termios_data = args->iop->data1;
#else
sc = rtems_termios_open( major, minor, arg, &pollCallbacks );
#endif
 
return sc;
}
 
 
#if (CONSOLE_USE_INTERRUPTS)
 
/*
* console_outbyte_interrupts
*
* This routine transmits a character out.
*
* Input parameters:
* port - port to transmit character to
* ch - character to be transmitted
*
* Output parameters: NONE
*
* Return values: NONE
*/
void console_outbyte_interrupts(
const Port_85C30_info *Port,
char ch
)
{
Console_Protocol *protocol;
rtems_unsigned32 isrlevel;
 
protocol = Port->Protocol;
/*
* If this is the first character then we need to prime the pump
*/
 
if ( protocol->Is_TX_active == FALSE ) {
 
rtems_interrupt_disable( isrlevel );
protocol->Is_TX_active = TRUE;
outbyte_polled_85c30( Port->ctrl, ch );
rtems_interrupt_enable( isrlevel );
 
return;
}
 
while ( Ring_buffer_Is_full( &protocol->TX_Buffer ) );
Ring_buffer_Add_character( &protocol->TX_Buffer, ch );
}
 
#endif
 
 
 
 
 
 
 
 
 
 
 
/tbl85c30.c
0,0 → 1,198
/*
* This file contains the table for the z85c30 port
* used by the console driver.
*
* COPYRIGHT (c) 1989-1997.
* On-Line Applications Research Corporation (OAR).
* Copyright assigned to U.S. Government, 1994.
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://www.OARcorp.com/rtems/license.html.
*
* $Id:
*/
 
#include "consolebsp.h"
#include <bsp.h>
 
#define CONSOLE_DEFAULT_BAUD_RATE 9600
#define CONSOLE_DEFAULT_BAUD_CONSTANT Score603e_Z8530_Chip0_Baud(9600)
#define CONSOLE_DEFAULT_STOP_BITS CONSOLE_STOP_BITS_1
#define CONSOLE_DEFAULT_PARITY CONSOLE_PARITY_NONE
#define CONSOLE_DEFAULT_READ_CHARACTER_BITS CONSOLE_CHARACTER_BITS_8
#define CONSOLE_DEFAULT_WRITE_CHARACTER_BITS CONSOLE_CHARACTER_BITS_8
#define CONSOLE_DEFAULT_CONSOLE_CLOCK CONSOLE_x16_CLOCK
 
 
#define DEFAULT_PROTOCOL { CONSOLE_DEFAULT_BAUD_RATE, \
CONSOLE_DEFAULT_STOP_BITS, \
CONSOLE_DEFAULT_PARITY, \
CONSOLE_DEFAULT_READ_CHARACTER_BITS, \
CONSOLE_DEFAULT_WRITE_CHARACTER_BITS }
 
/*
* Tables of information necessary to use the console 85c30 routines.
*/
Console_Protocol Protocols_85c30 [ NUM_Z85C30_PORTS ] =
{
DEFAULT_PROTOCOL,
DEFAULT_PROTOCOL,
DEFAULT_PROTOCOL,
DEFAULT_PROTOCOL,
 
#if (HAS_PMC_PSC8)
DEFAULT_PROTOCOL,
DEFAULT_PROTOCOL,
DEFAULT_PROTOCOL,
DEFAULT_PROTOCOL,
DEFAULT_PROTOCOL,
DEFAULT_PROTOCOL,
DEFAULT_PROTOCOL,
DEFAULT_PROTOCOL,
#endif
};
 
/*
* Table of chip unique information for each chip.
* See consolebsp.h for the Chip_85C30_info structure defination.
*/
Chip_85C30_info Chips_85C30 [ NUM_Z85C30_CHIPS ] =
{
{
SCORE603E_85C30_0_IRQ,
SCORE603E_85C30_0_CLOCK,
SCORE603E_85C30_0_CLOCK_X,
CONSOLE_DEFAULT_CONSOLE_CLOCK
},
{
SCORE603E_85C30_1_IRQ,
SCORE603E_85C30_1_CLOCK,
SCORE603E_85C30_1_CLOCK_X,
CONSOLE_DEFAULT_CONSOLE_CLOCK
},
 
#if (HAS_PMC_PSC8)
{
SCORE603E_85C30_2_IRQ,
SCORE603E_85C30_2_CLOCK,
SCORE603E_85C30_2_CLOCK_X,
CONSOLE_DEFAULT_CONSOLE_CLOCK
},
{
SCORE603E_85C30_3_IRQ,
SCORE603E_85C30_3_CLOCK,
SCORE603E_85C30_3_CLOCK_X,
CONSOLE_DEFAULT_CONSOLE_CLOCK
},
{
SCORE603E_85C30_4_IRQ,
SCORE603E_85C30_4_CLOCK,
SCORE603E_85C30_4_CLOCK_X,
CONSOLE_DEFAULT_CONSOLE_CLOCK
},
{
SCORE603E_85C30_5_IRQ,
SCORE603E_85C30_5_CLOCK,
SCORE603E_85C30_5_CLOCK_X,
CONSOLE_DEFAULT_CONSOLE_CLOCK
},
#endif
 
};
 
/*
* Table of port unique information for each port.
* See consolebsp.h for the Port_85C30_info structure defination.
*/
const Port_85C30_info Ports_85C30 [ NUM_Z85C30_PORTS ] = {
{
(volatile unsigned char *) SCORE603E_85C30_CTRL_0,
(volatile unsigned char *) SCORE603E_85C30_DATA_0,
0x00,
&Protocols_85c30[0],
&Chips_85C30[0],
},
{
(volatile unsigned char *) SCORE603E_85C30_CTRL_1,
(volatile unsigned char *) SCORE603E_85C30_DATA_1,
0x01,
&Protocols_85c30[1],
&Chips_85C30[0],
},
{
(volatile unsigned char *) SCORE603E_85C30_CTRL_2,
(volatile unsigned char *) SCORE603E_85C30_DATA_2,
0x02,
&Protocols_85c30[2],
&Chips_85C30[1],
},
{
(volatile unsigned char *) SCORE603E_85C30_CTRL_3,
(volatile unsigned char *) SCORE603E_85C30_DATA_3,
0x03,
&Protocols_85c30[3],
&Chips_85C30[1],
},
 
#if (HAS_PMC_PSC8)
{
(volatile unsigned char *) SCORE603E_85C30_CTRL_4,
(volatile unsigned char *) SCORE603E_85C30_DATA_4,
0x04,
&Protocols_85c30[4],
&Chips_85C30[2],
},
{
(volatile unsigned char *) SCORE603E_85C30_CTRL_5,
(volatile unsigned char *) SCORE603E_85C30_DATA_5,
0x05,
&Protocols_85c30[5],
&Chips_85C30[2],
},
{
(volatile unsigned char *) SCORE603E_85C30_CTRL_6,
(volatile unsigned char *) SCORE603E_85C30_DATA_6,
0x06,
&Protocols_85c30[6],
&Chips_85C30[3],
},
{
(volatile unsigned char *) SCORE603E_85C30_CTRL_7,
(volatile unsigned char *) SCORE603E_85C30_DATA_7,
0x07,
&Protocols_85c30[7],
&Chips_85C30[3],
},
{
(volatile unsigned char *) SCORE603E_85C30_CTRL_8,
(volatile unsigned char *) SCORE603E_85C30_DATA_8,
0x08,
&Protocols_85c30[8],
&Chips_85C30[4],
},
{
(volatile unsigned char *) SCORE603E_85C30_CTRL_9,
(volatile unsigned char *) SCORE603E_85C30_DATA_9,
0x09,
&Protocols_85c30[9],
&Chips_85C30[4],
},
{
(volatile unsigned char *) SCORE603E_85C30_CTRL_10,
(volatile unsigned char *) SCORE603E_85C30_DATA_10,
0x0a,
&Protocols_85c30[10],
&Chips_85C30[5],
},
{
(volatile unsigned char *) SCORE603E_85C30_CTRL_11,
(volatile unsigned char *) SCORE603E_85C30_DATA_11,
0x0b,
&Protocols_85c30[11],
&Chips_85C30[5],
},
#endif
};
 
/85c30.h
0,0 → 1,55
/* 85c30.h
*
* This include file contains z85c30 chip information.
*
* COPYRIGHT (c) 1989-1999.
* On-Line Applications Research Corporation (OAR).
*
* The license and distribution terms for this file may in
* the file LICENSE in this distribution or at
* http://www.OARcorp.com/rtems/license.html.
*
* $Id:
*/
 
#ifndef __85c30_H
#define __85c30_H
 
/*
* Clock Speed Definations
*/
#define Z8530_x1_CLOCK 0x00
#define Z8530_x16_CLOCK 0x40
#define Z8530_x32_CLOCK 0x80
#define Z8530_x64_CLOCK 0xC0
 
/*
* Number of Stop Bits.
*/
#define Z8530_STOP_BITS_1 0x04
#define Z8530_STOP_BITS_1_AND_A_HALF 0x08
#define Z8530_STOP_BITS_2 0x0C
 
/*
* PARITY
*/
#define Z8530_PARITY_NONE 0x00
#define Z8530_PARITY_ODD 0x01
#define Z8530_PARITY_EVEN 0x03
 
/*
* Character Bits
*/
#define Z8530_READ_CHARACTER_BITS_8 0xC0
#define Z8530_READ_CHARACTER_BITS_7 0x40
#define Z8530_READ_CHARACTER_BITS_6 0x80
#define Z8530_READ_CHARACTER_BITS_5 0x00
 
#define Z8530_WRITE_CHARACTER_BITS_8 0x60
#define Z8530_WRITE_CHARACTER_BITS_7 0x20
#define Z8530_WRITE_CHARACTER_BITS_6 0x40
#define Z8530_WRITE_CHARACTER_BITS_5 0x00
 
#endif
 
/Makefile.am
0,0 → 1,33
##
## $Id: Makefile.am,v 1.2 2001-09-27 12:01:03 chris Exp $
##
 
AUTOMAKE_OPTIONS = foreign 1.4
 
PGM = $(ARCH)/console.rel
 
C_FILES = 85c30.c console.c consolereserveresources.c tbl85c30.c
C_O_FILES = $(C_FILES:%.c=$(ARCH)/%.o)
 
OBJS = $(C_O_FILES)
 
include $(RTEMS_ROOT)/make/custom/@RTEMS_BSP@.cfg
include $(top_srcdir)/../../../../../../automake/lib.am
 
#
# (OPTIONAL) Add local stuff here using +=
#
 
$(PGM): $(OBJS)
$(make-rel)
 
# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
 
all-local: $(ARCH) $(OBJS) $(PGM)
 
.PRECIOUS: $(PGM)
 
EXTRA_DIST = 85c30.c 85c30.h console.c consolebsp.h \
consolereserveresources.c tbl85c30.c
 
include $(top_srcdir)/../../../../../../automake/local.am
/consolereserveresources.c
0,0 → 1,24
/*
* This file contains the routine console_reserve_resources
* for the Score603e console driver.
*
* COPYRIGHT (c) 1989-1997.
* On-Line Applications Research Corporation (OAR).
* Copyright assigned to U.S. Government, 1994.
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://www.OARcorp.com/rtems/license.html.
*
* $Id: consolereserveresources.c,v 1.2 2001-09-27 12:01:03 chris Exp $
*/
 
#include <bsp.h>
#include <rtems/libio.h>
#include <stdlib.h>
#include <assert.h>
 
#include "consolebsp.h"
 
int console_reserve_resources_removed;
 
/consolebsp.h
0,0 → 1,152
/* consolebsp.h
*
* This include file contains all console driver definations
*
* COPYRIGHT (c) 1989-1997.
* On-Line Applications Research Corporation (OAR).
* Copyright assigned to U.S. Government, 1994.
*
* The license and distribution terms for this file may in
* the file LICENSE in this distribution or at
* http://www.OARcorp.com/rtems/license.html.
*
* $Id:
*/
 
#ifndef __CONSOLEBSP_H
#define __CONSOLEBSP_H
 
#include <rtems.h>
#include <ringbuf.h>
 
#ifdef __cplusplus
extern "C" {
#endif
 
 
/*
*
* Note: The Ports are numbered 0..NUM_Z85C30_CHIPS with port 0 and 1
* being on the first chip, and ports 2 and 3 being on the
* second chip...
*/
 
/*
* Z85c30 configuration informaiton.
*/
 
#if (HAS_PMC_PSC8)
#define NUM_Z85C30_CHIPS_ON_MEZZANINE 4
#else
#define NUM_Z85C30_CHIPS_ON_MEZZANINE 0
#endif
 
#define NUM_Z85C30_CHIPS (2 + NUM_Z85C30_CHIPS_ON_MEZZANINE)
#define NUM_Z85C30_PORTS (NUM_Z85C30_CHIPS * 2)
 
typedef enum {
CONSOLE_x1_CLOCK,
CONSOLE_x16_CLOCK,
CONSOLE_x32_CLOCK,
CONSOLE_x64_CLOCK,
} CONSOLE_Clock_speed;
 
typedef enum {
CONSOLE_STOP_BITS_1,
CONSOLE_STOP_BITS_1_AND_A_HALF,
CONSOLE_STOP_BITS_2,
} CONSOLE_Stop_bits;
 
typedef enum {
CONSOLE_PARITY_NONE,
CONSOLE_PARITY_ODD,
CONSOLE_PARITY_EVEN,
} CONSOLE_Parity;
 
typedef enum {
CONSOLE_CHARACTER_BITS_8,
CONSOLE_CHARACTER_BITS_7,
CONSOLE_CHARACTER_BITS_6,
CONSOLE_CHARACTER_BITS_5,
} CONSOLE_Character_bits;
 
typedef struct {
rtems_unsigned32 baud_rate; /* baud rate value */
CONSOLE_Stop_bits stop_bits;
CONSOLE_Parity parity;
CONSOLE_Character_bits read_char_bits;
CONSOLE_Character_bits write_char_bits;
 
#if CONSOLE_USE_INTERRUPTS
volatile Ring_buffer_t TX_Buffer; /* Transmit Buffer */
volatile rtems_boolean Is_TX_active; /* Transmitting */
void *console_termios_data;
#endif
 
} Console_Protocol;
 
 
/*
* Structure used for chip level information.
*/
typedef struct {
rtems_unsigned32 vector;
rtems_unsigned32 clock_frequency;
rtems_unsigned16 clock_x;
CONSOLE_Clock_speed clock_speed;
} Chip_85C30_info;
 
/*
* Structure used for port level informaiton.
*/
typedef struct {
 
volatile unsigned char *ctrl; /* Port Ctrl byte */
volatile unsigned char *data; /* Port data byte */
 
unsigned char port; /* Port-id / minor # */
 
Console_Protocol *Protocol;
Chip_85C30_info *Chip; /* Chip specific info */
 
} Port_85C30_info;
 
/*
* Console port chip configuration tables.
*/
extern Chip_85C30_info Chips_85C30 [ NUM_Z85C30_CHIPS ];
extern const Port_85C30_info Ports_85C30 [ NUM_Z85C30_PORTS ];
 
 
/*
* 85c30.c prototypes.
*/
void initialize_85c30_port(
const Port_85C30_info *Port
);
 
void outbyte_polled_85c30(
volatile unsigned char *csr, /* IN */
char ch
);
 
int inbyte_nonblocking_85c30(
const Port_85C30_info *Port
);
 
void Reset_85c30_chip(
volatile unsigned char *ctrl_0,
volatile unsigned char *ctrl_1
);
 
#if CONSOLE_USE_INTERRUPTS
rtems_isr ISR_85c30_Async(
const Port_85C30_info *Port
);
#endif
#ifdef __cplusplus
}
#endif
 
#endif

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.