summaryrefslogtreecommitdiff
path: root/ecos/packages/devs/serial/v85x
diff options
context:
space:
mode:
Diffstat (limited to 'ecos/packages/devs/serial/v85x')
-rw-r--r--ecos/packages/devs/serial/v85x/v850/current/ChangeLog83
-rw-r--r--ecos/packages/devs/serial/v85x/v850/current/cdl/ser_v85x_v850.cdl131
-rw-r--r--ecos/packages/devs/serial/v85x/v850/current/src/v85x_v850_serial.c359
-rw-r--r--ecos/packages/devs/serial/v85x/v850/current/src/v85x_v850_serial.h164
4 files changed, 737 insertions, 0 deletions
diff --git a/ecos/packages/devs/serial/v85x/v850/current/ChangeLog b/ecos/packages/devs/serial/v85x/v850/current/ChangeLog
new file mode 100644
index 0000000..c40ada1
--- /dev/null
+++ b/ecos/packages/devs/serial/v85x/v850/current/ChangeLog
@@ -0,0 +1,83 @@
+2003-02-24 Jonathan Larmour <jifl@eCosCentric.com>
+
+ * cdl/ser_v85x_v850.cdl: Remove irrelevant doc link.
+
+2001-03-21 Jonathan Larmour <jlarmour@redhat.com>
+
+ * cdl/ser_v85x_v850.cdl: Default driver on if CYGPKG_IO_SERIAL_DEVICES
+ enabled - like other drivers.
+ Descriptions should not be specific to SA1.
+
+ * src/v85x_v850_serial.h: Generate baud table dependent on CPU
+ frequency always.
+ * src/v85x_v850_serial.c (v850_serial_config_port): Normalize
+ baud settings from above table before setting.
+ (v850_serial_putc): Silence warning.
+
+2000-10-12 Jesper Skov <jskov@redhat.com>
+
+ * cdl/ser_v85x_v850.cdl: Moved testing parameters here.
+
+2000-10-09 Gary Thomas <gthomas@redhat.com>
+
+ * src/v85x_v850_serial.c (v850_serial_config_port): Fix baud clock
+ setup.
+
+2000-10-04 Gary Thomas <gthomas@redhat.com>
+
+ * src/v85x_v850_serial.c (v850_serial_tx_timeout): Correct arguments.
+
+2000-09-06 Gary Thomas <gthomas@redhat.com>
+
+ * src/v85x_v850_serial.h:
+ * src/v85x_v850_serial.c: Better handling of V850 variants (SA1,SB1)
+
+2000-08-31 Gary Thomas <gthomas@redhat.com>
+
+ * src/v85x_v850_serial.c (v850_serial_config_port): Better handling
+ of cpu xtal frequency for baud rate calculations.
+
+2000-08-01 Jonathan Larmour <jlarmour@redhat.co.uk>
+
+ * src/v85x_v850_serial.c (v850_serial_set_config): Now use keys to make
+ more flexible.
+
+2000-07-19 Gary Thomas <gthomas@redhat.com>
+
+ * src/v85x_v850_serial.h: Base baud rate calculations on CPU frequency.
+
+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-28 Gary Thomas <gthomas@redhat.com>
+
+ * src/v85x_v850_serial.h:
+ * src/v85x_v850_serial.c:
+ * cdl/ser_v85x_v850.cdl: New file(s).
+
+//===========================================================================
+// ####GPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
+//
+// This program 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.
+//
+// This program 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 this program; if not, write to the
+// Free Software Foundation, Inc., 51 Franklin Street,
+// Fifth Floor, Boston, MA 02110-1301, USA.
+// -------------------------------------------
+// ####GPLCOPYRIGHTEND####
+//===========================================================================
diff --git a/ecos/packages/devs/serial/v85x/v850/current/cdl/ser_v85x_v850.cdl b/ecos/packages/devs/serial/v85x/v850/current/cdl/ser_v85x_v850.cdl
new file mode 100644
index 0000000..c9eb9c6
--- /dev/null
+++ b/ecos/packages/devs/serial/v85x/v850/current/cdl/ser_v85x_v850.cdl
@@ -0,0 +1,131 @@
+# ====================================================================
+#
+# ser_v85x_v850.cdl
+#
+# eCos serial NEC/V850 configuration data
+#
+# ====================================================================
+## ####ECOSGPLCOPYRIGHTBEGIN####
+## -------------------------------------------
+## This file is part of eCos, the Embedded Configurable Operating System.
+## Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, 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.,
+## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 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 v2.
+##
+## This exception does not invalidate any other reasons why a work based
+## on this file might be covered by the GNU General Public License.
+## -------------------------------------------
+## ####ECOSGPLCOPYRIGHTEND####
+# ====================================================================
+######DESCRIPTIONBEGIN####
+#
+# Author(s): gthomas
+# Original data: gthomas
+# Contributors: jlarmour
+# Date: 2000-05-26
+#
+#####DESCRIPTIONEND####
+#
+# ====================================================================
+
+cdl_package CYGPKG_IO_SERIAL_V85X_V850 {
+ display "NEC V850 serial device drivers"
+
+ parent CYGPKG_IO_SERIAL_DEVICES
+ active_if CYGPKG_IO_SERIAL
+ active_if CYGPKG_HAL_V85X_V850
+
+ requires CYGPKG_ERROR
+ include_dir cyg/io
+ include_files ; # none _exported_ whatsoever
+ description "
+ This option enables the serial device drivers for the
+ NEC V850."
+
+ compile -library=libextras.a v85x_v850_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_v85x_v850.h>"
+ puts $::cdl_system_header "/***** serial driver proc output end *****/"
+ }
+
+ cdl_component CYGPKG_IO_SERIAL_V85X_V850_SERIAL0 {
+ display "NEC V850 serial port 0 driver"
+ flavor bool
+ default_value 1
+ description "
+ This option includes the serial device driver for the NEC V850
+ SA1 (70F3017) and SB1 (70F3033) devices, port 0."
+
+ cdl_option CYGDAT_IO_SERIAL_V85X_V850_SERIAL0_NAME {
+ display "Device name for NEC V850 serial port 0 driver"
+ flavor data
+ default_value {"\"/dev/ser0\""}
+ description "
+ This option specifies the name of the serial device for the
+ NEC V850, port 0."
+ }
+
+ cdl_option CYGNUM_IO_SERIAL_V85X_V850_SERIAL0_BAUD {
+ display "Baud rate for the NEC V850 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
+ }
+ default_value 38400
+ description "
+ This option specifies the default baud rate (speed) for the
+ NEC V850, port 0."
+ }
+
+ cdl_option CYGNUM_IO_SERIAL_V85X_V850_SERIAL0_BUFSIZE {
+ display "Buffer size for the NEC V850 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 NEC V850, port 0."
+ }
+ }
+
+ cdl_component CYGPKG_IO_SERIAL_V85X_V850_TESTING {
+ display "Testing parameters"
+ flavor bool
+ calculated 1
+ active_if CYGPKG_IO_SERIAL_V85X_V850_SERIAL0
+
+ cdl_option CYGPRI_SER_TEST_SER_DEV {
+ display "Serial device used for testing"
+ flavor data
+ default_value { CYGDAT_IO_SERIAL_V85X_V850_SERIAL0_NAME }
+ }
+
+ define_proc {
+ puts $::cdl_header "#define CYGPRI_SER_TEST_CRASH_ID \"v85x/v850\""
+ puts $::cdl_header "#define CYGPRI_SER_TEST_TTY_DEV \"/dev/tty0\""
+ }
+ }
+
+}
diff --git a/ecos/packages/devs/serial/v85x/v850/current/src/v85x_v850_serial.c b/ecos/packages/devs/serial/v85x/v850/current/src/v85x_v850_serial.c
new file mode 100644
index 0000000..6818f07
--- /dev/null
+++ b/ecos/packages/devs/serial/v85x/v850/current/src/v85x_v850_serial.c
@@ -0,0 +1,359 @@
+//==========================================================================
+//
+// io/serial/v85x/v85x_v850_serial.c
+//
+// NEC V850 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 Free Software Foundation, 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.,
+// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 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 v2.
+//
+// This exception does not invalidate any other reasons why a work based
+// on this file might be covered by the GNU General Public License.
+// -------------------------------------------
+// ####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s): gthomas
+// Contributors: gthomas,jlarmour
+// Date: 2001-03-21
+// Purpose: V850 Serial I/O module (interrupt driven version)
+// Description:
+//
+//####DESCRIPTIONEND####
+//
+//==========================================================================
+
+#include <pkgconf/system.h>
+#include <pkgconf/io_serial.h>
+#include <pkgconf/io.h>
+#ifdef CYGPKG_KERNEL
+#include <pkgconf/kernel.h>
+#endif
+#include CYGBLD_HAL_TARGET_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>
+
+#ifdef CYGVAR_KERNEL_COUNTERS_CLOCK
+#include <cyg/kernel/kapi.h>
+#endif
+
+#ifdef CYGPKG_IO_SERIAL_V85X_V850
+
+#include "v85x_v850_serial.h"
+
+typedef struct v850_serial_info {
+ CYG_ADDRWORD base;
+ CYG_WORD int_num;
+ cyg_interrupt serial_interrupt[3];
+ cyg_handle_t serial_interrupt_handle[3];
+ cyg_bool tx_busy;
+#ifdef CYGVAR_KERNEL_COUNTERS_CLOCK
+ cyg_alarm tx_timeout;
+ cyg_handle_t tx_timeout_handle;
+#endif
+} v850_serial_info;
+
+static bool v850_serial_init(struct cyg_devtab_entry *tab);
+static bool v850_serial_putc(serial_channel *chan, unsigned char c);
+static Cyg_ErrNo v850_serial_lookup(struct cyg_devtab_entry **tab,
+ struct cyg_devtab_entry *sub_tab,
+ const char *name);
+static unsigned char v850_serial_getc(serial_channel *chan);
+static Cyg_ErrNo v850_serial_set_config(serial_channel *chan, cyg_uint32 key,
+ const void *xbuf, cyg_uint32 *len);
+static void v850_serial_start_xmit(serial_channel *chan);
+static void v850_serial_stop_xmit(serial_channel *chan);
+
+static cyg_uint32 v850_serial_ISR(cyg_vector_t vector, cyg_addrword_t data);
+static void v850_serial_DSR(cyg_vector_t vector, cyg_ucount32 count, cyg_addrword_t data);
+
+static SERIAL_FUNS(v850_serial_funs,
+ v850_serial_putc,
+ v850_serial_getc,
+ v850_serial_set_config,
+ v850_serial_start_xmit,
+ v850_serial_stop_xmit
+ );
+
+#ifdef CYGPKG_IO_SERIAL_V85X_V850_SERIAL0
+static v850_serial_info v850_serial_info0 = {V850_REG_ASIM0,
+ CYGNUM_HAL_VECTOR_INTSER0};
+#if CYGNUM_IO_SERIAL_V85X_V850_SERIAL0_BUFSIZE > 0
+static unsigned char v850_serial_out_buf0[CYGNUM_IO_SERIAL_V85X_V850_SERIAL0_BUFSIZE];
+static unsigned char v850_serial_in_buf0[CYGNUM_IO_SERIAL_V85X_V850_SERIAL0_BUFSIZE];
+
+static SERIAL_CHANNEL_USING_INTERRUPTS(v850_serial_channel0,
+ v850_serial_funs,
+ v850_serial_info0,
+ CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_V85X_V850_SERIAL0_BAUD),
+ CYG_SERIAL_STOP_DEFAULT,
+ CYG_SERIAL_PARITY_DEFAULT,
+ CYG_SERIAL_WORD_LENGTH_DEFAULT,
+ CYG_SERIAL_FLAGS_DEFAULT,
+ &v850_serial_out_buf0[0], sizeof(v850_serial_out_buf0),
+ &v850_serial_in_buf0[0], sizeof(v850_serial_in_buf0)
+ );
+#else
+static SERIAL_CHANNEL(v850_serial_channel0,
+ v850_serial_funs,
+ v850_serial_info0,
+ CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_V85X_V850_SERIAL0_BAUD),
+ CYG_SERIAL_STOP_DEFAULT,
+ CYG_SERIAL_PARITY_DEFAULT,
+ CYG_SERIAL_WORD_LENGTH_DEFAULT,
+ CYG_SERIAL_FLAGS_DEFAULT
+ );
+#endif
+
+DEVTAB_ENTRY(v850_serial_io0,
+ CYGDAT_IO_SERIAL_V85X_V850_SERIAL0_NAME,
+ 0, // Does not depend on a lower level interface
+ &cyg_io_serial_devio,
+ v850_serial_init,
+ v850_serial_lookup, // Serial driver may need initializing
+ &v850_serial_channel0
+ );
+#endif // CYGPKG_IO_SERIAL_V85X_V850_SERIAL0
+
+// Internal function to actually configure the hardware to desired baud rate, etc.
+static bool
+v850_serial_config_port(serial_channel *chan, cyg_serial_info_t *new_config, bool init)
+{
+ v850_serial_info *v850_chan = (v850_serial_info *)chan->dev_priv;
+ volatile struct serial_port *port = (volatile struct serial_port *)v850_chan->base;
+ unsigned char parity = select_parity[new_config->parity];
+ unsigned char word_length = select_word_length[new_config->word_length-CYGNUM_SERIAL_WORD_LENGTH_5];
+ unsigned char stop_bits = select_stop_bits[new_config->stop];
+ int divisor, count;
+
+ if ((select_baud[new_config->baud].count == 0) ||
+ (word_length == 0xFF) ||
+ (parity == 0xFF) ||
+ (stop_bits == 0xFF)) {
+ return false; // Unsupported configuration
+ }
+ port->asim = ASIM_TxRx_Tx | ASIM_TxRx_Rx | parity | word_length | stop_bits;
+ count = select_baud[new_config->baud].count;
+ divisor = select_baud[new_config->baud].divisor;
+
+ while (count > 0xFF) {
+ count >>= 1;
+ divisor++;
+ }
+
+ port->brgc = count;
+
+ port->brgm = divisor & 0x07;
+#if CYGINT_HAL_V850_VARIANT_SB1
+ port->brgm1 = divisor >> 3;
+#endif
+
+ if (new_config != &chan->config) {
+ chan->config = *new_config;
+ }
+ return true;
+}
+
+#ifdef CYGVAR_KERNEL_COUNTERS_CLOCK
+//
+// The serial ports on the V850 are incredibly stupid. There is no
+// interface status register which can tell you if it is possible to
+// read or write a character! The only way to discern this is by using
+// interrupts [or at least an interrupt register and polling it]. Thus
+// the serial transmit code has a problem in that it will be required by
+// upper layers to "send until full". The only way to decide "not full" is
+// that an interrupt has happened. If the serial driver is being mixed
+// with diagnostic I/O, then serial transmit interrupts will possibly be
+// lost.
+//
+// This code attempts to compenstate by using a kernel alarm to reset the
+// "device is busy" flag after some timeout. The timeout period will be
+// sufficiently long so as to not interfere with normal interrupt handling.
+//
+static void
+v850_serial_tx_timeout(cyg_handle_t alarm, cyg_addrword_t p)
+{
+ v850_serial_info *v850_chan = (v850_serial_info *)p;
+ v850_chan->tx_busy = false;
+}
+#endif
+
+// Function to initialize the device. Called at bootstrap time.
+static bool
+v850_serial_init(struct cyg_devtab_entry *tab)
+{
+ int i;
+ serial_channel *chan = (serial_channel *)tab->priv;
+ v850_serial_info *v850_chan = (v850_serial_info *)chan->dev_priv;
+#ifdef CYGVAR_KERNEL_COUNTERS_CLOCK
+ cyg_handle_t h;
+#endif
+#ifdef CYGDBG_IO_INIT
+ diag_printf("V850 SERIAL init - dev: %x.%d\n", v850_chan->base, v850_chan->int_num);
+#endif
+ (chan->callbacks->serial_init)(chan); // Really only required for interrupt driven devices
+ if (chan->out_cbuf.len != 0) {
+ for (i = 0; i < 3; i++) {
+ cyg_drv_interrupt_create(v850_chan->int_num+i,
+ 99, // Priority - unused
+ (cyg_addrword_t)chan, // Data item passed to interrupt handler
+ v850_serial_ISR,
+ v850_serial_DSR,
+ &v850_chan->serial_interrupt_handle[i],
+ &v850_chan->serial_interrupt[i]);
+ cyg_drv_interrupt_attach(v850_chan->serial_interrupt_handle[i]);
+ cyg_drv_interrupt_unmask(v850_chan->int_num+i);
+#ifdef CYGVAR_KERNEL_COUNTERS_CLOCK
+ cyg_clock_to_counter(cyg_real_time_clock(), &h);
+ cyg_alarm_create(h, v850_serial_tx_timeout, (cyg_addrword_t)v850_chan,
+ &v850_chan->tx_timeout_handle, &v850_chan->tx_timeout);
+#endif
+ }
+ }
+ v850_chan->tx_busy = false;
+ return v850_serial_config_port(chan, &chan->config, true);
+}
+
+// This routine is called when the device is "looked" up (i.e. attached)
+static Cyg_ErrNo
+v850_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
+v850_serial_putc(serial_channel *chan, unsigned char c)
+{
+ v850_serial_info *v850_chan = (v850_serial_info *)chan->dev_priv;
+ volatile struct serial_port *port = (volatile struct serial_port *)v850_chan->base;
+ if (!v850_chan->tx_busy) {
+ v850_chan->tx_busy = true;
+ port->txs = c;
+#ifdef CYGVAR_KERNEL_COUNTERS_CLOCK
+ cyg_alarm_initialize(v850_chan->tx_timeout_handle, cyg_current_time()+10, 0);
+#endif
+ return true;
+ } else {
+ return false; // Couldn't send, tx was busy
+ }
+}
+
+// Fetch a character from the device input buffer, waiting if necessary
+static unsigned char
+v850_serial_getc(serial_channel *chan)
+{
+ v850_serial_info *v850_chan = (v850_serial_info *)chan->dev_priv;
+ volatile struct serial_port *port = (volatile struct serial_port *)v850_chan->base;
+ return port->rxs;
+}
+
+// Set up the device characteristics; baud rate, etc.
+static Cyg_ErrNo
+v850_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 != v850_serial_config_port(chan, config, false) )
+ return -EINVAL;
+ }
+ break;
+ default:
+ return -EINVAL;
+ }
+ return ENOERR;
+}
+
+// Enable the transmitter on the device
+static void
+v850_serial_start_xmit(serial_channel *chan)
+{
+ v850_serial_info *v850_chan = (v850_serial_info *)chan->dev_priv;
+ (chan->callbacks->xmt_char)(chan); // Kick transmitter (if necessary)
+ cyg_drv_interrupt_unmask(v850_chan->int_num+INT_Tx); // Enable Tx interrupt
+}
+
+// Disable the transmitter on the device
+static void
+v850_serial_stop_xmit(serial_channel *chan)
+{
+ v850_serial_info *v850_chan = (v850_serial_info *)chan->dev_priv;
+ cyg_drv_interrupt_mask(v850_chan->int_num+INT_Tx); // Disable Tx interrupt
+}
+
+// Serial I/O - low level interrupt handler (ISR)
+static cyg_uint32
+v850_serial_ISR(cyg_vector_t vector, cyg_addrword_t data)
+{
+ cyg_drv_interrupt_mask(vector);
+ cyg_drv_interrupt_acknowledge(vector);
+ return CYG_ISR_CALL_DSR; // Cause DSR to be run
+}
+
+// Serial I/O - high level interrupt handler (DSR)
+static void
+v850_serial_DSR(cyg_vector_t vector, cyg_ucount32 count, cyg_addrword_t data)
+{
+ serial_channel *chan = (serial_channel *)data;
+ v850_serial_info *v850_chan = (v850_serial_info *)chan->dev_priv;
+ volatile struct serial_port *port = (volatile struct serial_port *)v850_chan->base;
+ switch (vector-(v850_chan->int_num)) {
+ case INT_ERR:
+ case INT_Rx:
+ (chan->callbacks->rcv_char)(chan, port->rxs);
+ break;
+ case INT_Tx:
+ v850_chan->tx_busy = false;
+#ifdef CYGVAR_KERNEL_COUNTERS_CLOCK
+ cyg_alarm_initialize(v850_chan->tx_timeout_handle, 0, 0);
+#endif
+ (chan->callbacks->xmt_char)(chan);
+ break;
+ }
+ cyg_drv_interrupt_unmask(vector);
+}
+#endif
+
+// EOF v85x_v850_serial.c
diff --git a/ecos/packages/devs/serial/v85x/v850/current/src/v85x_v850_serial.h b/ecos/packages/devs/serial/v85x/v850/current/src/v85x_v850_serial.h
new file mode 100644
index 0000000..9ad39c7
--- /dev/null
+++ b/ecos/packages/devs/serial/v85x/v850/current/src/v85x_v850_serial.h
@@ -0,0 +1,164 @@
+#ifndef CYGONCE_V85X_V850_SERIAL_H
+#define CYGONCE_V85X_V850_SERIAL_H
+
+// ====================================================================
+//
+// v850_ceb_serial.h
+//
+// Device I/O - Description of NEC V850 serial hardware
+//
+// ====================================================================
+// ####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, 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.,
+// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 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 v2.
+//
+// This exception does not invalidate any other reasons why a work based
+// on this file might be covered by the GNU General Public License.
+// -------------------------------------------
+// ####ECOSGPLCOPYRIGHTEND####
+// ====================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s): gthomas
+// Contributors: gthomas,jlarmour
+// Date: 2001-03-21
+// Purpose: Internal interfaces for serial I/O drivers
+// Description:
+//
+//####DESCRIPTIONEND####
+//
+// ====================================================================
+
+// Description of serial ports on NEC V850/SA1 & SB1
+
+#include <pkgconf/system.h>
+#include CYGBLD_HAL_TARGET_H
+
+#include <cyg/hal/v850_common.h>
+
+struct serial_port {
+ unsigned char asim; // Serial interface mode
+ unsigned char _filler0;
+ unsigned char asis; // Serial interface status
+ unsigned char _filler1;
+ unsigned char brgc; // Baud rate control
+ unsigned char _filler2;
+ unsigned char txs; // Transmit shift register
+ unsigned char _filler3;
+ unsigned char rxs; // Receive shift register
+ unsigned char _filler4[5];
+ unsigned char brgm; // Baud rate mode
+ unsigned char _filler5;
+#if CYGINT_HAL_V850_VARIANT_SB1
+ unsigned char _filler6[0x10];
+ unsigned char brgm1; // Baud rate overflow
+#endif
+};
+
+// Relative interrupt numbers
+#define INT_ERR 0 // Receive error condition
+#define INT_Rx 1 // Receive data
+#define INT_Tx 2 // Transmit data
+
+// Serial interface mode
+#define ASIM_TxRx_MASK (3<<6) // Receive & Transmit enables
+#define ASIM_TxRx_Rx (1<<6) // Receive enable
+#define ASIM_TxRx_Tx (2<<6) // Transmit enable
+#define ASIM_Parity_MASK (3<<4) // Parity mode bits
+#define ASIM_Parity_none (0<<4) // No parity
+#define ASIM_Parity_space (1<<4) // Send zero bit, ignore errors
+#define ASIM_Parity_odd (2<<4) // Odd parity
+#define ASIM_Parity_even (3<<4) // Even parity
+#define ASIM_Length_MASK (1<<3) // Character length select
+#define ASIM_Length_7 (0<<3) // 7 bit chars
+#define ASIM_Length_8 (1<<3) // 8 bit chars
+#define ASIM_Stop_MASK (1<<2) // Stop bit select
+#define ASIM_Stop_1 (0<<2) // 1 stop bit
+#define ASIM_Stop_2 (1<<2) // 2 stop bits
+#define ASIM_Error_MASK (1<<1) // Receive error select
+#define ASIM_Error_enable (0<<1) // Issue interrupt on receive error
+#define ASIM_Error_disable (1<<1) // No interrupts on receive error
+
+// Serial interface status (errors only)
+#define ASIS_OVE (1<<0) // Overrun error
+#define ASIS_FE (1<<1) // Framing error
+#define ASIS_PE (1<<2) // Parity error
+
+static unsigned char select_word_length[] = {
+ 0xFF, // 5 bits / word (char)
+ 0xFF,
+ ASIM_Length_7,
+ ASIM_Length_8
+};
+
+static unsigned char select_stop_bits[] = {
+ 0,
+ ASIM_Stop_1, // 1 stop bit
+ 0xFF, // 1.5 stop bit
+ ASIM_Stop_2 // 2 stop bits
+};
+
+static unsigned char select_parity[] = {
+ ASIM_Parity_none, // No parity
+ ASIM_Parity_even, // Even parity
+ ASIM_Parity_odd, // Odd parity
+ 0xFF, // Mark parity
+ ASIM_Parity_space, // Space parity
+};
+
+static struct v850_baud {
+ unsigned int count;
+ unsigned int divisor;
+} select_baud[] = {
+// Baud rate values, using defined system clock
+#define BAUDCOUNT(X) ((CYGHWR_HAL_V85X_CPU_FREQ/2)/(X))
+ {0, 0}, // Unused
+ {0, 0}, // 50
+ {0, 0}, // 75
+ {0, 0}, // 110
+ {0, 0}, // 134.5
+ {0, 0}, // 150
+ {0, 0}, // 200
+ {0, 0}, // 300
+ {0, 0}, // 600
+ {BAUDCOUNT(1200), 1}, // 1200
+ {0, 0}, // 1800
+ {BAUDCOUNT(2400), 1}, // 2400
+ {0, 0}, // 3600
+ {BAUDCOUNT(4800), 1}, // 4800
+ {0, 0}, // 7200
+ {BAUDCOUNT(9600), 1}, // 9600
+ {0, 0}, // 14400
+ {BAUDCOUNT(19200), 1}, // 19200
+ {BAUDCOUNT(38400), 1}, // 38400
+ {0, 0}, // 57600
+ {0, 0}, // 115200
+ {0, 0}, // 230400
+};
+
+#endif // CYGONCE_V85X_V850_SERIAL_H
+
+// EOF v85x_v850_serial.h