diff options
Diffstat (limited to 'ecos/packages/devs/serial/v85x')
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 |