* patch to add support for mcf5282 serial device
@ 2005-04-13 13:43 Errin Bechtel
0 siblings, 0 replies; only message in thread
From: Errin Bechtel @ 2005-04-13 13:43 UTC (permalink / raw)
To: ecos-devel
Here is a patch for the mcf5282 uart, I haven't tested
this yet, I just modified the files from the mcf5272.
Errin Bechtel
Index:
packages/devs/serial/mcf52xx/mcf5282/current/cdl/ser_mcf5282_uart.cdl
===================================================================
RCS file:
packages/devs/serial/mcf52xx/mcf5282/current/cdl/ser_mcf5282_uart.cdl
diff -N
packages/devs/serial/mcf52xx/mcf5282/current/cdl/ser_mcf5282_uart.cdl
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++
packages/devs/serial/mcf52xx/mcf5282/current/cdl/ser_mcf5282_uart.cdl
1 Jan 1970 00:00:00 -0000
@@ -0,0 +1,142 @@
+#
====================================================================
+#
+# ser_MCF5282_uart.cdl
+#
+# eCos serial driver for MCF5282 UART
+#
+#
====================================================================
+#####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####
+#
====================================================================
+
+cdl_package CYGPKG_IO_SERIAL_MCF5282_UART {
+ display "Serial driver for MCF5282 UART"
+
+ parent CYGPKG_IO_SERIAL_DEVICES
+ active_if CYGPKG_IO_SERIAL
+ requires CYGPKG_ERROR
+ include_dir cyg/io
+ description "
+ This option enables the serial device
drivers for the
+ GMPU boards."
+
+ compile -library=libextras.a
ser_mcf5282_uart.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_MCF52xx_ser_MFC5282_uart.h>"
+ # puts $::cdl_system_header "/***** serial
driver proc output end *****/"
+ #}
+
+
+ cdl_component
CYGPKG_IO_SERIAL_MCF5282_UART_CHANNEL0 {
+ display "MCF5282 UART serial port 0
driver"
+ flavor bool
+ default_value 1
+
+ implements
CYGINT_IO_SERIAL_FLOW_CONTROL_HW
+ implements CYGINT_IO_SERIAL_LINE_STATUS_HW
+
+ description "This option includes the
serial device driver for the MCF5282 UART port 0."
+
+ cdl_option
CYGDAT_IO_SERIAL_MCF5282_UART_CHANNEL0_NAME {
+ display "Device name for the
MCF5282 UART serial port 0 driver"
+ flavor data
+ default_value {"\"/dev/ser0\""}
+ description "
+ This option specifies the name of
serial device for the
+ MCF5282 UART port 0."
+ }
+
+ cdl_option
CYGNUM_IO_SERIAL_MCF5282_UART_CHANNEL0_BAUD {
+ display "Baud rate for the MCF5282
UART serial port 0 driver"
+ flavor data
+ legal_values {1200 2400 4800 9600 14400
19200 38400 115200}
+ default_value 9600
+ description "
+ This option specifies the default
baud rate (speed) for the
+ MCF5282 UART port 0."
+ }
+
+ cdl_option
CYGNUM_IO_SERIAL_MCF5282_UART_CHANNEL0_BUFSIZE {
+ display "Buffer size for the
MCF5282 UART 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 MCF5282 UART port 0."
+ }
+ }
+
+ cdl_component
CYGPKG_IO_SERIAL_MCF5282_UART_CHANNEL1 {
+ display "MCF5282 UART serial port 1
driver"
+ flavor bool
+ default_value 0
+
+ implements
CYGINT_IO_SERIAL_FLOW_CONTROL_HW
+ implements CYGINT_IO_SERIAL_LINE_STATUS_HW
+
+ description "This option includes the
serial device driver for the MCF5282 UART port 1."
+
+ cdl_option
CYGDAT_IO_SERIAL_MCF5282_UART_CHANNEL1_NAME {
+ display "Device name for the
MCF5282 UART serial port 1 driver"
+ flavor data
+ default_value {"\"/dev/ser1\""}
+ description "
+ This option specifies the name of
serial device for the
+ MCF5282 UART port 1."
+ }
+
+ cdl_option
CYGNUM_IO_SERIAL_MCF5282_UART_CHANNEL1_BAUD {
+ display "Baud rate for the MCF5282
UART serial port 1 driver"
+ flavor data
+ legal_values {1200 2400 4800 9600 14400
19200 38400 115200}
+ default_value 9600
+ description "
+ This option specifies the default
baud rate (speed) for the
+ MCF5282 UART port 1."
+ }
+
+ cdl_option
CYGNUM_IO_SERIAL_MCF5282_UART_CHANNEL1_BUFSIZE {
+ display "Buffer size for the
MCF5282 UART 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 MCF5282 UART port 1."
+ }
+ }
+}
+
Index:
packages/devs/serial/mcf52xx/mcf5282/current/include/ser_mcf5282_uart.h
===================================================================
RCS file:
packages/devs/serial/mcf52xx/mcf5282/current/include/ser_mcf5282_uart.h
diff -N
packages/devs/serial/mcf52xx/mcf5282/current/include/ser_mcf5282_uart.h
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++
packages/devs/serial/mcf52xx/mcf5282/current/include/ser_mcf5282_uart.h
1 Jan 1970 00:00:00 -0000
@@ -0,0 +1,134 @@
+#ifndef _SER_MCF5282_H_
+#define _SER_MCF5282_H_
+//==========================================================================
+//####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####
+//==========================================================================
+
+#include <pkgconf/io_serial_mcf5282_uart.h>
+
+/* Bit level definitions and macros */
+#define MCF5282_UART_UMR1_RXRTS (0x80)
+#define MCF5282_UART_UMR1_RXIRQ (0x40)
+#define MCF5282_UART_UMR1_ERR (0x20)
+#define MCF5282_UART_UMR1_PM_MULTI_ADDR (0x1C)
+#define MCF5282_UART_UMR1_PM_MULTI_DATA (0x18)
+#define MCF5282_UART_UMR1_PM_NONE (0x10)
+#define MCF5282_UART_UMR1_PM_FORCE_HI (0x0C)
+#define MCF5282_UART_UMR1_PM_FORCE_LO (0x08)
+#define MCF5282_UART_UMR1_PM_ODD (0x04)
+#define MCF5282_UART_UMR1_PM_EVEN (0x00)
+#define MCF5282_UART_UMR1_BC_5 (0x00)
+#define MCF5282_UART_UMR1_BC_6 (0x01)
+#define MCF5282_UART_UMR1_BC_7 (0x02)
+#define MCF5282_UART_UMR1_BC_8 (0x03)
+
+#define MCF5282_UART_UMR2_CM_NORMAL (0x00)
+#define MCF5282_UART_UMR2_CM_ECHO (0x40)
+#define MCF5282_UART_UMR2_CM_LOCAL_LOOP (0x80)
+#define MCF5282_UART_UMR2_CM_REMOTE_LOOP (0xC0)
+#define MCF5282_UART_UMR2_TXRTS (0x20)
+#define MCF5282_UART_UMR2_TXCTS (0x10)
+#define MCF5282_UART_UMR2_STOP_BITS_1 (0x07)
+#define MCF5282_UART_UMR2_STOP_BITS_15 (0x08)
+#define MCF5282_UART_UMR2_STOP_BITS_2 (0x0F)
+#define MCF5282_UART_UMR2_STOP_BITS(a) ((a)&0x0f)
/* Stop Bit Length */
+
+//#define MCF5282_UART_USR_RB (0x80)
+//#define MCF5282_UART_USR_FE (0x40)
+//#define MCF5282_UART_USR_PE (0x20)
+//#define MCF5282_UART_USR_OE (0x10)
+//#define MCF5282_UART_USR_TXEMP (0x08)
+//#define MCF5282_UART_USR_TXRDY (0x04)
+#define MCF5282_UART_USR_FFULL (0x02)
+#define MCF5282_UART_USR_RXRDY (0x01)
+
+#define MCF5282_UART_UCSR_RCS(a) (((a)&0x0f)<<4) /*
Rx Clk Select */
+#define MCF5282_UART_UCSR_TCS(a) ((a)&0x0f) /* Tx
Clk Select */
+
+
+#define MCF5282_UART_UCR_NONE (0x00)
+#define MCF5282_UART_UCR_ENAB (0x80)
+#define MCF5282_UART_UCR_STOP_BREAK (0x70)
+#define MCF5282_UART_UCR_START_BREAK (0x60)
+#define MCF5282_UART_UCR_RESET_BKCHGINT (0x50)
+#define MCF5282_UART_UCR_RESET_ERROR (0x40)
+#define MCF5282_UART_UCR_RESET_TX (0x30)
+#define MCF5282_UART_UCR_RESET_RX (0x20)
+#define MCF5282_UART_UCR_RESET_MR (0x10)
+#define MCF5282_UART_UCR_TX_DISABLED (0x08)
+#define MCF5282_UART_UCR_TX_ENABLED (0x04)
+#define MCF5282_UART_UCR_RX_DISABLED (0x02)
+#define MCF5282_UART_UCR_RX_ENABLED (0x01)
+
+#define MCF5282_UART_UCCR_COS (0x10)
+#define MCF5282_UART_UCCR_CTS (0x01)
+
+#define MCF5282_UART_UACR_BRG (0x80)
+#define MCF5282_UART_UACR_CTMS_TIMER (0x60)
+#define MCF5282_UART_UACR_IEC (0x01)
+
+#define MCF5282_UART_UISR_COS (0x80)
+#define MCF5282_UART_UISR_ABC (0x40)
+#define MCF5282_UART_UISR_DB (0x04)
+#define MCF5282_UART_UISR_RXRDY (0x02)
+#define MCF5282_UART_UISR_TXRDY (0x01)
+
+#define MCF5282_UART_UIMR_COS (0x80)
+#define MCF5282_UART_UIMR_ABC (0x40)
+#define MCF5282_UART_UIMR_DB (0x04)
+#define MCF5282_UART_UIMR_FFULL (0x02)
+#define MCF5282_UART_UIMR_TXRDY (0x01)
+
+typedef unsigned char uint8; /* 8 bits */
+typedef unsigned short int uint16; /* 16 bits */
+typedef unsigned long int uint32; /* 32 bits */
+
+typedef signed char int8; /* 8 bits */
+typedef signed short int int16; /* 16 bits */
+typedef signed long int int32; /* 32 bits */
+
+#ifdef CYGPKG_IO_SERIAL_MCF5282_UART_CHANNEL0
+unsigned long
MCF5282_uart_get_channel_0_baud_rate(void);
+#endif /* CYGPKG_IO_SERIAL_MCF5282_UART_CHANNEL0 */
+
+#ifdef CYGPKG_IO_SERIAL_MCF5282_UART_CHANNEL1
+unsigned long
MCF5282_uart_get_channel_1_baud_rate(void);
+#endif /* CYGPKG_IO_SERIAL_MCF5282_UART_CHANNEL1 */
+
+#ifdef CYGPKG_IO_SERIAL_MCF5282_UART_CHANNEL2
+unsigned long
MCF5282_uart_get_channel_2_baud_rate(void);
+#endif /* CYGPKG_IO_SERIAL_MCF5282_UART_CHANNEL2 */
+
+#endif /* _SER_MCF5282_H_ */
+
Index:
packages/devs/serial/mcf52xx/mcf5282/current/src/ser_mcf5282_uart.c
===================================================================
RCS file:
packages/devs/serial/mcf52xx/mcf5282/current/src/ser_mcf5282_uart.c
diff -N
packages/devs/serial/mcf52xx/mcf5282/current/src/ser_mcf5282_uart.c
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++
packages/devs/serial/mcf52xx/mcf5282/current/src/ser_mcf5282_uart.c
1 Jan 1970 00:00:00 -0000
@@ -0,0 +1,939 @@
+//==========================================================================
+//
+// devs/serial/MCF52xx/MCF5282
+//
+// MCF5282 UART 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####
+//==========================================================================
+
+#include <cyg/io/io.h>
+#include <cyg/io/devtab.h>
+#include <cyg/io/serial.h>
+#include <cyg/infra/diag.h>
+#include <cyg/hal/hal_intr.h>
+#include <cyg/hal/hal_memmap.h>
+#include <cyg/infra/cyg_type.h>
+#include <cyg/hal/hal_arch.h>
+#include <cyg/hal/drv_api.h>
+#include <pkgconf/hal.h>
+#include <pkgconf/system.h>
+#include <pkgconf/io_serial.h>
+#include <pkgconf/io.h>
+#include <pkgconf/io_serial_mcf5282_uart.h>
+#include <cyg/io/ser_mcf5282_uart.h>
+
+/* The UART priority level */
+#define MCF5282_UART_PRIORITY_LEVEL 2
+
+/* Autobaud states */
+typedef enum autobaud_states_t
+{
+ AB_IDLE = 0, /* Normal state. Autobaud process
hasn't been initiated yet. */
+ AB_BEGIN_BREAK, /* Detected a start of the break
*/
+ AB_BEGIN, /* Detected the end of the break
and has set up the autobaud.*/
+
+}autobaud_states_t;
+
+#define FIELD_OFFSET(type,field)
(cyg_uint32)(&(((type*)0)->field))
+
+typedef struct MCF5282_uart_info_t
+{
+
+ volatile mcf5282_sim_uart_t* base;
// Base address of the UART registers
+ uint32 uart_vector;
// UART interrupt vector number
+
+ cyg_interrupt serial_interrupt;
// Interrupt context
+ cyg_handle_t
serial_interrupt_handle; // Interrupt handle
+
+ volatile uint8 imr_mirror;
// Interrupt mask register mirror
+
+ cyg_serial_info_t config;
// The channel configuration
+
+ autobaud_states_t autobaud_state;
// The autobaud state
+
+
+} MCF5282_uart_info_t;
+
+/* Function prtoftyps for the MCF5282 UART ISR and
DSR. */
+static cyg_uint32 MCF5282_uart_ISR(cyg_vector_t
vector, cyg_addrword_t data);
+static void MCF5282_uart_DSR(cyg_vector_t
vector, cyg_ucount32 count, cyg_addrword_t data);
+
+
+/* Function prototypes for the serial functions. */
+static bool MCF5282_uart_init(struct cyg_devtab_entry
* tab);
+static Cyg_ErrNo MCF5282_uart_lookup(struct
cyg_devtab_entry **tab,
+ struct cyg_devtab_entry *sub_tab,
+ const char *name);
+static bool MCF5282_uart_putc(serial_channel *chan,
unsigned char c);
+static unsigned char MCF5282_uart_getc(serial_channel
*chan);
+Cyg_ErrNo MCF5282_uart_set_config(serial_channel
*chan, cyg_uint32 key,
+ const void *xbuf,
cyg_uint32 *len);
+static void MCF5282_uart_start_xmit(serial_channel
*chan);
+static void MCF5282_uart_stop_xmit(serial_channel *
chan);
+
+
+/* Declare the serial functions that are called by
the common serial driver layer. */
+static SERIAL_FUNS
+(
+ MCF5282_uart_funs,
+ MCF5282_uart_putc,
+ MCF5282_uart_getc,
+ MCF5282_uart_set_config,
+ MCF5282_uart_start_xmit,
+ MCF5282_uart_stop_xmit
+);
+
+
+/* Definition for channel 0 UART configuration. */
+/************************************************/
+#ifdef CYGPKG_IO_SERIAL_MCF5282_UART_CHANNEL0
+
+/* Data structure contains
+ channel informtion.
+ */
+static MCF5282_uart_info_t
MCF5282_uart_channel_info_0;
+
+/* If the channel buffer size is zero, do not include
interrupt UART processing */
+#if CYGNUM_IO_SERIAL_MCF5282_UART_CHANNEL0_BUFSIZE >
0
+
+/* Allocated receive and transmit buffer. The
size of the buffer is */
+/* configured by the configtool.
*/
+
+static unsigned char
MCF5282_uart_out_buf0[CYGNUM_IO_SERIAL_MCF5282_UART_CHANNEL0_BUFSIZE];
+static unsigned char
MCF5282_uart_in_buf0[CYGNUM_IO_SERIAL_MCF5282_UART_CHANNEL0_BUFSIZE];
+
+/* Channel function table. We register the
UART functions here so */
+/* that uppper serial drivers can call the serial
driver's routines. */
+
+static SERIAL_CHANNEL_USING_INTERRUPTS(
+ MCF5282_uart_channel_0,
+ MCF5282_uart_funs,
+ MCF5282_uart_channel_info_0,
+
CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_MCF5282_UART_CHANNEL0_BAUD),
+ CYG_SERIAL_STOP_DEFAULT,
+ CYG_SERIAL_PARITY_DEFAULT,
+ CYG_SERIAL_WORD_LENGTH_DEFAULT,
+ CYG_SERIAL_FLAGS_DEFAULT,
+ MCF5282_uart_out_buf0,
sizeof(MCF5282_uart_out_buf0),
+ MCF5282_uart_in_buf0,
sizeof(MCF5282_uart_in_buf0)
+);
+#else
+/* Don't use interrupt processing for the UART. */
+static SERIAL_CHANNEL(
+ MCF5282_uart_channel_0,
+ MCF5282_uart_funs,
+ MCF5282_uart_channel_info_0,
+
CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_MCF5282_UART_CHANNEL0_BAUD),
+ CYG_SERIAL_STOP_DEFAULT,
+ CYG_SERIAL_PARITY_DEFAULT,
+ CYG_SERIAL_WORD_LENGTH_DEFAULT,
+ CYG_SERIAL_FLAGS_DEFAULT
+);
+#endif
+
+DEVTAB_ENTRY(
+ MCF5282_uart_io0,
+ CYGDAT_IO_SERIAL_MCF5282_UART_CHANNEL0_NAME,
+ 0, // Does not depend on a
lower level interface
+ &cyg_io_serial_devio, // The table of I/O
functions.
+ MCF5282_uart_init, // UART initialization
function.
+ MCF5282_uart_lookup, // The UART lookup
function. This function typically sets
+ // up the device for
actual use, turing on interrupts, configuring the
port, etc.
+ &MCF5282_uart_channel_0
+);
+#endif // CYGNUM_IO_SERIAL_MCF5282_UART_CHANNEL0
+
+/* Definition for channel 1 UART configuration. */
+/************************************************/
+
+#ifdef CYGPKG_IO_SERIAL_MCF5282_UART_CHANNEL1
+
+
+/* Data structure contains
+ channel informtion.
+ */
+static MCF5282_uart_info_t
MCF5282_uart_channel_info_1;
+
+/* If the channel buffer size is zero, do not include
interrupt UART processing */
+#if CYGNUM_IO_SERIAL_MCF5282_UART_CHANNEL1_BUFSIZE >
0
+
+/* Allocated receive and transmit buffer. The
size of the buffer is */
+/* configured by the configtool.
*/
+
+static unsigned char
MCF5282_uart_out_buf1[CYGNUM_IO_SERIAL_MCF5282_UART_CHANNEL1_BUFSIZE];
+static unsigned char
MCF5282_uart_in_buf1[CYGNUM_IO_SERIAL_MCF5282_UART_CHANNEL1_BUFSIZE];
+
+/* Channel function table. We register the
UART functions here so */
+/* that uppper serial drivers can call the serial
driver's routines. */
+
+static SERIAL_CHANNEL_USING_INTERRUPTS(
+ MCF5282_uart_channel_1,
+ MCF5282_uart_funs,
+ MCF5282_uart_channel_info_1,
+
CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_MCF5282_UART_CHANNEL1_BAUD),
+ CYG_SERIAL_STOP_DEFAULT,
+ CYG_SERIAL_PARITY_DEFAULT,
+ CYG_SERIAL_WORD_LENGTH_DEFAULT,
+ CYG_SERIAL_FLAGS_DEFAULT,
+ MCF5282_uart_out_buf1,
sizeof(MCF5282_uart_out_buf1),
+ MCF5282_uart_in_buf1,
sizeof(MCF5282_uart_in_buf1)
+);
+
+#else
+static SERIAL_CHANNEL(MCF5282_uart_channel_1,
+ MCF5282_uart_funs,
+ MCF5282_uart_channel_info_1,
+
CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_MCF5282_UART_CHANNEL1_BAUD),
+ CYG_SERIAL_STOP_DEFAULT,
+ CYG_SERIAL_PARITY_DEFAULT,
+ CYG_SERIAL_WORD_LENGTH_DEFAULT,
+ CYG_SERIAL_FLAGS_DEFAULT
+ );
+#endif
+DEVTAB_ENTRY(
+ MCF5282_uart_io1,
+ CYGDAT_IO_SERIAL_MCF5282_UART_CHANNEL1_NAME,
+ 0, // Does not depend on a
lower level interface
+ &cyg_io_serial_devio, // The table of I/O
functions.
+ MCF5282_uart_init, // UART initialization
function.
+ MCF5282_uart_lookup, // The UART lookup
function. This function typically sets
+ // up the device for
actual use, turing on interrupts, configuring the
port, etc.
+ &MCF5282_uart_channel_1
+);
+#endif // CYGNUM_IO_SERIAL_MCF5282_UART_CHANNEL1
+
+/* Definition of macros that access the UART's SIM
registers */
+/* Read from a register */
+
+#define MCF5282_UART_WRITE(_addr_,_value_) \
+ *((volatile CYG_BYTE*)&(_addr_)) =
(CYG_BYTE)(_value_)
+/* Write to a register */
+#define MCF5282_UART_READ(_addr_) \
+ *(volatile CYG_BYTE*)&(_addr_)
+
+
+/* Function Prototypes */
+/* =================== */
+/* Internal function to actually configure the
hardware to desired baud rate, etc. */
+static bool MCF5282_uart_config_port(serial_channel*,
cyg_serial_info_t*);
+static void MCF5282_uart_start_xmit(serial_channel*);
+
+
+/* Baudrate conversion table. */
+static unsigned long baud_rates_table[]=
+{
+ 0,
+ 50, // CYGNUM_SERIAL_BAUD_50 = 1
+ 75, // CYGNUM_SERIAL_BAUD_75
+ 110, // CYGNUM_SERIAL_BAUD_110
+ 134, // CYGNUM_SERIAL_BAUD_134_5
+ 150, // CYGNUM_SERIAL_BAUD_150
+ 200, // CYGNUM_SERIAL_BAUD_200
+ 300, // CYGNUM_SERIAL_BAUD_300
+ 600, // CYGNUM_SERIAL_BAUD_600
+ 1200, // CYGNUM_SERIAL_BAUD_1200
+ 1800, // CYGNUM_SERIAL_BAUD_1800
+ 2400, // CYGNUM_SERIAL_BAUD_2400
+ 3600, // CYGNUM_SERIAL_BAUD_3600
+ 4800, // CYGNUM_SERIAL_BAUD_4800
+ 7200, // CYGNUM_SERIAL_BAUD_7200
+ 9600, // CYGNUM_SERIAL_BAUD_9600
+ 14400, // CYGNUM_SERIAL_BAUD_14400
+ 19200, // CYGNUM_SERIAL_BAUD_19200
+ 38400, // CYGNUM_SERIAL_BAUD_38400
+ 57600, // CYGNUM_SERIAL_BAUD_57600
+ 115200, // CYGNUM_SERIAL_BAUD_115200
+ 230400 // CYGNUM_SERIAL_BAUD_230400
+};
+
+/* The table contains divers to divide the
clock to configre a */
+/* approppriate for the UART.
*/
+
+static unsigned long dividers_table[]=
+{
+ 0,
+ 46080, // 50
+ 30720, // 75
+ 20945, // 110
+ 17130, // 134_5
+ 15360, // 150
+ 11520, // 200
+ 7680, // 300
+ 3840, // 600
+ 1920, // 1200
+ 1280, // 1800
+ 960, // 2400
+ 640, // 3600
+ 480, // 4800
+ 320, // 7200
+ 240, // 9600
+ 160, // 14400
+ 120, // 19200
+ 60, // 38400
+ 40, // 57600
+ 20, // 115200
+ 10 // 230400
+};
+
+/*******************************************************************************
+ MCF5282_uart_init() - This routine is called during
bootstrap to set up the
+ UART driver.
+
+ INPUT:
+ Pointer to the the device table.
+
+ RETURN:
+ Returns true if the initialization is successful.
Otherwise, it retuns false
+*/
+static bool MCF5282_uart_init(struct cyg_devtab_entry
* tab)
+{
+ serial_channel *chan = (serial_channel
*)tab->priv;
+ MCF5282_uart_info_t *MCF5282_uart_chan =
(MCF5282_uart_info_t *)chan->dev_priv;
+
+ #ifdef CYGPKG_IO_SERIAL_MCF5282_UART_CHANNEL0
+
+ /* Instantiation of the UART channel 0 data
strucutre. This data */
+ /* structure contains channel information.
*/
+
+ if (strcmp(tab->name,
CYGDAT_IO_SERIAL_MCF5282_UART_CHANNEL0_NAME) == 0)
+ {
+
+ /* Initiliaze the UART information data to
all zeros. */
+
+ memset(MCF5282_uart_chan,
sizeof(MCF5282_uart_info_t), 0);
+
+ /* Set the base address of the UART
registers to differentiate */
+ /* itself from the different regusters for
the other UART port. */
+
+ MCF5282_uart_chan->base =
(mcf5282_sim_uart_t*)&MCF5282_SIM->uart[0];
+
+ /* Set the UART interrupt vector number.
*/
+
+ MCF5282_uart_chan->uart_vector =
CYGNUM_HAL_VECTOR_UART1;
+
+ /* Set the autobaud state to idle.
*/
+
+ MCF5282_uart_chan->autobaud_state = AB_IDLE;
+
+ /* Initilize the UART 0 output pins */
+
+ MCF5282_SIM->gpio.puapar |= MCF5282_PUAPAR_URXD0 |
MCF5282_PUAPAR_UTXD0;
+ }
+ #endif
+
+ #ifdef CYGPKG_IO_SERIAL_MCF5282_UART_CHANNEL1
+
+ /* Instantiation of the UART channel 1 data
strucutre. This data structure contains
+ channel information.
+ */
+ if (strcmp(tab->name,
CYGDAT_IO_SERIAL_MCF5282_UART_CHANNEL1_NAME) == 0)
+ {
+
+ /* Initiliaze the UART information data to
all zeros. */
+
+ memset(MCF5282_uart_chan,
sizeof(MCF5282_uart_info_t), 0);
+
+ /* Set the base address of the UART
registers to differentiate */
+ /* itself from the different regusters for
the other UART port. */
+
+ MCF5282_uart_chan->base =
(mcf5282_sim_uart_t*)&MCF5282_SIM->uart[1];
+
+ /* Set the UART interrupt vector number.
*/
+
+ MCF5282_uart_chan->uart_vector =
CYGNUM_HAL_VECTOR_UART2;
+
+ /* Set the autobaud state to idle.
*/
+
+ MCF5282_uart_chan->autobaud_state = AB_IDLE;
+
+ /* Initilize the UART 1 output pins */
+ MCF5282_SIM->gpio.puapar |=
MCF5282_PUAPAR_URXD1 | MCF5282_PUAPAR_UTXD1;
+
+ }
+ #endif
+
+
+ if (chan->out_cbuf.len > 0) {
+
+ /* If the the buffer is greater than zero,
then the driver will */
+ /* use interrupt driven I/O. Hence, the
driver creates an */
+ /* interrupt context for the UART device.
*/
+
+
cyg_drv_interrupt_create(MCF5282_uart_chan->uart_vector,
+
MCF5282_UART_PRIORITY_LEVEL, // Priority -
Level 2
+
(cyg_addrword_t)chan, // Data item
passed to interrupt handler
+ MCF5282_uart_ISR,
+ MCF5282_uart_DSR,
+
&MCF5282_uart_chan->serial_interrupt_handle,
+
&MCF5282_uart_chan->serial_interrupt);
+
+
cyg_drv_interrupt_attach(MCF5282_uart_chan->serial_interrupt_handle);
+
+ (chan->callbacks->serial_init)(chan); //
Really only required for interrupt driven devices
+ }
+
+ // Configure Serial device.
+ return(MCF5282_uart_config_port(chan,
&chan->config));
+}
+
+/******************************************************************************************************
+ MCF5282_uart_config_port() - Configure the UART
port.
+
+ Internal function to actually configure the hardware
to desired baud rate, etc.
+
+ INPUT:
+ chan - The channel information
+ new_confg - The port configuration which
include the desired baud rate, etc.
+
+ RETURN:
+ Returns true if the port configuration is
successful. Otherwise, it retuns false
+
+ */
+static bool MCF5282_uart_config_port(serial_channel
*chan,
+
cyg_serial_info_t *new_config)
+{
+ MCF5282_uart_info_t * port = (MCF5282_uart_info_t
*) chan->dev_priv;
+ uint8 mode_reg = 0;
+ uint32 ubgs;
+ unsigned int baud_divisor;
+
+
+ /* Get the divisor from the baudrate table
which will use to */
+ /* configure the port's baud rate.
*/
+
+ baud_divisor =
baud_rates_table[new_config->baud];
+
+ /* If the divisor is zeor, we dont' configure
the port. */
+
+ if (baud_divisor == 0) return false;
+
+ /* Save the configuration value for later use.
*/
+
+ port->config = *new_config;
+
+ /* We first write the reset values into the
device and then configure */
+ /* the device the we way we want to use it.
*/
+
+ /* Reset Transmitter */
+
+ MCF5282_UART_WRITE(port->base->ucr,
MCF5282_UART_UCR_RESET_TX);
+
+ /* Reset Receiver */
+
+ MCF5282_UART_WRITE(port->base->ucr,
MCF5282_UART_UCR_RESET_RX);
+
+ /* Reset Mode Register */
+
+ MCF5282_UART_WRITE(port->base->ucr,
MCF5282_UART_UCR_RESET_MR);
+
+ /* Translate the parity configuration to UART
mode bits. */
+
+ switch(port->config.parity)
+ {
+ default:
+ case CYGNUM_SERIAL_PARITY_NONE:
+ mode_reg = 0 | MCF5282_UART_UMR1_PM_NONE;
+ break;
+ case CYGNUM_SERIAL_PARITY_EVEN:
+ mode_reg = 0 | MCF5282_UART_UMR1_PM_EVEN;
+ break;
+ case CYGNUM_SERIAL_PARITY_ODD:
+ mode_reg = 0 | MCF5282_UART_UMR1_PM_ODD;
+ break;
+ case CYGNUM_SERIAL_PARITY_MARK:
+ mode_reg = 0 | MCF5282_UART_UMR1_PM_FORCE_HI;
+ break;
+ case CYGNUM_SERIAL_PARITY_SPACE:
+ mode_reg = 0 | MCF5282_UART_UMR1_PM_FORCE_LO;
+ break;
+ }
+
+ /* Translate the number of bits per character
configuration to UART mode bits. */
+
+ switch(port->config.word_length)
+ {
+
+ case CYGNUM_SERIAL_WORD_LENGTH_5:
+ mode_reg |= MCF5282_UART_UMR1_BC_5;
+ break;
+ case CYGNUM_SERIAL_WORD_LENGTH_6:
+ mode_reg |= MCF5282_UART_UMR1_BC_6;
+ break;
+ case CYGNUM_SERIAL_WORD_LENGTH_7:
+ mode_reg |= MCF5282_UART_UMR1_BC_7;
+ break;
+ default:
+ case CYGNUM_SERIAL_WORD_LENGTH_8:
+ mode_reg |= MCF5282_UART_UMR1_BC_8;
+ break;
+ }
+
+ /* Configure the parity and the bits per
character */
+
+ MCF5282_UART_WRITE(port->base->umr, mode_reg);
+
+ /* Translate the stop bit length to UART mode
bits. */
+
+ switch(port->config.stop)
+ {
+ default:
+ case CYGNUM_SERIAL_STOP_1:
+ mode_reg = MCF5282_UART_UMR2_STOP_BITS_1;
+ break;
+ case CYGNUM_SERIAL_STOP_1_5:
+ mode_reg = MCF5282_UART_UMR2_STOP_BITS_15;
+ break;
+ case CYGNUM_SERIAL_STOP_2:
+ mode_reg = MCF5282_UART_UMR2_STOP_BITS_2;
+ break;
+ }
+
+ /* No echo or loopback */
+
+ MCF5282_UART_WRITE(port->base->umr, 0 |
MCF5282_UART_UMR2_CM_NORMAL | mode_reg);
+
+ /* Set Rx and Tx baud by timer */
+
+ MCF5282_UART_WRITE(port->base->ucr, 0 |
MCF5282_UART_UCSR_RCS(0xD) |
+ MCF5282_UART_UCSR_TCS(0xD));
+
+ /* Mask all USART interrupts */
+
+ MCF5282_UART_WRITE(port->base->uisr_uimr, 0);
+
+ /* Calculate baud settings */
+
+ ubgs =
(uint16)((CYGHWR_HAL_SYSTEM_CLOCK_MHZ*1000000)/
+ (baud_divisor * 32));
+
+ /* Program the baud settings to the device.
*/
+
+ MCF5282_UART_WRITE(port->base->udu, (uint8)((ubgs &
0xFF00) >> 8));
+ MCF5282_UART_WRITE(port->base->udl, (uint8)(ubgs &
0x00FF));
+
+ /* Enable receiver and transmitter */
+
+ MCF5282_UART_WRITE(port->base->ucr, 0 |
MCF5282_UART_UCR_TXRXEN);
+
+ /* Enable both transmit and receive interrupt. */
+
+ port->imr_mirror = MCF5282_UART_UIMR_TXRDY |
MCF5282_UART_UIMR_FFULL |
+ MCF5282_UART_UIMR_DB;
+ MCF5282_UART_WRITE(port->base->uisr_uimr,
port->imr_mirror);
+
+ return true; /* Returns true to indicate a
successful configuration */
+
+}
+
+/*******************************************************************************
+ MCF5282_uart_lookup() - This routine is called when
the device is "looked" up
+ (i.e. attached)
+
+ INPUT:
+ tab - pointer to a pointer of the device table
+ sub_tab - Pointer to the sub device table.
+ name - name of the device
+
+ RETURN:
+ always return ENOERR
+
+*/
+static Cyg_ErrNo MCF5282_uart_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;
+}
+
+/*******************************************************************************
+ MCF5282_uart_putc() - Send a character to the device
output buffer.
+
+ INPUT:
+ chan - pointer to the serial private data.
+ c - the character to output
+
+ RETURN:
+ 'true' if character is sent to device, return
'false' when we've
+ ran out of buffer space in the device itself.
+
+*/
+
+static bool MCF5282_uart_putc(serial_channel *chan,
unsigned char c)
+{
+ CYG_INTERRUPT_STATE int_state;
+ MCF5282_uart_info_t *port = (MCF5282_uart_info_t
*)chan->dev_priv;
+
+ /* Make sure the transmitter is not full. If it
is full, return false. */
+ if (!(MCF5282_UART_READ(port->base->usr_ucsr) &
MCF5282_UART_USR_TXRDY))
+ return false;
+
+ /* Enable transmit interrupt. */
+ HAL_DISABLE_INTERRUPTS(int_state);
+ port->imr_mirror |= MCF5282_UART_UIMR_TXRDY;
+ MCF5282_UART_WRITE(port->base->uisr_uimr,
port->imr_mirror);
+ HAL_RESTORE_INTERRUPTS(int_state);
+
+ /* Enable the UART transmit. */
+ MCF5282_UART_WRITE(port->base->ucr,
MCF5282_UART_UCR_TXRXEN);
+
+ /* Send the character */
+ MCF5282_UART_WRITE(port->base->urb_utb, c);
+
+ return true ;
+}
+
+
+/******************************************************************************************************
+ MCF5282_uart_getc() - Fetch a character from the
device input bufferand return it to the alling
+ routine. Wait until there is a
character ready.
+
+ INPUT:
+ chan - pointer to the serial private data.
+
+ RETURN:
+ the character read from the UART.
+
+ */
+static unsigned char MCF5282_uart_getc(serial_channel
*chan)
+{
+ MCF5282_uart_info_t * port = (MCF5282_uart_info_t
*)chan->dev_priv;
+
+ /* Wait until character has been received */
+
+ while (!(MCF5282_UART_READ(port->base->usr_ucsr) &
MCF5282_UART_USR_RXRDY))
+ {
+ diag_printf("ready poll");
+ }
+
+ /* Read the character from the FIFO queue. */
+
+ return MCF5282_UART_READ(port->base->urf);
+
+}
+
+
+/*******************************************************************************
+ MCF5282_uart_set_config() - Set up the device
characteristics; baud rate, etc.
+
+ INPUT:
+ chan - pointer to the serial private data.
+ key - configuration key (command).
+ xbuf - pointer to the configuration buffer
+ len - the length of the configuration buffer
+
+ RETURN:
+ NOERR - If the configuration is successful
+ EINVAL - If the argument is invalid
+
+*/
+
+Cyg_ErrNo MCF5282_uart_set_config(serial_channel
*chan, cyg_uint32 key,
+ const void *xbuf,
cyg_uint32 *len)
+{
+ cyg_serial_info_t *config = (cyg_serial_info_t
*)xbuf;
+ MCF5282_uart_info_t * port = (MCF5282_uart_info_t
*) chan->dev_priv;
+
+
+ switch (key) {
+ case CYG_IO_SET_CONFIG_SERIAL_INFO:
+ {
+ /* Set serial configuration. */
+ if ( *len < sizeof(cyg_serial_info_t) )
{
+ return EINVAL;
+ }
+ *len = sizeof(cyg_serial_info_t);
+
+ if (!MCF5282_uart_config_port(chan,
config))
+ return EINVAL;
+ }
+ break;
+
+ case CYG_IO_GET_CONFIG_SERIAL_INFO:
+ // Retrieve UART configuration
+ *config = port->config;
+ break;
+
+ default:
+ return EINVAL;
+ }
+ return ENOERR;
+}
+
+
+/*******************************************************************************
+ MCF5282_uart_start_xmit() - Enable the transmitter
on the device.
+
+ INPUT:
+ chan - pointer to the serial private data.
+
+*/
+static void MCF5282_uart_start_xmit(serial_channel
*chan)
+{
+ CYG_INTERRUPT_STATE int_state;
+ MCF5282_uart_info_t * port = (MCF5282_uart_info_t
*) chan->dev_priv;
+
+ /* Enable the UART transmit. */
+ MCF5282_UART_WRITE(port->base->ucr,
MCF5282_UART_UCR_TXEN);
+
+ /* Enable transmit interrupt */
+ HAL_DISABLE_INTERRUPTS(int_state);
+ port->imr_mirror |= MCF5282_UART_UIMR_TXRDY;
+ MCF5282_UART_WRITE(port->base->uisr_uimr,
port->imr_mirror);
+ HAL_RESTORE_INTERRUPTS(int_state);
+
+
+}
+
+
+/******************************************************************************************************
+ MCF5282_uart_stop_xmit() - Disable the transmitter
on the device
+
+ INPUT:
+ chan - pointer to the serial private data.
+
+*/
+static void MCF5282_uart_stop_xmit(serial_channel *
chan)
+{
+ CYG_INTERRUPT_STATE int_state;
+ MCF5282_uart_info_t * port = (MCF5282_uart_info_t
*) chan->dev_priv;
+
+ /* Disable transmit interrupt */
+ HAL_DISABLE_INTERRUPTS(int_state);
+ port->imr_mirror &= ~MCF5282_UART_UIMR_TXRDY;
+ MCF5282_UART_WRITE(port->base->uisr_uimr,
port->imr_mirror);
+ HAL_RESTORE_INTERRUPTS(int_state);
+
+ /* Disable the UART transmit.
+ !!!!!!!!!!!!!
+ !!!WARNING!!!
+ !!!!!!!!!!!!!
+ If the transmit the disabe
+ the diag_printf routines will poll forever to
transmit the
+ a character. Hence, don't ever disable the
transmit if
+ we want it to work with diag_printf.
+ */
+ //MCF5282_UART_WRITE(port->base->ucr,
MCF5282_UART_UCR_TXDE);
+
+
+}
+
+
+/******************************************************************************************************
+ MCF5282_uart_ISR() - UART I/O interrupt interrupt
service routine (ISR).
+
+ INPUT:
+ vector - the interrupt vector number
+ data - user parameter.
+
+
+ RETURN:
+ returns CYG_ISR_CALL_DSR to call the DSR.
+
+ */
+static cyg_uint32 MCF5282_uart_ISR(cyg_vector_t
vector, cyg_addrword_t data)
+{
+ serial_channel *chan = (serial_channel *) data;
+ MCF5282_uart_info_t * port = (MCF5282_uart_info_t
*) chan->dev_priv;
+
+
+ /* Write the value in the interrupt status
register back
+ to the mask register to disable the interrupt
temporarily.
+ */
+
+ MCF5282_UART_WRITE(port->base->uisr_uimr, 0);
+
+ return CYG_ISR_CALL_DSR; // Cause DSR to run
+}
+
+
+
+/******************************************************************************************************
+ MCF5282_uart_DSR() - Defered Service Routine (DSR) -
This routine processes the interrupt
+ from the device.
+
+ INPUT:
+ vector - The interrupt vector number
+ count - The nunber of DSR requests.
+ data - Device specific information
+
+*/
+
+static void MCF5282_uart_DSR(cyg_vector_t vector,
cyg_ucount32 count, cyg_addrword_t data)
+{
+ serial_channel *chan = (serial_channel *)data;
+ MCF5282_uart_info_t *port = (MCF5282_uart_info_t
*)chan->dev_priv;
+ volatile u8_t isr;
+
+
+ /* Retrieve the interrupt status bits. We use
these status bits to figure out
+ what process shouled we perform: read from the
UART or inform of a completion
+ of a data transmission.
+ */
+
+ /* Retrieve the interrupt status register so
+ * the DSR can look it up.
+ */
+
+
+ while((isr =
(MCF5282_UART_READ(port->base->uisr_uimr) &
port->imr_mirror)))
+ {
+ switch (port->autobaud_state)
+ {
+ default:
+ case AB_IDLE:
+ if (isr & MCF5282_UART_UISR_DB)
+ {
+ /* Detected the begin of a break, set
the state to AB_BEGIN_BREAK
+ */
+ port->autobaud_state = AB_BEGIN_BREAK;
+
+ /* Reset the Delta Break bit in the
UISR */
+ MCF5282_UART_WRITE(port->base->ucr,
MCF5282_UART_UCR_RESET_BKCHGINT);
+
+ }
+ break;
+ case AB_BEGIN_BREAK:
+ if (isr & MCF5282_UART_UISR_DB)
+ {
+ /* Detected the end of a break, set
the state to AB_BEGIN, and
+ setup autobaud detection.
+ */
+ port->autobaud_state = AB_BEGIN;
+
+ /* Reset the Delta Break bit in the
UISR and Enable autobaud */
+ MCF5282_UART_WRITE(port->base->ucr,
MCF5282_UART_UCR_RESET_BKCHGINT |
+
MCF5282_UART_UCR_ENAB);
+
+ /* Enable autobaud completion
interrupt */
+ port->imr_mirror |=
MCF5282_UART_UIMR_ABC;
+ /* Disable the delta break interrupt
so we can't receive
+ anymore break interrupt.
+ */
+ port->imr_mirror &=
~MCF5282_UART_UIMR_DB;
+
+ }
+ break;
+
+ case AB_BEGIN:
+ if (isr & MCF5282_UART_UISR_ABC)
+ {
+ int count;
+ // Retrieve the baudrate that we're
using now.
+ u16_t divider = (port->base->uabu <<
8) + port->base->uabl;
+ // Search in the list to find a match.
+ for (count =
sizeof(dividers_table)/sizeof(unsigned long) - 1;
+ count >= 0;
+ count--)
+ {
+ if (divider <
dividers_table[count]) break;
+ }
+
+ // Set the baud.
+ port->config.baud = count;
+
+ /* Autobaud completion */
+ port->autobaud_state = AB_IDLE;
+
+ /* Disable autobaud */
+ MCF5282_UART_WRITE(port->base->ucr,
MCF5282_UART_UCR_NONE);
+
+ /* Ignore autobaud completion
interrupt. */
+ port->imr_mirror &=
~MCF5282_UART_UIMR_ABC;
+
+ /* Reenable begin break change and
receive interrupt. */
+ port->imr_mirror |=
MCF5282_UART_UIMR_DB;
+
+ }
+ break;
+
+ }
+
+
+ /* Receive character interrupt */
+ if ((isr & MCF5282_UART_UISR_RXRDY))
+ /* Ignore all receive interrupt when
we're autobauding. */
+ {
+ // Read all the characters in the fifo.
+ while
((MCF5282_UART_READ(port->base->uisr_uimr) &
MCF5282_UART_UISR_RXRDY))
+ {
+ char c;
+ /* Read the character from the UART.
*/
+ c =
MCF5282_UART_READ(port->base->urb_utb);
+ /* Pass the read character to the
upper layer. */
+ (chan->callbacks->rcv_char)(chan, c);
+ }
+ }
+
+ /* Transmit complete interrupt */
+
+ if ((isr & MCF5282_UART_UISR_TXRDY))
+ {
+
+ /* Transmit holding register is empty
*/
+ (chan->callbacks->xmt_char)(chan);
+
+ }
+
+ }
+
+ /* Unmask all the DUART interrupts that were
masked in the ISR, so */
+ /* that we can receive the next interrupt.
*/
+
+ MCF5282_UART_WRITE(port->base->uisr_uimr,
port->imr_mirror);
+
+}
+
+#ifdef CYGPKG_IO_SERIAL_MCF5282_UART_CHANNEL0
+unsigned long MCF5282_uart_get_channel_0_baud_rate()
+{
+ /* return the baud rate for the first serial port
*/
+
+ return
baud_rates_table[MCF5282_uart_channel_info_0.config.baud];
+}
+#endif
+
+#ifdef CYGPKG_IO_SERIAL_MCF5282_UART_CHANNEL1
+unsigned long MCF5282_uart_get_channel_1_baud_rate()
+{
+ /* return the baud rate for the second serial
port */
+
+ return
baud_rates_table[MCF5282_uart_channel_info_1.config.baud];
+}
+#endif
+
+
__________________________________________________
Do You Yahoo!?
Tired of spam? Yahoo! Mail has the best spam protection around
http://mail.yahoo.com
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2005-04-13 13:43 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2005-04-13 13:43 patch to add support for mcf5282 serial device Errin Bechtel
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).