?? ser_esci.c
字號:
//==========================================================================
//
// ser_esci.c
//
// Freescale sSCI 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.
// Copyright (C) 2996 eCosCentric Ltd
//
// 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.
// -------------------------------------------
//####ECOSGPLCOPYRIGHTEND####
//==========================================================================
//#####DESCRIPTIONBEGIN####
//
// Author(s): Ilija Koco <ilijak@siva.com.mk>
// Contributors:
// Date: 2006-04-20
// Purpose: eSCI Serial I/O module (interrupt driven version)
// Description:
//
//
//####DESCRIPTIONEND####
//==========================================================================
#include <pkgconf/io_serial.h>
#include <pkgconf/io.h>
#include <cyg/io/io.h>
#include <cyg/hal/hal_intr.h>
#include <cyg/hal/hal_arbiter.h>
#include <cyg/hal/var_io.h>
#include <cyg/io/devtab.h>
#include <cyg/infra/diag.h>
#include <cyg/io/serial.h>
#include <cyg/devs/ser_esci.h>
// Only build this driver for if ESCI is needed.
#ifdef CYGPKG_IO_SERIAL_FREESCALE_ESCI
CYG_ADDRWORD esci_base; // Base address of the esci port
CYG_WORD interrupt_num; // INTC interrupt vector
cyg_priority_t interrupt_priority; // INTC interupt priority
cyg_interrupt interrupt_obj; // Interrupt object
cyg_handle_t interrupt_handle; // Interrupt handle
} esci_serial_info;
static bool esci_serial_init(struct cyg_devtab_entry * tab);
static bool esci_serial_putc(serial_channel * chan, unsigned char c);
static Cyg_ErrNo esci_serial_lookup(struct cyg_devtab_entry ** tab,
struct cyg_devtab_entry * sub_tab,
const char * name);
static unsigned char esci_serial_getc(serial_channel *chan);
static Cyg_ErrNo esci_serial_set_config(serial_channel *chan, cyg_uint32 key,
const void *xbuf, cyg_uint32 *len);
static void esci_serial_start_xmit(serial_channel *chan);
static void esci_serial_stop_xmit(serial_channel *chan);
// Interrupt servers
static cyg_uint32 esci_serial_ISR(cyg_vector_t vector, cyg_addrword_t data);
static void esci_serial_DSR(cyg_vector_t vector, cyg_ucount32 count,
cyg_addrword_t data);
static SERIAL_FUNS(esci_serial_funs,
esci_serial_putc,
esci_serial_getc,
esci_serial_set_config,
esci_serial_start_xmit,
esci_serial_stop_xmit);
// Available baud rates
static unsigned short select_baud[] = {
0, // Unused
0, // 50 bps unsupported
0, // 75 bps unsupported
0, // 110 bps unsupported
0, // 134_5 bps unsupported
0, // 150 bps unsupported
0, // 200 bps unsupported
FREESCALE_ESCI_BAUD(300), // 300 bps
FREESCALE_ESCI_BAUD(600), // 600 bps
FREESCALE_ESCI_BAUD(1200), // 1200 bps
0, // 1800 bps unsupported
FREESCALE_ESCI_BAUD(2400), // 2400 bps
0, // 3600 bps unsupported
FREESCALE_ESCI_BAUD(4800), // 4800 bps
0, // 7200 bps unsupported
FREESCALE_ESCI_BAUD(9600), // 9600 bps
FREESCALE_ESCI_BAUD(14400), // 14400 bps
FREESCALE_ESCI_BAUD(19200), // 19200 bps
FREESCALE_ESCI_BAUD(38400), // 38400 bps
FREESCALE_ESCI_BAUD(57600), // 57600 bps
FREESCALE_ESCI_BAUD(115200), // 115200 bps
0 // 230400 bps unsupported
};
#if defined CYGPKG_IO_SERIAL_FREESCALE_ESCI_A
static esci_serial_info esci_serial_info0 = {
esci_base : CYGADDR_IO_SERIAL_FREESCALE_ESCI_A_BASE,
interrupt_num : CYGNUM_IO_SERIAL_FREESCALE_ESCI_A_INT_VECTOR,
interrupt_priority : CYGNUM_IO_SERIAL_FREESCALE_ESCI_A_INT_PRIORITY
};
#if CYGNUM_IO_SERIAL_FREESCALE_ESCI_A_BUFSIZE > 0
static unsigned char
esci_serial_out_buf0[CYGNUM_IO_SERIAL_FREESCALE_ESCI_A_BUFSIZE];
static unsigned char
esci_serial_in_buf0[CYGNUM_IO_SERIAL_FREESCALE_ESCI_A_BUFSIZE];
static
SERIAL_CHANNEL_USING_INTERRUPTS(
esci_serial_channel0,
esci_serial_funs,
esci_serial_info0,
CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_FREESCALE_ESCI_A_BAUD),
CYG_SERIAL_STOP_DEFAULT,
CYG_SERIAL_PARITY_DEFAULT,
CYG_SERIAL_WORD_LENGTH_DEFAULT,
CYG_SERIAL_FLAGS_DEFAULT,
&esci_serial_out_buf0[0],
sizeof(esci_serial_out_buf0),
&esci_serial_in_buf0[0],
sizeof(esci_serial_in_buf0));
#else
static
SERIAL_CHANNEL(esci_serial_channel0,
esci_serial_funs,
esci_serial_info0,
CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_FREESCALE_ESCI_A_BAUD),
CYG_SERIAL_STOP_DEFAULT,
CYG_SERIAL_PARITY_DEFAULT,
CYG_SERIAL_WORD_LENGTH_DEFAULT,
CYG_SERIAL_FLAGS_DEFAULT);
#endif
DEVTAB_ENTRY(esci_serial_io0,
CYGDAT_IO_SERIAL_FREESCALE_ESCI_A_NAME,
0, // does not depend on a lower level device driver
&cyg_io_serial_devio,
esci_serial_init,
esci_serial_lookup,
&esci_serial_channel0);
#endif // ifdef CYGPKG_IO_SERIAL_FREESCALE_ESCI_A
#if defined CYGPKG_IO_SERIAL_FREESCALE_ESCI_B
static esci_serial_info esci_serial_info1 = {
esci_base : CYGADDR_IO_SERIAL_FREESCALE_ESCI_B_BASE,
interrupt_num : CYGNUM_IO_SERIAL_FREESCALE_ESCI_B_INT_VECTOR,
interrupt_priority : CYGNUM_IO_SERIAL_FREESCALE_ESCI_B_INT_PRIORITY
};
#if CYGNUM_IO_SERIAL_FREESCALE_ESCI_B_BUFSIZE > 0
static unsigned char
esci_serial_out_buf1[CYGNUM_IO_SERIAL_FREESCALE_ESCI_B_BUFSIZE];
static unsigned char
esci_serial_in_buf1[CYGNUM_IO_SERIAL_FREESCALE_ESCI_B_BUFSIZE];
static
SERIAL_CHANNEL_USING_INTERRUPTS(esci_serial_channel1,
esci_serial_funs,
esci_serial_info1,
CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_FREESCALE_ESCI_B_BAUD),
CYG_SERIAL_STOP_DEFAULT,
CYG_SERIAL_PARITY_DEFAULT,
CYG_SERIAL_WORD_LENGTH_DEFAULT,
CYG_SERIAL_FLAGS_DEFAULT,
&esci_serial_out_buf1[0],
sizeof(esci_serial_out_buf1),
&esci_serial_in_buf1[0],
sizeof(esci_serial_in_buf1));
#else
static
SERIAL_CHANNEL(esci_serial_channel1,
esci_serial_funs,
esci_serial_info1,
CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_FREESCALE_ESCI_B_BAUD),
CYG_SERIAL_STOP_DEFAULT,
CYG_SERIAL_PARITY_DEFAULT,
CYG_SERIAL_WORD_LENGTH_DEFAULT,
CYG_SERIAL_FLAGS_DEFAULT);
#endif
DEVTAB_ENTRY(esci_serial_io1,
CYGDAT_IO_SERIAL_FREESCALE_ESCI_B_NAME,
0, // does not depend on a lower level device driver
&cyg_io_serial_devio,
esci_serial_init,
esci_serial_lookup,
&esci_serial_channel1);
#endif // ifdef CYGPKG_IO_SERIAL_FREESCALE_ESCI_B
#if defined CYGPKG_IO_SERIAL_FREESCALE_ESCI_C
static esci_serial_info esci_serial_info2 = {
esci_base : CYGADDR_IO_SERIAL_FREESCALE_ESCI_C_BASE,
interrupt_num : CYGNUM_IO_SERIAL_FREESCALE_ESCI_C_INT_VECTOR,
interrupt_priority : CYGNUM_IO_SERIAL_FREESCALE_ESCI_C_INT_PRIORITY
};
#if CYGNUM_IO_SERIAL_FREESCALE_ESCI_C_BUFSIZE > 0
static unsigned char
esci_serial_out_buf2[CYGNUM_IO_SERIAL_FREESCALE_ESCI_C_BUFSIZE];
static unsigned char
esci_serial_in_buf2[CYGNUM_IO_SERIAL_FREESCALE_ESCI_C_BUFSIZE];
static
SERIAL_CHANNEL_USING_INTERRUPTS(esci_serial_channel2,
esci_serial_funs,
esci_serial_info2,
CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_FREESCALE_ESCI_C_BAUD),
CYG_SERIAL_STOP_DEFAULT,
CYG_SERIAL_PARITY_DEFAULT,
CYG_SERIAL_WORD_LENGTH_DEFAULT,
CYG_SERIAL_FLAGS_DEFAULT,
&esci_serial_out_buf2[0],
sizeof(esci_serial_out_buf2),
&esci_serial_in_buf2[0],
sizeof(esci_serial_in_buf2));
#else
static
SERIAL_CHANNEL(esci_serial_channel2,
esci_serial_funs,
esci_serial_info2,
CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_FREESCALE_ESCI_C_BAUD),
CYG_SERIAL_STOP_DEFAULT,
CYG_SERIAL_PARITY_DEFAULT,
CYG_SERIAL_WORD_LENGTH_DEFAULT,
CYG_SERIAL_FLAGS_DEFAULT);
#endif
DEVTAB_ENTRY(esci_serial_io2,
CYGDAT_IO_SERIAL_FREESCALE_ESCI_C_NAME,
0, // does not depend on a lower level device driver
&cyg_io_serial_devio,
esci_serial_init,
esci_serial_lookup,
&esci_serial_channel2);
#endif // ifdef CYGPKG_IO_SERIAL_FREESCALE_ESCI_C
#if defined CYGPKG_IO_SERIAL_FREESCALE_ESCI_D
static esci_serial_info esci_serial_info3 = {
esci_base : CYGADDR_IO_SERIAL_FREESCALE_ESCI_D_BASE,
interrupt_num : CYGNUM_IO_SERIAL_FREESCALE_ESCI_D_INT_VECTOR,
interrupt_priority : CYGNUM_IO_SERIAL_FREESCALE_ESCI_D_INT_PRIORITY
};
#if CYGNUM_IO_SERIAL_FREESCALE_ESCI_D_BUFSIZE > 0
static unsigned char
esci_serial_out_buf3[CYGNUM_IO_SERIAL_FREESCALE_ESCI_D_BUFSIZE];
static unsigned char
esci_serial_in_buf3[CYGNUM_IO_SERIAL_FREESCALE_ESCI_D_BUFSIZE];
static
SERIAL_CHANNEL_USING_INTERRUPTS(esci_serial_channel3,
esci_serial_funs,
esci_serial_info3,
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -