URL
https://opencores.org/ocsvn/openrisc_me/openrisc_me/trunk
Subversion Repositories openrisc_me
Compare Revisions
- This comparison shows the changes necessary to convert path
/openrisc/trunk/rtos/ecos-2.0/packages/devs/serial/mips
- from Rev 27 to Rev 174
- ↔ Reverse comparison
Rev 27 → Rev 174
/vrc437x/v2_0/cdl/ser_mips_vrc437x.cdl
0,0 → 1,203
# ==================================================================== |
# |
# ser_mips_vrc437x.cdl |
# |
# eCos serial MIPS/VRC437X configuration data |
# |
# ==================================================================== |
#####ECOSGPLCOPYRIGHTBEGIN#### |
## ------------------------------------------- |
## This file is part of eCos, the Embedded Configurable Operating System. |
## Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc. |
## |
## eCos is free software; you can redistribute it and/or modify it under |
## the terms of the GNU General Public License as published by the Free |
## Software Foundation; either version 2 or (at your option) any later version. |
## |
## eCos is distributed in the hope that it will be useful, but WITHOUT ANY |
## WARRANTY; without even the implied warranty of MERCHANTABILITY or |
## FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
## for more details. |
## |
## You should have received a copy of the GNU General Public License along |
## with eCos; if not, write to the Free Software Foundation, Inc., |
## 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. |
## |
## As a special exception, if other files instantiate templates or use macros |
## or inline functions from this file, or you compile this file and link it |
## with other works to produce a work based on this file, this file does not |
## by itself cause the resulting work to be covered by the GNU General Public |
## License. However the source code for this file must still be made available |
## in accordance with section (3) of the GNU General Public License. |
## |
## This exception does not invalidate any other reasons why a work based on |
## this file might be covered by the GNU General Public License. |
## |
## Alternative licenses for eCos may be arranged by contacting Red Hat, Inc. |
## at http://sources.redhat.com/ecos/ecos-license/ |
## ------------------------------------------- |
#####ECOSGPLCOPYRIGHTEND#### |
# ==================================================================== |
######DESCRIPTIONBEGIN#### |
# |
# Author(s): jskov |
# Original data: gthomas |
# Contributors: |
# Date: 1999-07-14 |
# |
#####DESCRIPTIONEND#### |
# |
# ==================================================================== |
|
|
cdl_package CYGPKG_IO_SERIAL_MIPS_VRC437X { |
display "VRC437X serial device drivers" |
|
parent CYGPKG_IO_SERIAL_DEVICES |
active_if CYGPKG_IO_SERIAL |
active_if CYGPKG_HAL_MIPS_VR4300_VRC437X |
|
requires CYGPKG_ERROR |
include_dir cyg/io |
include_files ; # none _exported_ whatsoever |
description " |
This option enables the serial device drivers for the |
VRC437X." |
|
compile -library=libextras.a vrc437x_serial.c |
|
define_proc { |
puts $::cdl_system_header "/***** serial driver proc output start *****/" |
puts $::cdl_system_header "#define CYGDAT_IO_SERIAL_DEVICE_HEADER <pkgconf/io_serial_mips_vrc437x.h>" |
puts $::cdl_system_header "/***** serial driver proc output end *****/" |
} |
|
cdl_component CYGPKG_IO_SERIAL_MIPS_VRC437X_SERIAL0 { |
display "VRC437X serial port 0 driver" |
flavor bool |
default_value 1 |
description " |
This option includes the serial device driver for the VRC437X port 0." |
|
cdl_option CYGDAT_IO_SERIAL_MIPS_VRC437X_SERIAL0_NAME { |
display "Device name for the VRC437X serial port 0 driver" |
flavor data |
default_value {"\"/dev/ser0\""} |
description " |
This option sets the name of the serial device for the VRC437X |
port 0." |
} |
|
cdl_option CYGNUM_IO_SERIAL_MIPS_VRC437X_SERIAL0_BAUD { |
display "Baud rate for the VRC437X serial port 0 driver" |
flavor data |
legal_values { 50 75 110 "134_5" 150 200 300 600 1200 1800 2400 3600 |
4800 7200 9600 14400 19200 38400 57600 115200 230400 |
} |
default_value 38400 |
description " |
This option specifies the default baud rate (speed) for the |
VRC437X port 0." |
} |
|
cdl_option CYGNUM_IO_SERIAL_MIPS_VRC437X_SERIAL0_BUFSIZE { |
display "Buffer size for the VRC437X serial port 0 driver" |
flavor data |
legal_values 0 to 8192 |
default_value 128 |
description " |
This option specifies the size of the internal buffers used |
for the VRC437X port 0." |
} |
} |
cdl_component CYGPKG_IO_SERIAL_MIPS_VRC437X_SERIAL1 { |
display "VRC437X serial port 1 driver" |
flavor bool |
default_value 1 |
description " |
This option includes the serial device driver for the VRC437X port 1." |
|
cdl_option CYGDAT_IO_SERIAL_MIPS_VRC437X_SERIAL1_NAME { |
display "Device name for the VRC437X serial port 1 driver" |
flavor data |
default_value {"\"/dev/ser1\""} |
description " |
This option specifies the name of serial device for the |
VRC437X port 1." |
} |
|
cdl_option CYGNUM_IO_SERIAL_MIPS_VRC437X_SERIAL1_BAUD { |
display "Baud rate for the VRC437X serial port 1 driver" |
flavor data |
legal_values { 50 75 110 "134_5" 150 200 300 600 1200 1800 2400 3600 |
4800 7200 9600 14400 19200 38400 57600 115200 230400 |
} |
default_value 38400 |
description " |
This option specifies the default baud rate (speed) for the |
VRC437X port 1." |
} |
|
cdl_option CYGNUM_IO_SERIAL_MIPS_VRC437X_SERIAL1_BUFSIZE { |
display "Buffer size for the VRC437X serial port 1 driver" |
flavor data |
legal_values 0 to 8192 |
default_value 128 |
description " |
This option specifies the size of the internal buffers used for |
the VRC437X port 1." |
} |
} |
|
cdl_component CYGPKG_IO_SERIAL_MIPS_VRC437X_OPTIONS { |
display "Serial device driver build options" |
flavor none |
description " |
Package specific build options including control over |
compiler flags used only in building this package, |
and details of which tests are built." |
|
|
cdl_option CYGPKG_IO_SERIAL_MIPS_VRC437X_CFLAGS_ADD { |
display "Additional compiler flags" |
flavor data |
no_define |
default_value { "" } |
description " |
This option modifies the set of compiler flags for |
building these serial device drivers. These flags are used in addition |
to the set of global flags." |
} |
|
cdl_option CYGPKG_IO_SERIAL_MIPS_VRC437X_CFLAGS_REMOVE { |
display "Suppressed compiler flags" |
flavor data |
no_define |
default_value { "" } |
description " |
This option modifies the set of compiler flags for |
building these serial device drivers. These flags are removed from |
the set of global flags if present." |
} |
} |
|
cdl_component CYGPKG_IO_SERIAL_MIPS_VRC437X_TESTING { |
display "Testing parameters" |
flavor bool |
calculated 1 |
active_if CYGPKG_IO_SERIAL_MIPS_VRC437X_SERIAL0 |
|
cdl_option CYGPRI_SER_TEST_SER_DEV { |
display "Serial device used for testing" |
flavor data |
default_value { CYGDAT_IO_SERIAL_MIPS_VRC437X_SERIAL0_NAME } |
} |
|
define_proc { |
puts $::cdl_header "#define CYGPRI_SER_TEST_CRASH_ID \"vrc437X\"" |
puts $::cdl_header "#define CYGPRI_SER_TEST_TTY_DEV \"/dev/tty0\"" |
} |
} |
} |
|
# EOF ser_mips_vrc437x.cdl |
/vrc437x/v2_0/src/vrc437x_serial.c
0,0 → 1,494
//========================================================================== |
// |
// io/serial/mips/vrc437x_serial.c |
// |
// Mips VRC437X Serial I/O Interface Module (interrupt driven) |
// |
//========================================================================== |
//####ECOSGPLCOPYRIGHTBEGIN#### |
// ------------------------------------------- |
// This file is part of eCos, the Embedded Configurable Operating System. |
// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc. |
// |
// eCos is free software; you can redistribute it and/or modify it under |
// the terms of the GNU General Public License as published by the Free |
// Software Foundation; either version 2 or (at your option) any later version. |
// |
// eCos is distributed in the hope that it will be useful, but WITHOUT ANY |
// WARRANTY; without even the implied warranty of MERCHANTABILITY or |
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
// for more details. |
// |
// You should have received a copy of the GNU General Public License along |
// with eCos; if not, write to the Free Software Foundation, Inc., |
// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. |
// |
// As a special exception, if other files instantiate templates or use macros |
// or inline functions from this file, or you compile this file and link it |
// with other works to produce a work based on this file, this file does not |
// by itself cause the resulting work to be covered by the GNU General Public |
// License. However the source code for this file must still be made available |
// in accordance with section (3) of the GNU General Public License. |
// |
// This exception does not invalidate any other reasons why a work based on |
// this file might be covered by the GNU General Public License. |
// |
// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc. |
// at http://sources.redhat.com/ecos/ecos-license/ |
// ------------------------------------------- |
//####ECOSGPLCOPYRIGHTEND#### |
//========================================================================== |
//#####DESCRIPTIONBEGIN#### |
// |
// Author(s): gthomas |
// Contributors: gthomas |
// Date: 1999-04-15 |
// Purpose: VRC437X Serial I/O module (interrupt driven version) |
// Description: |
// |
//####DESCRIPTIONEND#### |
// |
//========================================================================== |
|
#include <pkgconf/system.h> |
#include <pkgconf/io_serial.h> |
#include <pkgconf/io.h> |
#include <cyg/io/io.h> |
#include <cyg/hal/hal_intr.h> |
#include <cyg/io/devtab.h> |
#include <cyg/io/serial.h> |
|
#ifdef CYGPKG_IO_SERIAL_MIPS_VRC437X |
|
#include "vrc437x_serial.h" |
|
#if defined(CYGPKG_HAL_MIPS_LSBFIRST) |
#define VRC437X_SCC_BASE 0xC1000000 |
#elif defined(CYGPKG_HAL_MIPS_MSBFIRST) |
#define VRC437X_SCC_BASE 0xC1000003 |
#else |
#error MIPS endianness not defined by configuration |
#endif |
|
#define VRC437X_SCC_INT CYGNUM_HAL_INTERRUPT_DUART |
#define SCC_CHANNEL_A 4 |
#define SCC_CHANNEL_B 0 |
|
extern void diag_printf(const char *fmt, ...); |
|
typedef struct vrc437x_serial_info { |
CYG_ADDRWORD base; |
unsigned char regs[16]; // Known register state (since hardware is write-only!) |
} vrc437x_serial_info; |
|
static bool vrc437x_serial_init(struct cyg_devtab_entry *tab); |
static bool vrc437x_serial_putc(serial_channel *chan, unsigned char c); |
static Cyg_ErrNo vrc437x_serial_lookup(struct cyg_devtab_entry **tab, |
struct cyg_devtab_entry *sub_tab, |
const char *name); |
static unsigned char vrc437x_serial_getc(serial_channel *chan); |
static Cyg_ErrNo vrc437x_serial_set_config(serial_channel *chan, cyg_uint32 key, |
const void *xbuf, cyg_uint32 *len); |
static void vrc437x_serial_start_xmit(serial_channel *chan); |
static void vrc437x_serial_stop_xmit(serial_channel *chan); |
|
static cyg_uint32 vrc437x_serial_ISR(cyg_vector_t vector, cyg_addrword_t data); |
static void vrc437x_serial_DSR(cyg_vector_t vector, cyg_ucount32 count, cyg_addrword_t data); |
|
static SERIAL_FUNS(vrc437x_serial_funs, |
vrc437x_serial_putc, |
vrc437x_serial_getc, |
vrc437x_serial_set_config, |
vrc437x_serial_start_xmit, |
vrc437x_serial_stop_xmit |
); |
|
#ifdef CYGPKG_IO_SERIAL_MIPS_VRC437X_SERIAL0 |
static vrc437x_serial_info vrc437x_serial_info0 = {VRC437X_SCC_BASE+SCC_CHANNEL_A}; |
#if CYGNUM_IO_SERIAL_MIPS_VRC437X_SERIAL0_BUFSIZE > 0 |
static unsigned char vrc437x_serial_out_buf0[CYGNUM_IO_SERIAL_MIPS_VRC437X_SERIAL0_BUFSIZE]; |
static unsigned char vrc437x_serial_in_buf0[CYGNUM_IO_SERIAL_MIPS_VRC437X_SERIAL0_BUFSIZE]; |
|
static SERIAL_CHANNEL_USING_INTERRUPTS(vrc437x_serial_channel0, |
vrc437x_serial_funs, |
vrc437x_serial_info0, |
CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_MIPS_VRC437X_SERIAL0_BAUD), |
CYG_SERIAL_STOP_DEFAULT, |
CYG_SERIAL_PARITY_DEFAULT, |
CYG_SERIAL_WORD_LENGTH_DEFAULT, |
CYG_SERIAL_FLAGS_DEFAULT, |
&vrc437x_serial_out_buf0[0], sizeof(vrc437x_serial_out_buf0), |
&vrc437x_serial_in_buf0[0], sizeof(vrc437x_serial_in_buf0) |
); |
#else |
static SERIAL_CHANNEL(vrc437x_serial_channel0, |
vrc437x_serial_funs, |
vrc437x_serial_info0, |
CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_MIPS_VRC437X_SERIAL0_BAUD), |
CYG_SERIAL_STOP_DEFAULT, |
CYG_SERIAL_PARITY_DEFAULT, |
CYG_SERIAL_WORD_LENGTH_DEFAULT, |
CYG_SERIAL_FLAGS_DEFAULT |
); |
#endif |
|
DEVTAB_ENTRY(vrc437x_serial_io0, |
CYGDAT_IO_SERIAL_MIPS_VRC437X_SERIAL0_NAME, |
0, // Does not depend on a lower level interface |
&cyg_io_serial_devio, |
vrc437x_serial_init, |
vrc437x_serial_lookup, // Serial driver may need initializing |
&vrc437x_serial_channel0 |
); |
#endif // CYGPKG_IO_SERIAL_MIPS_VRC437X_SERIAL0 |
|
#ifdef CYGPKG_IO_SERIAL_MIPS_VRC437X_SERIAL1 |
static vrc437x_serial_info vrc437x_serial_info1 = {VRC437X_SCC_BASE+SCC_CHANNEL_B}; |
#if CYGNUM_IO_SERIAL_MIPS_VRC437X_SERIAL1_BUFSIZE > 0 |
static unsigned char vrc437x_serial_out_buf1[CYGNUM_IO_SERIAL_MIPS_VRC437X_SERIAL1_BUFSIZE]; |
static unsigned char vrc437x_serial_in_buf1[CYGNUM_IO_SERIAL_MIPS_VRC437X_SERIAL1_BUFSIZE]; |
|
static SERIAL_CHANNEL_USING_INTERRUPTS(vrc437x_serial_channel1, |
vrc437x_serial_funs, |
vrc437x_serial_info1, |
CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_MIPS_VRC437X_SERIAL1_BAUD), |
CYG_SERIAL_STOP_DEFAULT, |
CYG_SERIAL_PARITY_DEFAULT, |
CYG_SERIAL_WORD_LENGTH_DEFAULT, |
CYG_SERIAL_FLAGS_DEFAULT, |
&vrc437x_serial_out_buf1[0], sizeof(vrc437x_serial_out_buf1), |
&vrc437x_serial_in_buf1[0], sizeof(vrc437x_serial_in_buf1) |
); |
#else |
static SERIAL_CHANNEL(vrc437x_serial_channel1, |
vrc437x_serial_funs, |
vrc437x_serial_info1, |
CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_MIPS_VRC437X_SERIAL1_BAUD), |
CYG_SERIAL_STOP_DEFAULT, |
CYG_SERIAL_PARITY_DEFAULT, |
CYG_SERIAL_WORD_LENGTH_DEFAULT, |
CYG_SERIAL_FLAGS_DEFAULT |
); |
#endif |
|
DEVTAB_ENTRY(vrc437x_serial_io1, |
CYGDAT_IO_SERIAL_MIPS_VRC437X_SERIAL1_NAME, |
0, // Does not depend on a lower level interface |
&cyg_io_serial_devio, |
vrc437x_serial_init, |
vrc437x_serial_lookup, // Serial driver may need initializing |
&vrc437x_serial_channel1 |
); |
#endif // CYGPKG_IO_SERIAL_MIPS_VRC437X_SERIAL1 |
|
static cyg_interrupt vrc437x_serial_interrupt; |
static cyg_handle_t vrc437x_serial_interrupt_handle; |
|
// Table which maps hardware channels (A,B) to software ones |
struct serial_channel *vrc437x_chans[] = { |
#ifdef CYGPKG_IO_SERIAL_MIPS_VRC437X_SERIAL0 // Hardware channel A |
&vrc437x_serial_channel0, |
#else |
0, |
#endif |
#ifdef CYGPKG_IO_SERIAL_MIPS_VRC437X_SERIAL1 // Hardware channel B |
&vrc437x_serial_channel1, |
#else |
0, |
#endif |
}; |
|
// Support functions which access the serial device. Note that this chip requires |
// a substantial delay after each access. |
|
#define SCC_DELAY 100 |
inline static void |
scc_delay(void) |
{ |
int i; |
for (i = 0; i < SCC_DELAY; i++) ; |
} |
|
inline static void |
scc_write_reg(volatile unsigned char *reg, unsigned char val) |
{ |
scc_delay(); |
*reg = val; |
} |
|
inline static unsigned char |
scc_read_reg(volatile unsigned char *reg) |
{ |
unsigned char val; |
scc_delay(); |
val = *reg; |
return (val); |
} |
|
inline static unsigned char |
scc_read_ctl(volatile struct serial_port *port, int reg) |
{ |
if (reg != 0) { |
scc_write_reg(&port->scc_ctl, reg); |
} |
return (scc_read_reg(&port->scc_ctl)); |
} |
|
inline static void |
scc_write_ctl(volatile struct serial_port *port, int reg, unsigned char val) |
{ |
if (reg != 0) { |
scc_write_reg(&port->scc_ctl, reg); |
} |
scc_write_reg(&port->scc_ctl, val); |
} |
|
inline static unsigned char |
scc_read_dat(volatile struct serial_port *port) |
{ |
return (scc_read_reg(&port->scc_dat)); |
} |
|
inline static void |
scc_write_dat(volatile struct serial_port *port, unsigned char val) |
{ |
scc_write_reg(&port->scc_dat, val); |
} |
|
// Internal function to actually configure the hardware to desired baud rate, etc. |
static bool |
vrc437x_serial_config_port(serial_channel *chan, cyg_serial_info_t *new_config, bool init) |
{ |
vrc437x_serial_info *vrc437x_chan = (vrc437x_serial_info *)chan->dev_priv; |
volatile struct serial_port *port = (volatile struct serial_port *)vrc437x_chan->base; |
cyg_int32 baud_rate = select_baud[new_config->baud]; |
cyg_int32 baud_divisor; |
unsigned char *regs = &vrc437x_chan->regs[0]; |
if (baud_rate == 0) return false; |
// Compute state of registers. The register/control state needs to be kept in |
// the shadow variable 'regs' because the hardware registers can only be written, |
// not read (in general). |
if (init) { |
// Insert appropriate resets? |
if (chan->out_cbuf.len != 0) { |
regs[R1] = WR1_IntAllRx; |
regs[R9] = WR9_MIE | WR9_NoVector; |
} else { |
regs[R1] = 0; |
regs[R9] = 0; |
} |
// Clocks are from the baud rate generator |
regs[R11] = WR11_TRxCBR | WR11_TRxCOI | WR11_TxCBR | WR11_RxCBR; |
regs[R14] = WR14_BRenable | WR14_BRSRC; |
regs[R10] = 0; // Unused in this [async] mode |
regs[R15] = 0; |
} |
regs[R3] = WR3_RxEnable | select_word_length_WR3[new_config->word_length - CYGNUM_SERIAL_WORD_LENGTH_5]; |
regs[R4] = WR4_X16CLK | select_stop_bits[new_config->stop] | select_parity[new_config->parity]; |
regs[R5] = WR5_TxEnable | select_word_length_WR5[new_config->word_length - CYGNUM_SERIAL_WORD_LENGTH_5]; |
baud_divisor = BRTC(baud_rate); |
regs[R12] = baud_divisor & 0xFF; |
regs[R13] = baud_divisor >> 8; |
// Now load the registers |
scc_write_ctl(port, R4, regs[R4]); |
scc_write_ctl(port, R10, regs[R10]); |
scc_write_ctl(port, R3, regs[R3] & ~WR3_RxEnable); |
scc_write_ctl(port, R5, regs[R5] & ~WR5_TxEnable); |
scc_write_ctl(port, R1, regs[R1]); |
scc_write_ctl(port, R9, regs[R9]); |
scc_write_ctl(port, R11, regs[R11]); |
scc_write_ctl(port, R12, regs[R12]); |
scc_write_ctl(port, R13, regs[R13]); |
scc_write_ctl(port, R14, regs[R14]); |
scc_write_ctl(port, R15, regs[R15]); |
scc_write_ctl(port, R3, regs[R3]); |
scc_write_ctl(port, R5, regs[R5]); |
// Update configuration |
if (new_config != &chan->config) { |
chan->config = *new_config; |
} |
return true; |
} |
|
// Function to initialize the device. Called at bootstrap time. |
static bool |
vrc437x_serial_init(struct cyg_devtab_entry *tab) |
{ |
serial_channel *chan = (serial_channel *)tab->priv; |
vrc437x_serial_info *vrc437x_chan = (vrc437x_serial_info *)chan->dev_priv; |
static bool init = false; |
#ifdef CYGDBG_IO_INIT |
diag_printf("VRC437X SERIAL init '%s' - dev: %x\n", tab->name, vrc437x_chan->base); |
#endif |
(chan->callbacks->serial_init)(chan); // Really only required for interrupt driven devices |
if (!init && chan->out_cbuf.len != 0) { |
init = true; |
// Note that the hardware is rather broken. The interrupt status needs to |
// be read using only channel A |
cyg_drv_interrupt_create(VRC437X_SCC_INT, |
99, |
(cyg_addrword_t)VRC437X_SCC_BASE+SCC_CHANNEL_A, |
vrc437x_serial_ISR, |
vrc437x_serial_DSR, |
&vrc437x_serial_interrupt_handle, |
&vrc437x_serial_interrupt); |
cyg_drv_interrupt_attach(vrc437x_serial_interrupt_handle); |
cyg_drv_interrupt_unmask(VRC437X_SCC_INT); |
} |
vrc437x_serial_config_port(chan, &chan->config, true); |
return true; |
} |
|
// This routine is called when the device is "looked" up (i.e. attached) |
static Cyg_ErrNo |
vrc437x_serial_lookup(struct cyg_devtab_entry **tab, |
struct cyg_devtab_entry *sub_tab, |
const char *name) |
{ |
serial_channel *chan = (serial_channel *)(*tab)->priv; |
(chan->callbacks->serial_init)(chan); // Really only required for interrupt driven devices |
return ENOERR; |
} |
|
// Send a character to the device output buffer. |
// Return 'true' if character is sent to device |
static bool |
vrc437x_serial_putc(serial_channel *chan, unsigned char c) |
{ |
vrc437x_serial_info *vrc437x_chan = (vrc437x_serial_info *)chan->dev_priv; |
volatile struct serial_port *port = (volatile struct serial_port *)vrc437x_chan->base; |
if (scc_read_ctl(port, R0) & RR0_TxEmpty) { |
// Transmit buffer is empty |
scc_write_dat(port, c); |
return true; |
} else { |
// No space |
return false; |
} |
} |
|
// Fetch a character from the device input buffer, waiting if necessary |
static unsigned char |
vrc437x_serial_getc(serial_channel *chan) |
{ |
unsigned char c; |
vrc437x_serial_info *vrc437x_chan = (vrc437x_serial_info *)chan->dev_priv; |
volatile struct serial_port *port = (volatile struct serial_port *)vrc437x_chan->base; |
while ((scc_read_ctl(port, R0) & RR0_RxAvail) == 0) ; // Wait for char |
c = scc_read_dat(port); |
return c; |
} |
|
// Set up the device characteristics; baud rate, etc. |
static Cyg_ErrNo |
vrc437x_serial_set_config(serial_channel *chan, cyg_uint32 key, |
const void *xbuf, cyg_uint32 *len) |
{ |
switch (key) { |
case CYG_IO_SET_CONFIG_SERIAL_INFO: |
{ |
cyg_serial_info_t *config = (cyg_serial_info_t *)xbuf; |
if ( *len < sizeof(cyg_serial_info_t) ) { |
return -EINVAL; |
} |
*len = sizeof(cyg_serial_info_t); |
if ( true != vrc437x_serial_config_port(chan, config, false) ) |
return -EINVAL; |
} |
break; |
default: |
return -EINVAL; |
} |
return ENOERR; |
} |
|
// Enable the transmitter on the device |
static void |
vrc437x_serial_start_xmit(serial_channel *chan) |
{ |
vrc437x_serial_info *vrc437x_chan = (vrc437x_serial_info *)chan->dev_priv; |
volatile struct serial_port *port = (volatile struct serial_port *)vrc437x_chan->base; |
if ((vrc437x_chan->regs[R1] & WR1_TxIntEnab) == 0) { |
CYG_INTERRUPT_STATE old; |
HAL_DISABLE_INTERRUPTS(old); |
vrc437x_chan->regs[R1] |= WR1_TxIntEnab; // Enable Tx interrupt |
scc_write_ctl(port, R1, vrc437x_chan->regs[R1]); |
(chan->callbacks->xmt_char)(chan); // Send first character to start xmitter |
HAL_RESTORE_INTERRUPTS(old); |
} |
} |
|
// Disable the transmitter on the device |
static void |
vrc437x_serial_stop_xmit(serial_channel *chan) |
{ |
vrc437x_serial_info *vrc437x_chan = (vrc437x_serial_info *)chan->dev_priv; |
volatile struct serial_port *port = (volatile struct serial_port *)vrc437x_chan->base; |
if ((vrc437x_chan->regs[R1] & WR1_TxIntEnab) != 0) { |
CYG_INTERRUPT_STATE old; |
HAL_DISABLE_INTERRUPTS(old); |
vrc437x_chan->regs[R1] &= ~WR1_TxIntEnab; // Disable Tx interrupt |
scc_write_ctl(port, R1, vrc437x_chan->regs[R1]); |
HAL_RESTORE_INTERRUPTS(old); |
} |
} |
|
// Serial I/O - low level interrupt handler (ISR) |
static cyg_uint32 |
vrc437x_serial_ISR(cyg_vector_t vector, cyg_addrword_t data) |
{ |
cyg_drv_interrupt_mask(VRC437X_SCC_INT); |
cyg_drv_interrupt_acknowledge(VRC437X_SCC_INT); |
return CYG_ISR_CALL_DSR; // Cause DSR to be run |
} |
|
inline static void |
vrc437x_int(serial_channel *chan, unsigned char stat) |
{ |
vrc437x_serial_info *vrc437x_chan = (vrc437x_serial_info *)chan->dev_priv; |
volatile struct serial_port *port = (volatile struct serial_port *)vrc437x_chan->base; |
// Note: 'stat' value is interrupt status register, shifted into "B" position |
if (stat & RR3_BRxIP) { |
// Receive interrupt |
unsigned char c; |
c = scc_read_dat(port); |
(chan->callbacks->rcv_char)(chan, c); |
} |
if (stat & RR3_BTxIP) { |
// Transmit interrupt |
(chan->callbacks->xmt_char)(chan); |
} |
if (stat & RR3_BExt) { |
// Status interrupt (parity error, framing error, etc) |
} |
} |
|
// Serial I/O - high level interrupt handler (DSR) |
// Note: This device presents a single interrupt for both channels. Thus the |
// interrupt handler has to query the device and decide which channel needs service. |
// Additionally, more than one interrupt condition may be present so this needs to |
// be done in a loop until all interrupt requests have been handled. |
// Also note that the hardware is rather broken. The interrupt status needs to |
// be read using only channel A (pointed to by 'data') |
static void |
vrc437x_serial_DSR(cyg_vector_t vector, cyg_ucount32 count, cyg_addrword_t data) |
{ |
serial_channel *chan; |
volatile struct serial_port *port = (volatile struct serial_port *)data; |
unsigned char stat; |
while (true) { |
stat = scc_read_ctl(port, R3); |
if (stat & (RR3_AExt | RR3_ATxIP | RR3_ARxIP)) { |
chan = vrc437x_chans[0]; // Hardware channel A |
vrc437x_int(chan, stat>>3); // Handle interrupt |
} else if (stat & (RR3_BExt | RR3_BTxIP | RR3_BRxIP)) { |
chan = vrc437x_chans[1]; // Hardware channel B |
vrc437x_int(chan, stat); // Handle interrupt |
} else { |
// No more interrupts, all done |
break; |
} |
} |
cyg_drv_interrupt_unmask(VRC437X_SCC_INT); |
} |
#endif |
/vrc437x/v2_0/src/vrc437x_serial.h
0,0 → 1,344
#ifndef CYGONCE_MIPS_VRC437X_SERIAL_H |
#define CYGONCE_MIPS_VRC437X_SERIAL_H |
|
// ==================================================================== |
// |
// vrc437x_serial.h |
// |
// Device I/O - Description of Mips VRC437X serial hardware |
// |
// ==================================================================== |
//####ECOSGPLCOPYRIGHTBEGIN#### |
// ------------------------------------------- |
// This file is part of eCos, the Embedded Configurable Operating System. |
// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc. |
// |
// eCos is free software; you can redistribute it and/or modify it under |
// the terms of the GNU General Public License as published by the Free |
// Software Foundation; either version 2 or (at your option) any later version. |
// |
// eCos is distributed in the hope that it will be useful, but WITHOUT ANY |
// WARRANTY; without even the implied warranty of MERCHANTABILITY or |
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
// for more details. |
// |
// You should have received a copy of the GNU General Public License along |
// with eCos; if not, write to the Free Software Foundation, Inc., |
// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. |
// |
// As a special exception, if other files instantiate templates or use macros |
// or inline functions from this file, or you compile this file and link it |
// with other works to produce a work based on this file, this file does not |
// by itself cause the resulting work to be covered by the GNU General Public |
// License. However the source code for this file must still be made available |
// in accordance with section (3) of the GNU General Public License. |
// |
// This exception does not invalidate any other reasons why a work based on |
// this file might be covered by the GNU General Public License. |
// |
// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc. |
// at http://sources.redhat.com/ecos/ecos-license/ |
// ------------------------------------------- |
//####ECOSGPLCOPYRIGHTEND#### |
// ==================================================================== |
//#####DESCRIPTIONBEGIN#### |
// |
// Author(s): gthomas |
// Contributors: gthomas |
// Date: 1999-04-15 |
// Purpose: Internal interfaces for serial I/O drivers |
// Description: |
// |
//####DESCRIPTIONEND#### |
// |
// ==================================================================== |
|
// Description of serial ports on Mips VRC437X |
// Based on Zilog 85C30 SCC |
|
struct serial_port { |
unsigned char _byte[16]; |
}; |
|
#define scc_ctl _byte[0] |
#define scc_dat _byte[8] |
|
#define R0 0 /* Register selects */ |
#define R1 1 |
#define R2 2 |
#define R3 3 |
#define R4 4 |
#define R5 5 |
#define R6 6 |
#define R7 7 |
#define R8 8 |
#define R9 9 |
#define R10 10 |
#define R11 11 |
#define R12 12 |
#define R13 13 |
#define R14 14 |
#define R15 15 |
|
/* Write Register 0 */ |
#define WR0_NullCode 0x00 /* Null Code */ |
#define WR0_PointHigh 0x08 /* Select upper half of registers */ |
#define WR0_ResExtInt 0x10 /* Reset Ext. Status Interrupts */ |
#define WR0_SendAbort 0x18 /* HDLC Abort */ |
#define WR0_ResRxIntFC 0x20 /* Reset RxINT on First Character */ |
#define WR0_ResTxP 0x28 /* Reset TxINT Pending */ |
#define WR0_ErrReset 0x30 /* Error Reset */ |
#define WR0_ResHiIUS 0x38 /* Reset highest IUS */ |
|
#define WR0_ResRxCRC 0x40 /* Reset Rx CRC Checker */ |
#define WR0_ResTxCRC 0x80 /* Reset Tx CRC Checker */ |
#define WR0_ResEOMlatch 0xC0 /* Reset EOM latch */ |
|
/* Write Register 1 */ |
|
#define WR1_ExtIntEnab 0x01 /* Ext Int Enable */ |
#define WR1_TxIntEnab 0x02 /* Tx Int Enable */ |
#define WR1_ParSpec 0x04 /* Parity is special condition */ |
|
#define WR1_RxIntDisab 0x00 /* Rx Int Disable */ |
#define WR1_RxIntFCE 0x08 /* Rx Int on First Character Only or Error */ |
#define WR1_IntAllRx 0x10 /* Int on all Rx Characters or error */ |
#define WR1_IntErrRx 0x18 /* Int on error only */ |
|
#define WR1_WtRdyRT 0x20 /* Wait/Ready on R/T */ |
#define WR1_WtFnRdyFn 0x40 /* Wait/FN/Ready FN */ |
#define WR1_WtRdyEnab 0x80 /* Wait/Ready Enable */ |
|
/* Write Register #2 (Interrupt Vector) */ |
|
/* Write Register 3 */ |
|
#define WR3_RxEnable 0x01 /* Rx Enable */ |
#define WR3_SyncInhibit 0x02 /* Sync Character Load Inhibit */ |
#define WR3_AddrSearch 0x04 /* Address Search Mode (SDLC) */ |
#define WR3_RxCRC_ENAB 0x08 /* Rx CRC Enable */ |
#define WR3_EntHuntMode 0x10 /* Enter Hunt Mode */ |
#define WR3_AutoEnab 0x20 /* Auto Enables */ |
#define WR3_Rx5 0x00 /* Rx 5 Bits/Character */ |
#define WR3_Rx7 0x40 /* Rx 7 Bits/Character */ |
#define WR3_Rx6 0x80 /* Rx 6 Bits/Character */ |
#define WR3_Rx8 0xc0 /* Rx 8 Bits/Character */ |
#define WR3_RxNbitsMask 0xc0 |
|
/* Write Register 4 */ |
|
#define WR4_ParityEn 0x01 /* Parity Enable */ |
#define WR4_ParityEven 0x02 /* Parity Even/Odd* */ |
|
#define WR4_SyncEnable 0x00 /* Sync Modes Enable */ |
#define WR4_SB1 0x04 /* 1 stop bit/char */ |
#define WR4_SB15 0x08 /* 1.5 stop bits/char */ |
#define WR4_SB2 0x0c /* 2 stop bits/char */ |
#define WR4_SB_MASK 0x0c |
|
#define WR4_Monsync 0x00 /* 8 Bit Sync character */ |
#define WR4_Bisync 0x10 /* 16 bit sync character */ |
#define WR4_SDLC 0x20 /* SDLC Mode (01111110 Sync Flag) */ |
#define WR4_EXtSync 0x30 /* External Sync Mode */ |
|
#define WR4_X1CLK 0x00 /* x1 clock mode */ |
#define WR4_X16CLK 0x40 /* x16 clock mode */ |
#define WR4_X32CLK 0x80 /* x32 clock mode */ |
#define WR4_X64CLK 0xC0 /* x64 clock mode */ |
#define WR4_XCLK_MASK 0xC0 |
|
/* Write Register 5 */ |
|
#define WR5_TxCRCEnab 0x01 /* Tx CRC Enable */ |
#define WR5_RTS 0x02 /* RTS */ |
#define WR5_SDLC_CRC 0x04 /* SDLC/CRC-16 */ |
#define WR5_TxEnable 0x08 /* Tx Enable */ |
#define WR5_SendBreak 0x10 /* Send Break */ |
#define WR5_Tx5 0x00 /* Tx 5 bits (or less)/character */ |
#define WR5_Tx7 0x20 /* Tx 7 bits/character */ |
#define WR5_Tx6 0x40 /* Tx 6 bits/character */ |
#define WR5_Tx8 0x60 /* Tx 8 bits/character */ |
#define WR5_TxNbitsMask 0x60 |
#define WR5_DTR 0x80 /* DTR */ |
|
/* Write Register 6 (Sync bits 0-7/SDLC Address Field) */ |
|
/* Write Register 7 (Sync bits 8-15/SDLC 01111110) */ |
|
/* Write Register 8 (transmit buffer) */ |
|
/* Write Register 9 (Master interrupt control) */ |
#define WR9_VIS 0x01 /* Vector Includes Status */ |
#define WR9_NoVector 0x02 /* No Vector */ |
#define WR9_DLC 0x04 /* Disable Lower Chain */ |
#define WR9_MIE 0x08 /* Master Interrupt Enable */ |
#define WR9_StatHi 0x10 /* Status high */ |
#define WR9_NoReset 0x00 /* No reset on write to R9 */ |
#define WR9_ResetB 0x40 /* Reset channel B */ |
#define WR9_ResetA 0x80 /* Reset channel A */ |
#define WR9_HwReset 0xc0 /* Force hardware reset */ |
|
/* Write Register 10 (misc control bits) */ |
#define WR10_Bit6 0x01 /* 6 bit/8bit sync */ |
#define WR10_LoopMode 0x02 /* SDLC Loop mode */ |
#define WR10_AbrtUnder 0x04 /* Abort/flag on SDLC xmit underrun */ |
#define WR10_MarkIdle 0x08 /* Mark/flag on idle */ |
#define WR10_GAOP 0x10 /* Go active on poll */ |
#define WR10_NRZ 0x00 /* NRZ mode */ |
#define WR10_NRZI 0x20 /* NRZI mode */ |
#define WR10_FM1 0x40 /* FM1 (transition = 1) */ |
#define WR10_FM0 0x60 /* FM0 (transition = 0) */ |
#define WR10_CRCPS 0x80 /* CRC Preset I/O */ |
|
/* Write Register 11 (Clock Mode control) */ |
#define WR11_TRxCXT 0x00 /* TRxC = Xtal output */ |
#define WR11_TRxCTC 0x01 /* TRxC = Transmit clock */ |
#define WR11_TRxCBR 0x02 /* TRxC = BR Generator Output */ |
#define WR11_TRxCDP 0x03 /* TRxC = DPLL output */ |
#define WR11_TRxCOI 0x04 /* TRxC O/I */ |
#define WR11_TxCRTxCP 0x00 /* Transmit clock = RTxC pin */ |
#define WR11_TxCTRxCP 0x08 /* Transmit clock = TRxC pin */ |
#define WR11_TxCBR 0x10 /* Transmit clock = BR Generator output */ |
#define WR11_TxCDPLL 0x18 /* Transmit clock = DPLL output */ |
#define WR11_RxCRTxCP 0x00 /* Receive clock = RTxC pin */ |
#define WR11_RxCTRxCP 0x20 /* Receive clock = TRxC pin */ |
#define WR11_RxCBR 0x40 /* Receive clock = BR Generator output */ |
#define WR11_RxCDPLL 0x60 /* Receive clock = DPLL output */ |
#define WR11_RTxCX 0x80 /* RTxC Xtal/No Xtal */ |
|
/* Write Register 12 (lower byte of baud rate generator time constant) */ |
|
/* Write Register 13 (upper byte of baud rate generator time constant) */ |
|
/* Write Register 14 (Misc control bits) */ |
#define WR14_BRenable 0x01 /* Baud rate generator enable */ |
#define WR14_BRSRC 0x02 /* Baud rate generator source */ |
#define WR14_DTRreq 0x04 /* DTR/Request function */ |
#define WR14_AutoEcho 0x08 /* Auto Echo */ |
#define WR14_LoopBack 0x10 /* Local loopback */ |
#define WR14_Search 0x20 /* Enter search mode */ |
#define WR14_RMC 0x40 /* Reset missing clock */ |
#define WR14_NoDPLL 0x60 /* Disable DPLL */ |
#define WR14_SSBR 0x80 /* Set DPLL source = BR generator */ |
#define WR14_SSRTxC 0xa0 /* Set DPLL source = RTxC */ |
#define WR14_SFMM 0xc0 /* Set FM mode */ |
#define WR14_SNRZI 0xe0 /* Set NRZI mode */ |
|
/* Write Register 15 (external/status interrupt control) */ |
#define WR15_ZCIE 0x02 /* Zero count IE */ |
#define WR15_DCDIE 0x08 /* DCD IE */ |
#define WR15_SYNCIE 0x10 /* Sync/hunt IE */ |
#define WR15_CTSIE 0x20 /* CTS IE */ |
#define WR15_TxUIE 0x40 /* Tx Underrun/EOM IE */ |
#define WR15_BRKIE 0x80 /* Break/Abort IE */ |
|
/* Read Register 0 */ |
#define RR0_RxAvail 0x01 /* Rx Character Available */ |
#define RR0_Zcount 0x02 /* Zero count */ |
#define RR0_TxEmpty 0x04 /* Tx Buffer empty */ |
#define RR0_DCD 0x08 /* DCD */ |
#define RR0_SyncHunt 0x10 /* Sync/hunt */ |
#define RR0_CTS 0x20 /* CTS */ |
#define RR0_TxEOM 0x40 /* Tx underrun */ |
#define RR0_BrkAbort 0x80 /* Break/Abort */ |
|
/* Read Register 1 */ |
#define RR1_AllSent 0x01 /* All sent */ |
/* Residue Data for 8 Rx bits/char programmed */ |
#define RR1_RES3 0x08 /* 0/3 */ |
#define RR1_RES4 0x04 /* 0/4 */ |
#define RR1_RES5 0x0c /* 0/5 */ |
#define RR1_RES6 0x02 /* 0/6 */ |
#define RR1_RES7 0x0a /* 0/7 */ |
#define RR1_RES8 0x06 /* 0/8 */ |
#define RR1_RES18 0x0e /* 1/8 */ |
#define RR1_RES28 0x00 /* 2/8 */ |
/* Special Rx Condition Interrupts */ |
#define RR1_PariryError 0x10 /* Parity error */ |
#define RR1_RxOverrun 0x20 /* Rx Overrun Error */ |
#define RR1_FrameError 0x40 /* CRC/Framing Error */ |
#define RR1_EndOfFrame 0x80 /* End of Frame (SDLC) */ |
|
/* Read Register 2 (channel b only) - Interrupt vector */ |
|
/* Read Register 3 (interrupt pending register) ch a only */ |
#define RR3_BExt 0x01 /* Channel B Ext/Stat IP */ |
#define RR3_BTxIP 0x02 /* Channel B Tx IP */ |
#define RR3_BRxIP 0x04 /* Channel B Rx IP */ |
#define RR3_AExt 0x08 /* Channel A Ext/Stat IP */ |
#define RR3_ATxIP 0x10 /* Channel A Tx IP */ |
#define RR3_ARxIP 0x20 /* Channel A Rx IP */ |
|
/* Read Register 8 (receive data register) */ |
|
/* Read Register 10 (misc status bits) */ |
#define RR10_OnLoop 0x02 /* On loop */ |
#define RR10_LoopSend 0x10 /* Loop sending */ |
#define RR10_Clk2Mis 0x40 /* Two clocks missing */ |
#define RR10_Clk1Mis 0x80 /* One clock missing */ |
|
/* Read Register 12 (lower byte of baud rate generator constant) */ |
|
/* Read Register 13 (upper byte of baud rate generator constant) */ |
|
/* Read Register 15 (value of WR 15) */ |
|
#define BRTC(brate) (( ((unsigned) DUART_CLOCK) / (2*(brate)*SCC_CLKMODE_TC)) - 2) |
#define DUART_CLOCK 4915200 /* Z8530 duart */ |
#define SCC_CLKMODE_TC 16 /* Always run x16 clock for async modes */ |
|
static unsigned char select_word_length_WR3[] = { |
WR3_Rx5, // 5 bits / word (char) |
WR3_Rx6, |
WR3_Rx7, |
WR3_Rx8 |
}; |
|
static unsigned char select_word_length_WR5[] = { |
WR5_Tx5, // 5 bits / word (char) |
WR5_Tx6, |
WR5_Tx7, |
WR5_Tx8 |
}; |
|
static unsigned char select_stop_bits[] = { |
0, |
WR4_SB1, // 1 stop bit |
WR4_SB15, // 1.5 stop bit |
WR4_SB2 // 2 stop bits |
}; |
|
static unsigned char select_parity[] = { |
0, // No parity |
WR4_ParityEn | WR4_ParityEven, // Even parity |
WR4_ParityEn, // Odd parity |
0xFF, // Mark parity |
0xFF, // Space parity |
}; |
|
static cyg_int32 select_baud[] = { |
0, // Unused |
50, // 50 |
75, // 75 |
110, // 110 |
0, // 134.5 |
150, // 150 |
200, // 200 |
300, // 300 |
600, // 600 |
1200, // 1200 |
1800, // 1800 |
2400, // 2400 |
3600, // 3600 |
4800, // 4800 |
7200, // 7200 |
9600, // 9600 |
14400, // 14400 |
19200, // 19200 |
38400, // 38400 |
0, // 57600 |
0, // 115200 |
0, // 230400 |
}; |
|
#endif // CYGONCE_MIPS_VRC437X_SERIAL_H |
/vrc437x/v2_0/ChangeLog
0,0 → 1,1217
2003-02-24 Jonathan Larmour <jifl@eCosCentric.com> |
|
* cdl/ser_mips_vrc437x.cdl: Remove irrelevant doc link. |
|
2001-09-18 Nick Garnett <nickg@redhat.com> |
|
* cdl/ser_mips_vrc437x.cdl: |
* src/vrc437x_serial.h: |
* src/vrc437x_serial.c: |
Fixed VRC4373 -> VRC437X conversions that were missed. |
Also made default baud rates 38400 rather than 9600. |
|
2001-09-10 Jonathan Larmour <jlarmour@redhat.com> |
|
* cdl/ser_mips_vrc437x.cdl: |
Fix 234000->230400 typo. |
|
2001-09-07 Nick Garnett <nickg@redhat.com> |
|
* cdl/ser_mips_vrc437x.cdl: |
* src/vrc437x_serial.h: |
* src/vrc437x_serial.c: |
Moved this entire tree over to vrc437x from vrc4373 to make it |
generic to both kinds of board. |
|
2000-10-12 Jesper Skov <jskov@redhat.com> |
|
* cdl/ser_mips_vrc4373.cdl: Moved testing parameters here. |
|
2000-08-01 Jonathan Larmour <jlarmour@redhat.co.uk> |
|
* src/vrc4373_serial.c (vrc4373_serial_set_config): Now use keys |
to make more flexible. |
|
2000-07-22 Jonathan Larmour <jlarmour@redhat.co.uk> |
|
* src/vrc4373_serial.c (vrc4373_serial_init): Add comment about broken |
interrupt handling |
|
2000-06-22 Hugo Tyson <hmt@cygnus.co.uk> |
|
* cdl/<yournamehere>.cdl: Remove the comment on the empty |
include_files directive; the tools now support this correctly. |
This keeps internal include files internal. |
|
2000-04-11 Hugo Tyson <hmt@cygnus.co.uk> |
|
* cdl/ser_mips_vrc4373.cdl: Change the parent from CYGPKG_IO_SERIAL |
(which is enabled most of the time) to CYGPKG_IO_SERIAL_DEVICES |
(which is not...) thus allowing convenient control independent of |
platform. Also enable all individual devices by default, now, so |
that they can be enabled simply by enabling the above new parent. |
|
2000-04-07 Hugo Tyson <hmt@cygnus.co.uk> |
|
* ecos.db: Re-organize device packages. This is a massive change |
involving deleting all the sources for serial and ethernet drivers |
from where they used to live in |
packages/io/serial/current/src/ARCH/PLATFORM.[ch] |
packages/net/drivers/eth/PLATFORM/current/src/... |
and reinstating them in |
packages/devs/serial/ARCH/PLATFORM/current/src/... |
packages/devs/eth/ARCH/PLATFORM/current/src/... |
|
All these new packages are properly defined in ecos.db, and are |
all of type "hardware" so that a "target" can grab them. |
|
This directory layout is descriptive of the devices we have right |
now, arch and platform are separate levels just to make it easier |
to navigate in the filesystem and similar to the HAL structure in |
the filesystem. |
|
It is *not* prescriptive of future work; for example, the mythical |
common highly-portable 16550 serial driver which works on many |
targets would be called "devs/serial/s16550/current", or a serial |
device for a particular board (cogent springs to mind) that can |
work with different CPUs fitted is "devs/serial/cogent/current". |
|
Changelogs have been preserved and replicated over all the new |
packages, so that no history is lost. |
|
The contents of individual source files are unchanged; they build |
in just the same emvironment except for a very few cases where the |
config file name changed in this movement. |
|
Targets in ecos.db have been redefined to bring in all relevant |
hardware packages including net and serial drivers (but the newly |
included packages are only active if their desired parent is |
available.) |
|
The names of CDL options (and their #defines of course) stay the |
same for the serial drivers, for backward compatibility. |
|
* templates/*/current.ect: these have had CYGPKG_IO_SERIAL added |
rather than it being in (almost) all target definitions. |
|
2000-04-05 Jonathan Larmour <jlarmour@redhat.co.uk> |
|
* src/common/tty.c (tty_read): CRLF conversion should use \r\n not \n\r |
(tty_write): Similarly |
|
* include/ttyio.h: Update CYG_TTY_IN_FLAGS_CRLF and |
CYG_TTY_IN_FLAGS_CRLF to match |
|
2000-03-31 Jesper Skov <jskov@redhat.com> |
|
* cdl/ser_sh_edk7708.cdl: Limit legal baud rate range. |
* src/sh/sh_sci_serial.c: Use baud rate macro instead of hardwired |
constants. |
|
2000-03-28 John Dallaway <jld@cygnus.co.uk> |
|
* cdl/io_serial.cdl, |
cdl/ser_arm_aeb.cdl, |
cdl/ser_arm_cma230.cdl, |
cdl/ser_arm_edb7xxx.cdl, |
cdl/ser_arm_pid.cdl, |
cdl/ser_i386_pc.cdl, |
cdl/ser_mips_jmr3904.cdl, |
cdl/ser_mips_vrc4373.cdl, |
cdl/ser_mn10300.cdl, |
cdl/ser_powerpc_cogent.cdl, |
cdl/ser_quicc_smc.cdl, |
cdl/ser_sh_edk7708.cdl, |
cdl/ser_sparclite_sleb.cdl, |
cdl/tty.cdl: |
|
Adjust documentation URLs. |
|
2000-03-07 Jesper Skov <jskov@redhat.com> |
|
* cdl/ser_mips_jmr3904.cdl: Rename devices to match CDL naming. |
|
2000-02-29 Jonathan Larmour <jlarmour@redhat.co.uk> |
|
* include/serialio.h: Correct baud rate typo: 230400 rather than |
234000. Thanks to Grant Edwards for the report. |
|
2000-02-28 Gary Thomas <gthomas@cygnus.co.uk> |
|
* src/powerpc/quicc_smc_serial.c: Use standard 'diag_dump_buf()'. |
|
2000-02-28 Jesper Skov <jskov@redhat.com> |
|
* tests/ser_test_protocol.inl: Allow 115200 baud on Cogent |
again. Fixed interrupt problem. |
|
2000-02-22 Jesper Skov <jskov@redhat.com> |
|
* tests/ser_test_protocol.inl: Don't use 115200 baud on |
Cogent. Our slower boards can't keep up. |
|
2000-02-17 Gary Thomas <gthomas@cygnus.co.uk> |
|
* cdl/ser_powerpc_cogent.cdl: Fix incorrect dependency. |
|
2000-02-16 Nick Garnett <nickg@cygnus.co.uk> |
|
* include/pkgconf/io_serial.h: |
Added configury for PC serial device drivers. |
|
* cdl/ser_i386_pc.cdl: |
* src/i386/pc_serial.c: |
* src/i386/pc_serial.h: |
Added these files to implement PC serial line drivers. |
|
* cdl/io_serial.cdl: |
Added CYGPKG_IO_SERIAL_I386_PC. |
|
* tests/ser_test_protocol.inl: |
Added support for PC serial line testing. |
|
2000-02-11 Jesper Skov <jskov@redhat.com> |
|
* src/sh/sh_sci_7708.inl (DEVTAB_ENTRY): |
* src/sparclite/sleb_sdtr.c: |
serial_devio => cyg_io_serial_devio |
|
2000-02-10 Jonathan Larmour <jlarmour@redhat.co.uk> |
|
* src/mn10300/mn10300_serial.c: Ensure all CYG_HAL_MN10300_* |
preprocessor conditionals use the correct CYGPKG_HAL_MN10300_AM3* form |
now. |
|
2000-02-03 Jesper Skov <jskov@redhat.com> |
|
* src/powerpc/quicc_smc_serial.c: CYG_HAL_POWERPC_x->CYGPKG_... |
|
2000-02-02 Jonathan Larmour <jlarmour@redhat.co.uk> |
|
* src/arm/aeb_serial.h: Rename lower case register macros to REG_ upper |
case macros |
|
* src/arm/aeb_serial.c: Update to reflect above |
|
2000-01-31 Simon FitzMaurice <sdf@cygnus.co.uk> |
* cdl/*.cdl: |
|
Adjust help URLs in line with new doc layout. |
|
2000-01-28 Simon FitzMaurice <sdf@cygnus.co.uk> |
* cdl/*.cdl: |
|
Adjust help URLs in line with new doc layout. |
|
2000-01-28 Gary Thomas <gthomas@cygnus.co.uk> |
|
* src/common/tty.c (tty_read): Fix problem with backspace at start |
of line (size must be 'signed' for compare to work). |
|
2000-01-19 Hugo Tyson <hmt@cygnus.co.uk> |
|
* cdl/*.cdl: Add descriptions to a number of options &c which were |
lacking same, also tidied up other typos as noticed en passant. |
|
2000-01-17 Gary Thomas <gthomas@cygnus.co.uk> |
|
* src/common/tty.c (tty_read): Avoid echoing "backspace/erase" at |
start of line. |
|
2000-01-05 Gary Thomas <gthomas@cygnus.co.uk> |
|
* src/common/serial.c (serial_write): Avoid potential deadlock if |
transmit start actually sends enough characters to signal cond wait. |
|
2000-01-03 Gary Thomas <gthomas@cygnus.co.uk> |
|
* include/serial.h: Fix namespace pollution - |
serial_devio => cyg_io_serial_devio |
serial_callbacks => cyg_io_serial_callbacks |
|
* src/mips/tx3904_serial.c: |
* src/mips/vrc4373_serial.c: |
* src/mn10300/mn10300_serial.c: |
* src/powerpc/quicc_smc_serial.c: |
* src/powerpc/cogent_serial_with_ints.c: |
* src/sparclite/sleb_sdtr.c: |
* src/arm/aeb_serial.c: |
* src/arm/pid_serial_with_ints.c: |
* src/arm/edb7xxx_serial.c: |
* src/arm/cma230_serial.c: |
* src/arm/ebsa285_serial.c: |
* src/common/haldiag.c: |
* src/common/serial.c: Fix namespace pollution - |
serial_devio => cyg_io_serial_devio |
|
1999-12-06 Gary Thomas <gthomas@cygnus.co.uk> |
|
* src/arm/pid_serial_with_ints.c (pid_serial_DSR): Add loop to handle |
case where an interrupt represents multiple events. |
|
1999-11-19 Gary Thomas <gthomas@cygnus.co.uk> |
|
* src/powerpc/quicc_smc_serial.c: Channel select for SMC2 was wrong. |
|
1999-11-18 Gary Thomas <gthomas@cygnus.co.uk> |
|
* include/pkgconf/io_serial.h: Remove mention of 7209/7212. |
|
1999-11-03 John Dallaway <jld@cygnus.co.uk> |
|
* cdl/io_serial.cdl: Define build options. |
|
1999-10-26 Jesper Skov <jskov@cygnus.co.uk> |
* tests/serial5.c (serial_test): Reduce speed in thumb mode. |
|
* src/arm/pid_serial.h: Added BE support. |
|
* src/PKGconf.mak: Use CYGPKG_<> instead of CYG_<> to control what |
needs to be compiled. |
|
1999-10-25 Gary Thomas <gthomas@cygnus.co.uk> |
|
* src/arm/pid_serial.h (ISR_RxTO): Define - character received but |
not handled "promptly". |
|
* src/arm/pid_serial_with_ints.c (pid_serial_DSR): Handle rcv interrupts |
properly (can't ignore them even with TO bit set). |
|
* src/arm/cl7211_serial.c (cl7211_serial_rx_DSR): Need to handle all |
input (empty input FIFO) otherwise characters get dropped. |
|
1999-10-15 Jesper Skov <jskov@cygnus.co.uk> |
|
* tests/ser_test_protocol.inl: Removed AEB rev C change. Was bogus. |
|
1999-10-11 Nick Garnett <nickg@cygnus.co.uk> |
|
* tests/ser_test_protocol.inl: Added configury for VR4300 testing. |
|
* src/mips/vrc4373_serial.c: Added Bi-endian support. |
|
* include/pkgconf/io_serial.h: Adjusted default baud rates to |
38400. |
|
1999-10-06 Jesper Skov <jskov@cygnus.co.uk> |
|
* tests/ser_test_protocol.inl: Run tests on AEB rev C as well. |
|
1999-09-28 Hugo Tyson <hmt@cygnus.co.uk> |
|
* src/powerpc/quicc_smc_serial.c (quicc_smc_serial_init): Correct |
value supplied for interrupt priority - it may be unused, but it |
is asserted for range. Initialize the diagnostic channel if on an |
MBX and if NOT using SMC1 ourselves, to ensure that diag output |
and built-in stubs work correctly; otherwise reset the quicc and |
ignore SMC1 as before. Fix various warnings, mostly about |
casting/arg-passing/assigning away volatile. |
|
1999-08-31 Jesper Skov <jskov@cygnus.co.uk> |
|
* tests/ser_test_protocol.inl: Define dummy crash ID. |
|
1999-08-30 Jesper Skov <jskov@cygnus.co.uk> |
|
* tests/ser_test_protocol.inl: Added crash information which |
should help track down repeating errors. |
|
1999-08-20 Jesper Skov <jskov@cygnus.co.uk> |
|
* tests/README: Added. |
|
1999-08-18 Jesper Skov <jskov@cygnus.co.uk> |
|
* tests/tty1.c: |
* tests/tty2.c: |
* tests/serial1.c: |
* tests/serial2.c: |
* tests/serial3.c: |
* tests/serial4.c: |
* tests/serial5.c: |
* tests/PKGconf.mak: |
Require kernel and kernel C API. |
|
1999-08-17 Nick Garnett <nickg@cygnus.co.uk> |
|
* src/mn10300/mn10300_serial.c: Added a simple implementation of a |
receive FIFO to try and reduce the overhead of receiving bytes. |
|
1999-08-16 Jonathan Larmour <jlarmour@cygnus.co.uk> |
|
* src/PKGconf.mak: |
* src/mn10300/mn10300_serial.c: |
* tests/ser_test_protocol.inl: |
Rename all am32 -> am31 |
|
1999-08-12 Nick Garnett <nickg@cygnus.co.uk> |
|
Imported following changes from development branch: |
|
1999-08-11 Nick Garnett <nickg@cygnus.co.uk> |
|
* tests/serial5.c: Modified config test for boards that need a lower |
speed for this test. |
|
* tests/ser_test_protocol.inl: Removed 14400 baud tests for all |
MN10300 variants. The MN10300 cannot currently do this speed. |
|
* src/mn10300/mn10300_serial.c: Tidied up the transmit interrupt |
enable/disable code to be variant specific. |
|
* include/pkgconf/io_serial.h: Undid Jonathan's change, since the |
same options are used for all MN10300 variants. |
|
1999-08-10 Jonathan Larmour <jlarmour@cygnus.co.uk> |
|
* include/pkgconf/io_serial.h: |
Reparent CYGPKG_IO_SERIAL_MN10300 from under CYGPKG_HAL_MN10300 to |
CYGPKG_HAL_MN10300_AM32_STDEVAL1 since it's stdeval1 specific |
|
1999-08-04 Nick Garnett <nickg@cygnus.co.uk> |
|
* tests/ser_test_protocol.inl: |
Changed names of MN10300 defines tested. Added AM33 definitions. |
|
* src/mn10300/mn10300_serial.c: |
Modified driver to work on am33 too. This simply requires some |
alternate definitions of things like register addresses and some |
bits in them plus some extra parameterization of some register |
values. |
|
* src/PKGconf.mak: |
Added am33 to list of architectures supporting serial lines. |
|
1999-07-28 Gary Thomas <gthomas@cygnus.co.uk> |
|
* include/pkgconf/io_serial.h: Update descriptions to be more |
generic (CL7x11 instead of CL7211). |
|
1999-07-28 Jonathan Larmour <jlarmour@cygnus.co.uk> |
|
* include/pkgconf/io_serial.h: Correct typos in CDL description |
for serial port 2 driver |
|
1999-07-26 Hugo Tyson <hmt@cygnus.co.uk> |
|
* src/arm/ebsa285_serial.c: New file: device driver for the serial |
device of the Intel StrongARM EBSA-285 evaluation board. |
|
* include/pkgconf/io_serial.h (CYGPKG_IO_SERIAL_ARM_EBSA285): |
Config for it. |
|
* src/PKGconf.mak (EXTRAS_COMPILE): Compile it. |
|
* tests/ser_test_protocol.inl (TEST_SER_DEV): Enable testing of it. |
|
1999-07-08 Jesper Skov <jskov@cygnus.co.uk> |
|
* tests/ser_test_protocol.inl (change_config): Changed implementation. |
|
1999-06-27 Gary Thomas <gthomas@cygnus.co.uk> |
|
* src/powerpc/quicc_smc_serial.c (quicc_smc_serial_init): More robust |
initialization, with data cache disabled. This seems to fix the |
random failures described below. |
|
* tests/ser_test_protocol.inl: Add configuration for QUICC/MBX860. |
Added some delays in the configuration change code to make QUICC |
happy [didn't help much although the manual says they are required]. |
|
* src/powerpc/quicc_smc_serial.h (UART_BITRATE): Rewrote macro to |
match what the Linux driver uses - still doesn't work well, though. |
|
* src/powerpc/quicc_smc_serial.c: Lots of changes trying to get the |
serial driver working and robust. At this point it works quite well, |
using the default buffer sizes. Changing from the defaults seem to |
easily break it though, certainly on input. Also, changing the baud |
rate seems to not work reliably. |
|
* src/common/serial.c: Add some tracing/debug info to try and debug |
problems with QUICC serial driver. These are hard disabled with |
"XX_" prepended to "CYGDBG_DIAG_BUF". Enabling them gives information |
about how/when data are delivered from the serial driver. |
|
* include/pkgconf/io_serial.h: Adjust limits and defaults on number and |
size of buffers with values that seem to work. |
|
1999-06-21 Jesper Skov <jskov@cygnus.co.uk> |
|
* src/sh/sh_sci_serial.c: Rearranged inclusion of .inl file a bit |
to avoid compiler warnings. |
|
1999-06-21 Gary Thomas <gthomas@cygnus.co.uk> |
|
* include/pkgconf/io_serial.h: Fix CDL for number of buffers. |
|
* src/powerpc/quicc_smc_serial.c: Force number of buffers = 1. |
|
1999-06-20 Gary Thomas <gthomas@cygnus.co.uk> |
|
* include/pkgconf/io_serial.h: Some clean up (removed commented |
obsolete CDL parenting structure). |
Add support for Motorola PowerPC QUICC/SMC. |
|
* src/arm/cma230_serial.c: |
* src/arm/cl7211_serial.c: |
* src/arm/aeb_serial.c: |
* src/arm/pid_serial_with_ints.c: Use #include to get 'diag_printf()' |
prototypes. |
|
1999-06-17 Gary Thomas <gthomas@cygnus.co.uk> |
|
* src/arm/cl7211_serial.c (cl7211_serial_start_xmit): Fix race which |
cause xmitter to get stuck. |
|
1999-06-16 Jesper Skov <jskov@cygnus.co.uk> |
|
* src/sh/sh_serial.c: [removed] |
* src/sh/sh_sci_serial.c: [added] |
* src/sh/sh_sci_7708.inl: [added] |
* include/pkgconf/io_serial.h: |
* src/PKGconf.mak (EXTRAS_COMPILE): |
* tests/ser_test_protocol.inl: |
Renamed CDL options and restructered driver. |
Fixed CDL typo. |
|
1999-06-04 Jesper Skov <jskov@cygnus.co.uk> |
|
* include/pkgconf/io_serial.h: Fixed CDL string for BAUD rate option. |
|
1999-06-04 Gary Thomas <gthomas@cygnus.co.uk> |
|
* tests/ser_test_protocol.inl: Disable testing at 115200 |
for Cogent CMA230 (ARM). |
|
* src/arm/cma230_serial.c: Fix interrupt for port B. |
|
1999-05-31 Jesper Skov <jskov@cygnus.co.uk> |
|
* src/sh/sh_serial.c: Fixed receive interrupts and added handler for |
error interrupts. |
|
1999-05-28 Jesper Skov <jskov@cygnus.co.uk> |
|
* io/serial/current/src/PKGconf.mak: |
* io/serial/current/tests/ser_test_protocol.inl: |
* include/pkgconf/io_serial.h: |
Renamed SH platform package to edk7708. |
|
1999-05-27 Jesper Skov <jskov@cygnus.co.uk> |
|
* tests/ser_test_protocol.inl: Added ability to change options in |
host software. |
|
1999-05-27 Jonathan Larmour <jlarmour@cygnus.co.uk> |
|
* src/mn10300/mn10300_serial.c (mn10300_serial_config_port): |
Wait for the serial device to become acquiescent before disabling |
it. This prevents cygmon's outgoing characters getting corrupted |
due to transmission being disabled. |
Fix for PR 20047 |
|
1999-05-26 Gary Thomas <gthomas@cygnus.co.uk> |
|
* include/pkgconf/io_serial.h: |
* tests/ser_test_protocol.inl: Add Cogent CMA230 setup. |
|
* src/arm/cma230_serial.c: Make names compatible with Cogent |
PowerPC board. |
|
1999-05-26 Gary Thomas <gthomas@cygnus.co.uk> |
|
* tests/ser_test_protocol.inl: Add Cirrus Logic CL7211 setup. |
1999-05-26 Jesper Skov <jskov@cygnus.co.uk> |
|
* src/sh/sh_serial.c: Added more baud rate values. Disabled |
interrupt driven receive. Fixed config_port to enable proper |
interrupt flags. |
|
1999-05-25 Jonathan Larmour <jlarmour@cygnus.co.uk> |
|
* tests/ser_test_protocol.inl: |
Change all mentions of CYGPKG_HAL_TX39_JMR3904 to |
CYGPKG_HAL_MIPS_TX39_JMR3904 |
|
1999-05-25 Jonathan Larmour <jlarmour@cygnus.co.uk> |
|
* src/PKGconf.mak (EXTRAS_COMPILE): Change CYG_HAL_TX39 to |
CYG_HAL_MIPS_TX39 |
1999-05-25 Jesper Skov <jskov@cygnus.co.uk> |
|
* tests/ser_test_protocol.inl: Added sh entry. |
|
1999-05-24 Jesper Skov <jskov@cygnus.co.uk> |
|
* src/PKGconf.mak: |
* include/pkgconf/io_serial.h: |
* src/sh/sh_serial.c: |
Added sh driver. |
|
1999-05-18 Jesper Skov <jskov@cygnus.co.uk> |
PR 19926 |
* src/sparclite/sleb_sdtr.c (sleb_sdtr_rx_DSR): Only read chan if |
there is one. |
|
1999-05-18 Jesper Skov <jskov@cygnus.co.uk> |
PR 19926 |
* src/arm/cl7211_serial.c (cl7211_serial_rx_DSR): Only read char |
if there is one. |
|
1999-05-16 Gary Thomas <gthomas@cygnus.co.uk> |
|
* src/arm/cl7211_serial.c: Clean up, first working version. |
|
1999-05-14 Jesper Skov <jskov@cygnus.co.uk> |
|
* tests/ser_test_protocol.inl: Removed workaround for spurious |
Cogent reads. |
|
* src/arm/aeb_serial.c: |
* src/arm/aeb_serial.h: |
* src/arm/pid_serial_with_ints.c: |
* src/arm/pid_serial.h: |
* src/powerpc/cogent_serial.h: |
* src/powerpc/cogent_serial_with_ints.c: |
Check for receive interrupt before reading. |
|
1999-05-13 Nick Garnett <nickg@cygnus.co.uk> |
|
The follow changes were made in a branch an have now been merged: |
|
1999-04-21 Gary Thomas <gthomas@cygnus.co.uk> |
|
* src/mips/vrc4373_serial.c: Small changes to get working with |
interrupts. |
|
1999-04-20 John Dallaway <jld@cygnus.co.uk> |
|
* include/pkgconf/io_serial.h: Fix CYGPKG_IO_SERIAL_TX39_JMR3904 |
parent attribute. |
|
1999-05-11 Gary Thomas <gthomas@cygnus.co.uk> |
|
* src/arm/cl7211_serial.c: Fix compile problems from merged code. |
|
1999-05-05 Jesper Skov <jskov@cygnus.co.uk> |
|
* tests/ser_test_protocol.inl: Tidied up a bit and added |
description of protocol. |
|
1999-05-05 Jesper Skov <jskov@cygnus.co.uk> |
|
* src/common/serial.c (serial_write, serial_read): Clear abort |
flag at entry. |
|
1999-05-05 Jesper Skov <jskov@cygnus.co.uk> |
|
* tests/serial4.c (serial_test): Handle config fails correctly. |
|
* tests/ser_test_protocol.inl: Better change_config |
handling. Simple recovery and negotiation isn't timing |
dependant. |
|
1999-05-05 Jesper Skov <jskov@cygnus.co.uk> |
|
* tests/timeout.inl: Updated with the below changes. |
|
1999-05-05 Gary Thomas <gthomas@cygnus.co.uk> |
|
* misc/timeout.inl (timeout): Timeouts are relative, but alarms |
need absolute time values. |
|
1999-05-04 Jesper Skov <jskov@cygnus.co.uk> |
PR 20018 |
* tests/serial1.c (serial_test): Always PASS, regardless of |
configuration. |
|
1999-05-04 Jesper Skov <jskov@cygnus.co.uk> |
|
* tests/ser_test_protocol.inl: Reverse order of configurations - |
run tests with slow baud rate first. |
Only check CYG_KERNEL_DIAG_GDB_SERIAL_DIRECT for SLEB on RAM startup. |
|
1999-05-04 Jesper Skov <jskov@cygnus.co.uk> |
* src/mn10300/mn10300_serial.c: |
Use interrupt enable/disable feature of serial port2 to allow |
coexistence with CygMon/hal_diag. |
|
* tests/ser_test_protocol.inl: Use port2 for MN10300. |
|
1999-04-28 Bart Veer <bartv@cygnus.co.uk> |
|
* src/PKGconf.mak (EXTRAS_COMPILE): |
Use the new rules for generating libextras.a |
|
1999-04-26 Gary Thomas <gthomas@cygnus.co.uk> |
|
* include/pkgconf/io_serial.h: Add support for Cirrus Logic CL7211. |
|
|
1999-04-20 Gary Thomas <gthomas@cygnus.co.uk> |
|
* src/arm/aeb_serial.c: |
* src/arm/pid_serial_with_ints.c: Fix default baud rate if unbuffered. |
1999-04-20 Jesper Skov <jskov@cygnus.co.uk> |
|
* tests/ser_test_protocol.inl: Added some comments. Disabled 38400 |
for SLEB. Only run test on SLEB if CygMon isn't used for diag |
output. |
|
1999-04-15 Jesper Skov <jskov@cygnus.co.uk> |
PR 19752 |
* tests/serial3.c: |
* tests/serial5.c: |
Run these tests at a lower baud rate on ARM AEB. |
|
1999-04-14 Jesper Skov <jskov@cygnus.co.uk> |
PR 19839 |
* src/mn10300/mn10300_serial.c: |
Fix compiler warnings. |
|
1999-04-14 Bart Veer <bartv@cygnus.co.uk> |
|
* include/pkgconf/io_serial.h: |
Reparent the board-specific serial devices below the actual boards. |
|
1999-04-13 Jesper Skov <jskov@cygnus.co.uk> |
|
* tests/ser_test_protocol.inl: |
NA when run from simulator. |
|
1999-04-12 Jesper Skov <jskov@cygnus.co.uk> |
|
* tests/ser_test_protocol.inl: |
Disabled 115200 for MN10300. |
Reclaim interrupt vectors from CygMon when testing on SLEB. |
|
1999-04-09 Gary Thomas <gthomas@cygnus.co.uk> |
|
* include/serial.h: Change SERIAL_CHANNEL setup so all channels |
have serial callbacks, regardless of buffering. |
|
1999-04-09 Jesper Skov <jskov@cygnus.co.uk> |
|
* src/common/tty.c: |
* include/pkgconf/io_serial.h: |
Added new ttydiag device layered on top of haldiag, so that tty0 |
can be layered on top of ser0. |
|
1999-04-08 Jesper Skov <jskov@cygnus.co.uk> |
|
* tests/tty1.c: [added] |
* tests/tty2.c: [added] |
* tests/PKGconf.mak: |
* tests/ser_test_protocol.inl: |
Added two simple TTY tests. |
|
1999-04-07 Hugo Tyson <hmt@cygnus.co.uk> |
|
* src/sparclite/sleb_sdtr.h: Include cyg/hal/hal_io.h for I/O |
macros instead of hal_diag.h where they had evolved before. |
|
1999-04-06 Jesper Skov <jskov@cygnus.co.uk> |
|
* tests/serial4.c (serial_test): |
* tests/serial3.c (serial_test): |
Reduce packet sizes. |
|
1999-03-31 Jesper Skov <jskov@cygnus.co.uk> |
|
* tests/ser_test_protocol.inl: Added remaining targets to the |
test. |
|
1999-03-31 Gary Thomas <gthomas@cygnus.co.uk> |
|
* src/sparclite/sleb_sdtr.c (sleb_sdtr_start_xmit): Fix timing race |
when enabling xmit interrupts. |
|
1999-03-26 Gary Thomas <gthomas@cygnus.co.uk> |
|
* src/sparclite/sleb_sdtr.c: Change how the port is set up. The transmitter |
is now always enabled, just the interrupts are masked/unmasked to control it. |
This lets the serial driver cooperate with Cygmon on the port used for GDB. |
Note that currently serial input does not work for CON1 since Cygmon is |
taking all of the receive interrupts for itself. |
(sleb_sdtr_tx_DSR): Need to keep track whether xmit interrupt should be |
enabled - otherwise it can get enabled incorrectly and we get interrupted |
to death! |
|
1999-03-26 Jesper Skov <jskov@cygnus.co.uk> |
|
* tests/ser_test_protocol.inl: Send a DONE message after a no-echo |
binary packet. |
|
1999-03-26 Hugo Tyson <hmt@cygnus.co.uk> |
|
* tests/serial5.c: |
* tests/serial4.c: |
* tests/serial3.c: |
* tests/serial2.c: |
* tests/serial1.c: |
Make these build when no kernel present; include of testcase |
was the wrong side of the ifdef. |
|
1999-03-26 Jesper Skov <jskov@cygnus.co.uk> |
|
* tests/serial5.c: |
* tests/serial4.c: |
* tests/serial3.c: |
* tests/serial2.c: |
* tests/serial1.c: |
Moved NOP check to ser_test_protocol open call. |
|
* tests/ser_test_protocol.inl: Make sure the proper device is |
selected for testing. Do NOP check in open call. |
|
1999-03-25 Gary Thomas <gthomas@cygnus.co.uk> |
|
* include/pkgconf/io_serial.h: |
* misc/console.c: |
* src/arm/aeb_serial.c: |
* src/arm/pid_serial_with_ints.c: |
* src/common/tty.c: |
* src/mips/tx3904_serial.c: |
* src/mn10300/mn10300_serial.c: |
* src/powerpc/cogent_serial_with_ints.c: |
* src/sparclite/sleb_sdtr.c: Update CDL to follow naming conventions. |
|
* src/mips/tx3904_serial.c (tx3904_serial_config_port): |
Make sure port is enabled (CDL) before using it. |
|
* src/mn10300/mn10300_serial.c (mn10300_serial_config_port): |
* src/powerpc/cogent_serial_with_ints.c (cogent_serial_config_port): |
* src/arm/aeb_serial.c (aeb_serial_config_port): |
* src/arm/pid_serial_with_ints.c (pid_serial_config_port): Change so that |
the physical port is not modified unless the provided configuration is valid. |
|
* src/sparclite/sleb_sdtr.c (sleb_sdtr_config_port): |
Using wrong config data. |
|
* include/serialio.h: Add macros to support baud rate from CDL. |
|
* include/pkgconf/io_serial.h: |
* src/mn10300/mn10300_serial.c: |
* src/mips/tx3904_serial.c (tx3904_serial_ISR): |
* src/sparclite/sleb_sdtr.c: |
* src/powerpc/cogent_serial_with_ints.c: |
* src/arm/pid_serial_with_ints.c: |
* src/arm/aeb_serial.c: Add configury for baud rate and buffer size. |
|
1999-03-24 Nick Garnett <nickg@cygnus.co.uk> |
|
* src/mips/tx3904_serial.c: |
Now uses CYGHWR_HAL_MIPS_CPU_FREQ_ACTUAL to get CPU |
frequency. This is a little more accurate than using |
CYGHWR_HAL_MIPS_CPU_FREQ. |
|
1999-03-24 Gary Thomas <gthomas@cygnus.co.uk> |
|
* include/serialio.h (CYGNUM_SERIAL_BAUD_MIN/MAX): Add for completeness. |
|
* src/arm/aeb_serial.c (aeb_serial_stop_xmit): |
* src/arm/pid_serial_with_ints.c (pid_serial_stop_xmit): Fix typo in comment. |
|
1999-03-24 Jesper Skov <jskov@cygnus.co.uk> |
|
* tests/ser_test_protocol.inl: Weeded out configs TX39 doesn't |
like. |
|
* src/powerpc/cogent_serial.h: |
Added copyright header. |
|
* tests/ser_test_protocol.inl: |
* tests/serial1.c: |
* tests/serial2.c: |
* tests/serial3.c: |
* tests/serial4.c: |
* tests/serial5.c: |
Don't try to run tests when no IO device has been specified. |
|
1999-03-23 Jesper Skov <jskov@cygnus.co.uk> |
|
* misc/serial1.c, misc/serial2.c, misc/serial3.c, misc/serial4.c, |
* misc/serial5.c, misc/ser_test_protocol.inl |
Deleted. |
|
1999-03-23 Jesper Skov <jskov@cygnus.co.uk> |
|
* misc/PKGconf.mak: |
* tests/timeout.inl: |
* tests/PKGconf.mak: |
* tests/serial1.c: |
* tests/serial2.c: |
* tests/serial3.c: |
* tests/serial4.c: |
* tests/serial5.c: |
* tests/ser_test_protocol.inl: |
Moved the serial tests from the misc directory to the tests |
directory. |
|
1999-03-23 Nick Garnett <nickg@cygnus.co.uk> |
|
* src/mn10300/mn10300_serial.c: Now initially mask TX interrupts |
at initialization and unmask/remask in start/stop xmit |
routines. This has no real effect on the hardware, but the |
simulator does not implement the LCR_TXE bit properly, resulting |
in spurious TX interrupts during diagnostic output. |
This was the cause of the slow output reported in PR 19559. |
|
1999-03-23 Gary Thomas <gthomas@cygnus.co.uk> |
|
* include/pkgconf/io_serial.h: Fix "display" strings to have appropriate |
case - mostly lower case. |
|
1999-03-22 Hugo Tyson <hmt@cygnus.co.uk> |
|
* misc/console.c: |
* misc/serial.c: |
* misc/serial1.c: |
* misc/serial2.c: |
* misc/serial3.c: |
* misc/serial4.c: |
* misc/serial5.c: |
Use CYGNUM_HAL_STACK_SIZE_TYPICAL for the stack size instead of |
CYGNUM_HAL_MINIMUM_STACK_SIZE. |
|
1999-03-22 Gary Thomas <gthomas@cygnus.co.uk> |
|
* src/mn10300/mn10300_serial.c: |
* src/mips/tx3904_serial.c: Add CDL configury. |
|
* include/pkgconf/io_serial.h: Update CDL to add device name |
configurability for all devices. |
|
* src/sparclite/sleb_sdtr.c: |
* src/powerpc/cogent_serial_with_ints.c: |
* src/arm/aeb_serial.c: |
* src/arm/pid_serial_with_ints.c: Use CDL configured device names. |
|
1999-03-22 Jesper Skov <jskov@lassi.cygnus.co.uk> |
|
* misc/serial1.c: |
* misc/serial2.c: |
* misc/serial3.c: |
* misc/serial4.c: |
* misc/serial5.c: |
Requires kernel as well. |
|
1999-03-22 Jesper Skov <jskov@cygnus.co.uk> |
|
* src/sparclite/sleb_sdtr.c: |
Moved include statement to avoid warnings. |
|
1999-03-19 Jesper Skov <jskov@cygnus.co.uk> |
|
* misc/ser_test_protocol.inl: |
* misc/serial5.c: |
* misc/PKGconf.mak: |
Replace complex and not very stable duplex test with a simpler |
test that works better. |
Added serial5 using that test. |
|
1999-03-19 Jesper Skov <jskov@cygnus.co.uk> |
|
* misc/PKGconf.mak: |
* misc/serial1.c: |
* misc/serial2.c: |
Added API test and made serial2 do simple string output. |
|
1999-03-19 Jesper Skov <jskov@cygnus.co.uk> |
|
* src/powerpc/cogent_serial_with_ints.c: Changed ToDo comment. |
|
1999-03-19 Jesper Skov <jskov@lassi.cygnus.co.uk> |
|
* src/powerpc/cogent_serial_with_ints.c: |
* src/arm/aeb_serial.c: |
* src/arm/pid_serial_with_ints.c: |
Moved include statement to avoid warnings. |
|
1999-03-19 Gary Thomas <gthomas@cygnus.co.uk> |
|
* include/pkgconf/io_serial.h: More CDL problems. |
|
1999-03-18 Gary Thomas <gthomas@cygnus.co.uk> |
|
* include/pkgconf/io_serial.h: Add CDL for SPARClite SLEB. |
|
* src/powerpc/cogent_serial_with_ints.c: |
* src/arm/pid_serial_with_ints.c: |
* src/arm/aeb_serial.c: Update device names to match CDL. |
|
* include/pkgconf/io_serial.h: Change names for serial ports to |
be CYGPKG_IO_SERIAL_<arch>_<platform>_<port>. |
|
1999-03-18 Jesper Skov <jskov@cygnus.co.uk> |
|
* misc/ser_test_protocol.inl: |
* misc/serial2.c: |
First stab at the duplex binary test. Still much fun to be had... |
|
1999-03-18 Jesper Skov <jskov@cygnus.co.uk> |
|
* misc/ser_test_protocol.inl: Added timeout for PING. |
|
1999-03-18 Gary Thomas <gthomas@cygnus.co.uk> |
|
* src/common/serial.c: Change ABORT functionality to be DSR safe. |
(serial_get_config): Fix typo! |
|
* include/pkgconf/io_serial.h: Small change in CDL to make serial |
devices tied to the platform and not the serial I/O package. This |
means that only the devices appropriate to a given platform can be |
enabled. |
|
* misc/serial.c: Better use of alarms - only trigger at the time of |
the next timeout. Moved timeout functions to new file "timeout.inl". |
|
* src/common/serial.c (serial_get_config): Add support for |
CYG_IO_GET_CONFIG_SERIAL_INPUT_FLUSH and CYG_IO_GET_CONFIG_SERIAL_ABORT. |
|
* misc/serial.c: Add simple timeout mechanisms. |
|
1999-03-17 Gary Thomas <gthomas@cygnus.co.uk> |
|
* src/powerpc/cogent_serial_with_ints.c: |
* src/arm/aeb_serial.c: |
* src/arm/pid_serial_with_ints.c: Conditionalize based on CDL. |
|
* include/pkgconf/io_serial.h: Add some CDL configury - not perfect |
because of current ~CDL limitations. |
|
1999-03-17 Jesper Skov <jskov@cygnus.co.uk> |
|
* misc/serial2.c: Cleaned up a bit. Used for hacking new tests. |
|
1999-03-17 Jesper Skov <jskov@cygnus.co.uk> |
|
* misc/PKGconf.mak: |
* misc/ser_test_protocol.inl: |
* misc/serial2.c: |
* misc/serial3.c: |
* misc/serial4.c: |
Put testing protocol implementation in a separate file. Split the |
tests in serial2 into separate files. |
|
1999-03-16 Nick Garnett <nickg@cygnus.co.uk> |
|
* src/mn10300/mn10300_serial.c: Fixed some compiler warnings. |
|
1999-03-15 Gary Thomas <gthomas@cygnus.co.uk> |
|
* include/pkgconf/io_serial.h: Change default configurations. |
No serial drivers enabled for PID port A or AEB. |
|
* src/sparclite/sleb_sdtr.c: |
* src/powerpc/cogent_serial_with_ints.c: |
* src/arm/aeb_serial.c: |
* src/arm/pid_serial_with_ints.c: |
* src/common/haldiag.c: |
* src/common/tty.c: |
* src/common/serial.c: Add 'CYGDBG_IO_INIT' for control of init |
messages. |
|
* src/powerpc/cogent_serial_with_ints.c: |
* src/sparclite/sleb_sdtr.c: |
* src/arm/aeb_serial.c: |
* src/arm/pid_serial_with_ints.c: Don't include <cyg/kernel/kapi.h> |
|
1999-03-15 Jesper Skov <jskov@cygnus.co.uk> |
|
* misc/serial2.c (serial_test): Fix use of strlen. Fix DONE part |
of binary protocol. |
|
1999-03-12 Jesper Skov <jskov@cygnus.co.uk> |
|
* misc/serial2.c: Play a bit with timing. Think I broke it :( |
Added DONE to BINARY packet. |
Proper call to DRAIN. |
|
1999-03-12 Nick Garnett <nickg@cygnus.co.uk> |
|
* src/mips/tx3904_serial.c: Tidied away some debugging code. |
|
1999-03-12 Jesper Skov <jskov@cygnus.co.uk> |
|
* misc/serial2.c: Removed bogus config changes. |
|
1999-03-12 Jesper Skov <jskov@cygnus.co.uk> |
|
* misc/serial2.c (serial_test): Check for ser_filter on host (PING |
packet). |
|
1999-03-11 Jesper Skov <jskov@cygnus.co.uk> |
|
* src/powerpc/cogent_serial_with_ints.c: Added note. |
|
* misc/serial2.c: |
Added (almost) proper configuration handling. |
Run tests on varying configurations. |
|
1999-03-11 Nick Garnett <nickg@cygnus.co.uk> |
|
* src/mips/tx3904_serial.c: |
Many changes to get working. |
|
* misc/console.c (console_test): Fixed compiler warning. |
|
* misc/serial2.c: |
Added device name for TX39 testing. |
Fixed some bugs in Tcyg_io_write() macro. |
|
1999-03-10 Jesper Skov <jskov@cygnus.co.uk> |
|
* misc/serial2.c: Added target specific test device name. |
|
1999-03-10 John Dallaway <jld@cygnus.co.uk> |
|
* include/pkgconf/io_serial.h: Correct CDL description spelling. |
|
1999-03-10 Jesper Skov <jskov@cygnus.co.uk> |
|
* src/powerpc/cogent_serial_with_ints.c: |
* misc/console.c: |
Fixed compiler warnings. |
|
1999-03-10 Gary Thomas <gthomas@cygnus.co.uk> |
|
* include/pkgconf/io_serial.h: Improve CDL descriptions. |
|
1999-03-10 Jesper Skov <jskov@cygnus.co.uk> |
|
* misc/serial2.c (serial_test): Do some more tests with changed |
baud rates. |
|
1999-03-09 Jesper Skov <jskov@cygnus.co.uk> |
|
* misc/serial2.c (serial_test): Added workaround for spurious byte |
problem. Added a few more tests to run. |
|
* src/powerpc/cogent_serial_with_ints.c |
(cogent_serial_config_port): Remove interrupt enabling. |
|
1999-03-09 Nick Garnett <nickg@cygnus.co.uk> |
|
* src/PKGconf.mak: |
* src/mips/tx3904_serial.c: |
Added initial version of TX39 device driver. Currently untested |
but eliminates PR19445. |
|
1999-03-09 Jesper Skov <jskov@cygnus.co.uk> |
|
* misc/serial2.c: DRAIN function works now. |
|
1999-03-09 Jesper Skov <jskov@cygnus.co.uk> |
|
* include/pkgconf/io_serial.h: Only enable one serial driver per |
default. |
|
1999-03-08 Jesper Skov <jskov@cygnus.co.uk> |
|
* misc/serial2.c (serial_test): Be a bit more aggressive. |
|
* src/powerpc/cogent_serial_with_ints.c: Check that configuration |
is sensible. |
|
1999-03-08 Jesper Skov <jskov@cygnus.co.uk> |
|
* src/powerpc/cogent_serial_with_ints.c: |
Added support for both ports. |
|
* include/pkgconf/io_serial.h: Added simple defines for cogent |
serial ports. No CDL yet. |
|
1999-03-08 Jesper Skov <jskov@cygnus.co.uk> |
|
* misc/serial.c: Removed PID references. Fixed compiler warnings. |
|
1999-03-08 Jesper Skov <jskov@cygnus.co.uk> |
|
* src/powerpc/cogent_serial_with_ints.c: Cleaned up a |
bit. Actually works now. |
|
1999-03-08 Gary Thomas <gthomas@cygnus.co.uk> |
|
* src/common/serial.c: Change in cyg_drv_cond_wait() behaviour |
means DSR lock should be left alone. |
|
1999-03-08 Jesper Skov <jskov@cygnus.co.uk> |
PR 19400 |
* src/powerpc/cogent_serial_with_ints.c (cogent_serial_init): Set |
valid interrupt priority. |
|
1999-03-05 Nick Garnett <nickg@cygnus.co.uk> |
|
* src/mn10300/mn10300_serial.c (mn10300_serial_init): |
Added extra test to avoid initializing serial 2 when CYGMON is |
present. |
Include hal_intr.h explicitly for use in non-kernel |
configurations. |
|
* src/common/serial.c: |
Added extra test before calls to cyg_drv_cond_wait() to avoid race |
condition. This is not, however, a complete solution to this |
problem. A better solution will be forthcoming. |
|
* include/serial.h: |
Changed include files used to permit non-kernel configurations to |
be built. |
|
1999-03-05 Jesper Skov <jskov@cygnus.co.uk> |
|
* src/common/haldiag.c: Removed diag_printf declaration. |
|
1999-03-05 Jonathan Larmour <jlarmour@cygnus.co.uk> |
|
* src/mn10300/mn10300_serial.c: |
Change CYG_VECTOR_* to CYGNUM_HAL_INTERRUPT_* to get it to compile! |
|
1999-03-05 Gary Thomas <gthomas@cygnus.co.uk> |
|
* src/powerpc/cogent_serial_with_ints.c (cogent_serial_config_port): |
Fix renaming of interrupt vectors. |
|
1999-03-05 Gary Thomas <gthomas@cygnus.co.uk> |
|
* src/arm/pid_serial_with_ints.c: Fix interrupt vectors. |
|
1999-03-03 Gary Thomas <gthomas@cygnus.co.uk> |
|
* serial/current/src/arm/pid_serial_with_ints.c: |
New [somewhat] configurable drivers for PID. |
|
//=========================================================================== |
//####ECOSGPLCOPYRIGHTBEGIN#### |
// ------------------------------------------- |
// This file is part of eCos, the Embedded Configurable Operating System. |
// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc. |
// |
// eCos is free software; you can redistribute it and/or modify it under |
// the terms of the GNU General Public License as published by the Free |
// Software Foundation; either version 2 or (at your option) any later version. |
// |
// eCos is distributed in the hope that it will be useful, but WITHOUT ANY |
// WARRANTY; without even the implied warranty of MERCHANTABILITY or |
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
// for more details. |
// |
// You should have received a copy of the GNU General Public License along |
// with eCos; if not, write to the Free Software Foundation, Inc., |
// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. |
// |
// As a special exception, if other files instantiate templates or use macros |
// or inline functions from this file, or you compile this file and link it |
// with other works to produce a work based on this file, this file does not |
// by itself cause the resulting work to be covered by the GNU General Public |
// License. However the source code for this file must still be made available |
// in accordance with section (3) of the GNU General Public License. |
// |
// This exception does not invalidate any other reasons why a work based on |
// this file might be covered by the GNU General Public License. |
// |
// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc. |
// at http://sources.redhat.com/ecos/ecos-license/ |
// ------------------------------------------- |
//####ECOSGPLCOPYRIGHTEND#### |
//=========================================================================== |
/ref4955/v2_0/cdl/ser_mips_ref4955.cdl
0,0 → 1,183
# ==================================================================== |
# |
# ser_mips_ref4955.cdl |
# |
# eCos serial MIPS/REF4955 configuration data |
# |
# ==================================================================== |
#####ECOSGPLCOPYRIGHTBEGIN#### |
## ------------------------------------------- |
## This file is part of eCos, the Embedded Configurable Operating System. |
## Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc. |
## |
## eCos is free software; you can redistribute it and/or modify it under |
## the terms of the GNU General Public License as published by the Free |
## Software Foundation; either version 2 or (at your option) any later version. |
## |
## eCos is distributed in the hope that it will be useful, but WITHOUT ANY |
## WARRANTY; without even the implied warranty of MERCHANTABILITY or |
## FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
## for more details. |
## |
## You should have received a copy of the GNU General Public License along |
## with eCos; if not, write to the Free Software Foundation, Inc., |
## 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. |
## |
## As a special exception, if other files instantiate templates or use macros |
## or inline functions from this file, or you compile this file and link it |
## with other works to produce a work based on this file, this file does not |
## by itself cause the resulting work to be covered by the GNU General Public |
## License. However the source code for this file must still be made available |
## in accordance with section (3) of the GNU General Public License. |
## |
## This exception does not invalidate any other reasons why a work based on |
## this file might be covered by the GNU General Public License. |
## |
## Alternative licenses for eCos may be arranged by contacting Red Hat, Inc. |
## at http://sources.redhat.com/ecos/ecos-license/ |
## ------------------------------------------- |
#####ECOSGPLCOPYRIGHTEND#### |
# ==================================================================== |
######DESCRIPTIONBEGIN#### |
# |
# Author(s): jskov |
# Original data: gthomas |
# Contributors: |
# Date: 2000-05-24 |
# |
#####DESCRIPTIONEND#### |
# |
# ==================================================================== |
|
|
cdl_package CYGPKG_IO_SERIAL_MIPS_REF4955 { |
display "REF4955 serial device drivers" |
|
parent CYGPKG_IO_SERIAL_DEVICES |
active_if CYGPKG_IO_SERIAL |
active_if CYGPKG_HAL_MIPS_TX49_REF4955 |
|
requires CYGPKG_ERROR |
include_dir cyg/io |
|
description " |
This option enables the serial device drivers for the |
REF4955." |
|
# FIXME: This really belongs in the GENERIC_16X5X package |
cdl_interface CYGINT_IO_SERIAL_GENERIC_16X5X_REQUIRED { |
display "Generic 16x5x serial driver required" |
} |
|
define_proc { |
puts $::cdl_system_header "/***** serial driver proc output start *****/" |
puts $::cdl_system_header "#define CYGDAT_IO_SERIAL_GENERIC_16X5X_INL <cyg/io/mips_tx49_ref4955_ser.inl>" |
puts $::cdl_system_header "#define CYGDAT_IO_SERIAL_GENERIC_16X5X_CFG <pkgconf/io_serial_mips_ref4955.h>" |
puts $::cdl_system_header "/***** serial driver proc output end *****/" |
} |
|
cdl_component CYGPKG_IO_SERIAL_MIPS_REF4955_SERIAL0 { |
display "REF4955 serial port 0 driver" |
flavor bool |
default_value 1 |
description " |
This option includes the serial device driver for the |
REF4955 port 0." |
|
implements CYGINT_IO_SERIAL_GENERIC_16X5X_REQUIRED |
# implements CYGINT_IO_SERIAL_FLOW_CONTROL_HW |
# implements CYGINT_IO_SERIAL_LINE_STATUS_HW |
|
cdl_option CYGDAT_IO_SERIAL_MIPS_REF4955_SERIAL0_NAME { |
display "Device name for the REF4955 serial port 0 driver" |
flavor data |
default_value {"\"/dev/ser0\""} |
description " |
This option sets the name of the serial device for the |
REF4955 port 0." |
} |
|
cdl_option CYGNUM_IO_SERIAL_MIPS_REF4955_SERIAL0_BAUD { |
display "Baud rate for the REF4955 serial port 0 driver" |
flavor data |
legal_values { 1200 2400 4800 9600 14400 19200 38400 57600 115200} |
default_value 38400 |
description " |
This option specifies the default baud rate (speed) |
for the REF4955 port 0." |
} |
|
cdl_option CYGNUM_IO_SERIAL_MIPS_REF4955_SERIAL0_BUFSIZE { |
display "Buffer size for the REF4955 serial port 0 driver" |
flavor data |
legal_values 0 to 8192 |
default_value 128 |
description " |
This option specifies the size of the internal buffers |
used for the REF4955 port 0." |
} |
} |
|
cdl_component CYGPKG_IO_SERIAL_MIPS_REF4955_SERIAL1 { |
display "REF4955 serial port 1 driver" |
flavor bool |
default_value 1 |
description " |
This option includes the serial device driver for the |
REF4955 port 1." |
|
implements CYGINT_IO_SERIAL_GENERIC_16X5X_REQUIRED |
# implements CYGINT_IO_SERIAL_FLOW_CONTROL_HW |
# implements CYGINT_IO_SERIAL_LINE_STATUS_HW |
|
cdl_option CYGDAT_IO_SERIAL_MIPS_REF4955_SERIAL1_NAME { |
display "Device name for the REF4955 serial port 1 driver" |
flavor data |
default_value {"\"/dev/ser1\""} |
description " |
This option specifies the name of serial device for |
the REF4955 port 1." |
} |
|
cdl_option CYGNUM_IO_SERIAL_MIPS_REF4955_SERIAL1_BAUD { |
display "Baud rate for the REF4955 serial port 1 driver" |
flavor data |
legal_values { 1200 2400 4800 9600 14400 19200 38400 57600 115200} |
default_value 38400 |
description " |
This option specifies the default baud rate (speed) |
for the REF4955 port 1." |
} |
|
cdl_option CYGNUM_IO_SERIAL_MIPS_REF4955_SERIAL1_BUFSIZE { |
display "Buffer size for the REF4955 serial port 1 driver" |
flavor data |
legal_values 0 to 8192 |
default_value 128 |
description " |
This option specifies the size of the internal buffers |
used for the REF4955 port 1." |
} |
} |
|
|
cdl_component CYGPKG_IO_SERIAL_MIPS_REF4955_TESTING { |
display "Testing parameters" |
flavor bool |
calculated 1 |
active_if CYGPKG_IO_SERIAL_MIPS_REF4955_SERIAL0 |
|
cdl_option CYGPRI_SER_TEST_SER_DEV { |
display "Serial device used for testing" |
flavor data |
default_value { CYGDAT_IO_SERIAL_MIPS_REF4955_SERIAL0_NAME } |
} |
|
define_proc { |
puts $::cdl_header "#define CYGPRI_SER_TEST_CRASH_ID \"ref4955\"" |
puts $::cdl_header "#define CYGPRI_SER_TEST_TTY_DEV \"/dev/tty0\"" |
} |
} |
} |
|
# EOF ser_mips_ref4955.cdl |
/ref4955/v2_0/include/mips_tx49_ref4955_ser.inl
0,0 → 1,177
//========================================================================== |
// |
// devs/serial/mips/ref4955/src/mips_tx49_ref4955_ser.inl |
// |
// REF4955 Serial I/O definitions. |
// |
//========================================================================== |
//####ECOSGPLCOPYRIGHTBEGIN#### |
// ------------------------------------------- |
// This file is part of eCos, the Embedded Configurable Operating System. |
// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc. |
// |
// eCos is free software; you can redistribute it and/or modify it under |
// the terms of the GNU General Public License as published by the Free |
// Software Foundation; either version 2 or (at your option) any later version. |
// |
// eCos is distributed in the hope that it will be useful, but WITHOUT ANY |
// WARRANTY; without even the implied warranty of MERCHANTABILITY or |
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
// for more details. |
// |
// You should have received a copy of the GNU General Public License along |
// with eCos; if not, write to the Free Software Foundation, Inc., |
// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. |
// |
// As a special exception, if other files instantiate templates or use macros |
// or inline functions from this file, or you compile this file and link it |
// with other works to produce a work based on this file, this file does not |
// by itself cause the resulting work to be covered by the GNU General Public |
// License. However the source code for this file must still be made available |
// in accordance with section (3) of the GNU General Public License. |
// |
// This exception does not invalidate any other reasons why a work based on |
// this file might be covered by the GNU General Public License. |
// |
// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc. |
// at http://sources.redhat.com/ecos/ecos-license/ |
// ------------------------------------------- |
//####ECOSGPLCOPYRIGHTEND#### |
//========================================================================== |
//#####DESCRIPTIONBEGIN#### |
// |
// Author(s): jskov |
// Contributors:gthomas, jskov |
// Date: 2000-05-24 |
// Purpose: REF4955 Serial definitions |
//####DESCRIPTIONEND#### |
//========================================================================== |
|
#include <cyg/hal/hal_intr.h> |
|
//----------------------------------------------------------------------------- |
// There are two serial ports. |
#define CYG_DEVICE_SERIAL_SCC1 0xb40003f8 // port 1 |
#define CYG_DEVICE_SERIAL_SCC2 0xb40002f8 // port 2 |
|
//----------------------------------------------------------------------------- |
// The REF4955 board has a 14.318 MHz crystal, but the PC87338 part |
// uses a 24MHz internal clock for baud rate calculation. |
#define BAUD_DIVISOR(_x_) 24000000/13/16/(_x_) |
|
static unsigned short select_baud[] = { |
0, // Unused |
0, // 50 |
0, // 75 |
0, // 110 |
0, // 134.5 |
0, // 150 |
0, // 200 |
0, // 300 |
0, // 600 |
BAUD_DIVISOR(1200), |
0, // 1800 |
BAUD_DIVISOR(2400), |
0, // 3600 |
BAUD_DIVISOR(4800), |
0 , // 7200 |
BAUD_DIVISOR(9600), |
BAUD_DIVISOR(14400), |
BAUD_DIVISOR(19200), |
BAUD_DIVISOR(38400), |
BAUD_DIVISOR(57600), |
BAUD_DIVISOR(115200), |
0, // 230400 |
}; |
|
//----------------------------------------------------------------------------- |
// Port 0 descriptors |
|
#ifdef CYGPKG_IO_SERIAL_MIPS_REF4955_SERIAL0 |
static pc_serial_info pc_serial_info0 = {CYG_DEVICE_SERIAL_SCC1, |
CYGNUM_HAL_INTERRUPT_DEBUG_UART}; |
#if CYGNUM_IO_SERIAL_MIPS_REF4955_SERIAL0_BUFSIZE > 0 |
static unsigned char pc_serial_out_buf0[CYGNUM_IO_SERIAL_MIPS_REF4955_SERIAL0_BUFSIZE]; |
static unsigned char pc_serial_in_buf0[CYGNUM_IO_SERIAL_MIPS_REF4955_SERIAL0_BUFSIZE]; |
|
static SERIAL_CHANNEL_USING_INTERRUPTS(pc_serial_channel0, |
pc_serial_funs, |
pc_serial_info0, |
CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_MIPS_REF4955_SERIAL0_BAUD), |
CYG_SERIAL_STOP_DEFAULT, |
CYG_SERIAL_PARITY_DEFAULT, |
CYG_SERIAL_WORD_LENGTH_DEFAULT, |
CYG_SERIAL_FLAGS_DEFAULT, |
&pc_serial_out_buf0[0], |
sizeof(pc_serial_out_buf0), |
&pc_serial_in_buf0[0], |
sizeof(pc_serial_in_buf0) |
); |
#else |
static SERIAL_CHANNEL(pc_serial_channel0, |
pc_serial_funs, |
pc_serial_info0, |
CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_MIPS_REF4955_SERIAL0_BAUD), |
CYG_SERIAL_STOP_DEFAULT, |
CYG_SERIAL_PARITY_DEFAULT, |
CYG_SERIAL_WORD_LENGTH_DEFAULT, |
CYG_SERIAL_FLAGS_DEFAULT |
); |
#endif |
|
DEVTAB_ENTRY(pc_serial_io0, |
CYGDAT_IO_SERIAL_MIPS_REF4955_SERIAL0_NAME, |
0, // Does not depend on a lower level interface |
&cyg_io_serial_devio, |
pc_serial_init, |
pc_serial_lookup, // Serial driver may need initializing |
&pc_serial_channel0 |
); |
#endif |
|
//----------------------------------------------------------------------------- |
// Port 1 descriptors |
|
#ifdef CYGPKG_IO_SERIAL_MIPS_REF4955_SERIAL1 |
static pc_serial_info pc_serial_info1 = {CYG_DEVICE_SERIAL_SCC2, |
CYGNUM_HAL_INTERRUPT_USER_UART}; |
#if CYGNUM_IO_SERIAL_MIPS_REF4955_SERIAL1_BUFSIZE > 0 |
static unsigned char pc_serial_out_buf1[CYGNUM_IO_SERIAL_MIPS_REF4955_SERIAL1_BUFSIZE]; |
static unsigned char pc_serial_in_buf1[CYGNUM_IO_SERIAL_MIPS_REF4955_SERIAL1_BUFSIZE]; |
|
static SERIAL_CHANNEL_USING_INTERRUPTS(pc_serial_channel1, |
pc_serial_funs, |
pc_serial_info1, |
CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_MIPS_REF4955_SERIAL1_BAUD), |
CYG_SERIAL_STOP_DEFAULT, |
CYG_SERIAL_PARITY_DEFAULT, |
CYG_SERIAL_WORD_LENGTH_DEFAULT, |
CYG_SERIAL_FLAGS_DEFAULT, |
&pc_serial_out_buf1[0], |
sizeof(pc_serial_out_buf1), |
&pc_serial_in_buf1[0], |
sizeof(pc_serial_in_buf1) |
); |
#else |
static SERIAL_CHANNEL(pc_serial_channel1, |
pc_serial_funs, |
pc_serial_info1, |
CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_MIPS_REF4955_SERIAL1_BAUD), |
CYG_SERIAL_STOP_DEFAULT, |
CYG_SERIAL_PARITY_DEFAULT, |
CYG_SERIAL_WORD_LENGTH_DEFAULT, |
CYG_SERIAL_FLAGS_DEFAULT |
); |
#endif |
|
DEVTAB_ENTRY(pc_serial_io1, |
CYGDAT_IO_SERIAL_MIPS_REF4955_SERIAL1_NAME, |
0, // Does not depend on a lower level interface |
&cyg_io_serial_devio, |
pc_serial_init, |
pc_serial_lookup, // Serial driver may need initializing |
&pc_serial_channel1 |
); |
#endif |
|
// EOF mips_tx49_ref4955_ser.inl |
/ref4955/v2_0/ChangeLog
0,0 → 1,71
2003-02-24 Jonathan Larmour <jifl@eCosCentric.com> |
|
* cdl/ser_mips_ref4955.cdl: Remove irrelevant doc link. |
|
2000-09-18 Jesper Skov <jskov@redhat.com> |
|
* cdl/ser_mips_ref4955.cdl: Use CDL to specify testing parameters. |
|
* include/mips_tx49_ref4955_ser.inl: Follow type naming changes in |
generic driver. |
|
2000-09-14 Jesper Skov <jskov@redhat.com> |
|
* include/mips_tx49_ref4955_ser.inl: Use with generic 16x5x serial |
driver. |
* src/ref4955_serial.c: Deleted. |
* src/ref4955_serial.h: Deleted. |
* cdl/ser_mips_ref4955.cdl: Changed accordingly. |
|
2000-08-01 Jonathan Larmour <jlarmour@redhat.co.uk> |
|
* src/ref4955_serial.c (pc_serial_set_config): Now use keys to make |
more flexible. |
|
2000-06-22 Hugo Tyson <hmt@cygnus.co.uk> |
|
* cdl/<yournamehere>.cdl: Remove the comment on the empty |
include_files directive; the tools now support this correctly. |
This keeps internal include files internal. |
|
2000-05-25 Jesper Skov <jskov@redhat.com> |
|
* cdl/ser_mips_ref4955.cdl: |
* src/ref4955_serial.h: |
* src/ref4955_serial.c: |
REF4955 serial driver. |
|
//=========================================================================== |
//####ECOSGPLCOPYRIGHTBEGIN#### |
// ------------------------------------------- |
// This file is part of eCos, the Embedded Configurable Operating System. |
// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc. |
// |
// eCos is free software; you can redistribute it and/or modify it under |
// the terms of the GNU General Public License as published by the Free |
// Software Foundation; either version 2 or (at your option) any later version. |
// |
// eCos is distributed in the hope that it will be useful, but WITHOUT ANY |
// WARRANTY; without even the implied warranty of MERCHANTABILITY or |
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
// for more details. |
// |
// You should have received a copy of the GNU General Public License along |
// with eCos; if not, write to the Free Software Foundation, Inc., |
// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. |
// |
// As a special exception, if other files instantiate templates or use macros |
// or inline functions from this file, or you compile this file and link it |
// with other works to produce a work based on this file, this file does not |
// by itself cause the resulting work to be covered by the GNU General Public |
// License. However the source code for this file must still be made available |
// in accordance with section (3) of the GNU General Public License. |
// |
// This exception does not invalidate any other reasons why a work based on |
// this file might be covered by the GNU General Public License. |
// |
// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc. |
// at http://sources.redhat.com/ecos/ecos-license/ |
// ------------------------------------------- |
//####ECOSGPLCOPYRIGHTEND#### |
//=========================================================================== |
/atlas/v2_0/cdl/ser_mips_atlas.cdl
0,0 → 1,158
# ==================================================================== |
# |
# ser_mips_atlas.cdl |
# |
# eCos serial MIPS/ATLAS configuration data |
# |
# ==================================================================== |
#####ECOSGPLCOPYRIGHTBEGIN#### |
## ------------------------------------------- |
## This file is part of eCos, the Embedded Configurable Operating System. |
## Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc. |
## |
## eCos is free software; you can redistribute it and/or modify it under |
## the terms of the GNU General Public License as published by the Free |
## Software Foundation; either version 2 or (at your option) any later version. |
## |
## eCos is distributed in the hope that it will be useful, but WITHOUT ANY |
## WARRANTY; without even the implied warranty of MERCHANTABILITY or |
## FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
## for more details. |
## |
## You should have received a copy of the GNU General Public License along |
## with eCos; if not, write to the Free Software Foundation, Inc., |
## 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. |
## |
## As a special exception, if other files instantiate templates or use macros |
## or inline functions from this file, or you compile this file and link it |
## with other works to produce a work based on this file, this file does not |
## by itself cause the resulting work to be covered by the GNU General Public |
## License. However the source code for this file must still be made available |
## in accordance with section (3) of the GNU General Public License. |
## |
## This exception does not invalidate any other reasons why a work based on |
## this file might be covered by the GNU General Public License. |
## |
## Alternative licenses for eCos may be arranged by contacting Red Hat, Inc. |
## at http://sources.redhat.com/ecos/ecos-license/ |
## ------------------------------------------- |
#####ECOSGPLCOPYRIGHTEND#### |
# ==================================================================== |
######DESCRIPTIONBEGIN#### |
# |
# Author(s): dmoseley |
# Original data: gthomas |
# Contributors: |
# Date: 2000-06-23 |
# |
#####DESCRIPTIONEND#### |
# |
# ==================================================================== |
|
|
cdl_package CYGPKG_IO_SERIAL_MIPS_ATLAS { |
display "MIPS ATLAS serial device drivers" |
|
parent CYGPKG_IO_SERIAL_DEVICES |
active_if CYGPKG_IO_SERIAL |
active_if CYGPKG_HAL_MIPS_ATLAS |
|
requires CYGPKG_ERROR |
include_dir cyg/io |
# include_files ; # none _exported_ whatsoever |
description " |
This option enables the serial device drivers for the |
MIPS ATLAS." |
|
compile -library=libextras.a atlas_serial.c |
|
define_proc { |
puts $::cdl_system_header "/***** serial driver proc output start *****/" |
puts $::cdl_system_header "#define CYGDAT_IO_SERIAL_DEVICE_HEADER <pkgconf/io_serial_mips_atlas.h>" |
puts $::cdl_system_header "/***** serial driver proc output end *****/" |
} |
|
# FIXME: Bad name |
cdl_option CYGPKG_IO_SERIAL_MIPS_ATLAS_POLLED_MODE { |
display "MIPS ATLAS polled mode serial drivers" |
flavor bool |
default_value 0 |
description " |
If asserted, this option specifies that the serial device |
drivers for the MIPS ATLAS should be polled-mode instead of |
interrupt driven." |
} |
|
cdl_component CYGPKG_IO_SERIAL_MIPS_ATLAS_SERIAL_A { |
display "MIPS ATLAS serial port driver" |
flavor bool |
default_value 1 |
description " |
This option includes the serial device driver for the 16C550C on the |
MIPS ATLAS." |
|
cdl_option CYGDAT_IO_SERIAL_MIPS_ATLAS_SERIAL_A_NAME { |
display "Device name for MIPS ATLAS serial port" |
flavor data |
default_value {"\"/dev/ser0\""} |
description " |
This option specifies the device name on the MIPS ATLAS." |
} |
|
cdl_option CYGNUM_IO_SERIAL_MIPS_ATLAS_SERIAL_A_BAUD { |
display "Baud rate for the MIPS ATLAS serial port driver" |
flavor data |
legal_values { 50 75 110 "134_5" 150 200 300 600 1200 1800 2400 3600 |
4800 7200 9600 14400 19200 38400 57600 115200 230400 |
} |
default_value 38400 |
description " |
This option specifies the default baud rate (speed) for the |
MIPS ATLAS 16c550c port." |
} |
|
cdl_option CYGNUM_IO_SERIAL_MIPS_ATLAS_SERIAL_A_BUFSIZE { |
display "Buffer size for the MIPS ATLAS serial port driver" |
flavor data |
legal_values 0 to 8192 |
default_value 512 |
description " |
This option specifies the size of the internal buffers used |
for the MIPS ATLAS 16c550c port." |
} |
} |
|
cdl_component CYGPKG_IO_SERIAL_MIPS_ATLAS_OPTIONS { |
display "Serial device driver build options" |
flavor none |
description " |
Package specific build options including control over |
compiler flags used only in building this package, |
and details of which tests are built." |
|
|
cdl_option CYGPKG_IO_SERIAL_MIPS_ATLAS_CFLAGS_ADD { |
display "Additional compiler flags" |
flavor data |
no_define |
default_value { "" } |
description " |
This option modifies the set of compiler flags for |
building these serial device drivers. These flags are used in addition |
to the set of global flags." |
} |
|
cdl_option CYGPKG_IO_SERIAL_MIPS_ATLAS_CFLAGS_REMOVE { |
display "Suppressed compiler flags" |
flavor data |
no_define |
default_value { "" } |
description " |
This option modifies the set of compiler flags for |
building these serial device drivers. These flags are removed from |
the set of global flags if present." |
} |
} |
} |
|
# EOF ser_mips_atlas.cdl |
/atlas/v2_0/src/atlas_serial.c
0,0 → 1,373
//========================================================================== |
// |
// atlas_serial.c |
// |
// Serial device driver for ATLAS on-chip serial devices |
// |
//========================================================================== |
//####ECOSGPLCOPYRIGHTBEGIN#### |
// ------------------------------------------- |
// This file is part of eCos, the Embedded Configurable Operating System. |
// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc. |
// |
// eCos is free software; you can redistribute it and/or modify it under |
// the terms of the GNU General Public License as published by the Free |
// Software Foundation; either version 2 or (at your option) any later version. |
// |
// eCos is distributed in the hope that it will be useful, but WITHOUT ANY |
// WARRANTY; without even the implied warranty of MERCHANTABILITY or |
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
// for more details. |
// |
// You should have received a copy of the GNU General Public License along |
// with eCos; if not, write to the Free Software Foundation, Inc., |
// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. |
// |
// As a special exception, if other files instantiate templates or use macros |
// or inline functions from this file, or you compile this file and link it |
// with other works to produce a work based on this file, this file does not |
// by itself cause the resulting work to be covered by the GNU General Public |
// License. However the source code for this file must still be made available |
// in accordance with section (3) of the GNU General Public License. |
// |
// This exception does not invalidate any other reasons why a work based on |
// this file might be covered by the GNU General Public License. |
// |
// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc. |
// at http://sources.redhat.com/ecos/ecos-license/ |
// ------------------------------------------- |
//####ECOSGPLCOPYRIGHTEND#### |
//========================================================================== |
//#####DESCRIPTIONBEGIN#### |
// |
// Author(s): dmoseley, based on POWERPC driver by jskov |
// Contributors: gthomas, jskov, dmoseley |
// Date: 2000-06-23 |
// Purpose: ATLAS serial device driver |
// Description: ATLAS serial device driver |
// |
// To Do: |
// Put in magic to effectively use the FIFOs. Transmitter FIFO fill is a |
// problem, and setting receiver FIFO interrupts to happen only after |
// n chars may conflict with hal diag. |
// |
//####DESCRIPTIONEND#### |
// |
//========================================================================== |
|
#include <pkgconf/io_serial.h> |
#include <pkgconf/io.h> |
|
#include <cyg/io/io.h> |
#include <cyg/hal/hal_intr.h> |
#include <cyg/io/devtab.h> |
#include <cyg/infra/diag.h> |
#include <cyg/io/serial.h> |
|
#ifdef CYGPKG_IO_SERIAL_MIPS_ATLAS |
|
#include "atlas_serial.h" |
|
typedef struct atlas_serial_info { |
CYG_ADDRWORD base; |
CYG_WORD int_num; |
cyg_interrupt serial_interrupt; |
cyg_handle_t serial_interrupt_handle; |
cyg_uint8 iir; |
} atlas_serial_info; |
|
static bool atlas_serial_init(struct cyg_devtab_entry *tab); |
static bool atlas_serial_putc(serial_channel *chan, unsigned char c); |
static Cyg_ErrNo atlas_serial_lookup(struct cyg_devtab_entry **tab, |
struct cyg_devtab_entry *sub_tab, |
const char *name); |
static unsigned char atlas_serial_getc(serial_channel *chan); |
static Cyg_ErrNo atlas_serial_set_config(serial_channel *chan, cyg_uint32 key, |
const void *xbuf, cyg_uint32 *len); |
static void atlas_serial_start_xmit(serial_channel *chan); |
static void atlas_serial_stop_xmit(serial_channel *chan); |
|
static cyg_uint32 atlas_serial_ISR(cyg_vector_t vector, cyg_addrword_t data); |
static void atlas_serial_DSR(cyg_vector_t vector, cyg_ucount32 count, cyg_addrword_t data); |
|
static SERIAL_FUNS(atlas_serial_funs, |
atlas_serial_putc, |
atlas_serial_getc, |
atlas_serial_set_config, |
atlas_serial_start_xmit, |
atlas_serial_stop_xmit |
); |
|
static atlas_serial_info atlas_serial_info0 ={ATLAS_SER_16550_BASE_A, |
CYGNUM_HAL_INTERRUPT_SER}; |
|
#if CYGNUM_IO_SERIAL_MIPS_ATLAS_SERIAL_A_BUFSIZE > 0 |
static unsigned char atlas_serial_out_buf0[CYGNUM_IO_SERIAL_MIPS_ATLAS_SERIAL_A_BUFSIZE]; |
static unsigned char atlas_serial_in_buf0[CYGNUM_IO_SERIAL_MIPS_ATLAS_SERIAL_A_BUFSIZE]; |
|
static SERIAL_CHANNEL_USING_INTERRUPTS(atlas_serial_channel0, |
atlas_serial_funs, |
atlas_serial_info0, |
CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_MIPS_ATLAS_SERIAL_A_BAUD), |
CYG_SERIAL_STOP_DEFAULT, |
CYG_SERIAL_PARITY_DEFAULT, |
CYG_SERIAL_WORD_LENGTH_DEFAULT, |
CYG_SERIAL_FLAGS_DEFAULT, |
&atlas_serial_out_buf0[0], |
sizeof(atlas_serial_out_buf0), |
&atlas_serial_in_buf0[0], |
sizeof(atlas_serial_in_buf0) |
); |
#else |
static SERIAL_CHANNEL(atlas_serial_channel0, |
atlas_serial_funs, |
atlas_serial_info0, |
CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_MIPS_ATLAS_SERIAL_A_BAUD), |
CYG_SERIAL_STOP_DEFAULT, |
CYG_SERIAL_PARITY_DEFAULT, |
CYG_SERIAL_WORD_LENGTH_DEFAULT, |
CYG_SERIAL_FLAGS_DEFAULT |
); |
#endif |
|
DEVTAB_ENTRY(atlas_serial_io0, |
CYGDAT_IO_SERIAL_MIPS_ATLAS_SERIAL_A_NAME, |
0, // Does not depend on a lower level interface |
&cyg_io_serial_devio, |
atlas_serial_init, |
atlas_serial_lookup, // Serial driver may need initializing |
&atlas_serial_channel0 |
); |
|
|
|
// Internal function to actually configure the hardware to desired baud rate, etc. |
static bool |
atlas_serial_config_port(serial_channel *chan, cyg_serial_info_t *new_config, bool init) |
{ |
atlas_serial_info *atlas_chan = (atlas_serial_info *)chan->dev_priv; |
cyg_addrword_t port = atlas_chan->base; |
cyg_uint16 baud_divisor = select_baud[new_config->baud]; |
cyg_uint8 _lcr, _ier; |
|
if (baud_divisor == 0) |
return false; // Invalid baud rate selected |
|
// |
// We may need to increase the timeout before causing a break reset. |
// According to the Atlas Users Manual (Document MD00005) The BRKRES |
// register will need to be programmed with a value larger that 0xA (the default) |
// if we are going to use a baud rate lower than 2400. |
// |
if (new_config->baud <= CYGNUM_SERIAL_BAUD_2400) |
{ |
// For now, just disable the break reset entirely. |
HAL_WRITE_UINT32(HAL_ATLAS_BRKRES, 0); |
} else { |
// Put the break reset state back to the default |
HAL_WRITE_UINT32(HAL_ATLAS_BRKRES, HAL_ATLAS_BRKRES_DEFAULT_VALUE); |
} |
|
// Disable port interrupts while changing hardware |
HAL_READ_UINT8(port+SER_16550_IER, _ier); |
HAL_WRITE_UINT8(port+SER_16550_IER, 0); |
|
// Set databits, stopbits and parity. |
_lcr = select_word_length[(new_config->word_length - |
CYGNUM_SERIAL_WORD_LENGTH_5)] | |
select_stop_bits[new_config->stop] | |
select_parity[new_config->parity]; |
HAL_WRITE_UINT8(port+SER_16550_LCR, _lcr); |
|
// Set baud rate. |
_lcr |= LCR_DL; |
HAL_WRITE_UINT8(port+SER_16550_LCR, _lcr); |
HAL_WRITE_UINT8(port+SER_16550_DLM, baud_divisor >> 8); |
HAL_WRITE_UINT8(port+SER_16550_DLL, baud_divisor & 0xff); |
_lcr &= ~LCR_DL; |
HAL_WRITE_UINT8(port+SER_16550_LCR, _lcr); |
|
if (init) { |
// Enable and clear FIFO |
HAL_WRITE_UINT8(port+SER_16550_FCR, |
(FCR_ENABLE | FCR_CLEAR_RCVR | FCR_CLEAR_XMIT)); |
|
if (chan->out_cbuf.len != 0) { |
HAL_WRITE_UINT8(port+SER_16550_IER, SIO_IER_ERDAI); |
} else { |
HAL_WRITE_UINT8(port+SER_16550_IER, 0); |
} |
} else { |
HAL_WRITE_UINT8(port+SER_16550_IER, _ier); |
} |
if (new_config != &chan->config) { |
chan->config = *new_config; |
} |
return true; |
} |
|
// Function to initialize the device. Called at bootstrap time. |
static bool |
atlas_serial_init(struct cyg_devtab_entry *tab) |
{ |
serial_channel *chan = (serial_channel *)tab->priv; |
atlas_serial_info *atlas_chan = (atlas_serial_info *)chan->dev_priv; |
#ifdef CYGDBG_IO_INIT |
diag_printf("ATLAS SERIAL init - dev: %x.%d\n", atlas_chan->base, atlas_chan->int_num); |
#endif |
(chan->callbacks->serial_init)(chan); // Really only required for interrupt driven devices |
if (chan->out_cbuf.len != 0) { |
cyg_drv_interrupt_create(atlas_chan->int_num, |
0, // can change IRQ0 priority |
(cyg_addrword_t)chan, // Data item passed to interrupt handler |
atlas_serial_ISR, |
atlas_serial_DSR, |
&atlas_chan->serial_interrupt_handle, |
&atlas_chan->serial_interrupt); |
cyg_drv_interrupt_attach(atlas_chan->serial_interrupt_handle); |
cyg_drv_interrupt_unmask(atlas_chan->int_num); |
} |
atlas_serial_config_port(chan, &chan->config, true); |
return true; |
} |
|
// This routine is called when the device is "looked" up (i.e. attached) |
static Cyg_ErrNo |
atlas_serial_lookup(struct cyg_devtab_entry **tab, |
struct cyg_devtab_entry *sub_tab, |
const char *name) |
{ |
serial_channel *chan = (serial_channel *)(*tab)->priv; |
(chan->callbacks->serial_init)(chan); // Really only required for interrupt driven devices |
return ENOERR; |
} |
|
// Send a character to the device output buffer. |
// Return 'true' if character is sent to device |
static bool |
atlas_serial_putc(serial_channel *chan, unsigned char c) |
{ |
atlas_serial_info *atlas_chan = (atlas_serial_info *)chan->dev_priv; |
cyg_addrword_t port = atlas_chan->base; |
cyg_uint8 _lsr; |
|
HAL_READ_UINT8(port+SER_16550_LSR, _lsr); |
if (_lsr & SIO_LSR_THRE) { |
// Transmit buffer is empty |
HAL_WRITE_UINT8(port+SER_16550_THR, c); |
return true; |
} else { |
// No space |
return false; |
} |
} |
|
// Fetch a character from the device input buffer, waiting if necessary |
static unsigned char |
atlas_serial_getc(serial_channel *chan) |
{ |
unsigned char c; |
atlas_serial_info *atlas_chan = (atlas_serial_info *)chan->dev_priv; |
cyg_addrword_t port = atlas_chan->base; |
cyg_uint8 _lsr; |
|
do { |
HAL_READ_UINT8(port+SER_16550_LSR, _lsr); |
} while ((_lsr & SIO_LSR_DR) == 0); |
HAL_READ_UINT8(port+SER_16550_RBR, c); |
return c; |
} |
|
// Set up the device characteristics; baud rate, etc. |
static Cyg_ErrNo |
atlas_serial_set_config(serial_channel *chan, cyg_uint32 key, |
const void *xbuf, cyg_uint32 *len) |
{ |
switch (key) { |
case CYG_IO_SET_CONFIG_SERIAL_INFO: |
{ |
cyg_serial_info_t *config = (cyg_serial_info_t *)xbuf; |
if ( *len < sizeof(cyg_serial_info_t) ) { |
return -EINVAL; |
} |
*len = sizeof(cyg_serial_info_t); |
if ( true != atlas_serial_config_port(chan, config, false) ) |
return -EINVAL; |
} |
break; |
default: |
return -EINVAL; |
} |
return ENOERR; |
} |
|
// Enable the transmitter on the device |
static void |
atlas_serial_start_xmit(serial_channel *chan) |
{ |
atlas_serial_info *atlas_chan = (atlas_serial_info *)chan->dev_priv; |
cyg_addrword_t port = atlas_chan->base; |
cyg_uint8 _ier; |
|
HAL_READ_UINT8(port+SER_16550_IER, _ier); |
_ier |= IER_XMT; // Enable xmit interrupt |
HAL_WRITE_UINT8(port+SER_16550_IER, _ier); |
|
// We should not need to call this here. THRE Interrupts are enabled, and the DSR |
// below calls this function. However, sometimes we get called with Master Interrupts |
// disabled, and thus the DSR never runs. This is unfortunate because it means we |
// will be doing multiple processing steps for the same thing. |
(chan->callbacks->xmt_char)(chan); |
} |
|
// Disable the transmitter on the device |
static void |
atlas_serial_stop_xmit(serial_channel *chan) |
{ |
atlas_serial_info *atlas_chan = (atlas_serial_info *)chan->dev_priv; |
cyg_addrword_t port = atlas_chan->base; |
cyg_uint8 _ier; |
|
HAL_READ_UINT8(port+SER_16550_IER, _ier); |
_ier &= ~IER_XMT; // Disable xmit interrupt |
HAL_WRITE_UINT8(port+SER_16550_IER, _ier); |
} |
|
// Serial I/O - low level interrupt handler (ISR) |
static cyg_uint32 |
atlas_serial_ISR(cyg_vector_t vector, cyg_addrword_t data) |
{ |
serial_channel *chan = (serial_channel *)data; |
atlas_serial_info *atlas_chan = (atlas_serial_info *)chan->dev_priv; |
|
cyg_drv_interrupt_mask(atlas_chan->int_num); |
cyg_drv_interrupt_acknowledge(atlas_chan->int_num); |
return CYG_ISR_CALL_DSR; // Cause DSR to be run |
} |
|
// Serial I/O - high level interrupt handler (DSR) |
static void |
atlas_serial_DSR(cyg_vector_t vector, cyg_ucount32 count, cyg_addrword_t data) |
{ |
serial_channel *chan = (serial_channel *)data; |
atlas_serial_info *atlas_chan = (atlas_serial_info *)chan->dev_priv; |
cyg_addrword_t port = atlas_chan->base; |
cyg_uint8 _iir; |
|
HAL_READ_UINT8(port+SER_16550_IIR, _iir); |
_iir &= SIO_IIR_ID_MASK; |
if ( ISR_Tx_Empty == _iir ) { |
(chan->callbacks->xmt_char)(chan); |
} else if (( ISR_Rx_Avail == _iir ) || ( ISR_Rx_Char_Timeout == _iir )) { |
cyg_uint8 _c; |
HAL_READ_UINT8(port+SER_16550_RBR, _c); |
(chan->callbacks->rcv_char)(chan, _c); |
} |
|
cyg_drv_interrupt_unmask(atlas_chan->int_num); |
} |
|
#endif |
|
//------------------------------------------------------------------------- |
// EOF atlas_serial.c |
/atlas/v2_0/src/atlas_serial.h
0,0 → 1,214
//========================================================================== |
// |
// io/serial/mips/atlas/atlas_serial.h |
// |
// MIPS Atlas Serial I/O definitions. |
// |
//========================================================================== |
//####ECOSGPLCOPYRIGHTBEGIN#### |
// ------------------------------------------- |
// This file is part of eCos, the Embedded Configurable Operating System. |
// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc. |
// |
// eCos is free software; you can redistribute it and/or modify it under |
// the terms of the GNU General Public License as published by the Free |
// Software Foundation; either version 2 or (at your option) any later version. |
// |
// eCos is distributed in the hope that it will be useful, but WITHOUT ANY |
// WARRANTY; without even the implied warranty of MERCHANTABILITY or |
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
// for more details. |
// |
// You should have received a copy of the GNU General Public License along |
// with eCos; if not, write to the Free Software Foundation, Inc., |
// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. |
// |
// As a special exception, if other files instantiate templates or use macros |
// or inline functions from this file, or you compile this file and link it |
// with other works to produce a work based on this file, this file does not |
// by itself cause the resulting work to be covered by the GNU General Public |
// License. However the source code for this file must still be made available |
// in accordance with section (3) of the GNU General Public License. |
// |
// This exception does not invalidate any other reasons why a work based on |
// this file might be covered by the GNU General Public License. |
// |
// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc. |
// at http://sources.redhat.com/ecos/ecos-license/ |
// ------------------------------------------- |
//####ECOSGPLCOPYRIGHTEND#### |
//========================================================================== |
//#####DESCRIPTIONBEGIN#### |
// |
// Author(s): dmoseley, based on PowerPC driver by jskov |
// Contributors:gthomas, jskov, dmoseley |
// Date: 2000-06-23 |
// Purpose: Atlas Serial definitions |
//####DESCRIPTIONEND#### |
//========================================================================== |
|
// Description of serial ports on Atlas board |
|
// Interrupt Enable Register |
#define IER_RCV 0x01 |
#define IER_XMT 0x02 |
#define IER_LS 0x04 |
#define IER_MS 0x08 |
|
// Line Control Register |
#define LCR_WL5 0x00 // Word length |
#define LCR_WL6 0x01 |
#define LCR_WL7 0x02 |
#define LCR_WL8 0x03 |
#define LCR_SB1 0x00 // Number of stop bits |
#define LCR_SB1_5 0x04 // 1.5 -> only valid with 5 bit words |
#define LCR_SB2 0x04 |
#define LCR_PN 0x00 // Parity mode - none |
#define LCR_PE 0x0C // Parity mode - even |
#define LCR_PO 0x08 // Parity mode - odd |
#define LCR_PM 0x28 // Forced "mark" parity |
#define LCR_PS 0x38 // Forced "space" parity |
#define LCR_DL 0x80 // Enable baud rate latch |
|
// Line Status Register |
#define LSR_RSR 0x01 |
#define LSR_THE 0x20 |
|
// Modem Control Register |
#define MCR_DTR 0x01 |
#define MCR_RTS 0x02 |
#define MCR_INT 0x08 // Enable interrupts |
|
// Interrupt status register |
#define ISR_None 0x01 |
#define ISR_Rx_Line_Status 0x06 |
#define ISR_Rx_Avail 0x04 |
#define ISR_Rx_Char_Timeout 0x0C |
#define ISR_Tx_Empty 0x02 |
#define IRS_Modem_Status 0x00 |
|
// FIFO control register |
#define FCR_ENABLE 0x01 |
#define FCR_CLEAR_RCVR 0x02 |
#define FCR_CLEAR_XMIT 0x04 |
|
|
//////////////////////////////////////////////////////////// |
// Clean this up. |
|
#define ATLAS_SER_16550_BASE_A 0xBF000900 |
#define SER_16550_BASE ATLAS_SER_16550_BASE_A |
|
//----------------------------------------------------------------------------- |
// Define the serial registers. The Atlas board is equipped with a 16550C |
// serial chip. |
#define SER_16550_RBR 0x00 // receiver buffer register, read, dlab = 0 |
#define SER_16550_THR 0x00 // transmitter holding register, write, dlab = 0 |
#define SER_16550_DLL 0x00 // divisor latch (LS), read/write, dlab = 1 |
#define SER_16550_IER 0x08 // interrupt enable register, read/write, dlab = 0 |
#define SER_16550_DLM 0x08 // divisor latch (MS), read/write, dlab = 1 |
#define SER_16550_IIR 0x10 // interrupt identification reg, read, dlab = 0 |
#define SER_16550_FCR 0x10 // fifo control register, write, dlab = 0 |
#define SER_16550_AFR 0x10 // alternate function reg, read/write, dlab = 1 |
#define SER_16550_LCR 0x18 // line control register, read/write |
#define SER_16550_MCR 0x20 // modem control register, read/write |
#define SER_16550_LSR 0x28 // line status register, read |
#define SER_16550_MSR 0x30 // modem status register, read |
#define SER_16550_SCR 0x38 // scratch pad register |
|
// The interrupt enable register bits. |
#define SIO_IER_ERDAI 0x01 // enable received data available irq |
#define SIO_IER_ETHREI 0x02 // enable THR empty interrupt |
#define SIO_IER_ELSI 0x04 // enable receiver line status irq |
#define SIO_IER_EMSI 0x08 // enable modem status interrupt |
|
// The interrupt identification register bits. |
#define SIO_IIR_IP 0x01 // 0 if interrupt pending |
#define SIO_IIR_ID_MASK 0x0e // mask for interrupt ID bits |
|
// The line status register bits. |
#define SIO_LSR_DR 0x01 // data ready |
#define SIO_LSR_OE 0x02 // overrun error |
#define SIO_LSR_PE 0x04 // parity error |
#define SIO_LSR_FE 0x08 // framing error |
#define SIO_LSR_BI 0x10 // break interrupt |
#define SIO_LSR_THRE 0x20 // transmitter holding register empty |
#define SIO_LSR_TEMT 0x40 // transmitter register empty |
#define SIO_LSR_ERR 0x80 // any error condition |
|
// The modem status register bits. |
#define SIO_MSR_DCTS 0x01 // delta clear to send |
#define SIO_MSR_DDSR 0x02 // delta data set ready |
#define SIO_MSR_TERI 0x04 // trailing edge ring indicator |
#define SIO_MSR_DDCD 0x08 // delta data carrier detect |
#define SIO_MSR_CTS 0x10 // clear to send |
#define SIO_MSR_DSR 0x20 // data set ready |
#define SIO_MSR_RI 0x40 // ring indicator |
#define SIO_MSR_DCD 0x80 // data carrier detect |
|
// The line control register bits. |
#define SIO_LCR_WLS0 0x01 // word length select bit 0 |
#define SIO_LCR_WLS1 0x02 // word length select bit 1 |
#define SIO_LCR_STB 0x04 // number of stop bits |
#define SIO_LCR_PEN 0x08 // parity enable |
#define SIO_LCR_EPS 0x10 // even parity select |
#define SIO_LCR_SP 0x20 // stick parity |
#define SIO_LCR_SB 0x40 // set break |
#define SIO_LCR_DLAB 0x80 // divisor latch access bit |
|
// The FIFO control register |
#define SIO_FCR_FCR0 0x01 // enable xmit and rcvr fifos |
#define SIO_FCR_FCR1 0x02 // clear RCVR FIFO |
#define SIO_FCR_FCR2 0x04 // clear XMIT FIFO |
///////////////////////////////////////// |
|
|
static unsigned char select_word_length[] = { |
LCR_WL5, // 5 bits / word (char) |
LCR_WL6, |
LCR_WL7, |
LCR_WL8 |
}; |
|
static unsigned char select_stop_bits[] = { |
0, |
LCR_SB1, // 1 stop bit |
LCR_SB1_5, // 1.5 stop bit |
LCR_SB2 // 2 stop bits |
}; |
|
static unsigned char select_parity[] = { |
LCR_PN, // No parity |
LCR_PE, // Even parity |
LCR_PO, // Odd parity |
LCR_PM, // Mark parity |
LCR_PS, // Space parity |
}; |
|
// FIXME: calc all properly |
// The Atlas board has a 3.6864 MHz crystal |
static unsigned short select_baud[] = { |
0, // Unused |
0, // 50 |
0, // 75 |
2094, // 110 |
0, // 134.5 |
1536, // 150 |
0, // 200 |
768, // 300 |
384, // 600 |
192, // 1200 |
0, // 1800 |
96, // 2400 |
0, // 3600 |
48, // 4800 |
32, // 7200 |
24, // 9600 |
16, // 14400 |
12, // 19200 |
6, // 38400 |
4, // 57600 |
2, // 115200 |
1, // 230400 |
}; |
|
/atlas/v2_0/ChangeLog
0,0 → 1,54
2003-02-24 Jonathan Larmour <jifl@eCosCentric.com> |
|
* cdl/ser_mips_atlas.cdl: Remove irrelevant doc link. |
|
2001-09-10 Jonathan Larmour <jlarmour@redhat.com> |
|
* cdl/ser_mips_atlas.cdl: |
Fix 234000->230400 typo. |
|
2000-08-01 Jonathan Larmour <jlarmour@redhat.co.uk> |
|
* src/atlas_serial.c (atlas_serial_set_config): Now use keys to make |
more flexible. |
|
2000-07-14 Drew Moseley <dmoseley@redhat.com> |
|
* cdl/ser_mips_atlas.cdl: New file. Implement a serial driver for the mips Atlas board |
* src/atlas_serial.c: Ditto. |
* src/atlas_serial.h: Ditto. |
|
//=========================================================================== |
//####ECOSGPLCOPYRIGHTBEGIN#### |
// ------------------------------------------- |
// This file is part of eCos, the Embedded Configurable Operating System. |
// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc. |
// |
// eCos is free software; you can redistribute it and/or modify it under |
// the terms of the GNU General Public License as published by the Free |
// Software Foundation; either version 2 or (at your option) any later version. |
// |
// eCos is distributed in the hope that it will be useful, but WITHOUT ANY |
// WARRANTY; without even the implied warranty of MERCHANTABILITY or |
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
// for more details. |
// |
// You should have received a copy of the GNU General Public License along |
// with eCos; if not, write to the Free Software Foundation, Inc., |
// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. |
// |
// As a special exception, if other files instantiate templates or use macros |
// or inline functions from this file, or you compile this file and link it |
// with other works to produce a work based on this file, this file does not |
// by itself cause the resulting work to be covered by the GNU General Public |
// License. However the source code for this file must still be made available |
// in accordance with section (3) of the GNU General Public License. |
// |
// This exception does not invalidate any other reasons why a work based on |
// this file might be covered by the GNU General Public License. |
// |
// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc. |
// at http://sources.redhat.com/ecos/ecos-license/ |
// ------------------------------------------- |
//####ECOSGPLCOPYRIGHTEND#### |
//=========================================================================== |
/jmr3904/v2_0/cdl/ser_mips_jmr3904.cdl
0,0 → 1,220
# ==================================================================== |
# |
# ser_mips_jmr3904.cdl |
# |
# eCos serial MIPS/JMR3904 configuration data |
# |
# ==================================================================== |
#####ECOSGPLCOPYRIGHTBEGIN#### |
## ------------------------------------------- |
## This file is part of eCos, the Embedded Configurable Operating System. |
## Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc. |
## |
## eCos is free software; you can redistribute it and/or modify it under |
## the terms of the GNU General Public License as published by the Free |
## Software Foundation; either version 2 or (at your option) any later version. |
## |
## eCos is distributed in the hope that it will be useful, but WITHOUT ANY |
## WARRANTY; without even the implied warranty of MERCHANTABILITY or |
## FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
## for more details. |
## |
## You should have received a copy of the GNU General Public License along |
## with eCos; if not, write to the Free Software Foundation, Inc., |
## 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. |
## |
## As a special exception, if other files instantiate templates or use macros |
## or inline functions from this file, or you compile this file and link it |
## with other works to produce a work based on this file, this file does not |
## by itself cause the resulting work to be covered by the GNU General Public |
## License. However the source code for this file must still be made available |
## in accordance with section (3) of the GNU General Public License. |
## |
## This exception does not invalidate any other reasons why a work based on |
## this file might be covered by the GNU General Public License. |
## |
## Alternative licenses for eCos may be arranged by contacting Red Hat, Inc. |
## at http://sources.redhat.com/ecos/ecos-license/ |
## ------------------------------------------- |
#####ECOSGPLCOPYRIGHTEND#### |
# ==================================================================== |
######DESCRIPTIONBEGIN#### |
# |
# Author(s): jskov |
# Original data: gthomas |
# Contributors: |
# Date: 1999-07-14 |
# |
#####DESCRIPTIONEND#### |
# |
# ==================================================================== |
|
|
cdl_package CYGPKG_IO_SERIAL_TX39_JMR3904 { |
display "TX39 JMR3904 serial device drivers" |
|
parent CYGPKG_IO_SERIAL_DEVICES |
active_if CYGPKG_IO_SERIAL |
active_if CYGPKG_HAL_MIPS_TX39_JMR3904 |
|
requires CYGPKG_ERROR |
include_dir cyg/io |
include_files ; # none _exported_ whatsoever |
description " |
This option enables the serial device drivers for the |
TX39 JMR3904." |
|
compile -library=libextras.a tx3904_serial.c |
|
define_proc { |
puts $::cdl_system_header "/***** serial driver proc output start *****/" |
puts $::cdl_system_header "#define CYGDAT_IO_SERIAL_DEVICE_HEADER <pkgconf/io_serial_tx39_jmr3904.h>" |
puts $::cdl_system_header "/***** serial driver proc output end *****/" |
} |
|
# FIXME: Bad name |
cdl_option CYGPKG_IO_SERIAL_TX39_JMR3904_POLLED_MODE { |
display "TX39 JMR3904 polled mode serial drivers" |
flavor bool |
default_value 0 |
description " |
If asserted, this option specifies that the serial device |
drivers for the TX39 JMR3904 should be polled-mode instead of |
interrupt driven." |
} |
|
cdl_component CYGPKG_IO_SERIAL_TX39_JMR3904_SERIAL0 { |
display "TX39 JMR3904 serial port 0 driver" |
flavor bool |
default_value 1 |
description " |
This option includes the serial device driver for port 0 on the |
TX39 JMR3904." |
|
cdl_option CYGDAT_IO_SERIAL_TX39_JMR3904_SERIAL0_NAME { |
display "Device name for TX39 JMR3904 serial port 0" |
flavor data |
default_value {"\"/dev/ser0\""} |
description " |
This option specifies the device name port 0 on the TX39 JMR3904." |
} |
|
cdl_option CYGNUM_IO_SERIAL_TX39_JMR3904_SERIAL0_BAUD { |
display "Baud rate for the TX39 JMR3904 serial port 0 driver" |
flavor data |
legal_values { 50 75 110 "134_5" 150 200 300 600 1200 1800 2400 3600 |
4800 7200 9600 14400 19200 38400 57600 115200 230400 |
} |
default_value 38400 |
description " |
This option specifies the default baud rate (speed) for the |
TX39 JMR3904 port 0." |
} |
|
cdl_option CYGNUM_IO_SERIAL_TX39_JMR3904_SERIAL0_BUFSIZE { |
display "Buffer size for the TX39 JMR3904 serial port 0 driver" |
flavor data |
legal_values 0 to 8192 |
default_value 128 |
description " |
This option specifies the size of the internal buffers used |
for the TX39 JMR3904 port 0." |
} |
} |
cdl_component CYGPKG_IO_SERIAL_TX39_JMR3904_SERIAL1 { |
display "TX39 JMR3904 serial port 1 driver" |
flavor bool |
default_value 1 |
description " |
This option includes the serial device driver for port 1 on |
the TX39 JMR3904." |
|
cdl_option CYGDAT_IO_SERIAL_TX39_JMR3904_SERIAL1_NAME { |
display "Device name for TX39 JMR3904 serial port 1" |
flavor data |
default_value {"\"/dev/ser1\""} |
description " |
This option specifies the device name port 1 on the TX39 JMR3904." |
} |
|
cdl_option CYGNUM_IO_SERIAL_TX39_JMR3904_SERIAL1_BAUD { |
display "Baud rate for the TX39 JMR3904 serial port 1 driver" |
flavor data |
legal_values { 50 75 110 "134_5" 150 200 300 600 1200 1800 2400 3600 |
4800 7200 9600 14400 19200 38400 57600 115200 230400 |
} |
default_value 38400 |
description " |
This option specifies the default baud rate (speed) for the |
TX39 JMR3904 port 1." |
} |
|
cdl_option CYGNUM_IO_SERIAL_TX39_JMR3904_SERIAL1_BUFSIZE { |
display "Buffer size for the TX39 JMR3904 serial port 1 driver" |
flavor data |
legal_values 0 to 8192 |
default_value 128 |
description " |
This option specifies the size of the internal buffers used |
for the TX39 JMR3904 port 1." |
} |
} |
|
cdl_component CYGPKG_IO_SERIAL_TX39_JMR3904_OPTIONS { |
display "Serial device driver build options" |
flavor none |
description " |
Package specific build options including control over |
compiler flags used only in building this package, |
and details of which tests are built." |
|
|
cdl_option CYGPKG_IO_SERIAL_TX39_JMR3904_CFLAGS_ADD { |
display "Additional compiler flags" |
flavor data |
no_define |
default_value { "" } |
description " |
This option modifies the set of compiler flags for |
building these serial device drivers. These flags are used in addition |
to the set of global flags." |
} |
|
cdl_option CYGPKG_IO_SERIAL_TX39_JMR3904_CFLAGS_REMOVE { |
display "Suppressed compiler flags" |
flavor data |
no_define |
default_value { "" } |
description " |
This option modifies the set of compiler flags for |
building these serial device drivers. These flags are removed from |
the set of global flags if present." |
} |
} |
|
cdl_component CYGPKG_IO_SERIAL_TX39_JMR3904_TESTING { |
display "Testing parameters" |
flavor bool |
calculated 1 |
active_if CYGPKG_IO_SERIAL_TX39_JMR3904_SERIAL0 |
|
implements CYGINT_IO_SERIAL_TEST_SKIP_9600 |
implements CYGINT_IO_SERIAL_TEST_SKIP_57600 |
implements CYGINT_IO_SERIAL_TEST_SKIP_115200 |
implements CYGINT_IO_SERIAL_TEST_SKIP_PARITY_EVEN |
implements CYGINT_IO_SERIAL_TEST_SKIP_STOP_2 |
|
cdl_option CYGPRI_SER_TEST_SER_DEV { |
display "Serial device used for testing" |
flavor data |
default_value { CYGDAT_IO_SERIAL_TX39_JMR3904_SERIAL0_NAME } |
} |
|
define_proc { |
puts $::cdl_header "#define CYGPRI_SER_TEST_CRASH_ID \"tx39jmr\"" |
puts $::cdl_header "#define CYGPRI_SER_TEST_TTY_DEV \"/dev/tty0\"" |
} |
} |
} |
|
# EOF ser_mips_jmr3904.cdl |
/jmr3904/v2_0/src/tx3904_serial.c
0,0 → 1,757
//========================================================================== |
// |
// tx3904_serial.c |
// |
// Serial device driver for TX3904 on-chip serial devices |
// |
//========================================================================== |
//####ECOSGPLCOPYRIGHTBEGIN#### |
// ------------------------------------------- |
// This file is part of eCos, the Embedded Configurable Operating System. |
// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc. |
// |
// eCos is free software; you can redistribute it and/or modify it under |
// the terms of the GNU General Public License as published by the Free |
// Software Foundation; either version 2 or (at your option) any later version. |
// |
// eCos is distributed in the hope that it will be useful, but WITHOUT ANY |
// WARRANTY; without even the implied warranty of MERCHANTABILITY or |
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
// for more details. |
// |
// You should have received a copy of the GNU General Public License along |
// with eCos; if not, write to the Free Software Foundation, Inc., |
// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. |
// |
// As a special exception, if other files instantiate templates or use macros |
// or inline functions from this file, or you compile this file and link it |
// with other works to produce a work based on this file, this file does not |
// by itself cause the resulting work to be covered by the GNU General Public |
// License. However the source code for this file must still be made available |
// in accordance with section (3) of the GNU General Public License. |
// |
// This exception does not invalidate any other reasons why a work based on |
// this file might be covered by the GNU General Public License. |
// |
// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc. |
// at http://sources.redhat.com/ecos/ecos-license/ |
// ------------------------------------------- |
//####ECOSGPLCOPYRIGHTEND#### |
//========================================================================== |
//#####DESCRIPTIONBEGIN#### |
// |
// Author(s): nickg |
// Contributors: nickg |
// Date: 1999-03-3 |
// Purpose: TX3904 serial device driver |
// Description: TX3904 serial device driver |
// |
//####DESCRIPTIONEND#### |
// |
//========================================================================== |
|
#include <pkgconf/hal.h> |
#include <pkgconf/io_serial.h> |
#include <cyg/hal/hal_io.h> |
#include <cyg/hal/hal_intr.h> |
|
#include <cyg/io/io.h> |
#include <cyg/io/devtab.h> |
#include <cyg/io/serial.h> |
|
#ifdef CYGPKG_IO_SERIAL_TX39_JMR3904 |
|
cyg_bool cyg_hal_is_break(char *buf, int size); |
void cyg_hal_user_break( CYG_ADDRWORD *regs ); |
|
//------------------------------------------------------------------------- |
|
extern void diag_printf(const char *fmt, ...); |
|
//------------------------------------------------------------------------- |
// Forward definitions |
|
static bool tx3904_serial_init(struct cyg_devtab_entry *tab); |
static bool tx3904_serial_putc(serial_channel *chan, unsigned char c); |
static Cyg_ErrNo tx3904_serial_lookup(struct cyg_devtab_entry **tab, |
struct cyg_devtab_entry *sub_tab, |
const char *name); |
static unsigned char tx3904_serial_getc(serial_channel *chan); |
static Cyg_ErrNo tx3904_serial_set_config(serial_channel *chan, cyg_uint32 key, |
const void *xbuf, cyg_uint32 *len); |
static void tx3904_serial_start_xmit(serial_channel *chan); |
static void tx3904_serial_stop_xmit(serial_channel *chan); |
|
#ifndef CYGPKG_IO_SERIAL_TX39_JMR3904_POLLED_MODE |
static cyg_uint32 tx3904_serial_ISR(cyg_vector_t vector, cyg_addrword_t data, cyg_addrword_t *regs); |
static void tx3904_serial_DSR(cyg_vector_t vector, cyg_ucount32 count, cyg_addrword_t data); |
#endif |
|
|
//------------------------------------------------------------------------- |
// TX3904 serial line control register values: |
|
// Offsets to serial control registers from base |
#define SERIAL_CR 0x00 |
#define SERIAL_SR 0x04 |
#define SERIAL_ICR 0x08 |
#define SERIAL_ISR 0x0C |
#define SERIAL_FCR 0x10 |
#define SERIAL_BRG 0x14 |
#define SERIAL_TXB 0x20 |
#define SERIAL_RXB 0x30 |
|
// Status register bits |
#define ISR_RXRDY 0x01 |
#define ISR_TXRDY 0x02 |
#define ISR_ERROR 0x04 |
|
// Control register bits |
#define LCR_SB1 0x0000 |
#define LCR_SB1_5 0x0000 |
#define LCR_SB2 0x0004 |
#define LCR_PN 0x0000 // Parity mode - none |
#define LCR_PS 0x0000 // Forced "space" parity |
#define LCR_PM 0x0000 // Forced "mark" parity |
#define LCR_PE 0x0018 // Parity mode - even |
#define LCR_PO 0x0010 // Parity mode - odd |
#define LCR_WL5 0x0001 // not supported - use 7bit |
#define LCR_WL6 0x0001 // not supported - use 7bit |
#define LCR_WL7 0x0001 // 7 bit chars |
#define LCR_WL8 0x0000 // 8 bit chars |
|
#define LCR_BRG 0x0020 // Select baud rate generator |
|
#define ICR_RXE 0x0001 // receive enable |
#define ICR_TXE 0x0002 // transmit enable |
|
//------------------------------------------------------------------------- |
// Tables to map input values to hardware settings |
|
static unsigned char select_word_length[] = { |
LCR_WL5, // 5 bits / word (char) |
LCR_WL6, |
LCR_WL7, |
LCR_WL8 |
}; |
|
static unsigned char select_stop_bits[] = { |
0, |
LCR_SB1, // 1 stop bit |
LCR_SB1_5, // 1.5 stop bit |
LCR_SB2 // 2 stop bits |
}; |
|
static unsigned char select_parity[] = { |
LCR_PN, // No parity |
LCR_PE, // Even parity |
LCR_PO, // Odd parity |
LCR_PM, // Mark parity |
LCR_PS, // Space parity |
}; |
|
// The values in this table plug straight into the BRG register |
// in the serial driver hardware. They comprise a baud rate divisor |
// in the bottom 8 bits and a clock selector in the top 8 bits. |
// These figures all come from Toshiba. |
|
#if (CYGHWR_HAL_MIPS_CPU_FREQ == 50) |
|
static unsigned short select_baud[] = { |
0, // Unused |
0, // 50 |
0, // 75 |
0, // 110 |
0, // 134.5 |
0, // 150 |
0, // 200 |
0, // 300 |
0x0300|20, // 600 |
0x0300|10, // 1200 |
0, // 1800 |
0x0300|05, // 2400 |
0, // 3600 |
0x0300|10, // 4800 |
0, // 7200 |
0x0200|05, // 9600 |
0, // 14400 |
0x0100|10, // 19200 |
0x0100|05, // 38400 |
0, // 57600 |
0, // 115200 |
0, // 230400 |
}; |
|
#elif (CYGHWR_HAL_MIPS_CPU_FREQ == 66) |
|
static unsigned short select_baud[] = { |
0, // Unused |
0, // 50 |
0, // 75 |
0, // 110 |
0, // 134.5 |
0, // 150 |
0, // 200 |
0, // 300 |
0x0300|27, // 600 |
0x0200|54, // 1200 |
0, // 1800 |
0x0200|27, // 2400 |
0, // 3600 |
0x0100|54, // 4800 |
0, // 7200 |
0x0100|27, // 9600 |
0, // 14400 |
0x0000|54, // 19200 |
0x0000|27, // 38400 |
0, // 57600 |
0, // 115200 |
0, // 230400 |
}; |
|
#else |
|
#error Unsupported CPU frequency |
|
#endif |
|
//------------------------------------------------------------------------- |
// Info for each serial device controlled |
|
typedef struct tx3904_serial_info { |
CYG_ADDRWORD base; |
CYG_WORD int_num; |
cyg_interrupt interrupt; |
cyg_handle_t interrupt_handle; |
cyg_uint8 input_char; |
cyg_bool input_char_valid; |
cyg_bool output_ready; |
cyg_uint16 cur_baud; |
} tx3904_serial_info; |
|
//------------------------------------------------------------------------- |
// Callback functions exported by this driver |
|
static SERIAL_FUNS(tx3904_serial_funs, |
tx3904_serial_putc, |
tx3904_serial_getc, |
tx3904_serial_set_config, |
tx3904_serial_start_xmit, |
tx3904_serial_stop_xmit |
); |
|
//------------------------------------------------------------------------- |
// Hardware info for each serial line |
|
#ifdef CYGPKG_IO_SERIAL_TX39_JMR3904_SERIAL0 |
static tx3904_serial_info tx3904_serial_info0 = { |
0xFFFFF300, |
CYGNUM_HAL_INTERRUPT_SIO_0 |
}; |
#if CYGNUM_IO_SERIAL_TX39_JMR3904_SERIAL0_BUFSIZE > 0 |
static unsigned char tx3904_serial_out_buf0[CYGNUM_IO_SERIAL_TX39_JMR3904_SERIAL0_BUFSIZE]; |
static unsigned char tx3904_serial_in_buf0[CYGNUM_IO_SERIAL_TX39_JMR3904_SERIAL0_BUFSIZE]; |
#endif |
#endif // CYGPKG_IO_SERIAL_TX39_JMR3904_SERIAL0 |
|
#ifdef CYGPKG_IO_SERIAL_TX39_JMR3904_SERIAL1 |
static tx3904_serial_info tx3904_serial_info1 = { |
0xFFFFF400, |
CYGNUM_HAL_INTERRUPT_SIO_1 |
}; |
#if CYGNUM_IO_SERIAL_TX39_JMR3904_SERIAL1_BUFSIZE > 0 |
static unsigned char tx3904_serial_out_buf1[CYGNUM_IO_SERIAL_TX39_JMR3904_SERIAL1_BUFSIZE]; |
static unsigned char tx3904_serial_in_buf1[CYGNUM_IO_SERIAL_TX39_JMR3904_SERIAL1_BUFSIZE]; |
#endif |
#endif // CYGPKG_IO_SERIAL_TX39_JMR3904_SERIAL1 |
|
//------------------------------------------------------------------------- |
// Channel descriptions: |
|
#ifdef CYGPKG_IO_SERIAL_TX39_JMR3904_POLLED_MODE |
#define SIZEOF_BUF(_x_) 0 |
#else |
#define SIZEOF_BUF(_x_) sizeof(_x_) |
#endif |
|
#ifdef CYGPKG_IO_SERIAL_TX39_JMR3904_SERIAL0 |
#if CYGNUM_IO_SERIAL_TX39_JMR3904_SERIAL0_BUFSIZE > 0 |
static SERIAL_CHANNEL_USING_INTERRUPTS(tx3904_serial_channel0, |
tx3904_serial_funs, |
tx3904_serial_info0, |
CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_TX39_JMR3904_SERIAL0_BAUD), |
CYG_SERIAL_STOP_DEFAULT, |
CYG_SERIAL_PARITY_DEFAULT, |
CYG_SERIAL_WORD_LENGTH_DEFAULT, |
CYG_SERIAL_FLAGS_DEFAULT, |
&tx3904_serial_out_buf0[0], |
SIZEOF_BUF(tx3904_serial_out_buf0), |
&tx3904_serial_in_buf0[0], |
SIZEOF_BUF(tx3904_serial_in_buf0) |
); |
#else |
static SERIAL_CHANNEL(tx3904_serial_channel0, |
tx3904_serial_funs, |
tx3904_serial_info0, |
CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_TX39_JMR3904_SERIAL0_BAUD), |
CYG_SERIAL_STOP_DEFAULT, |
CYG_SERIAL_PARITY_DEFAULT, |
CYG_SERIAL_WORD_LENGTH_DEFAULT, |
CYG_SERIAL_FLAGS_DEFAULT |
); |
#endif |
#endif // CYGPKG_IO_SERIAL_TX39_JMR3904_SERIAL0 |
|
#ifdef CYGPKG_IO_SERIAL_TX39_JMR3904_SERIAL1 |
#if CYGNUM_IO_SERIAL_TX39_JMR3904_SERIAL1_BUFSIZE > 0 |
static SERIAL_CHANNEL_USING_INTERRUPTS(tx3904_serial_channel1, |
tx3904_serial_funs, |
tx3904_serial_info1, |
CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_TX39_JMR3904_SERIAL1_BAUD), |
CYG_SERIAL_STOP_DEFAULT, |
CYG_SERIAL_PARITY_DEFAULT, |
CYG_SERIAL_WORD_LENGTH_DEFAULT, |
CYG_SERIAL_FLAGS_DEFAULT, |
&tx3904_serial_out_buf1[0], |
SIZEOF_BUF(tx3904_serial_out_buf1), |
&tx3904_serial_in_buf1[0], |
SIZEOF_BUF(tx3904_serial_in_buf1) |
); |
#else |
static SERIAL_CHANNEL(tx3904_serial_channel1, |
tx3904_serial_funs, |
tx3904_serial_info1, |
CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_TX39_JMR3904_SERIAL1_BAUD), |
CYG_SERIAL_STOP_DEFAULT, |
CYG_SERIAL_PARITY_DEFAULT, |
CYG_SERIAL_WORD_LENGTH_DEFAULT, |
CYG_SERIAL_FLAGS_DEFAULT |
); |
#endif |
#endif // CYGPKG_IO_SERIAL_TX39_JMR3904_SERIAL1 |
|
//------------------------------------------------------------------------- |
// And finally, the device table entries: |
|
#ifdef CYGPKG_IO_SERIAL_TX39_JMR3904_SERIAL0 |
DEVTAB_ENTRY(tx3904_serial_io0, |
CYGDAT_IO_SERIAL_TX39_JMR3904_SERIAL0_NAME, |
0, // Does not depend on a lower level interface |
&cyg_io_serial_devio, |
tx3904_serial_init, |
tx3904_serial_lookup, // Serial driver may need initializing |
&tx3904_serial_channel0 |
); |
#endif // CYGPKG_IO_SERIAL_TX39_JMR3904_SERIAL0 |
|
#ifdef CYGPKG_IO_SERIAL_TX39_JMR3904_SERIAL1 |
DEVTAB_ENTRY(tx3904_serial_io1, |
CYGDAT_IO_SERIAL_TX39_JMR3904_SERIAL1_NAME, |
0, // Does not depend on a lower level interface |
&cyg_io_serial_devio, |
tx3904_serial_init, |
tx3904_serial_lookup, // Serial driver may need initializing |
&tx3904_serial_channel1 |
); |
#endif // CYGPKG_IO_SERIAL_TX39_JMR3904_SERIAL1 |
|
// ------------------------------------------------------------------------ |
// Delay for some number of character times. This is based on the baud |
// rate currently set. We use the numbers that plug in to the BRG |
// clock select and divider to control two loops. The innermost delay |
// loop uses a count that is derived from dividing the CPU frequency |
// by the BRG granularity (and we then add 1 to compensate for any |
// rounding). This gives the number of cycles that the innermost loop |
// must consume. For the sake of simplicity we assume that this loop |
// will take 1 cycle per loop, which is roughly true in optimized |
// code. |
|
void delay_char_time(tx3904_serial_info *tx3904_chan, int n) |
{ |
static cyg_uint16 clock_val[4] = { 4, 16, 64, 256 }; |
cyg_uint16 baud_val = select_baud[tx3904_chan->cur_baud]; |
cyg_count32 clock_loop = clock_val[baud_val>>8]; |
cyg_count32 div_loop = baud_val & 0xFF; |
cyg_count32 bit_time = ((CYGHWR_HAL_MIPS_CPU_FREQ_ACTUAL)/(2457600)) + 1; |
|
n *= 11; // allow for start and stop bits and 8 data bits |
|
while( n-- ) |
{ |
cyg_count32 i,j,k; |
|
for( i = 0; i < clock_loop; i++ ) |
for( j = 0; j < div_loop; j++ ) |
for( k = 0; k < bit_time; k++ ) |
continue; |
} |
} |
|
//------------------------------------------------------------------------- |
|
static bool |
tx3904_serial_config_port(serial_channel *chan, cyg_serial_info_t *new_config, bool init) |
{ |
tx3904_serial_info *tx3904_chan = (tx3904_serial_info *)chan->dev_priv; |
cyg_uint16 cr = 0; |
cyg_uint16 icr = 0; |
cyg_uint16 baud_divisor = select_baud[new_config->baud]; |
|
if (baud_divisor == 0) |
return false; // Invalid baud rate selected |
|
// set up other config values: |
|
cr |= select_word_length[new_config->word_length - CYGNUM_SERIAL_WORD_LENGTH_5]; |
cr |= select_stop_bits[new_config->stop]; |
cr |= select_parity[new_config->parity]; |
|
// Source transfer clock from BRG |
cr |= LCR_BRG; |
|
#ifndef CYGPKG_IO_SERIAL_TX39_JMR3904_POLLED_MODE |
// Enable RX interrupts only at present |
#ifdef CYGPKG_IO_SERIAL_TX39_JMR3904_SERIAL0 |
if ((chan->out_cbuf.len != 0) || (chan == &tx3904_serial_channel0)) { |
#else |
if (chan->out_cbuf.len != 0) { |
#endif |
icr |= ICR_RXE; |
} |
#endif |
|
// Avoid any interrupts while we are fiddling with the line parameters. |
cyg_drv_interrupt_mask(tx3904_chan->int_num); |
|
|
// In theory we should wait here for the transmitter to drain the |
// FIFO so we dont change the line parameters with characters |
// unsent. Unfortunately the TX39 serial devices do not allow us |
// to discover when the FIFO is empty. |
|
delay_char_time(tx3904_chan, 8); |
|
// Disable device entirely. |
// HAL_WRITE_UINT16(tx3904_chan->base+SERIAL_CR, 0); |
// HAL_WRITE_UINT8(tx3904_chan->base+SERIAL_ICR, 0); |
|
// Reset the FIFOs |
|
HAL_WRITE_UINT16(tx3904_chan->base+SERIAL_FCR, 7); |
HAL_WRITE_UINT16(tx3904_chan->base+SERIAL_FCR, 0); |
|
// Set up baud rate |
|
HAL_WRITE_UINT16( tx3904_chan->base+SERIAL_BRG, baud_divisor ); |
|
// Write CR into hardware |
HAL_WRITE_UINT16(tx3904_chan->base+SERIAL_CR, cr); |
|
// Write ICR into hardware |
HAL_WRITE_UINT16(tx3904_chan->base+SERIAL_ICR, icr); |
|
// Re-enable interrupts. |
cyg_drv_interrupt_unmask(tx3904_chan->int_num); |
|
// Save current baud rate |
tx3904_chan->cur_baud = new_config->baud; |
|
if (new_config != &chan->config) { |
chan->config = *new_config; |
} |
return true; |
} |
|
//------------------------------------------------------------------------- |
// Function to initialize the device. Called at bootstrap time. |
|
bool tx3904_serial_init(struct cyg_devtab_entry *tab) |
{ |
serial_channel *chan = (serial_channel *)tab->priv; |
tx3904_serial_info *tx3904_chan = (tx3904_serial_info *)chan->dev_priv; |
|
(chan->callbacks->serial_init)(chan); // Really only required for interrupt driven devices |
|
tx3904_chan->cur_baud = CYGNUM_SERIAL_BAUD_38400; |
|
#ifndef CYGPKG_IO_SERIAL_TX39_JMR3904_POLLED_MODE |
if (chan->out_cbuf.len != 0) { |
// Install and enable the interrupt |
cyg_drv_interrupt_create(tx3904_chan->int_num, |
4, // Priority |
(cyg_addrword_t)chan, // Data item passed to interrupt handler |
(cyg_ISR_t *)tx3904_serial_ISR, |
tx3904_serial_DSR, |
&tx3904_chan->interrupt_handle, |
&tx3904_chan->interrupt); |
cyg_drv_interrupt_attach(tx3904_chan->interrupt_handle); |
cyg_drv_interrupt_unmask(tx3904_chan->int_num); |
} |
#endif |
|
tx3904_serial_config_port(chan, &chan->config, true); |
|
return true; |
} |
|
//------------------------------------------------------------------------- |
// This routine is called when the device is "looked" up (i.e. attached) |
|
static Cyg_ErrNo |
tx3904_serial_lookup(struct cyg_devtab_entry **tab, |
struct cyg_devtab_entry *sub_tab, |
const char *name) |
{ |
serial_channel *chan = (serial_channel *)(*tab)->priv; |
(chan->callbacks->serial_init)(chan); // Really only required for interrupt driven devices |
return ENOERR; |
} |
|
//------------------------------------------------------------------------- |
// Return 'true' if character is sent to device |
|
bool |
tx3904_serial_putc(serial_channel *chan, unsigned char c) |
{ |
tx3904_serial_info *tx3904_chan = (tx3904_serial_info *)chan->dev_priv; |
cyg_uint16 isr; |
|
HAL_READ_UINT16( tx3904_chan->base+SERIAL_ISR, isr ); |
|
if( isr & ISR_TXRDY ) |
{ |
HAL_WRITE_UINT8( tx3904_chan->base+SERIAL_TXB, c ); |
|
isr &= ~ISR_TXRDY; |
|
HAL_WRITE_UINT16( tx3904_chan->base+SERIAL_ISR, isr ); |
|
return true; |
} |
else return false; |
} |
|
//------------------------------------------------------------------------- |
|
unsigned char |
tx3904_serial_getc(serial_channel *chan) |
{ |
unsigned char c; |
tx3904_serial_info *tx3904_chan = (tx3904_serial_info *)chan->dev_priv; |
cyg_uint16 isr; |
|
do |
{ |
HAL_READ_UINT16( tx3904_chan->base+SERIAL_ISR, isr ); |
|
// Eliminate any RX errors |
if( isr & ISR_ERROR ) |
{ |
cyg_uint16 sr = 0; |
|
isr &= ISR_ERROR; |
|
// HAL_READ_UINT16( tx3904_chan->base+SERIAL_SR, sr ); |
|
HAL_WRITE_UINT16( tx3904_chan->base+SERIAL_SR, sr ); |
HAL_WRITE_UINT16( tx3904_chan->base+SERIAL_ISR, isr ); |
} |
|
} while( (isr & ISR_RXRDY) != ISR_RXRDY ); |
|
HAL_READ_UINT8( tx3904_chan->base+SERIAL_RXB, c ); |
|
isr &= ~ISR_RXRDY; |
|
HAL_WRITE_UINT16( tx3904_chan->base+SERIAL_ISR, isr ); |
|
return c; |
} |
|
//------------------------------------------------------------------------- |
|
static Cyg_ErrNo |
tx3904_serial_set_config(serial_channel *chan, cyg_uint32 key, |
const void *xbuf, cyg_uint32 *len) |
{ |
switch (key) { |
case CYG_IO_SET_CONFIG_SERIAL_INFO: |
{ |
cyg_serial_info_t *config = (cyg_serial_info_t *)xbuf; |
if ( *len < sizeof(cyg_serial_info_t) ) { |
return -EINVAL; |
} |
*len = sizeof(cyg_serial_info_t); |
if ( true != tx3904_serial_config_port(chan, config, false) ) |
return -EINVAL; |
} |
break; |
default: |
return -EINVAL; |
} |
return ENOERR; |
} |
|
//------------------------------------------------------------------------- |
// Enable the transmitter on the device |
|
static void |
tx3904_serial_start_xmit(serial_channel *chan) |
{ |
#ifndef CYGPKG_IO_SERIAL_TX39_JMR3904_POLLED_MODE |
tx3904_serial_info *tx3904_chan = (tx3904_serial_info *)chan->dev_priv; |
cyg_uint16 icr; |
|
HAL_READ_UINT16( tx3904_chan->base+SERIAL_ICR, icr ); |
|
icr |= ICR_TXE; |
|
HAL_WRITE_UINT16( tx3904_chan->base+SERIAL_ICR, icr ); |
#endif |
} |
|
//------------------------------------------------------------------------- |
// Disable the transmitter on the device |
|
static void |
tx3904_serial_stop_xmit(serial_channel *chan) |
{ |
#ifndef CYGPKG_IO_SERIAL_TX39_JMR3904_POLLED_MODE |
tx3904_serial_info *tx3904_chan = (tx3904_serial_info *)chan->dev_priv; |
cyg_uint16 icr; |
|
HAL_READ_UINT16( tx3904_chan->base+SERIAL_ICR, icr ); |
|
icr &= ~ICR_TXE; |
|
HAL_WRITE_UINT16( tx3904_chan->base+SERIAL_ICR, icr ); |
#endif |
} |
|
//------------------------------------------------------------------------- |
// Serial I/O - low level interrupt handlers (ISR) |
|
#ifndef CYGPKG_IO_SERIAL_TX39_JMR3904_POLLED_MODE |
|
static cyg_uint32 |
tx3904_serial_ISR(cyg_vector_t vector, cyg_addrword_t data, cyg_addrword_t *regs) |
{ |
serial_channel *chan = (serial_channel *)data; |
tx3904_serial_info *tx3904_chan = (tx3904_serial_info *)chan->dev_priv; |
cyg_uint8 isr; |
cyg_uint32 result = 0; |
|
cyg_drv_interrupt_mask(tx3904_chan->int_num); |
cyg_drv_interrupt_acknowledge(tx3904_chan->int_num); |
|
HAL_READ_UINT16( tx3904_chan->base+SERIAL_ISR, isr ); |
|
// Eliminate any RX errors |
if( isr & ISR_ERROR ) |
{ |
cyg_uint16 sr = 0; |
|
isr &= ~ISR_ERROR; |
|
HAL_READ_UINT16( tx3904_chan->base+SERIAL_SR, sr ); |
|
HAL_WRITE_UINT16( tx3904_chan->base+SERIAL_SR, 0 ); |
} |
|
// Check for a TX interrupt and set the flag if so. |
if( isr & ISR_TXRDY ) |
{ |
isr &= ~ISR_TXRDY; |
|
tx3904_chan->output_ready = true; |
|
result |= CYG_ISR_CALL_DSR; // Cause DSR to be run |
} |
|
|
// Check here for an RX interrupt and fetch the character. If it |
// is a ^C then call into GDB stub to handle it. |
|
if( isr & ISR_RXRDY ) |
{ |
cyg_uint8 rxb; |
HAL_READ_UINT8( tx3904_chan->base+SERIAL_RXB, rxb ); |
|
isr &= ~ISR_RXRDY; |
|
if( cyg_hal_is_break( &rxb , 1 ) ) |
cyg_hal_user_break( regs ); |
else |
{ |
tx3904_chan->input_char = rxb; |
tx3904_chan->input_char_valid = true; |
result |= CYG_ISR_CALL_DSR; // Cause DSR to be run |
} |
|
} |
|
HAL_WRITE_UINT16( tx3904_chan->base+SERIAL_ISR, isr ); |
|
return result; |
} |
|
|
#endif |
|
//------------------------------------------------------------------------- |
// Serial I/O - high level interrupt handler (DSR) |
|
#ifndef CYGPKG_IO_SERIAL_TX39_JMR3904_POLLED_MODE |
|
static void |
tx3904_serial_DSR(cyg_vector_t vector, cyg_ucount32 count, cyg_addrword_t data) |
{ |
serial_channel *chan = (serial_channel *)data; |
tx3904_serial_info *tx3904_chan = (tx3904_serial_info *)chan->dev_priv; |
cyg_uint8 isr; |
|
HAL_READ_UINT16( tx3904_chan->base+SERIAL_ISR, isr ); |
|
if( tx3904_chan->input_char_valid ) |
{ |
(chan->callbacks->rcv_char)(chan, tx3904_chan->input_char); |
|
tx3904_chan->input_char_valid = false; |
|
#if 0 |
// And while we are here, pull any further characters out of the |
// FIFO. This should help to reduce the interrupt rate. |
|
HAL_READ_UINT16( tx3904_chan->base+SERIAL_ISR, isr ); |
|
while( isr & ISR_RXRDY ) |
{ |
cyg_uint8 rxb; |
HAL_READ_UINT8( tx3904_chan->base+SERIAL_RXB, rxb ); |
|
(chan->callbacks->rcv_char)(chan, rxb); |
|
isr &= ~ISR_RXRDY; |
|
HAL_WRITE_UINT16( tx3904_chan->base+SERIAL_ISR, isr ); |
HAL_READ_UINT16( tx3904_chan->base+SERIAL_ISR, isr ); |
} |
#endif |
|
} |
|
if( tx3904_chan->output_ready ) |
{ |
(chan->callbacks->xmt_char)(chan); |
|
tx3904_chan->output_ready = false; |
} |
|
cyg_drv_interrupt_unmask(tx3904_chan->int_num); |
} |
|
#endif |
#endif // CYGPKG_IO_SERIAL_TX39_JMR3904 |
|
//------------------------------------------------------------------------- |
// EOF tx3904_serial.c |
/jmr3904/v2_0/ChangeLog
0,0 → 1,1196
2003-02-24 Jonathan Larmour <jifl@eCosCentric.com> |
|
* cdl/ser_mips_jmr3904.cdl: Remove irrelevant doc link. |
|
2001-09-10 Jonathan Larmour <jlarmour@redhat.com> |
|
* cdl/ser_mips_jmr3904.cdl: |
Fix 234000->230400 typo. |
|
2000-10-12 Jesper Skov <jskov@redhat.com> |
|
* cdl/ser_mips_jmr3904.cdl: Moved testing parameters here. |
|
2000-08-01 Jonathan Larmour <jlarmour@redhat.co.uk> |
|
* src/tx3904_serial.c (tx3904_serial_set_config): Now use keys to make |
more flexible. |
|
2000-06-22 Hugo Tyson <hmt@cygnus.co.uk> |
|
* cdl/<yournamehere>.cdl: Remove the comment on the empty |
include_files directive; the tools now support this correctly. |
This keeps internal include files internal. |
|
2000-04-11 Hugo Tyson <hmt@cygnus.co.uk> |
|
* cdl/ser_mips_jmr3904.cdl: Change the parent from CYGPKG_IO_SERIAL |
(which is enabled most of the time) to CYGPKG_IO_SERIAL_DEVICES |
(which is not...) thus allowing convenient control independent of |
platform. Also enable all individual devices by default, now, so |
that they can be enabled simply by enabling the above new parent. |
|
2000-04-07 Hugo Tyson <hmt@cygnus.co.uk> |
|
* ecos.db: Re-organize device packages. This is a massive change |
involving deleting all the sources for serial and ethernet drivers |
from where they used to live in |
packages/io/serial/current/src/ARCH/PLATFORM.[ch] |
packages/net/drivers/eth/PLATFORM/current/src/... |
and reinstating them in |
packages/devs/serial/ARCH/PLATFORM/current/src/... |
packages/devs/eth/ARCH/PLATFORM/current/src/... |
|
All these new packages are properly defined in ecos.db, and are |
all of type "hardware" so that a "target" can grab them. |
|
This directory layout is descriptive of the devices we have right |
now, arch and platform are separate levels just to make it easier |
to navigate in the filesystem and similar to the HAL structure in |
the filesystem. |
|
It is *not* prescriptive of future work; for example, the mythical |
common highly-portable 16550 serial driver which works on many |
targets would be called "devs/serial/s16550/current", or a serial |
device for a particular board (cogent springs to mind) that can |
work with different CPUs fitted is "devs/serial/cogent/current". |
|
Changelogs have been preserved and replicated over all the new |
packages, so that no history is lost. |
|
The contents of individual source files are unchanged; they build |
in just the same emvironment except for a very few cases where the |
config file name changed in this movement. |
|
Targets in ecos.db have been redefined to bring in all relevant |
hardware packages including net and serial drivers (but the newly |
included packages are only active if their desired parent is |
available.) |
|
The names of CDL options (and their #defines of course) stay the |
same for the serial drivers, for backward compatibility. |
|
* templates/*/current.ect: these have had CYGPKG_IO_SERIAL added |
rather than it being in (almost) all target definitions. |
|
2000-04-05 Jonathan Larmour <jlarmour@redhat.co.uk> |
|
* src/common/tty.c (tty_read): CRLF conversion should use \r\n not \n\r |
(tty_write): Similarly |
|
* include/ttyio.h: Update CYG_TTY_IN_FLAGS_CRLF and |
CYG_TTY_IN_FLAGS_CRLF to match |
|
2000-03-31 Jesper Skov <jskov@redhat.com> |
|
* cdl/ser_sh_edk7708.cdl: Limit legal baud rate range. |
* src/sh/sh_sci_serial.c: Use baud rate macro instead of hardwired |
constants. |
|
2000-03-28 John Dallaway <jld@cygnus.co.uk> |
|
* cdl/io_serial.cdl, |
cdl/ser_arm_aeb.cdl, |
cdl/ser_arm_cma230.cdl, |
cdl/ser_arm_edb7xxx.cdl, |
cdl/ser_arm_pid.cdl, |
cdl/ser_i386_pc.cdl, |
cdl/ser_mips_jmr3904.cdl, |
cdl/ser_mips_vrc4373.cdl, |
cdl/ser_mn10300.cdl, |
cdl/ser_powerpc_cogent.cdl, |
cdl/ser_quicc_smc.cdl, |
cdl/ser_sh_edk7708.cdl, |
cdl/ser_sparclite_sleb.cdl, |
cdl/tty.cdl: |
|
Adjust documentation URLs. |
|
2000-03-07 Jesper Skov <jskov@redhat.com> |
|
* cdl/ser_mips_jmr3904.cdl: Rename devices to match CDL naming. |
|
2000-02-29 Jonathan Larmour <jlarmour@redhat.co.uk> |
|
* include/serialio.h: Correct baud rate typo: 230400 rather than |
234000. Thanks to Grant Edwards for the report. |
|
2000-02-28 Gary Thomas <gthomas@cygnus.co.uk> |
|
* src/powerpc/quicc_smc_serial.c: Use standard 'diag_dump_buf()'. |
|
2000-02-28 Jesper Skov <jskov@redhat.com> |
|
* tests/ser_test_protocol.inl: Allow 115200 baud on Cogent |
again. Fixed interrupt problem. |
|
2000-02-22 Jesper Skov <jskov@redhat.com> |
|
* tests/ser_test_protocol.inl: Don't use 115200 baud on |
Cogent. Our slower boards can't keep up. |
|
2000-02-17 Gary Thomas <gthomas@cygnus.co.uk> |
|
* cdl/ser_powerpc_cogent.cdl: Fix incorrect dependency. |
|
2000-02-16 Nick Garnett <nickg@cygnus.co.uk> |
|
* include/pkgconf/io_serial.h: |
Added configury for PC serial device drivers. |
|
* cdl/ser_i386_pc.cdl: |
* src/i386/pc_serial.c: |
* src/i386/pc_serial.h: |
Added these files to implement PC serial line drivers. |
|
* cdl/io_serial.cdl: |
Added CYGPKG_IO_SERIAL_I386_PC. |
|
* tests/ser_test_protocol.inl: |
Added support for PC serial line testing. |
|
2000-02-11 Jesper Skov <jskov@redhat.com> |
|
* src/sh/sh_sci_7708.inl (DEVTAB_ENTRY): |
* src/sparclite/sleb_sdtr.c: |
serial_devio => cyg_io_serial_devio |
|
2000-02-10 Jonathan Larmour <jlarmour@redhat.co.uk> |
|
* src/mn10300/mn10300_serial.c: Ensure all CYG_HAL_MN10300_* |
preprocessor conditionals use the correct CYGPKG_HAL_MN10300_AM3* form |
now. |
|
2000-02-03 Jesper Skov <jskov@redhat.com> |
|
* src/powerpc/quicc_smc_serial.c: CYG_HAL_POWERPC_x->CYGPKG_... |
|
2000-02-02 Jonathan Larmour <jlarmour@redhat.co.uk> |
|
* src/arm/aeb_serial.h: Rename lower case register macros to REG_ upper |
case macros |
|
* src/arm/aeb_serial.c: Update to reflect above |
|
2000-01-31 Simon FitzMaurice <sdf@cygnus.co.uk> |
* cdl/*.cdl: |
|
Adjust help URLs in line with new doc layout. |
|
2000-01-28 Simon FitzMaurice <sdf@cygnus.co.uk> |
* cdl/*.cdl: |
|
Adjust help URLs in line with new doc layout. |
|
2000-01-28 Gary Thomas <gthomas@cygnus.co.uk> |
|
* src/common/tty.c (tty_read): Fix problem with backspace at start |
of line (size must be 'signed' for compare to work). |
|
2000-01-19 Hugo Tyson <hmt@cygnus.co.uk> |
|
* cdl/*.cdl: Add descriptions to a number of options &c which were |
lacking same, also tidied up other typos as noticed en passant. |
|
2000-01-17 Gary Thomas <gthomas@cygnus.co.uk> |
|
* src/common/tty.c (tty_read): Avoid echoing "backspace/erase" at |
start of line. |
|
2000-01-05 Gary Thomas <gthomas@cygnus.co.uk> |
|
* src/common/serial.c (serial_write): Avoid potential deadlock if |
transmit start actually sends enough characters to signal cond wait. |
|
2000-01-03 Gary Thomas <gthomas@cygnus.co.uk> |
|
* include/serial.h: Fix namespace pollution - |
serial_devio => cyg_io_serial_devio |
serial_callbacks => cyg_io_serial_callbacks |
|
* src/mips/tx3904_serial.c: |
* src/mips/vrc4373_serial.c: |
* src/mn10300/mn10300_serial.c: |
* src/powerpc/quicc_smc_serial.c: |
* src/powerpc/cogent_serial_with_ints.c: |
* src/sparclite/sleb_sdtr.c: |
* src/arm/aeb_serial.c: |
* src/arm/pid_serial_with_ints.c: |
* src/arm/edb7xxx_serial.c: |
* src/arm/cma230_serial.c: |
* src/arm/ebsa285_serial.c: |
* src/common/haldiag.c: |
* src/common/serial.c: Fix namespace pollution - |
serial_devio => cyg_io_serial_devio |
|
1999-12-06 Gary Thomas <gthomas@cygnus.co.uk> |
|
* src/arm/pid_serial_with_ints.c (pid_serial_DSR): Add loop to handle |
case where an interrupt represents multiple events. |
|
1999-11-19 Gary Thomas <gthomas@cygnus.co.uk> |
|
* src/powerpc/quicc_smc_serial.c: Channel select for SMC2 was wrong. |
|
1999-11-18 Gary Thomas <gthomas@cygnus.co.uk> |
|
* include/pkgconf/io_serial.h: Remove mention of 7209/7212. |
|
1999-11-03 John Dallaway <jld@cygnus.co.uk> |
|
* cdl/io_serial.cdl: Define build options. |
|
1999-10-26 Jesper Skov <jskov@cygnus.co.uk> |
* tests/serial5.c (serial_test): Reduce speed in thumb mode. |
|
* src/arm/pid_serial.h: Added BE support. |
|
* src/PKGconf.mak: Use CYGPKG_<> instead of CYG_<> to control what |
needs to be compiled. |
|
1999-10-25 Gary Thomas <gthomas@cygnus.co.uk> |
|
* src/arm/pid_serial.h (ISR_RxTO): Define - character received but |
not handled "promptly". |
|
* src/arm/pid_serial_with_ints.c (pid_serial_DSR): Handle rcv interrupts |
properly (can't ignore them even with TO bit set). |
|
* src/arm/cl7211_serial.c (cl7211_serial_rx_DSR): Need to handle all |
input (empty input FIFO) otherwise characters get dropped. |
|
1999-10-15 Jesper Skov <jskov@cygnus.co.uk> |
|
* tests/ser_test_protocol.inl: Removed AEB rev C change. Was bogus. |
|
1999-10-11 Nick Garnett <nickg@cygnus.co.uk> |
|
* tests/ser_test_protocol.inl: Added configury for VR4300 testing. |
|
* src/mips/vrc4373_serial.c: Added Bi-endian support. |
|
* include/pkgconf/io_serial.h: Adjusted default baud rates to |
38400. |
|
1999-10-06 Jesper Skov <jskov@cygnus.co.uk> |
|
* tests/ser_test_protocol.inl: Run tests on AEB rev C as well. |
|
1999-09-28 Hugo Tyson <hmt@cygnus.co.uk> |
|
* src/powerpc/quicc_smc_serial.c (quicc_smc_serial_init): Correct |
value supplied for interrupt priority - it may be unused, but it |
is asserted for range. Initialize the diagnostic channel if on an |
MBX and if NOT using SMC1 ourselves, to ensure that diag output |
and built-in stubs work correctly; otherwise reset the quicc and |
ignore SMC1 as before. Fix various warnings, mostly about |
casting/arg-passing/assigning away volatile. |
|
1999-08-31 Jesper Skov <jskov@cygnus.co.uk> |
|
* tests/ser_test_protocol.inl: Define dummy crash ID. |
|
1999-08-30 Jesper Skov <jskov@cygnus.co.uk> |
|
* tests/ser_test_protocol.inl: Added crash information which |
should help track down repeating errors. |
|
1999-08-20 Jesper Skov <jskov@cygnus.co.uk> |
|
* tests/README: Added. |
|
1999-08-18 Jesper Skov <jskov@cygnus.co.uk> |
|
* tests/tty1.c: |
* tests/tty2.c: |
* tests/serial1.c: |
* tests/serial2.c: |
* tests/serial3.c: |
* tests/serial4.c: |
* tests/serial5.c: |
* tests/PKGconf.mak: |
Require kernel and kernel C API. |
|
1999-08-17 Nick Garnett <nickg@cygnus.co.uk> |
|
* src/mn10300/mn10300_serial.c: Added a simple implementation of a |
receive FIFO to try and reduce the overhead of receiving bytes. |
|
1999-08-16 Jonathan Larmour <jlarmour@cygnus.co.uk> |
|
* src/PKGconf.mak: |
* src/mn10300/mn10300_serial.c: |
* tests/ser_test_protocol.inl: |
Rename all am32 -> am31 |
|
1999-08-12 Nick Garnett <nickg@cygnus.co.uk> |
|
Imported following changes from development branch: |
|
1999-08-11 Nick Garnett <nickg@cygnus.co.uk> |
|
* tests/serial5.c: Modified config test for boards that need a lower |
speed for this test. |
|
* tests/ser_test_protocol.inl: Removed 14400 baud tests for all |
MN10300 variants. The MN10300 cannot currently do this speed. |
|
* src/mn10300/mn10300_serial.c: Tidied up the transmit interrupt |
enable/disable code to be variant specific. |
|
* include/pkgconf/io_serial.h: Undid Jonathan's change, since the |
same options are used for all MN10300 variants. |
|
1999-08-10 Jonathan Larmour <jlarmour@cygnus.co.uk> |
|
* include/pkgconf/io_serial.h: |
Reparent CYGPKG_IO_SERIAL_MN10300 from under CYGPKG_HAL_MN10300 to |
CYGPKG_HAL_MN10300_AM32_STDEVAL1 since it's stdeval1 specific |
|
1999-08-04 Nick Garnett <nickg@cygnus.co.uk> |
|
* tests/ser_test_protocol.inl: |
Changed names of MN10300 defines tested. Added AM33 definitions. |
|
* src/mn10300/mn10300_serial.c: |
Modified driver to work on am33 too. This simply requires some |
alternate definitions of things like register addresses and some |
bits in them plus some extra parameterization of some register |
values. |
|
* src/PKGconf.mak: |
Added am33 to list of architectures supporting serial lines. |
|
1999-07-28 Gary Thomas <gthomas@cygnus.co.uk> |
|
* include/pkgconf/io_serial.h: Update descriptions to be more |
generic (CL7x11 instead of CL7211). |
|
1999-07-28 Jonathan Larmour <jlarmour@cygnus.co.uk> |
|
* include/pkgconf/io_serial.h: Correct typos in CDL description |
for serial port 2 driver |
|
1999-07-26 Hugo Tyson <hmt@cygnus.co.uk> |
|
* src/arm/ebsa285_serial.c: New file: device driver for the serial |
device of the Intel StrongARM EBSA-285 evaluation board. |
|
* include/pkgconf/io_serial.h (CYGPKG_IO_SERIAL_ARM_EBSA285): |
Config for it. |
|
* src/PKGconf.mak (EXTRAS_COMPILE): Compile it. |
|
* tests/ser_test_protocol.inl (TEST_SER_DEV): Enable testing of it. |
|
1999-07-08 Jesper Skov <jskov@cygnus.co.uk> |
|
* tests/ser_test_protocol.inl (change_config): Changed implementation. |
|
1999-06-27 Gary Thomas <gthomas@cygnus.co.uk> |
|
* src/powerpc/quicc_smc_serial.c (quicc_smc_serial_init): More robust |
initialization, with data cache disabled. This seems to fix the |
random failures described below. |
|
* tests/ser_test_protocol.inl: Add configuration for QUICC/MBX860. |
Added some delays in the configuration change code to make QUICC |
happy [didn't help much although the manual says they are required]. |
|
* src/powerpc/quicc_smc_serial.h (UART_BITRATE): Rewrote macro to |
match what the Linux driver uses - still doesn't work well, though. |
|
* src/powerpc/quicc_smc_serial.c: Lots of changes trying to get the |
serial driver working and robust. At this point it works quite well, |
using the default buffer sizes. Changing from the defaults seem to |
easily break it though, certainly on input. Also, changing the baud |
rate seems to not work reliably. |
|
* src/common/serial.c: Add some tracing/debug info to try and debug |
problems with QUICC serial driver. These are hard disabled with |
"XX_" prepended to "CYGDBG_DIAG_BUF". Enabling them gives information |
about how/when data are delivered from the serial driver. |
|
* include/pkgconf/io_serial.h: Adjust limits and defaults on number and |
size of buffers with values that seem to work. |
|
1999-06-21 Jesper Skov <jskov@cygnus.co.uk> |
|
* src/sh/sh_sci_serial.c: Rearranged inclusion of .inl file a bit |
to avoid compiler warnings. |
|
1999-06-21 Gary Thomas <gthomas@cygnus.co.uk> |
|
* include/pkgconf/io_serial.h: Fix CDL for number of buffers. |
|
* src/powerpc/quicc_smc_serial.c: Force number of buffers = 1. |
|
1999-06-20 Gary Thomas <gthomas@cygnus.co.uk> |
|
* include/pkgconf/io_serial.h: Some clean up (removed commented |
obsolete CDL parenting structure). |
Add support for Motorola PowerPC QUICC/SMC. |
|
* src/arm/cma230_serial.c: |
* src/arm/cl7211_serial.c: |
* src/arm/aeb_serial.c: |
* src/arm/pid_serial_with_ints.c: Use #include to get 'diag_printf()' |
prototypes. |
|
1999-06-17 Gary Thomas <gthomas@cygnus.co.uk> |
|
* src/arm/cl7211_serial.c (cl7211_serial_start_xmit): Fix race which |
cause xmitter to get stuck. |
|
1999-06-16 Jesper Skov <jskov@cygnus.co.uk> |
|
* src/sh/sh_serial.c: [removed] |
* src/sh/sh_sci_serial.c: [added] |
* src/sh/sh_sci_7708.inl: [added] |
* include/pkgconf/io_serial.h: |
* src/PKGconf.mak (EXTRAS_COMPILE): |
* tests/ser_test_protocol.inl: |
Renamed CDL options and restructered driver. |
Fixed CDL typo. |
|
1999-06-04 Jesper Skov <jskov@cygnus.co.uk> |
|
* include/pkgconf/io_serial.h: Fixed CDL string for BAUD rate option. |
|
1999-06-04 Gary Thomas <gthomas@cygnus.co.uk> |
|
* tests/ser_test_protocol.inl: Disable testing at 115200 |
for Cogent CMA230 (ARM). |
|
* src/arm/cma230_serial.c: Fix interrupt for port B. |
|
1999-05-31 Jesper Skov <jskov@cygnus.co.uk> |
|
* src/sh/sh_serial.c: Fixed receive interrupts and added handler for |
error interrupts. |
|
1999-05-28 Jesper Skov <jskov@cygnus.co.uk> |
|
* io/serial/current/src/PKGconf.mak: |
* io/serial/current/tests/ser_test_protocol.inl: |
* include/pkgconf/io_serial.h: |
Renamed SH platform package to edk7708. |
|
1999-05-27 Jesper Skov <jskov@cygnus.co.uk> |
|
* tests/ser_test_protocol.inl: Added ability to change options in |
host software. |
|
1999-05-27 Jonathan Larmour <jlarmour@cygnus.co.uk> |
|
* src/mn10300/mn10300_serial.c (mn10300_serial_config_port): |
Wait for the serial device to become acquiescent before disabling |
it. This prevents cygmon's outgoing characters getting corrupted |
due to transmission being disabled. |
Fix for PR 20047 |
|
1999-05-26 Gary Thomas <gthomas@cygnus.co.uk> |
|
* include/pkgconf/io_serial.h: |
* tests/ser_test_protocol.inl: Add Cogent CMA230 setup. |
|
* src/arm/cma230_serial.c: Make names compatible with Cogent |
PowerPC board. |
|
1999-05-26 Gary Thomas <gthomas@cygnus.co.uk> |
|
* tests/ser_test_protocol.inl: Add Cirrus Logic CL7211 setup. |
1999-05-26 Jesper Skov <jskov@cygnus.co.uk> |
|
* src/sh/sh_serial.c: Added more baud rate values. Disabled |
interrupt driven receive. Fixed config_port to enable proper |
interrupt flags. |
|
1999-05-25 Jonathan Larmour <jlarmour@cygnus.co.uk> |
|
* tests/ser_test_protocol.inl: |
Change all mentions of CYGPKG_HAL_TX39_JMR3904 to |
CYGPKG_HAL_MIPS_TX39_JMR3904 |
|
1999-05-25 Jonathan Larmour <jlarmour@cygnus.co.uk> |
|
* src/PKGconf.mak (EXTRAS_COMPILE): Change CYG_HAL_TX39 to |
CYG_HAL_MIPS_TX39 |
1999-05-25 Jesper Skov <jskov@cygnus.co.uk> |
|
* tests/ser_test_protocol.inl: Added sh entry. |
|
1999-05-24 Jesper Skov <jskov@cygnus.co.uk> |
|
* src/PKGconf.mak: |
* include/pkgconf/io_serial.h: |
* src/sh/sh_serial.c: |
Added sh driver. |
|
1999-05-18 Jesper Skov <jskov@cygnus.co.uk> |
PR 19926 |
* src/sparclite/sleb_sdtr.c (sleb_sdtr_rx_DSR): Only read chan if |
there is one. |
|
1999-05-18 Jesper Skov <jskov@cygnus.co.uk> |
PR 19926 |
* src/arm/cl7211_serial.c (cl7211_serial_rx_DSR): Only read char |
if there is one. |
|
1999-05-16 Gary Thomas <gthomas@cygnus.co.uk> |
|
* src/arm/cl7211_serial.c: Clean up, first working version. |
|
1999-05-14 Jesper Skov <jskov@cygnus.co.uk> |
|
* tests/ser_test_protocol.inl: Removed workaround for spurious |
Cogent reads. |
|
* src/arm/aeb_serial.c: |
* src/arm/aeb_serial.h: |
* src/arm/pid_serial_with_ints.c: |
* src/arm/pid_serial.h: |
* src/powerpc/cogent_serial.h: |
* src/powerpc/cogent_serial_with_ints.c: |
Check for receive interrupt before reading. |
|
1999-05-13 Nick Garnett <nickg@cygnus.co.uk> |
|
The follow changes were made in a branch an have now been merged: |
|
1999-04-21 Gary Thomas <gthomas@cygnus.co.uk> |
|
* src/mips/vrc4373_serial.c: Small changes to get working with |
interrupts. |
|
1999-04-20 John Dallaway <jld@cygnus.co.uk> |
|
* include/pkgconf/io_serial.h: Fix CYGPKG_IO_SERIAL_TX39_JMR3904 |
parent attribute. |
|
1999-05-11 Gary Thomas <gthomas@cygnus.co.uk> |
|
* src/arm/cl7211_serial.c: Fix compile problems from merged code. |
|
1999-05-05 Jesper Skov <jskov@cygnus.co.uk> |
|
* tests/ser_test_protocol.inl: Tidied up a bit and added |
description of protocol. |
|
1999-05-05 Jesper Skov <jskov@cygnus.co.uk> |
|
* src/common/serial.c (serial_write, serial_read): Clear abort |
flag at entry. |
|
1999-05-05 Jesper Skov <jskov@cygnus.co.uk> |
|
* tests/serial4.c (serial_test): Handle config fails correctly. |
|
* tests/ser_test_protocol.inl: Better change_config |
handling. Simple recovery and negotiation isn't timing |
dependant. |
|
1999-05-05 Jesper Skov <jskov@cygnus.co.uk> |
|
* tests/timeout.inl: Updated with the below changes. |
|
1999-05-05 Gary Thomas <gthomas@cygnus.co.uk> |
|
* misc/timeout.inl (timeout): Timeouts are relative, but alarms |
need absolute time values. |
|
1999-05-04 Jesper Skov <jskov@cygnus.co.uk> |
PR 20018 |
* tests/serial1.c (serial_test): Always PASS, regardless of |
configuration. |
|
1999-05-04 Jesper Skov <jskov@cygnus.co.uk> |
|
* tests/ser_test_protocol.inl: Reverse order of configurations - |
run tests with slow baud rate first. |
Only check CYG_KERNEL_DIAG_GDB_SERIAL_DIRECT for SLEB on RAM startup. |
|
1999-05-04 Jesper Skov <jskov@cygnus.co.uk> |
* src/mn10300/mn10300_serial.c: |
Use interrupt enable/disable feature of serial port2 to allow |
coexistence with CygMon/hal_diag. |
|
* tests/ser_test_protocol.inl: Use port2 for MN10300. |
|
1999-04-28 Bart Veer <bartv@cygnus.co.uk> |
|
* src/PKGconf.mak (EXTRAS_COMPILE): |
Use the new rules for generating libextras.a |
|
1999-04-26 Gary Thomas <gthomas@cygnus.co.uk> |
|
* include/pkgconf/io_serial.h: Add support for Cirrus Logic CL7211. |
|
|
1999-04-20 Gary Thomas <gthomas@cygnus.co.uk> |
|
* src/arm/aeb_serial.c: |
* src/arm/pid_serial_with_ints.c: Fix default baud rate if unbuffered. |
1999-04-20 Jesper Skov <jskov@cygnus.co.uk> |
|
* tests/ser_test_protocol.inl: Added some comments. Disabled 38400 |
for SLEB. Only run test on SLEB if CygMon isn't used for diag |
output. |
|
1999-04-15 Jesper Skov <jskov@cygnus.co.uk> |
PR 19752 |
* tests/serial3.c: |
* tests/serial5.c: |
Run these tests at a lower baud rate on ARM AEB. |
|
1999-04-14 Jesper Skov <jskov@cygnus.co.uk> |
PR 19839 |
* src/mn10300/mn10300_serial.c: |
Fix compiler warnings. |
|
1999-04-14 Bart Veer <bartv@cygnus.co.uk> |
|
* include/pkgconf/io_serial.h: |
Reparent the board-specific serial devices below the actual boards. |
|
1999-04-13 Jesper Skov <jskov@cygnus.co.uk> |
|
* tests/ser_test_protocol.inl: |
NA when run from simulator. |
|
1999-04-12 Jesper Skov <jskov@cygnus.co.uk> |
|
* tests/ser_test_protocol.inl: |
Disabled 115200 for MN10300. |
Reclaim interrupt vectors from CygMon when testing on SLEB. |
|
1999-04-09 Gary Thomas <gthomas@cygnus.co.uk> |
|
* include/serial.h: Change SERIAL_CHANNEL setup so all channels |
have serial callbacks, regardless of buffering. |
|
1999-04-09 Jesper Skov <jskov@cygnus.co.uk> |
|
* src/common/tty.c: |
* include/pkgconf/io_serial.h: |
Added new ttydiag device layered on top of haldiag, so that tty0 |
can be layered on top of ser0. |
|
1999-04-08 Jesper Skov <jskov@cygnus.co.uk> |
|
* tests/tty1.c: [added] |
* tests/tty2.c: [added] |
* tests/PKGconf.mak: |
* tests/ser_test_protocol.inl: |
Added two simple TTY tests. |
|
1999-04-07 Hugo Tyson <hmt@cygnus.co.uk> |
|
* src/sparclite/sleb_sdtr.h: Include cyg/hal/hal_io.h for I/O |
macros instead of hal_diag.h where they had evolved before. |
|
1999-04-06 Jesper Skov <jskov@cygnus.co.uk> |
|
* tests/serial4.c (serial_test): |
* tests/serial3.c (serial_test): |
Reduce packet sizes. |
|
1999-03-31 Jesper Skov <jskov@cygnus.co.uk> |
|
* tests/ser_test_protocol.inl: Added remaining targets to the |
test. |
|
1999-03-31 Gary Thomas <gthomas@cygnus.co.uk> |
|
* src/sparclite/sleb_sdtr.c (sleb_sdtr_start_xmit): Fix timing race |
when enabling xmit interrupts. |
|
1999-03-26 Gary Thomas <gthomas@cygnus.co.uk> |
|
* src/sparclite/sleb_sdtr.c: Change how the port is set up. The transmitter |
is now always enabled, just the interrupts are masked/unmasked to control it. |
This lets the serial driver cooperate with Cygmon on the port used for GDB. |
Note that currently serial input does not work for CON1 since Cygmon is |
taking all of the receive interrupts for itself. |
(sleb_sdtr_tx_DSR): Need to keep track whether xmit interrupt should be |
enabled - otherwise it can get enabled incorrectly and we get interrupted |
to death! |
|
1999-03-26 Jesper Skov <jskov@cygnus.co.uk> |
|
* tests/ser_test_protocol.inl: Send a DONE message after a no-echo |
binary packet. |
|
1999-03-26 Hugo Tyson <hmt@cygnus.co.uk> |
|
* tests/serial5.c: |
* tests/serial4.c: |
* tests/serial3.c: |
* tests/serial2.c: |
* tests/serial1.c: |
Make these build when no kernel present; include of testcase |
was the wrong side of the ifdef. |
|
1999-03-26 Jesper Skov <jskov@cygnus.co.uk> |
|
* tests/serial5.c: |
* tests/serial4.c: |
* tests/serial3.c: |
* tests/serial2.c: |
* tests/serial1.c: |
Moved NOP check to ser_test_protocol open call. |
|
* tests/ser_test_protocol.inl: Make sure the proper device is |
selected for testing. Do NOP check in open call. |
|
1999-03-25 Gary Thomas <gthomas@cygnus.co.uk> |
|
* include/pkgconf/io_serial.h: |
* misc/console.c: |
* src/arm/aeb_serial.c: |
* src/arm/pid_serial_with_ints.c: |
* src/common/tty.c: |
* src/mips/tx3904_serial.c: |
* src/mn10300/mn10300_serial.c: |
* src/powerpc/cogent_serial_with_ints.c: |
* src/sparclite/sleb_sdtr.c: Update CDL to follow naming conventions. |
|
* src/mips/tx3904_serial.c (tx3904_serial_config_port): |
Make sure port is enabled (CDL) before using it. |
|
* src/mn10300/mn10300_serial.c (mn10300_serial_config_port): |
* src/powerpc/cogent_serial_with_ints.c (cogent_serial_config_port): |
* src/arm/aeb_serial.c (aeb_serial_config_port): |
* src/arm/pid_serial_with_ints.c (pid_serial_config_port): Change so that |
the physical port is not modified unless the provided configuration is valid. |
|
* src/sparclite/sleb_sdtr.c (sleb_sdtr_config_port): |
Using wrong config data. |
|
* include/serialio.h: Add macros to support baud rate from CDL. |
|
* include/pkgconf/io_serial.h: |
* src/mn10300/mn10300_serial.c: |
* src/mips/tx3904_serial.c (tx3904_serial_ISR): |
* src/sparclite/sleb_sdtr.c: |
* src/powerpc/cogent_serial_with_ints.c: |
* src/arm/pid_serial_with_ints.c: |
* src/arm/aeb_serial.c: Add configury for baud rate and buffer size. |
|
1999-03-24 Nick Garnett <nickg@cygnus.co.uk> |
|
* src/mips/tx3904_serial.c: |
Now uses CYGHWR_HAL_MIPS_CPU_FREQ_ACTUAL to get CPU |
frequency. This is a little more accurate than using |
CYGHWR_HAL_MIPS_CPU_FREQ. |
|
1999-03-24 Gary Thomas <gthomas@cygnus.co.uk> |
|
* include/serialio.h (CYGNUM_SERIAL_BAUD_MIN/MAX): Add for completeness. |
|
* src/arm/aeb_serial.c (aeb_serial_stop_xmit): |
* src/arm/pid_serial_with_ints.c (pid_serial_stop_xmit): Fix typo in comment. |
|
1999-03-24 Jesper Skov <jskov@cygnus.co.uk> |
|
* tests/ser_test_protocol.inl: Weeded out configs TX39 doesn't |
like. |
|
* src/powerpc/cogent_serial.h: |
Added copyright header. |
|
* tests/ser_test_protocol.inl: |
* tests/serial1.c: |
* tests/serial2.c: |
* tests/serial3.c: |
* tests/serial4.c: |
* tests/serial5.c: |
Don't try to run tests when no IO device has been specified. |
|
1999-03-23 Jesper Skov <jskov@cygnus.co.uk> |
|
* misc/serial1.c, misc/serial2.c, misc/serial3.c, misc/serial4.c, |
* misc/serial5.c, misc/ser_test_protocol.inl |
Deleted. |
|
1999-03-23 Jesper Skov <jskov@cygnus.co.uk> |
|
* misc/PKGconf.mak: |
* tests/timeout.inl: |
* tests/PKGconf.mak: |
* tests/serial1.c: |
* tests/serial2.c: |
* tests/serial3.c: |
* tests/serial4.c: |
* tests/serial5.c: |
* tests/ser_test_protocol.inl: |
Moved the serial tests from the misc directory to the tests |
directory. |
|
1999-03-23 Nick Garnett <nickg@cygnus.co.uk> |
|
* src/mn10300/mn10300_serial.c: Now initially mask TX interrupts |
at initialization and unmask/remask in start/stop xmit |
routines. This has no real effect on the hardware, but the |
simulator does not implement the LCR_TXE bit properly, resulting |
in spurious TX interrupts during diagnostic output. |
This was the cause of the slow output reported in PR 19559. |
|
1999-03-23 Gary Thomas <gthomas@cygnus.co.uk> |
|
* include/pkgconf/io_serial.h: Fix "display" strings to have appropriate |
case - mostly lower case. |
|
1999-03-22 Hugo Tyson <hmt@cygnus.co.uk> |
|
* misc/console.c: |
* misc/serial.c: |
* misc/serial1.c: |
* misc/serial2.c: |
* misc/serial3.c: |
* misc/serial4.c: |
* misc/serial5.c: |
Use CYGNUM_HAL_STACK_SIZE_TYPICAL for the stack size instead of |
CYGNUM_HAL_MINIMUM_STACK_SIZE. |
|
1999-03-22 Gary Thomas <gthomas@cygnus.co.uk> |
|
* src/mn10300/mn10300_serial.c: |
* src/mips/tx3904_serial.c: Add CDL configury. |
|
* include/pkgconf/io_serial.h: Update CDL to add device name |
configurability for all devices. |
|
* src/sparclite/sleb_sdtr.c: |
* src/powerpc/cogent_serial_with_ints.c: |
* src/arm/aeb_serial.c: |
* src/arm/pid_serial_with_ints.c: Use CDL configured device names. |
|
1999-03-22 Jesper Skov <jskov@lassi.cygnus.co.uk> |
|
* misc/serial1.c: |
* misc/serial2.c: |
* misc/serial3.c: |
* misc/serial4.c: |
* misc/serial5.c: |
Requires kernel as well. |
|
1999-03-22 Jesper Skov <jskov@cygnus.co.uk> |
|
* src/sparclite/sleb_sdtr.c: |
Moved include statement to avoid warnings. |
|
1999-03-19 Jesper Skov <jskov@cygnus.co.uk> |
|
* misc/ser_test_protocol.inl: |
* misc/serial5.c: |
* misc/PKGconf.mak: |
Replace complex and not very stable duplex test with a simpler |
test that works better. |
Added serial5 using that test. |
|
1999-03-19 Jesper Skov <jskov@cygnus.co.uk> |
|
* misc/PKGconf.mak: |
* misc/serial1.c: |
* misc/serial2.c: |
Added API test and made serial2 do simple string output. |
|
1999-03-19 Jesper Skov <jskov@cygnus.co.uk> |
|
* src/powerpc/cogent_serial_with_ints.c: Changed ToDo comment. |
|
1999-03-19 Jesper Skov <jskov@lassi.cygnus.co.uk> |
|
* src/powerpc/cogent_serial_with_ints.c: |
* src/arm/aeb_serial.c: |
* src/arm/pid_serial_with_ints.c: |
Moved include statement to avoid warnings. |
|
1999-03-19 Gary Thomas <gthomas@cygnus.co.uk> |
|
* include/pkgconf/io_serial.h: More CDL problems. |
|
1999-03-18 Gary Thomas <gthomas@cygnus.co.uk> |
|
* include/pkgconf/io_serial.h: Add CDL for SPARClite SLEB. |
|
* src/powerpc/cogent_serial_with_ints.c: |
* src/arm/pid_serial_with_ints.c: |
* src/arm/aeb_serial.c: Update device names to match CDL. |
|
* include/pkgconf/io_serial.h: Change names for serial ports to |
be CYGPKG_IO_SERIAL_<arch>_<platform>_<port>. |
|
1999-03-18 Jesper Skov <jskov@cygnus.co.uk> |
|
* misc/ser_test_protocol.inl: |
* misc/serial2.c: |
First stab at the duplex binary test. Still much fun to be had... |
|
1999-03-18 Jesper Skov <jskov@cygnus.co.uk> |
|
* misc/ser_test_protocol.inl: Added timeout for PING. |
|
1999-03-18 Gary Thomas <gthomas@cygnus.co.uk> |
|
* src/common/serial.c: Change ABORT functionality to be DSR safe. |
(serial_get_config): Fix typo! |
|
* include/pkgconf/io_serial.h: Small change in CDL to make serial |
devices tied to the platform and not the serial I/O package. This |
means that only the devices appropriate to a given platform can be |
enabled. |
|
* misc/serial.c: Better use of alarms - only trigger at the time of |
the next timeout. Moved timeout functions to new file "timeout.inl". |
|
* src/common/serial.c (serial_get_config): Add support for |
CYG_IO_GET_CONFIG_SERIAL_INPUT_FLUSH and CYG_IO_GET_CONFIG_SERIAL_ABORT. |
|
* misc/serial.c: Add simple timeout mechanisms. |
|
1999-03-17 Gary Thomas <gthomas@cygnus.co.uk> |
|
* src/powerpc/cogent_serial_with_ints.c: |
* src/arm/aeb_serial.c: |
* src/arm/pid_serial_with_ints.c: Conditionalize based on CDL. |
|
* include/pkgconf/io_serial.h: Add some CDL configury - not perfect |
because of current ~CDL limitations. |
|
1999-03-17 Jesper Skov <jskov@cygnus.co.uk> |
|
* misc/serial2.c: Cleaned up a bit. Used for hacking new tests. |
|
1999-03-17 Jesper Skov <jskov@cygnus.co.uk> |
|
* misc/PKGconf.mak: |
* misc/ser_test_protocol.inl: |
* misc/serial2.c: |
* misc/serial3.c: |
* misc/serial4.c: |
Put testing protocol implementation in a separate file. Split the |
tests in serial2 into separate files. |
|
1999-03-16 Nick Garnett <nickg@cygnus.co.uk> |
|
* src/mn10300/mn10300_serial.c: Fixed some compiler warnings. |
|
1999-03-15 Gary Thomas <gthomas@cygnus.co.uk> |
|
* include/pkgconf/io_serial.h: Change default configurations. |
No serial drivers enabled for PID port A or AEB. |
|
* src/sparclite/sleb_sdtr.c: |
* src/powerpc/cogent_serial_with_ints.c: |
* src/arm/aeb_serial.c: |
* src/arm/pid_serial_with_ints.c: |
* src/common/haldiag.c: |
* src/common/tty.c: |
* src/common/serial.c: Add 'CYGDBG_IO_INIT' for control of init |
messages. |
|
* src/powerpc/cogent_serial_with_ints.c: |
* src/sparclite/sleb_sdtr.c: |
* src/arm/aeb_serial.c: |
* src/arm/pid_serial_with_ints.c: Don't include <cyg/kernel/kapi.h> |
|
1999-03-15 Jesper Skov <jskov@cygnus.co.uk> |
|
* misc/serial2.c (serial_test): Fix use of strlen. Fix DONE part |
of binary protocol. |
|
1999-03-12 Jesper Skov <jskov@cygnus.co.uk> |
|
* misc/serial2.c: Play a bit with timing. Think I broke it :( |
Added DONE to BINARY packet. |
Proper call to DRAIN. |
|
1999-03-12 Nick Garnett <nickg@cygnus.co.uk> |
|
* src/mips/tx3904_serial.c: Tidied away some debugging code. |
|
1999-03-12 Jesper Skov <jskov@cygnus.co.uk> |
|
* misc/serial2.c: Removed bogus config changes. |
|
1999-03-12 Jesper Skov <jskov@cygnus.co.uk> |
|
* misc/serial2.c (serial_test): Check for ser_filter on host (PING |
packet). |
|
1999-03-11 Jesper Skov <jskov@cygnus.co.uk> |
|
* src/powerpc/cogent_serial_with_ints.c: Added note. |
|
* misc/serial2.c: |
Added (almost) proper configuration handling. |
Run tests on varying configurations. |
|
1999-03-11 Nick Garnett <nickg@cygnus.co.uk> |
|
* src/mips/tx3904_serial.c: |
Many changes to get working. |
|
* misc/console.c (console_test): Fixed compiler warning. |
|
* misc/serial2.c: |
Added device name for TX39 testing. |
Fixed some bugs in Tcyg_io_write() macro. |
|
1999-03-10 Jesper Skov <jskov@cygnus.co.uk> |
|
* misc/serial2.c: Added target specific test device name. |
|
1999-03-10 John Dallaway <jld@cygnus.co.uk> |
|
* include/pkgconf/io_serial.h: Correct CDL description spelling. |
|
1999-03-10 Jesper Skov <jskov@cygnus.co.uk> |
|
* src/powerpc/cogent_serial_with_ints.c: |
* misc/console.c: |
Fixed compiler warnings. |
|
1999-03-10 Gary Thomas <gthomas@cygnus.co.uk> |
|
* include/pkgconf/io_serial.h: Improve CDL descriptions. |
|
1999-03-10 Jesper Skov <jskov@cygnus.co.uk> |
|
* misc/serial2.c (serial_test): Do some more tests with changed |
baud rates. |
|
1999-03-09 Jesper Skov <jskov@cygnus.co.uk> |
|
* misc/serial2.c (serial_test): Added workaround for spurious byte |
problem. Added a few more tests to run. |
|
* src/powerpc/cogent_serial_with_ints.c |
(cogent_serial_config_port): Remove interrupt enabling. |
|
1999-03-09 Nick Garnett <nickg@cygnus.co.uk> |
|
* src/PKGconf.mak: |
* src/mips/tx3904_serial.c: |
Added initial version of TX39 device driver. Currently untested |
but eliminates PR19445. |
|
1999-03-09 Jesper Skov <jskov@cygnus.co.uk> |
|
* misc/serial2.c: DRAIN function works now. |
|
1999-03-09 Jesper Skov <jskov@cygnus.co.uk> |
|
* include/pkgconf/io_serial.h: Only enable one serial driver per |
default. |
|
1999-03-08 Jesper Skov <jskov@cygnus.co.uk> |
|
* misc/serial2.c (serial_test): Be a bit more aggressive. |
|
* src/powerpc/cogent_serial_with_ints.c: Check that configuration |
is sensible. |
|
1999-03-08 Jesper Skov <jskov@cygnus.co.uk> |
|
* src/powerpc/cogent_serial_with_ints.c: |
Added support for both ports. |
|
* include/pkgconf/io_serial.h: Added simple defines for cogent |
serial ports. No CDL yet. |
|
1999-03-08 Jesper Skov <jskov@cygnus.co.uk> |
|
* misc/serial.c: Removed PID references. Fixed compiler warnings. |
|
1999-03-08 Jesper Skov <jskov@cygnus.co.uk> |
|
* src/powerpc/cogent_serial_with_ints.c: Cleaned up a |
bit. Actually works now. |
|
1999-03-08 Gary Thomas <gthomas@cygnus.co.uk> |
|
* src/common/serial.c: Change in cyg_drv_cond_wait() behaviour |
means DSR lock should be left alone. |
|
1999-03-08 Jesper Skov <jskov@cygnus.co.uk> |
PR 19400 |
* src/powerpc/cogent_serial_with_ints.c (cogent_serial_init): Set |
valid interrupt priority. |
|
1999-03-05 Nick Garnett <nickg@cygnus.co.uk> |
|
* src/mn10300/mn10300_serial.c (mn10300_serial_init): |
Added extra test to avoid initializing serial 2 when CYGMON is |
present. |
Include hal_intr.h explicitly for use in non-kernel |
configurations. |
|
* src/common/serial.c: |
Added extra test before calls to cyg_drv_cond_wait() to avoid race |
condition. This is not, however, a complete solution to this |
problem. A better solution will be forthcoming. |
|
* include/serial.h: |
Changed include files used to permit non-kernel configurations to |
be built. |
|
1999-03-05 Jesper Skov <jskov@cygnus.co.uk> |
|
* src/common/haldiag.c: Removed diag_printf declaration. |
|
1999-03-05 Jonathan Larmour <jlarmour@cygnus.co.uk> |
|
* src/mn10300/mn10300_serial.c: |
Change CYG_VECTOR_* to CYGNUM_HAL_INTERRUPT_* to get it to compile! |
|
1999-03-05 Gary Thomas <gthomas@cygnus.co.uk> |
|
* src/powerpc/cogent_serial_with_ints.c (cogent_serial_config_port): |
Fix renaming of interrupt vectors. |
|
1999-03-05 Gary Thomas <gthomas@cygnus.co.uk> |
|
* src/arm/pid_serial_with_ints.c: Fix interrupt vectors. |
|
1999-03-03 Gary Thomas <gthomas@cygnus.co.uk> |
|
* serial/current/src/arm/pid_serial_with_ints.c: |
New [somewhat] configurable drivers for PID. |
|
//=========================================================================== |
//####ECOSGPLCOPYRIGHTBEGIN#### |
// ------------------------------------------- |
// This file is part of eCos, the Embedded Configurable Operating System. |
// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc. |
// |
// eCos is free software; you can redistribute it and/or modify it under |
// the terms of the GNU General Public License as published by the Free |
// Software Foundation; either version 2 or (at your option) any later version. |
// |
// eCos is distributed in the hope that it will be useful, but WITHOUT ANY |
// WARRANTY; without even the implied warranty of MERCHANTABILITY or |
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
// for more details. |
// |
// You should have received a copy of the GNU General Public License along |
// with eCos; if not, write to the Free Software Foundation, Inc., |
// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. |
// |
// As a special exception, if other files instantiate templates or use macros |
// or inline functions from this file, or you compile this file and link it |
// with other works to produce a work based on this file, this file does not |
// by itself cause the resulting work to be covered by the GNU General Public |
// License. However the source code for this file must still be made available |
// in accordance with section (3) of the GNU General Public License. |
// |
// This exception does not invalidate any other reasons why a work based on |
// this file might be covered by the GNU General Public License. |
// |
// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc. |
// at http://sources.redhat.com/ecos/ecos-license/ |
// ------------------------------------------- |
//####ECOSGPLCOPYRIGHTEND#### |
//=========================================================================== |
/idt79s334a/v2_0/cdl/ser_mipsidt_334a.cdl
0,0 → 1,158
# ==================================================================== |
# |
# ser_mipsidt_334a.cdl |
# |
# eCos serial MIPS/IDT 334a reference platform configuration data |
# |
# ==================================================================== |
#####ECOSGPLCOPYRIGHTBEGIN#### |
## ------------------------------------------- |
## This file is part of eCos, the Embedded Configurable Operating System. |
## Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc. |
## |
## eCos is free software; you can redistribute it and/or modify it under |
## the terms of the GNU General Public License as published by the Free |
## Software Foundation; either version 2 or (at your option) any later version. |
## |
## eCos is distributed in the hope that it will be useful, but WITHOUT ANY |
## WARRANTY; without even the implied warranty of MERCHANTABILITY or |
## FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
## for more details. |
## |
## You should have received a copy of the GNU General Public License along |
## with eCos; if not, write to the Free Software Foundation, Inc., |
## 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. |
## |
## As a special exception, if other files instantiate templates or use macros |
## or inline functions from this file, or you compile this file and link it |
## with other works to produce a work based on this file, this file does not |
## by itself cause the resulting work to be covered by the GNU General Public |
## License. However the source code for this file must still be made available |
## in accordance with section (3) of the GNU General Public License. |
## |
## This exception does not invalidate any other reasons why a work based on |
## this file might be covered by the GNU General Public License. |
## |
## Alternative licenses for eCos may be arranged by contacting Red Hat, Inc. |
## at http://sources.redhat.com/ecos/ecos-license/ |
## ------------------------------------------- |
#####ECOSGPLCOPYRIGHTEND#### |
# ==================================================================== |
######DESCRIPTIONBEGIN#### |
# |
# Author(s): tmichals |
# Original data: dmoseley |
# Contributors: |
# Date: 2003-02-13 |
# |
#####DESCRIPTIONEND#### |
# |
# ==================================================================== |
|
|
cdl_package CYGPKG_IO_SERIAL_MIPS_IDT79S334A { |
display "MIPS IDT79RC32344 reference platform serial device drivers" |
|
parent CYGPKG_IO_SERIAL_DEVICES |
active_if CYGPKG_IO_SERIAL |
active_if CYGPKG_HAL_MIPS_IDT32334 |
|
requires CYGPKG_ERROR |
include_dir cyg/io |
# include_files ; # none _exported_ whatsoever |
description " |
This package contains the serial device drivers for the |
MIPS IDT79RC32334 reference platform." |
|
compile -library=libextras.a mipsidt_serial.c |
|
define_proc { |
puts $::cdl_system_header "/***** serial driver proc output start *****/" |
puts $::cdl_system_header "#define CYGDAT_IO_SERIAL_DEVICE_HEADER <pkgconf/io_serial_mips_idt79s334a.h>" |
puts $::cdl_system_header "/***** serial driver proc output end *****/" |
} |
|
|
cdl_option CYGPKG_IO_SERIAL_MIPS_POLLED_MODE { |
display "MIPS IDT polled mode serial drivers" |
flavor bool |
default_value 0 |
description " |
If asserted, this option specifies that the serial device |
drivers for the MIPS should be polled-mode instead of |
interrupt driven." |
} |
|
cdl_component CYGPKG_IO_SERIAL_MIPS_IDT79S334A_SERIAL_A { |
display "MIPS IDT79S334A serial port driver" |
flavor bool |
default_value 1 |
description " |
This option includes the serial device driver for the 16C550 on the |
MIPS IDT79S334A." |
|
cdl_option CYGDAT_IO_SERIAL_MIPS_IDT79S334A_SERIAL_A_NAME { |
display "Device name for MIPS IDT79S334A serial port" |
flavor data |
default_value {"\"/dev/ser0\""} |
description " |
This option specifies the device name on the MIPS IDT79S334A." |
} |
|
cdl_option CYGNUM_IO_SERIAL_MIPS_IDT79S334A_SERIAL_A_BAUD { |
display "Baud rate for the MIPS IDT79S334A serial port driver" |
flavor data |
legal_values { 50 75 110 "134_5" 150 200 300 600 1200 1800 2400 3600 |
4800 7200 9600 14400 19200 38400 57600 115200 230400 |
} |
default_value 115200 |
description " |
This option specifies the default baud rate (speed) for the |
MIPS 16c550 port." |
} |
|
cdl_option CYGNUM_IO_SERIAL_MIPS_IDT79S334A_SERIAL_A_BUFSIZE { |
display "Buffer size for the MIPS IDT79S334A serial port driver" |
flavor data |
legal_values 0 to 8192 |
default_value 512 |
description " |
This option specifies the size of the internal buffers used |
for the MIPS IDT79S334A 16c550c port." |
} |
} |
|
cdl_component CYGPKG_IO_SERIAL_MIPS_IDT79S334A_OPTIONS { |
display "Serial device driver build options" |
flavor none |
description " |
Package specific build options including control over |
compiler flags used only in building this package, |
and details of which tests are built." |
|
|
cdl_option CYGPKG_IO_SERIAL_MIPS_IDT79S334A_CFLAGS_ADD { |
display "Additional compiler flags" |
flavor data |
no_define |
default_value { "" } |
description " |
This option modifies the set of compiler flags for |
building these serial device drivers. These flags are used in addition |
to the set of global flags." |
} |
|
cdl_option CYGPKG_IO_SERIAL_MIPS_IDT79S334A_CFLAGS_REMOVE { |
display "Suppressed compiler flags" |
flavor data |
no_define |
default_value { "" } |
description " |
This option modifies the set of compiler flags for |
building these serial device drivers. These flags are removed from |
the set of global flags if present." |
} |
} |
} |
|
# EOF ser_mipsidt_334A.cdl |
/idt79s334a/v2_0/src/mipsidt_serial.c
0,0 → 1,364
//========================================================================== |
// |
// mipsidt_serial.c |
// |
// Serial device driver for MIPS IDT79s334a reference platform on-chip serial devices |
// |
//========================================================================== |
//####ECOSGPLCOPYRIGHTBEGIN#### |
// ------------------------------------------- |
// This file is part of eCos, the Embedded Configurable Operating System. |
// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc. |
// |
// eCos is free software; you can redistribute it and/or modify it under |
// the terms of the GNU General Public License as published by the Free |
// Software Foundation; either version 2 or (at your option) any later version. |
// |
// eCos is distributed in the hope that it will be useful, but WITHOUT ANY |
// WARRANTY; without even the implied warranty of MERCHANTABILITY or |
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
// for more details. |
// |
// You should have received a copy of the GNU General Public License along |
// with eCos; if not, write to the Free Software Foundation, Inc., |
// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. |
// |
// As a special exception, if other files instantiate templates or use macros |
// or inline functions from this file, or you compile this file and link it |
// with other works to produce a work based on this file, this file does not |
// by itself cause the resulting work to be covered by the GNU General Public |
// License. However the source code for this file must still be made available |
// in accordance with section (3) of the GNU General Public License. |
// |
// This exception does not invalidate any other reasons why a work based on |
// this file might be covered by the GNU General Public License. |
// |
// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc. |
// at http://sources.redhat.com/ecos/ecos-license/ |
// ------------------------------------------- |
//####ECOSGPLCOPYRIGHTEND#### |
//========================================================================== |
//#####DESCRIPTIONBEGIN#### |
// |
// Author(s): tmichals based on driver by dmoseley, based on POWERPC driver by jskov |
// Contributors: gthomas, jskov, dmoseley, tmichals |
// Date: 2003-02-13 |
// Purpose: MIPS IDT79s334a reference platform serial device driver |
// Description: IDT MIPS serial device driver |
// |
// To Do: |
// Put in magic to effectively use the FIFOs. Transmitter FIFO fill is a |
// problem, and setting receiver FIFO interrupts to happen only after |
// n chars may conflict with hal diag. |
// |
//####DESCRIPTIONEND#### |
// |
//========================================================================== |
|
#include <pkgconf/io_serial.h> |
#include <pkgconf/io.h> |
|
#include <cyg/io/io.h> |
#include <cyg/hal/hal_intr.h> |
#include <cyg/io/devtab.h> |
#include <cyg/infra/diag.h> |
#include <cyg/io/serial.h> |
|
#ifdef CYGPKG_IO_SERIAL_MIPS_IDT79S334A |
|
#include "mipsidt_serial.h" |
|
typedef struct mipsidt_serial_info { |
CYG_ADDRWORD base; |
CYG_WORD int_num; |
cyg_interrupt serial_interrupt; |
cyg_handle_t serial_interrupt_handle; |
cyg_uint8 iir; |
} mipsidt_serial_info; |
|
static bool mipsidt_serial_init(struct cyg_devtab_entry *tab); |
static bool mipsidt_serial_putc(serial_channel *chan, unsigned char c); |
static Cyg_ErrNo mipsidt_serial_lookup(struct cyg_devtab_entry **tab, |
struct cyg_devtab_entry *sub_tab, |
const char *name); |
static unsigned char mipsidt_serial_getc(serial_channel *chan); |
static Cyg_ErrNo mipsidt_serial_set_config(serial_channel *chan, cyg_uint32 key, |
const void *xbuf, cyg_uint32 *len); |
static void mipsidt_serial_start_xmit(serial_channel *chan); |
static void mipsidt_serial_stop_xmit(serial_channel *chan); |
|
static cyg_uint32 mipsidt_serial_ISR(cyg_vector_t vector, cyg_addrword_t data); |
static void mipsidt_serial_DSR(cyg_vector_t vector, cyg_ucount32 count, cyg_addrword_t data); |
|
static SERIAL_FUNS(mipsidt_serial_funs, |
mipsidt_serial_putc, |
mipsidt_serial_getc, |
mipsidt_serial_set_config, |
mipsidt_serial_start_xmit, |
mipsidt_serial_stop_xmit |
); |
|
static mipsidt_serial_info mipsidt_serial_info0 ={IDTMIPS_SER_16550_BASE_A, |
CYGNUM_HAL_INTERRUPT_SIO_0}; |
|
#if CYGNUM_IO_SERIAL_MIPS_IDT79S334A_SERIAL_A_BUFSIZE > 0 |
static unsigned char mipsidt_serial_out_buf0[CYGNUM_IO_SERIAL_MIPS_IDT79S334A_SERIAL_A_BUFSIZE]; |
static unsigned char mipsidt_serial_in_buf0[CYGNUM_IO_SERIAL_MIPS_IDT79S334A_SERIAL_A_BUFSIZE]; |
|
static SERIAL_CHANNEL_USING_INTERRUPTS(mipsidt_serial_channel0, |
mipsidt_serial_funs, |
mipsidt_serial_info0, |
CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_MIPS_IDT79S334A_SERIAL_A_BAUD), |
CYG_SERIAL_STOP_DEFAULT, |
CYG_SERIAL_PARITY_DEFAULT, |
CYG_SERIAL_WORD_LENGTH_DEFAULT, |
CYG_SERIAL_FLAGS_DEFAULT, |
&mipsidt_serial_out_buf0[0], |
sizeof(mipsidt_serial_out_buf0), |
&mipsidt_serial_in_buf0[0], |
sizeof(mipsidt_serial_in_buf0) |
); |
#else |
static SERIAL_CHANNEL(mipsidt_serial_channel0, |
mipsidt_serial_funs, |
mipsidt_serial_info0, |
CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_MIPS_IDT79S334A_SERIAL_A_BAUD), |
CYG_SERIAL_STOP_DEFAULT, |
CYG_SERIAL_PARITY_DEFAULT, |
CYG_SERIAL_WORD_LENGTH_DEFAULT, |
CYG_SERIAL_FLAGS_DEFAULT |
); |
#endif |
|
DEVTAB_ENTRY(mipsidt_serial_io0, |
CYGDAT_IO_SERIAL_MIPS_IDT79S334A_SERIAL_A_NAME, |
0, // Does not depend on a lower level interface |
&cyg_io_serial_devio, |
mipsidt_serial_init, |
mipsidt_serial_lookup, // Serial driver may need initializing |
&mipsidt_serial_channel0 |
); |
|
|
|
// Internal function to actually configure the hardware to desired baud rate, etc. |
static bool |
mipsidt_serial_config_port(serial_channel *chan, cyg_serial_info_t *new_config, bool init) |
{ |
mipsidt_serial_info *mipsidt_chan = (mipsidt_serial_info *)chan->dev_priv; |
cyg_addrword_t port = mipsidt_chan->base; |
cyg_uint32 baud_divisor = select_baud[new_config->baud]; ; |
cyg_uint8 _lcr, _ier; |
|
if (baud_divisor == 0) |
return false; // Invalid baud rate selected |
|
baud_divisor = (CYGHWR_HAL_MIPS_CPU_FREQ_ACTUAL * 10) / (16 * select_baud[new_config->baud]); |
|
baud_divisor +=5; |
baud_divisor = ((cyg_int32)baud_divisor) / 10; |
|
|
// Disable port interrupts while changing hardware |
HAL_READ_UINT8(port+SER_16550_IER, _ier); |
HAL_WRITE_UINT8(port+SER_16550_IER, 0); |
|
// Set databits, stopbits and parity. |
_lcr = select_word_length[(new_config->word_length - |
CYGNUM_SERIAL_WORD_LENGTH_5)] | |
select_stop_bits[new_config->stop] | |
select_parity[new_config->parity]; |
HAL_WRITE_UINT8(port+SER_16550_LCR, _lcr); |
|
// Set baud rate. |
_lcr |= LCR_DL; |
HAL_WRITE_UINT8(port+SER_16550_LCR, _lcr); |
HAL_WRITE_UINT8(port+SER_16550_DLM, baud_divisor >> 8); |
HAL_WRITE_UINT8(port+SER_16550_DLL, baud_divisor & 0xff); |
_lcr &= ~LCR_DL; |
HAL_WRITE_UINT8(port+SER_16550_LCR, _lcr); |
|
if (init) { |
// Enable and clear FIFO |
HAL_WRITE_UINT8(port+SER_16550_FCR, |
(FCR_ENABLE | FCR_CLEAR_RCVR | FCR_CLEAR_XMIT)); |
|
if (chan->out_cbuf.len != 0) { |
HAL_WRITE_UINT8(port+SER_16550_IER, SIO_IER_ERDAI); |
} else { |
HAL_WRITE_UINT8(port+SER_16550_IER, 0); |
} |
} else { |
HAL_WRITE_UINT8(port+SER_16550_IER, _ier); |
} |
if (new_config != &chan->config) { |
chan->config = *new_config; |
} |
return true; |
} |
|
// Function to initialize the device. Called at bootstrap time. |
static bool |
mipsidt_serial_init(struct cyg_devtab_entry *tab) |
{ |
serial_channel *chan = (serial_channel *)tab->priv; |
mipsidt_serial_info *mipsidt_chan = (mipsidt_serial_info *)chan->dev_priv; |
#ifdef CYGDBG_IO_INIT |
diag_printf("IDT SERIAL init - dev: %x.%d\n", mipsidt_chan->base, mipsidt_chan->int_num); |
#endif |
(chan->callbacks->serial_init)(chan); // Really only required for interrupt driven devices |
if (chan->out_cbuf.len != 0) { |
cyg_drv_interrupt_create(mipsidt_chan->int_num, |
0, // can change IRQ0 priority |
(cyg_addrword_t)chan, // Data item passed to interrupt handler |
mipsidt_serial_ISR, |
mipsidt_serial_DSR, |
&mipsidt_chan->serial_interrupt_handle, |
&mipsidt_chan->serial_interrupt); |
cyg_drv_interrupt_attach(mipsidt_chan->serial_interrupt_handle); |
cyg_drv_interrupt_unmask(mipsidt_chan->int_num); |
} |
mipsidt_serial_config_port(chan, &chan->config, true); |
return true; |
} |
|
// This routine is called when the device is "looked" up (i.e. attached) |
static Cyg_ErrNo |
mipsidt_serial_lookup(struct cyg_devtab_entry **tab, |
struct cyg_devtab_entry *sub_tab, |
const char *name) |
{ |
serial_channel *chan = (serial_channel *)(*tab)->priv; |
(chan->callbacks->serial_init)(chan); // Really only required for interrupt driven devices |
return ENOERR; |
} |
|
// Send a character to the device output buffer. |
// Return 'true' if character is sent to device |
static bool |
mipsidt_serial_putc(serial_channel *chan, unsigned char c) |
{ |
mipsidt_serial_info *mipsidt_chan = (mipsidt_serial_info *)chan->dev_priv; |
cyg_addrword_t port = mipsidt_chan->base; |
cyg_uint8 _lsr; |
|
HAL_READ_UINT8(port+SER_16550_LSR, _lsr); |
if (_lsr & SIO_LSR_THRE) { |
// Transmit buffer is empty |
HAL_WRITE_UINT8(port+SER_16550_THR, c); |
return true; |
} else { |
// No space |
return false; |
} |
} |
|
// Fetch a character from the device input buffer, waiting if necessary |
static unsigned char |
mipsidt_serial_getc(serial_channel *chan) |
{ |
unsigned char c; |
mipsidt_serial_info *mipsidt_chan = (mipsidt_serial_info *)chan->dev_priv; |
cyg_addrword_t port = mipsidt_chan->base; |
cyg_uint8 _lsr; |
|
do { |
HAL_READ_UINT8(port+SER_16550_LSR, _lsr); |
} while ((_lsr & SIO_LSR_DR) == 0); |
HAL_READ_UINT8(port+SER_16550_RBR, c); |
return c; |
} |
|
// Set up the device characteristics; baud rate, etc. |
static Cyg_ErrNo |
mipsidt_serial_set_config(serial_channel *chan, cyg_uint32 key, |
const void *xbuf, cyg_uint32 *len) |
{ |
switch (key) { |
case CYG_IO_SET_CONFIG_SERIAL_INFO: |
{ |
cyg_serial_info_t *config = (cyg_serial_info_t *)xbuf; |
if ( *len < sizeof(cyg_serial_info_t) ) { |
return -EINVAL; |
} |
*len = sizeof(cyg_serial_info_t); |
if ( true != mipsidt_serial_config_port(chan, config, false) ) |
return -EINVAL; |
} |
break; |
default: |
return -EINVAL; |
} |
return ENOERR; |
} |
|
// Enable the transmitter on the device |
static void |
mipsidt_serial_start_xmit(serial_channel *chan) |
{ |
mipsidt_serial_info *mipsidt_chan = (mipsidt_serial_info *)chan->dev_priv; |
cyg_addrword_t port = mipsidt_chan->base; |
cyg_uint8 _ier; |
|
HAL_READ_UINT8(port+SER_16550_IER, _ier); |
_ier |= IER_XMT; // Enable xmit interrupt |
HAL_WRITE_UINT8(port+SER_16550_IER, _ier); |
|
// We should not need to call this here. THRE Interrupts are enabled, and the DSR |
// below calls this function. However, sometimes we get called with Master Interrupts |
// disabled, and thus the DSR never runs. This is unfortunate because it means we |
// will be doing multiple processing steps for the same thing. |
(chan->callbacks->xmt_char)(chan); |
} |
|
// Disable the transmitter on the device |
static void |
mipsidt_serial_stop_xmit(serial_channel *chan) |
{ |
mipsidt_serial_info *mipsidt_chan = (mipsidt_serial_info *)chan->dev_priv; |
cyg_addrword_t port = mipsidt_chan->base; |
cyg_uint8 _ier; |
|
HAL_READ_UINT8(port+SER_16550_IER, _ier); |
_ier &= ~IER_XMT; // Disable xmit interrupt |
HAL_WRITE_UINT8(port+SER_16550_IER, _ier); |
} |
|
// Serial I/O - low level interrupt handler (ISR) |
static cyg_uint32 |
mipsidt_serial_ISR(cyg_vector_t vector, cyg_addrword_t data) |
{ |
serial_channel *chan = (serial_channel *)data; |
mipsidt_serial_info *mipsidt_chan = (mipsidt_serial_info *)chan->dev_priv; |
|
cyg_drv_interrupt_mask(mipsidt_chan->int_num); |
cyg_drv_interrupt_acknowledge(mipsidt_chan->int_num); |
return CYG_ISR_CALL_DSR; // Cause DSR to be run |
} |
|
// Serial I/O - high level interrupt handler (DSR) |
static void |
mipsidt_serial_DSR(cyg_vector_t vector, cyg_ucount32 count, cyg_addrword_t data) |
{ |
serial_channel *chan = (serial_channel *)data; |
mipsidt_serial_info *mipsidt_chan = (mipsidt_serial_info *)chan->dev_priv; |
cyg_addrword_t port = mipsidt_chan->base; |
cyg_uint8 _iir; |
|
HAL_READ_UINT8(port+SER_16550_IIR, _iir); |
_iir &= SIO_IIR_ID_MASK; |
if ( ISR_Tx_Empty == _iir ) { |
(chan->callbacks->xmt_char)(chan); |
} else if (( ISR_Rx_Avail == _iir ) || ( ISR_Rx_Char_Timeout == _iir )) { |
cyg_uint8 _c; |
HAL_READ_UINT8(port+SER_16550_RBR, _c); |
(chan->callbacks->rcv_char)(chan, _c); |
} |
|
cyg_drv_interrupt_unmask(mipsidt_chan->int_num); |
} |
|
#endif |
|
//------------------------------------------------------------------------- |
// EOF mipsidt_serial.c |
/idt79s334a/v2_0/src/mipsidt_serial.h
0,0 → 1,217
//========================================================================== |
// |
// io/serial/mips/idt79s334a/mipsidt_serial.h |
// |
// MIPS IDT79S334A Serial I/O definitions. |
// |
//========================================================================== |
//####ECOSGPLCOPYRIGHTBEGIN#### |
// ------------------------------------------- |
// This file is part of eCos, the Embedded Configurable Operating System. |
// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc. |
// |
// eCos is free software; you can redistribute it and/or modify it under |
// the terms of the GNU General Public License as published by the Free |
// Software Foundation; either version 2 or (at your option) any later version. |
// |
// eCos is distributed in the hope that it will be useful, but WITHOUT ANY |
// WARRANTY; without even the implied warranty of MERCHANTABILITY or |
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
// for more details. |
// |
// You should have received a copy of the GNU General Public License along |
// with eCos; if not, write to the Free Software Foundation, Inc., |
// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. |
// |
// As a special exception, if other files instantiate templates or use macros |
// or inline functions from this file, or you compile this file and link it |
// with other works to produce a work based on this file, this file does not |
// by itself cause the resulting work to be covered by the GNU General Public |
// License. However the source code for this file must still be made available |
// in accordance with section (3) of the GNU General Public License. |
// |
// This exception does not invalidate any other reasons why a work based on |
// this file might be covered by the GNU General Public License. |
// |
// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc. |
// at http://sources.redhat.com/ecos/ecos-license/ |
// ------------------------------------------- |
//####ECOSGPLCOPYRIGHTEND#### |
//========================================================================== |
//#####DESCRIPTIONBEGIN#### |
// |
// Author(s): tmichals based on driver by dmoseley, based on POWERPC driver by jskov |
// Contributors: gthomas, jskov, dmoseley, tmichals |
// Date: 2003-02-13 |
// Date: 2003-02-13 |
// Purpose: MIPS IDT79s334a reference platform serial device driver definitions. |
// Description: IDT MIPS serial device driver definitions. |
//####DESCRIPTIONEND#### |
//========================================================================== |
|
// Description of serial ports on IDT board |
|
// Interrupt Enable Register |
#define IER_RCV 0x01 |
#define IER_XMT 0x02 |
#define IER_LS 0x04 |
#define IER_MS 0x08 |
|
// Line Control Register |
#define LCR_WL5 0x00 // Word length |
#define LCR_WL6 0x01 |
#define LCR_WL7 0x02 |
#define LCR_WL8 0x03 |
#define LCR_SB1 0x00 // Number of stop bits |
#define LCR_SB1_5 0x04 // 1.5 -> only valid with 5 bit words |
#define LCR_SB2 0x04 |
#define LCR_PN 0x00 // Parity mode - none |
#define LCR_PE 0x0C // Parity mode - even |
#define LCR_PO 0x08 // Parity mode - odd |
#define LCR_PM 0x28 // Forced "mark" parity |
#define LCR_PS 0x38 // Forced "space" parity |
#define LCR_DL 0x80 // Enable baud rate latch |
|
// Line Status Register |
#define LSR_RSR 0x01 |
#define LSR_THE 0x20 |
|
// Modem Control Register |
#define MCR_DTR 0x01 |
#define MCR_RTS 0x02 |
#define MCR_INT 0x08 // Enable interrupts |
|
// Interrupt status register |
#define ISR_None 0x01 |
#define ISR_Rx_Line_Status 0x06 |
#define ISR_Rx_Avail 0x04 |
#define ISR_Rx_Char_Timeout 0x0C |
#define ISR_Tx_Empty 0x02 |
#define IRS_Modem_Status 0x00 |
|
// FIFO control register |
#define FCR_ENABLE 0x01 |
#define FCR_CLEAR_RCVR 0x02 |
#define FCR_CLEAR_XMIT 0x04 |
|
|
//////////////////////////////////////////////////////////// |
// Clean this up. |
|
#define IDTMIPS_SER_16550_BASE_A 0xB8000803 |
#define IDTMIPS_SER_16550_BASE_B 0xB8000823 |
#define SER_16550_BASE IDTMIPS_SER_16550_BASE_A |
|
//----------------------------------------------------------------------------- |
// Define the serial registers. The IDT board is equipped with a 16550C |
// serial chip. |
#define SER_16550_RBR 0x00 // receiver buffer register, read, dlab = 0 |
#define SER_16550_THR 0x00 // transmitter holding register, write, dlab = 0 |
#define SER_16550_DLL 0x00 // divisor latch (LS), read/write, dlab = 1 |
#define SER_16550_IER 0x04 // interrupt enable register, read/write, dlab = 0 |
#define SER_16550_DLM 0x04 // divisor latch (MS), read/write, dlab = 1 |
#define SER_16550_IIR 0x08 // interrupt identification reg, read, dlab = 0 |
#define SER_16550_FCR 0x08 // fifo control register, write, dlab = 0 |
#define SER_16550_AFR 0x08 // alternate function reg, read/write, dlab = 1 |
#define SER_16550_LCR 0x0c // line control register, read/write |
#define SER_16550_MCR 0x10 // modem control register, read/write |
#define SER_16550_LSR 0x14 // line status register, read |
#define SER_16550_MSR 0x18 // modem status register, read |
#define SER_16550_SCR 0x1c // scratch pad register |
|
// The interrupt enable register bits. |
#define SIO_IER_ERDAI 0x01 // enable received data available irq |
#define SIO_IER_ETHREI 0x02 // enable THR empty interrupt |
#define SIO_IER_ELSI 0x04 // enable receiver line status irq |
#define SIO_IER_EMSI 0x08 // enable modem status interrupt |
|
// The interrupt identification register bits. |
#define SIO_IIR_IP 0x01 // 0 if interrupt pending |
#define SIO_IIR_ID_MASK 0x0e // mask for interrupt ID bits |
|
// The line status register bits. |
#define SIO_LSR_DR 0x01 // data ready |
#define SIO_LSR_OE 0x02 // overrun error |
#define SIO_LSR_PE 0x04 // parity error |
#define SIO_LSR_FE 0x08 // framing error |
#define SIO_LSR_BI 0x10 // break interrupt |
#define SIO_LSR_THRE 0x20 // transmitter holding register empty |
#define SIO_LSR_TEMT 0x40 // transmitter register empty |
#define SIO_LSR_ERR 0x80 // any error condition |
|
// The modem status register bits. |
#define SIO_MSR_DCTS 0x01 // delta clear to send |
#define SIO_MSR_DDSR 0x02 // delta data set ready |
#define SIO_MSR_TERI 0x04 // trailing edge ring indicator |
#define SIO_MSR_DDCD 0x08 // delta data carrier detect |
#define SIO_MSR_CTS 0x10 // clear to send |
#define SIO_MSR_DSR 0x20 // data set ready |
#define SIO_MSR_RI 0x40 // ring indicator |
#define SIO_MSR_DCD 0x80 // data carrier detect |
|
// The line control register bits. |
#define SIO_LCR_WLS0 0x01 // word length select bit 0 |
#define SIO_LCR_WLS1 0x02 // word length select bit 1 |
#define SIO_LCR_STB 0x04 // number of stop bits |
#define SIO_LCR_PEN 0x08 // parity enable |
#define SIO_LCR_EPS 0x10 // even parity select |
#define SIO_LCR_SP 0x20 // stick parity |
#define SIO_LCR_SB 0x40 // set break |
#define SIO_LCR_DLAB 0x80 // divisor latch access bit |
|
// The FIFO control register |
#define SIO_FCR_FCR0 0x01 // enable xmit and rcvr fifos |
#define SIO_FCR_FCR1 0x02 // clear RCVR FIFO |
#define SIO_FCR_FCR2 0x04 // clear XMIT FIFO |
///////////////////////////////////////// |
|
|
static unsigned char select_word_length[] = { |
LCR_WL5, // 5 bits / word (char) |
LCR_WL6, |
LCR_WL7, |
LCR_WL8 |
}; |
|
static unsigned char select_stop_bits[] = { |
0, |
LCR_SB1, // 1 stop bit |
LCR_SB1_5, // 1.5 stop bit |
LCR_SB2 // 2 stop bits |
}; |
|
static unsigned char select_parity[] = { |
LCR_PN, // No parity |
LCR_PE, // Even parity |
LCR_PO, // Odd parity |
LCR_PM, // Mark parity |
LCR_PS, // Space parity |
}; |
|
|
static unsigned int select_baud[] = { |
0, // Unused |
50, // 50 |
75, // 75 |
110, // 110 |
134, // 134.5 |
150, // 150 |
200, // 200 |
300, // 300 |
600, // 600 |
1200, // 1200 |
1800, // 1800 |
2400, // 2400 |
3600, // 3600 |
4800, // 4800 |
7200, // 7200 |
9600, // 9600 |
14400, // 14400 |
19200, // 19200 |
38400, // 38400 |
57600, // 57600 |
115200, // 115200 |
230400, // 230400 |
}; |
|
// EOF mipsidt_serial.h |
/idt79s334a/v2_0/ChangeLog
0,0 → 1,43
2003-02-24 Jonathan Larmour <jifl@eCosCentric.com> |
|
* cdl/ser_mipsidt_334a.cdl: Remove irrelevant doc link. |
|
2003-02-13 Tim Michals <t.michals@attbi.com> |
2003-02-13 Jonathan Larmour <jifl@eCosCentric.com> |
|
* New package - support for MIPS IDT 79s334a board. |
|
//=========================================================================== |
//####ECOSGPLCOPYRIGHTBEGIN#### |
// ------------------------------------------- |
// This file is part of eCos, the Embedded Configurable Operating System. |
// Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Red Hat, Inc. |
// |
// eCos is free software; you can redistribute it and/or modify it under |
// the terms of the GNU General Public License as published by the Free |
// Software Foundation; either version 2 or (at your option) any later version. |
// |
// eCos is distributed in the hope that it will be useful, but WITHOUT ANY |
// WARRANTY; without even the implied warranty of MERCHANTABILITY or |
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
// for more details. |
// |
// You should have received a copy of the GNU General Public License along |
// with eCos; if not, write to the Free Software Foundation, Inc., |
// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. |
// |
// As a special exception, if other files instantiate templates or use macros |
// or inline functions from this file, or you compile this file and link it |
// with other works to produce a work based on this file, this file does not |
// by itself cause the resulting work to be covered by the GNU General Public |
// License. However the source code for this file must still be made available |
// in accordance with section (3) of the GNU General Public License. |
// |
// This exception does not invalidate any other reasons why a work based on |
// this file might be covered by the GNU General Public License. |
// |
// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc. |
// at http://sources.redhat.com/ecos/ecos-license/ |
// ------------------------------------------- |
//####ECOSGPLCOPYRIGHTEND#### |
//=========================================================================== |
/upd985xx/v2_0/cdl/ser_mips_upd985xx.cdl
0,0 → 1,165
# ==================================================================== |
# |
# ser_mips_upd985xx.cdl |
# |
# eCos serial MIPS/Upd985xx configuration data |
# |
# ==================================================================== |
#####ECOSGPLCOPYRIGHTBEGIN#### |
## ------------------------------------------- |
## This file is part of eCos, the Embedded Configurable Operating System. |
## Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc. |
## |
## eCos is free software; you can redistribute it and/or modify it under |
## the terms of the GNU General Public License as published by the Free |
## Software Foundation; either version 2 or (at your option) any later version. |
## |
## eCos is distributed in the hope that it will be useful, but WITHOUT ANY |
## WARRANTY; without even the implied warranty of MERCHANTABILITY or |
## FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
## for more details. |
## |
## You should have received a copy of the GNU General Public License along |
## with eCos; if not, write to the Free Software Foundation, Inc., |
## 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. |
## |
## As a special exception, if other files instantiate templates or use macros |
## or inline functions from this file, or you compile this file and link it |
## with other works to produce a work based on this file, this file does not |
## by itself cause the resulting work to be covered by the GNU General Public |
## License. However the source code for this file must still be made available |
## in accordance with section (3) of the GNU General Public License. |
## |
## This exception does not invalidate any other reasons why a work based on |
## this file might be covered by the GNU General Public License. |
## |
## Alternative licenses for eCos may be arranged by contacting Red Hat, Inc. |
## at http://sources.redhat.com/ecos/ecos-license/ |
## ------------------------------------------- |
#####ECOSGPLCOPYRIGHTEND#### |
# ==================================================================== |
######DESCRIPTIONBEGIN#### |
# |
# Author(s): hmt |
# Contributors: gthomas |
# Date: 2001-07-17 |
# |
#####DESCRIPTIONEND#### |
# |
# ==================================================================== |
|
|
cdl_package CYGPKG_IO_SERIAL_MIPS_UPD985XX { |
display "NEC uPD985xx serial device drivers" |
|
parent CYGPKG_IO_SERIAL_DEVICES |
active_if CYGPKG_IO_SERIAL |
active_if CYGPKG_HAL_MIPS_UPD985XX |
|
requires CYGPKG_ERROR |
include_dir cyg/io |
include_files ; # none _exported_ whatsoever |
description " |
This option enables the serial device drivers for the |
NEC MIPS uPD985xx system-on-chip device." |
|
compile -library=libextras.a upd985xx_serial.c |
|
define_proc { |
puts $::cdl_system_header "/***** serial driver proc output start *****/" |
puts $::cdl_system_header "#define CYGDAT_IO_SERIAL_DEVICE_HEADER <pkgconf/io_serial_mips_upd985xx.h>" |
puts $::cdl_system_header "/***** serial driver proc output end *****/" |
} |
|
cdl_component CYGPKG_IO_SERIAL_MIPS_UPD985XX_SERIAL0 { |
display "MIPS UPD985XX serial port 0 driver" |
flavor bool |
default_value 1 |
description " |
This option includes the serial device driver for the MIPS UPD985XX |
serial port." |
|
cdl_option CYGDAT_IO_SERIAL_MIPS_UPD985XX_SERIAL0_NAME { |
display "Device name for MIPS UPD985XX serial port 0 driver" |
flavor data |
default_value {"\"/dev/ser0\""} |
description " |
This option specifies the name of the serial device for the |
MIPS UPD985XX port 0." |
} |
|
cdl_option CYGNUM_IO_SERIAL_MIPS_UPD985XX_SERIAL0_BAUD { |
display "Baud rate for the MIPS UPD985XX serial port 0 driver" |
flavor data |
legal_values { 50 75 110 "134_5" 150 200 300 600 1200 1800 2400 3600 |
4800 7200 9600 14400 19200 38400 57600 115200 230400 |
} |
default_value 38400 |
description " |
This option specifies the default baud rate (speed) for the |
MIPS UPD985XX port 0." |
} |
|
cdl_option CYGNUM_IO_SERIAL_MIPS_UPD985XX_SERIAL0_BUFSIZE { |
display "Buffer size for the MIPS UPD985XX serial port 0 driver" |
flavor data |
legal_values 0 to 8192 |
default_value 128 |
description " |
This option specifies the size of the internal buffers used |
for the MIPS UPD985XX port 0." |
} |
} |
|
cdl_component CYGPKG_IO_SERIAL_MIPS_UPD985XX_OPTIONS { |
display "Serial device driver build options" |
flavor none |
description " |
Package specific build options including control over |
compiler flags used only in building this package, |
and details of which tests are built." |
|
|
cdl_option CYGPKG_IO_SERIAL_MIPS_UPD985XX_CFLAGS_ADD { |
display "Additional compiler flags" |
flavor data |
no_define |
default_value { "" } |
description " |
This option modifies the set of compiler flags for |
building these serial device drivers. These flags are used in addition |
to the set of global flags." |
} |
|
cdl_option CYGPKG_IO_SERIAL_MIPS_UPD985XX_CFLAGS_REMOVE { |
display "Suppressed compiler flags" |
flavor data |
no_define |
default_value { "" } |
description " |
This option modifies the set of compiler flags for |
building these serial device drivers. These flags are removed from |
the set of global flags if present." |
} |
} |
|
cdl_component CYGPKG_IO_SERIAL_MIPS_UPD985XX_TESTING { |
display "Testing parameters" |
flavor bool |
calculated 1 |
active_if CYGPKG_IO_SERIAL_MIPS_UPD985XX_SERIAL0 |
|
cdl_option CYGPRI_SER_TEST_SER_DEV { |
display "Serial device used for testing" |
flavor data |
default_value { CYGDAT_IO_SERIAL_MIPS_UPD985XX_SERIAL0_NAME } |
} |
|
define_proc { |
puts $::cdl_header "#define CYGPRI_SER_TEST_CRASH_ID \"upd985xx\"" |
puts $::cdl_header "#define CYGPRI_SER_TEST_TTY_DEV \"/dev/tty0\"" |
} |
} |
} |
|
# EOF ser_mips_upd985xx.cdl |
/upd985xx/v2_0/src/upd985xx_serial.h
0,0 → 1,109
#ifndef CYGONCE_MIPS_UPD985XX_SERIAL_H |
#define CYGONCE_MIPS_UPD985XX_SERIAL_H |
// ==================================================================== |
// |
// upd985xx_serial.h |
// |
// Device I/O - Description of NEC MIPS uPD985xx serial hardware |
// |
// ==================================================================== |
//####ECOSGPLCOPYRIGHTBEGIN#### |
// ------------------------------------------- |
// This file is part of eCos, the Embedded Configurable Operating System. |
// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc. |
// |
// eCos is free software; you can redistribute it and/or modify it under |
// the terms of the GNU General Public License as published by the Free |
// Software Foundation; either version 2 or (at your option) any later version. |
// |
// eCos is distributed in the hope that it will be useful, but WITHOUT ANY |
// WARRANTY; without even the implied warranty of MERCHANTABILITY or |
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
// for more details. |
// |
// You should have received a copy of the GNU General Public License along |
// with eCos; if not, write to the Free Software Foundation, Inc., |
// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. |
// |
// As a special exception, if other files instantiate templates or use macros |
// or inline functions from this file, or you compile this file and link it |
// with other works to produce a work based on this file, this file does not |
// by itself cause the resulting work to be covered by the GNU General Public |
// License. However the source code for this file must still be made available |
// in accordance with section (3) of the GNU General Public License. |
// |
// This exception does not invalidate any other reasons why a work based on |
// this file might be covered by the GNU General Public License. |
// |
// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc. |
// at http://sources.redhat.com/ecos/ecos-license/ |
// ------------------------------------------- |
//####ECOSGPLCOPYRIGHTEND#### |
// ==================================================================== |
//#####DESCRIPTIONBEGIN#### |
// |
// Author(s): hmt |
// Contributors: gthomas |
// Date: 2001-07-17 |
// Purpose: Internal interfaces for serial I/O drivers |
// Description: |
// |
//####DESCRIPTIONEND#### |
// |
// ==================================================================== |
|
// Description of serial ports on NEC MIPS uPD985xx |
|
#include <cyg/hal/hal_arch.h> // Register definitions |
|
static unsigned char select_word_length[] = { |
0xFF, // 5 bits / word (char) |
0xFF, // 6 |
UARTLCR_7, // 7 |
UARTLCR_8 // 8 |
}; |
|
static unsigned char select_stop_bits[] = { |
0xFF, // N/A |
UARTLCR_STB1, // 1 stop bit |
0xFF, // 1.5 stop bit |
UARTLCR_STB2 // 2 stop bits |
}; |
|
static unsigned char select_parity[] = { |
UARTLCR_NOP, // No parity |
UARTLCR_EP, // Even parity |
UARTLCR_OP, // Odd parity |
0xFF, // Mark parity |
0xFF, // Space parity |
}; |
|
static cyg_int32 select_baud[] = { |
0, // Unused |
UARTDLL_VAL( 50 ), // 50 |
UARTDLL_VAL( 75 ), // 75 |
UARTDLL_VAL( 110 ), // 110 |
0, // 134.5 |
UARTDLL_VAL( 150 ), // 150 |
UARTDLL_VAL( 200 ), // 200 |
UARTDLL_VAL( 300 ), // 300 |
UARTDLL_VAL( 600 ), // 600 |
UARTDLL_VAL( 1200 ), // 1200 |
UARTDLL_VAL( 1800 ), // 1800 |
UARTDLL_VAL( 2400 ), // 2400 |
UARTDLL_VAL( 3600 ), // 3600 |
UARTDLL_VAL( 4800 ), // 4800 |
UARTDLL_VAL( 7200 ), // 7200 |
UARTDLL_VAL( 9600 ), // 9600 |
UARTDLL_VAL( 14400 ), // 14400 |
UARTDLL_VAL( 19200 ), // 19200 |
UARTDLL_VAL( 38400 ), // 38400 |
UARTDLL_VAL( 57600 ), // 57600 |
UARTDLL_VAL( 115200 ), // 115200 |
UARTDLL_VAL( 230400 ), // 230400 |
}; |
|
#endif // CYGONCE_MIPS_UPD985XX_SERIAL_H |
|
// ------------------------------------------------------------------------ |
// EOF upd985xx_serial.h |
/upd985xx/v2_0/src/upd985xx_serial.c
0,0 → 1,313
//========================================================================== |
// |
// io/serial/mips/upd985xx/upd985xx_serial.c |
// |
// NEC MIPS uPD985xx Serial I/O Interface Module (interrupt driven) |
// |
//========================================================================== |
//####ECOSGPLCOPYRIGHTBEGIN#### |
// ------------------------------------------- |
// This file is part of eCos, the Embedded Configurable Operating System. |
// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc. |
// |
// eCos is free software; you can redistribute it and/or modify it under |
// the terms of the GNU General Public License as published by the Free |
// Software Foundation; either version 2 or (at your option) any later version. |
// |
// eCos is distributed in the hope that it will be useful, but WITHOUT ANY |
// WARRANTY; without even the implied warranty of MERCHANTABILITY or |
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
// for more details. |
// |
// You should have received a copy of the GNU General Public License along |
// with eCos; if not, write to the Free Software Foundation, Inc., |
// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. |
// |
// As a special exception, if other files instantiate templates or use macros |
// or inline functions from this file, or you compile this file and link it |
// with other works to produce a work based on this file, this file does not |
// by itself cause the resulting work to be covered by the GNU General Public |
// License. However the source code for this file must still be made available |
// in accordance with section (3) of the GNU General Public License. |
// |
// This exception does not invalidate any other reasons why a work based on |
// this file might be covered by the GNU General Public License. |
// |
// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc. |
// at http://sources.redhat.com/ecos/ecos-license/ |
// ------------------------------------------- |
//####ECOSGPLCOPYRIGHTEND#### |
//========================================================================== |
//#####DESCRIPTIONBEGIN#### |
// |
// Author(s): hmt |
// Contributors: gthomas |
// Date: 2001-07-17 |
// Purpose: NEC MIPS uPD985xx Serial I/O module (interrupt driven version) |
// Description: |
// |
//####DESCRIPTIONEND#### |
// |
//========================================================================== |
|
#include <pkgconf/system.h> |
#include <pkgconf/io_serial.h> |
#include <pkgconf/io.h> |
|
#include <cyg/io/io.h> |
#include <cyg/hal/hal_intr.h> |
#include <cyg/io/devtab.h> |
#include <cyg/io/serial.h> |
#include <cyg/infra/diag.h> |
|
#include "upd985xx_serial.h" |
|
typedef struct upd985xx_serial_info { |
// CYG_ADDRWORD base; |
CYG_WORD int_num; |
cyg_interrupt serial_interrupt; |
cyg_handle_t serial_interrupt_handle; |
} upd985xx_serial_info; |
|
static bool upd985xx_serial_init(struct cyg_devtab_entry *tab); |
static bool upd985xx_serial_putc(serial_channel *chan, unsigned char c); |
static Cyg_ErrNo upd985xx_serial_lookup(struct cyg_devtab_entry **tab, |
struct cyg_devtab_entry *sub_tab, |
const char *name); |
static unsigned char upd985xx_serial_getc(serial_channel *chan); |
static Cyg_ErrNo upd985xx_serial_set_config(serial_channel *chan, cyg_uint32 key, |
const void *xbuf, cyg_uint32 *len); |
static void upd985xx_serial_start_xmit(serial_channel *chan); |
static void upd985xx_serial_stop_xmit(serial_channel *chan); |
|
static cyg_uint32 upd985xx_serial_ISR(cyg_vector_t vector, cyg_addrword_t data); |
static void upd985xx_serial_DSR(cyg_vector_t vector, cyg_ucount32 count, cyg_addrword_t data); |
|
static SERIAL_FUNS(upd985xx_serial_funs, |
upd985xx_serial_putc, |
upd985xx_serial_getc, |
upd985xx_serial_set_config, |
upd985xx_serial_start_xmit, |
upd985xx_serial_stop_xmit |
); |
|
#ifdef CYGPKG_IO_SERIAL_MIPS_UPD985XX_SERIAL0 |
static upd985xx_serial_info upd985xx_serial_info0 = { |
// base: (CYG_ADDRWORD)UPD985XX_UART3_CONTROL0, |
int_num: CYGNUM_HAL_INTERRUPT_UART, |
}; |
#if CYGNUM_IO_SERIAL_MIPS_UPD985XX_SERIAL0_BUFSIZE > 0 |
static unsigned char upd985xx_serial_out_buf0[CYGNUM_IO_SERIAL_MIPS_UPD985XX_SERIAL0_BUFSIZE]; |
static unsigned char upd985xx_serial_in_buf0[CYGNUM_IO_SERIAL_MIPS_UPD985XX_SERIAL0_BUFSIZE]; |
|
static SERIAL_CHANNEL_USING_INTERRUPTS( |
upd985xx_serial_channel0, |
upd985xx_serial_funs, |
upd985xx_serial_info0, |
CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_MIPS_UPD985XX_SERIAL0_BAUD), |
CYG_SERIAL_STOP_DEFAULT, |
CYG_SERIAL_PARITY_DEFAULT, |
CYG_SERIAL_WORD_LENGTH_DEFAULT, |
CYG_SERIAL_FLAGS_DEFAULT, |
&upd985xx_serial_out_buf0[0], sizeof(upd985xx_serial_out_buf0), |
&upd985xx_serial_in_buf0[0], sizeof(upd985xx_serial_in_buf0) |
); |
#else |
static SERIAL_CHANNEL( |
upd985xx_serial_channel0, |
upd985xx_serial_funs, |
upd985xx_serial_info0, |
CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_MIPS_UPD985XX_SERIAL0_BAUD), |
CYG_SERIAL_STOP_DEFAULT, |
CYG_SERIAL_PARITY_DEFAULT, |
CYG_SERIAL_WORD_LENGTH_DEFAULT, |
CYG_SERIAL_FLAGS_DEFAULT |
); |
#endif |
|
DEVTAB_ENTRY(upd985xx_serial_io0, |
CYGDAT_IO_SERIAL_MIPS_UPD985XX_SERIAL0_NAME, |
0, // Does not depend on a lower level interface |
&cyg_io_serial_devio, |
upd985xx_serial_init, |
upd985xx_serial_lookup, // Serial driver may need initializing |
&upd985xx_serial_channel0 |
); |
#endif // CYGPKG_IO_SERIAL_MIPS_UPD985XX_SERIAL1 |
|
// Internal function to actually configure the hardware to desired baud rate, etc. |
static bool |
upd985xx_serial_config_port(serial_channel *chan, cyg_serial_info_t *new_config, bool init) |
{ |
unsigned char parity; |
unsigned char word_length; |
unsigned char stop_bits; |
int baud; |
|
parity = select_parity[new_config->parity]; |
word_length = select_word_length[new_config->word_length-CYGNUM_SERIAL_WORD_LENGTH_5]; |
stop_bits = select_stop_bits[new_config->stop]; |
baud = select_baud[new_config->baud]; |
|
if ((word_length == 0xFF) || |
(parity == 0xFF) || |
(stop_bits == 0xFF)) { |
return false; // Unsupported configuration |
} |
|
// First ensure we are accessing the right registers. |
// Clear the divisor latch access bit |
*UARTLCR &=~UARTLCR_DLAB; |
|
// Disable Receiver and Transmitter |
// No such thing in uPD985xx - but we can mask interrupts: |
*UARTIER = 0; |
|
// Clear sticky (writable) status bits. |
// Ensure it's in 16550 mode at least: |
*UARTFCR = UARTFCR_16550_MODE; |
|
// Set parity, word length, stop bits (keep DLAB clear) |
*UARTLCR = word_length | parity | stop_bits; |
|
// Set the desired baud rate. |
*UARTLCR |= UARTLCR_DLAB; |
*UARTDLM = (baud >> 8) & 0xff; |
*UARTDLL = baud & 0xff; |
*UARTLCR &=~UARTLCR_DLAB; |
|
// Enable the receiver (with interrupts) and the transmitter. |
*UARTIER = UARTIER_ERBFI; |
|
return true; |
} |
|
// Function to initialize the device. Called at bootstrap time. |
static bool |
upd985xx_serial_init(struct cyg_devtab_entry *tab) |
{ |
serial_channel *chan = (serial_channel *)tab->priv; |
upd985xx_serial_info *upd985xx_chan = (upd985xx_serial_info *)chan->dev_priv; |
int res; |
#ifdef CYGDBG_IO_INIT |
diag_printf("UPD985XX SERIAL init - dev: %x.%d\n", 0 /* upd985xx_chan->base */, |
upd985xx_chan->int_num); |
#endif |
(chan->callbacks->serial_init)(chan); // Really only required for interrupt driven devices |
if (chan->out_cbuf.len != 0) { |
cyg_drv_interrupt_create(upd985xx_chan->int_num, |
99, // Priority - unused |
(cyg_addrword_t)chan, // Data item passed to interrupt handler |
upd985xx_serial_ISR, |
upd985xx_serial_DSR, |
&upd985xx_chan->serial_interrupt_handle, |
&upd985xx_chan->serial_interrupt); |
cyg_drv_interrupt_attach(upd985xx_chan->serial_interrupt_handle); |
cyg_drv_interrupt_unmask(upd985xx_chan->int_num); |
} |
res = upd985xx_serial_config_port(chan, &chan->config, true); |
return res; |
} |
|
// This routine is called when the device is "looked" up (i.e. attached) |
static Cyg_ErrNo |
upd985xx_serial_lookup(struct cyg_devtab_entry **tab, |
struct cyg_devtab_entry *sub_tab, |
const char *name) |
{ |
serial_channel *chan = (serial_channel *)(*tab)->priv; |
(chan->callbacks->serial_init)(chan); // Really only required for interrupt driven devices |
return ENOERR; |
} |
|
// Send a character to the device output buffer. |
// Return 'true' if character is sent to device |
static bool |
upd985xx_serial_putc(serial_channel *chan, unsigned char c) |
{ |
if ( 0 == (UARTLSR_THRE & *UARTLSR) ) |
return false; |
*UARTTHR = (unsigned int)c; |
return true; |
} |
|
// Fetch a character from the device input buffer, waiting if necessary |
static unsigned char |
upd985xx_serial_getc(serial_channel *chan) |
{ |
while ( 0 == (UARTLSR_DR & *UARTLSR) ) |
/* do nothing */ ; |
|
return (char)*UARTRBR; |
} |
|
// Set up the device characteristics; baud rate, etc. |
static Cyg_ErrNo |
upd985xx_serial_set_config(serial_channel *chan, cyg_uint32 key, |
const void *xbuf, cyg_uint32 *len) |
{ |
switch (key) { |
case CYG_IO_SET_CONFIG_SERIAL_INFO: |
{ |
cyg_serial_info_t *config = (cyg_serial_info_t *)xbuf; |
if ( *len < sizeof(cyg_serial_info_t) ) { |
return -EINVAL; |
} |
*len = sizeof(cyg_serial_info_t); |
if ( true != upd985xx_serial_config_port(chan, config, false) ) |
return -EINVAL; |
} |
break; |
default: |
return -EINVAL; |
} |
return ENOERR; |
} |
|
// Enable the transmitter on the device |
static void |
upd985xx_serial_start_xmit(serial_channel *chan) |
{ |
(chan->callbacks->xmt_char)(chan); // Kick transmitter (if necessary) |
*UARTIER |= UARTIER_ERBEI; // enable interrupts |
} |
|
// Disable the transmitter on the device |
static void |
upd985xx_serial_stop_xmit(serial_channel *chan) |
{ |
*UARTIER &=~UARTIER_ERBEI; // disable interrupts |
} |
|
// Serial I/O - low level interrupt handler (ISR) |
static cyg_uint32 |
upd985xx_serial_ISR(cyg_vector_t vector, cyg_addrword_t data) |
{ |
cyg_drv_interrupt_mask(vector); |
return CYG_ISR_CALL_DSR; // Cause DSR to be run |
} |
|
// Serial I/O - high level interrupt handler (DSR) |
static void |
upd985xx_serial_DSR(cyg_vector_t vector, cyg_ucount32 count, cyg_addrword_t data) |
{ |
serial_channel *chan = (serial_channel *)data; |
|
int stat = *UARTIIR; |
|
stat &= UARTIIR_UIID_MASK; |
|
if (stat == UARTIIR_TX_EMPTY) { |
(chan->callbacks->xmt_char)(chan); |
} |
if (stat == UARTIIR_RXD_AVAIL) { |
while (0 != (UARTLSR_DR & *UARTLSR)) { |
(chan->callbacks->rcv_char)(chan, (char)*UARTRBR); |
} |
} |
cyg_drv_interrupt_acknowledge(vector); |
cyg_drv_interrupt_unmask(vector); |
} |
|
// ------------------------------------------------------------------------ |
// EOF upd985xx_serial.c |
/upd985xx/v2_0/ChangeLog
0,0 → 1,54
2003-02-24 Jonathan Larmour <jifl@eCosCentric.com> |
|
* cdl/ser_mips_upd985xx.cdl: Remove irrelevant doc link. |
|
2002-02-11 Jesper Skov <jskov@redhat.com> |
|
* src/upd985xx_serial.c (upd985xx_serial_init): Fix compile error. |
|
2001-09-10 Jonathan Larmour <jlarmour@redhat.com> |
|
* cdl/ser_mips_upd985xx.cdl: |
Fix 234000->230400 typo. |
|
2001-07-18 Hugo Tyson <hmt@redhat.com> |
|
* src/upd985xx_serial.c: |
* src/upd985xx_serial.h: |
* cdl/ser_mips_upd985xx.cdl: |
New files; implement asynchronous serial device for uPD985xx. |
|
//=========================================================================== |
//####ECOSGPLCOPYRIGHTBEGIN#### |
// ------------------------------------------- |
// This file is part of eCos, the Embedded Configurable Operating System. |
// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc. |
// |
// eCos is free software; you can redistribute it and/or modify it under |
// the terms of the GNU General Public License as published by the Free |
// Software Foundation; either version 2 or (at your option) any later version. |
// |
// eCos is distributed in the hope that it will be useful, but WITHOUT ANY |
// WARRANTY; without even the implied warranty of MERCHANTABILITY or |
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
// for more details. |
// |
// You should have received a copy of the GNU General Public License along |
// with eCos; if not, write to the Free Software Foundation, Inc., |
// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. |
// |
// As a special exception, if other files instantiate templates or use macros |
// or inline functions from this file, or you compile this file and link it |
// with other works to produce a work based on this file, this file does not |
// by itself cause the resulting work to be covered by the GNU General Public |
// License. However the source code for this file must still be made available |
// in accordance with section (3) of the GNU General Public License. |
// |
// This exception does not invalidate any other reasons why a work based on |
// this file might be covered by the GNU General Public License. |
// |
// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc. |
// at http://sources.redhat.com/ecos/ecos-license/ |
// ------------------------------------------- |
//####ECOSGPLCOPYRIGHTEND#### |
//=========================================================================== |