summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/m68k/genmcf548x/console/console.c
diff options
context:
space:
mode:
Diffstat (limited to 'c/src/lib/libbsp/m68k/genmcf548x/console/console.c')
-rw-r--r--c/src/lib/libbsp/m68k/genmcf548x/console/console.c843
1 files changed, 0 insertions, 843 deletions
diff --git a/c/src/lib/libbsp/m68k/genmcf548x/console/console.c b/c/src/lib/libbsp/m68k/genmcf548x/console/console.c
deleted file mode 100644
index 32e5601a17..0000000000
--- a/c/src/lib/libbsp/m68k/genmcf548x/console/console.c
+++ /dev/null
@@ -1,843 +0,0 @@
-/*===============================================================*\
-| Project: RTEMS generic mcf548x BSP |
-+-----------------------------------------------------------------+
-| File: console.c |
-+-----------------------------------------------------------------+
-| The file contains the console driver code of generic MCF548x |
-| BSP. |
-+-----------------------------------------------------------------+
-| Copyright (c) 2007 |
-| Embedded Brains GmbH |
-| Obere Lagerstr. 30 |
-| D-82178 Puchheim |
-| Germany |
-| rtems@embedded-brains.de |
-+-----------------------------------------------------------------+
-| |
-| Parts of the code has been derived from the "dBUG source code" |
-| package Freescale is providing for M548X EVBs. The usage of |
-| the modified or unmodified code and it's integration into the |
-| generic mcf548x BSP has been done according to the Freescale |
-| license terms. |
-| |
-| The Freescale license terms can be reviewed in the file |
-| |
-| Freescale_license.txt |
-| |
-+-----------------------------------------------------------------+
-| |
-| The generic mcf548x BSP has been developed on the basic |
-| structures and modules of the av5282 BSP. |
-| |
-+-----------------------------------------------------------------+
-| |
-| The license and distribution terms for this file may be |
-| found in the file LICENSE in this distribution or at |
-| |
-| http://www.rtems.org/license/LICENSE. |
-| |
-+-----------------------------------------------------------------+
-| |
-| date history ID |
-| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
-| 12.11.07 1.0 ras |
-| |
-\*===============================================================*/
-
- /*
- * Multi UART console serial I/O.
- *
- * TO DO: Add DMA input/output
- */
-
-#include <stdio.h>
-#include <fcntl.h>
-#include <termios.h>
-#include <malloc.h>
-
-#include <bsp.h>
-#include <bsp/irq-generic.h>
-#include <rtems/libio.h>
-#include <rtems/termiostypes.h>
-#include <rtems/console.h>
-#include <rtems/bspIo.h>
-
-#define UART_INTC0_IRQ_VECTOR(x) (64+35-(x))
-
-#define MCF548X_PSC_SR_ERROR ( MCF548X_PSC_SR_RB_NEOF | \
- MCF548X_PSC_SR_FE_PHYERR | \
- MCF548X_PSC_SR_PE_CRCERR | \
- MCF548X_PSC_SR_OE )
-
-static ssize_t IntUartPollWrite(int minor, const char *buf, size_t len);
-static int IntUartPollRead (int minor);
-static int IntUartSetAttributes(int minor, const struct termios *t);
-
-static void
-psc_output_char( char c )
-{
- rtems_interrupt_level level;
-
- rtems_interrupt_disable(level);
- while (!((MCF548X_PSC_SR(CONSOLE_PORT) & MCF548X_PSC_SR_TXRDY)))
- continue;
- *((uint8_t *) &MCF548X_PSC_TB(CONSOLE_PORT)) = c;
- while (!((MCF548X_PSC_SR(CONSOLE_PORT) & MCF548X_PSC_SR_TXRDY)))
- continue;
- rtems_interrupt_enable(level);
-}
-
-static void
-psc_output_char_init(char c)
-{
- IntUartSetAttributes(CONSOLE_PORT, NULL);
- BSP_output_char = psc_output_char;
- psc_output_char(c);
-}
-
-BSP_output_char_function_type BSP_output_char = psc_output_char_init;
-
-BSP_polling_getchar_function_type BSP_poll_char = NULL;
-
-#define MAX_UART_INFO 4
-#define RX_BUFFER_SIZE 248
-
-struct IntUartInfoStruct
-{
- int iomode;
- volatile int imr;
- int baud;
- int databits;
- int parity;
- int stopbits;
- int hwflow;
- int rx_in;
- int rx_out;
- char rx_buffer[RX_BUFFER_SIZE];
- void *ttyp;
-};
-
-struct IntUartInfoStruct IntUartInfo[MAX_UART_INFO];
-
-static int GetBaud( int baudHandle )
-{
- int baud = BSP_CONSOLE_BAUD;
- switch(baudHandle)
- {
- case B0:
- baud = (int)0;
- break;
- case B1200:
- baud = (int)1200;
- break;
- case B2400:
- baud = (int)2400;
- break;
- case B4800:
- baud = (int)4800;
- break;
- case B9600:
- baud = (int)9600;
- break;
- case B19200:
- baud = (int)19200;
- break;
- case B38400:
- baud = (int)38400;
- break;
- case B57600:
- baud = (int)57600;
- break;
- case B115200:
- baud = (int)115200;
- break;
- }
- return baud;
-}
-
-/***************************************************************************
- Function : IntUartSet
-
- Description : This updates the hardware UART settings.
- ***************************************************************************/
-static void
-IntUartSet(int minor, int baud, int databits, int parity, int stopbits, int hwflow)
-{
- uint8_t psc_mode_1 = 0, psc_mode_2 = 0;
- uint16_t divider;
- int level;
- struct IntUartInfoStruct *info = &IntUartInfo[minor];
-
- rtems_interrupt_disable(level);
-
- /* disable interrupts, clear RTS line, and disable the UARTS */
- /* Mask all psc interrupts */
- MCF548X_PSC_IMR(minor) = 0x0000;
-
- /* Clear RTS to send */
- MCF548X_PSC_OPSET(minor) &= ~(MCF548X_PSC_OPSET_RTS);
-
- /* Disable receiver and transmitter */
- MCF548X_PSC_CR(minor) &= ~(MCF548X_PSC_CR_RX_ENABLED | MCF548X_PSC_CR_TX_ENABLED);
-
- /* provide gpio settings */
- switch (minor)
- {
- case 0:
- MCF548X_GPIO_PAR_PSC0 = (0 | MCF548X_GPIO_PAR_PSC0_PAR_TXD0 | MCF548X_GPIO_PAR_PSC0_PAR_RXD0);
-
- if(hwflow)
- {
- MCF548X_GPIO_PAR_PSC0 |= (0 | MCF548X_GPIO_PAR_PSC0_PAR_CTS0_CTS | MCF548X_GPIO_PAR_PSC0_PAR_RTS0_RTS);
- }
- break;
- case 1:
- MCF548X_GPIO_PAR_PSC1 = (0 | MCF548X_GPIO_PAR_PSC1_PAR_TXD1 | MCF548X_GPIO_PAR_PSC1_PAR_RXD1);
-
- if(hwflow)
- {
- MCF548X_GPIO_PAR_PSC1 |= (0 | MCF548X_GPIO_PAR_PSC1_PAR_CTS1_CTS | MCF548X_GPIO_PAR_PSC1_PAR_RTS1_RTS);
- }
- break;
- case 2:
- MCF548X_GPIO_PAR_PSC2 = (0 | MCF548X_GPIO_PAR_PSC2_PAR_TXD2 | MCF548X_GPIO_PAR_PSC2_PAR_RXD2);
-
- if(hwflow)
- {
- MCF548X_GPIO_PAR_PSC2 |= (0 | MCF548X_GPIO_PAR_PSC2_PAR_CTS2_CTS | MCF548X_GPIO_PAR_PSC2_PAR_RTS2_RTS);
- }
- break;
- case 3:
- MCF548X_GPIO_PAR_PSC3 = (0 | MCF548X_GPIO_PAR_PSC3_PAR_TXD3 | MCF548X_GPIO_PAR_PSC3_PAR_RXD3);
-
- if(hwflow)
- {
- MCF548X_GPIO_PAR_PSC3 |= (0 | MCF548X_GPIO_PAR_PSC3_PAR_CTS3_CTS | MCF548X_GPIO_PAR_PSC3_PAR_RTS3_RTS);
- }
- break;
- default:
- break;
- }
-
- /* save the current values */
- info->imr = 0;
- info->baud = baud;
- info->databits = databits;
- info->parity = parity;
- info->stopbits = stopbits;
- info->hwflow = hwflow;
-
- /* Put PSC in UART mode */
- MCF548X_PSC_SICR(minor) = MCF548X_PSC_SICR_SIM_UART;
-
- /* set the baud rate values */
- MCF548X_PSC_CSR(minor) = (0 | MCF548X_PSC_CSR_RCSEL_SYS_CLK | MCF548X_PSC_CSR_TCSEL_SYS_CLK);
-
- /* Calculate baud settings */
- divider = (uint16_t)((get_CPU_clock_speed())/(baud * 32));
- MCF548X_PSC_CTUR(minor) = (uint8_t) ((divider >> 8) & 0xFF);
- MCF548X_PSC_CTLR(minor) = (uint8_t) (divider & 0xFF);
-
- /* Reset transmitter, receiver, mode register, and error conditions */
- MCF548X_PSC_CR(minor) = MCF548X_PSC_CR_RESET_RX;
- MCF548X_PSC_CR(minor) = MCF548X_PSC_CR_RESET_TX;
- MCF548X_PSC_CR(minor) = MCF548X_PSC_CR_RESET_ERROR;
- MCF548X_PSC_CR(minor) = MCF548X_PSC_CR_BKCHGINT;
- MCF548X_PSC_CR(minor) = MCF548X_PSC_CR_RESET_MR;
-
- /* check to see if doing hardware flow control */
- if ( hwflow )
- {
- /* set hardware flow options */
- psc_mode_1 = MCF548X_PSC_MR_RXRTS;
- psc_mode_2 = MCF548X_PSC_MR_TXCTS;
- }
-
- /* set mode registers */
- psc_mode_1 |= (uint8_t)(parity | databits);
- psc_mode_2 |= (uint8_t)(stopbits);
-
- /* set mode registers */
- MCF548X_PSC_MR(minor) = psc_mode_1;
- MCF548X_PSC_MR(minor) = psc_mode_2;
-
- /* Setup FIFO Alarms */
- MCF548X_PSC_RFAR(minor) = MCF548X_PSC_RFAR_ALARM(248);
- MCF548X_PSC_TFAR(minor) = MCF548X_PSC_TFAR_ALARM(248);
-
- /* check to see if interrupts need to be enabled */
- if ( info->iomode != TERMIOS_POLLED )
- {
- /* enable rx interrupts */
- info->imr |= MCF548X_PSC_IMR_RXRDY_FU;
- MCF548X_PSC_IMR(minor) = info->imr;
- }
-
- /* check to see if doing hardware flow control */
- if ( hwflow )
- {
- /* assert the RTS line */
- MCF548X_PSC_OPSET(minor) = MCF548X_PSC_OPSET_RTS;
- }
-
- rtems_interrupt_enable(level);
-
- /* Enable receiver and transmitter */
- MCF548X_PSC_CR(minor) =(0 | MCF548X_PSC_CR_RX_ENABLED | MCF548X_PSC_CR_TX_ENABLED);
-
-
-}
-
-/***************************************************************************
- Function : IntUartSetAttributes
-
- Description : This provides the hardware-dependent portion of tcsetattr().
- value and sets it. At the moment this just sets the baud rate.
-
- Note: The highest baudrate is 115200 as this stays within
- an error of +/- 5% at 25MHz processor clock
- ***************************************************************************/
-static int
-IntUartSetAttributes(int minor, const struct termios *t)
-{
-/* set default index values */
-#ifdef HAS_DBUG
- int baud = DBUG_SETTINGS.console_baudrate;
-#else
- int baud = (int)BSP_CONSOLE_BAUD;
-#endif
- int databits = (int)MCF548X_PSC_MR_BC_8;
- int parity = (int)MCF548X_PSC_MR_PM_NONE;
- int stopbits = (int)MCF548X_PSC_MR_SB_STOP_BITS_1;
- int hwflow = (int)1;
- struct IntUartInfoStruct *info = &IntUartInfo[minor];
-
- /* check to see if input is valid */
- if ( t != (const struct termios *)0 )
- {
- /* determine baud rate index */
- baud = GetBaud( t->c_ospeed );
-
- /* determine data bits */
- switch ( t->c_cflag & CSIZE )
- {
- case CS5:
- databits = (int)MCF548X_PSC_MR_BC_5;
- break;
- case CS6:
- databits = (int)MCF548X_PSC_MR_BC_6;
- break;
- case CS7:
- databits = (int)MCF548X_PSC_MR_BC_7;
- break;
- case CS8:
- databits = (int)MCF548X_PSC_MR_BC_8;
- break;
- }
-
- /* determine if parity is enabled */
- if ( t->c_cflag & PARENB )
- {
- if ( t->c_cflag & PARODD )
- {
- /* odd parity */
- parity = (int)MCF548X_PSC_MR_PM_ODD;
- }
- else
- {
- /* even parity */
- parity = (int)MCF548X_PSC_MR_PM_EVEN;
- }
- }
-
- /* determine stop bits */
- if ( t->c_cflag & CSTOPB )
- {
- /* two stop bits */
- stopbits = (int)MCF548X_PSC_MR_SB_STOP_BITS_2;
- }
-
- /* check to see if hardware flow control */
- if ( t->c_cflag & CRTSCTS )
- {
- hwflow = 1;
- }
- }
-
- /* check to see if values have changed */
- if ( ( baud != info->baud ) ||
- ( databits != info->databits ) ||
- ( parity != info->parity ) ||
- ( stopbits != info->stopbits ) ||
- ( hwflow != info->hwflow ) )
- {
-
- /* call function to set values */
- IntUartSet(minor, baud, databits, parity, stopbits, hwflow);
- }
-
-return RTEMS_SUCCESSFUL;
-
-}
-
-/***************************************************************************
- Function : IntUartInterruptHandler
-
- Description : This is the interrupt handler for the internal uart. It
- determines which channel caused the interrupt before queueing any received
- chars and dequeueing chars waiting for transmission.
- ***************************************************************************/
-static rtems_isr
-IntUartInterruptHandler(rtems_vector_number v)
-{
- unsigned int chan = v - UART_INTC0_IRQ_VECTOR(0);
- struct IntUartInfoStruct *info = &IntUartInfo[chan];
-
- /* check to see if received data */
- if ( MCF548X_PSC_ISR(chan) & MCF548X_PSC_ISR_RXRDY_FU )
- {
- /* read data and put into the receive buffer */
- while ( MCF548X_PSC_SR(chan) & MCF548X_PSC_SR_RXRDY )
- {
-
- /* put data in rx buffer */
- info->rx_buffer[info->rx_in] = *((volatile uint8_t *)&MCF548X_PSC_RB(chan));
-
- /* check for errors */
- if ( MCF548X_PSC_SR(chan) & MCF548X_PSC_SR_ERROR )
- {
- /* clear the error */
- MCF548X_PSC_CR(chan) = MCF548X_PSC_CR_RESET_ERROR;
- }
-
- /* update buffer values */
- info->rx_in++;
-
- if ( info->rx_in >= RX_BUFFER_SIZE )
- {
- info->rx_in = 0;
- }
- }
- /* Make sure the port has been opened */
- if ( info->ttyp )
- {
-
- /* check to see if task driven */
- if ( info->iomode == TERMIOS_TASK_DRIVEN )
- {
- /* notify rx task that rx buffer has data */
- rtems_termios_rxirq_occured(info->ttyp);
- }
- else
- {
- /* Push up the received data */
- rtems_termios_enqueue_raw_characters(info->ttyp, info->rx_buffer, info->rx_in);
- info->rx_in = 0;
- }
- }
- }
-
- /* check to see if data needs to be transmitted */
- if ( ( info->imr & MCF548X_PSC_IMR_TXRDY ) &&
- ( MCF548X_PSC_ISR(chan) & MCF548X_PSC_ISR_TXRDY ) )
- {
-
- /* disable tx interrupts */
- info->imr &= ~MCF548X_PSC_IMR_TXRDY;
- MCF548X_PSC_IMR(chan) = info->imr;
-
- /* tell upper level that character has been sent */
- if ( info->ttyp )
- rtems_termios_dequeue_characters(info->ttyp, 1);
- }
-
-}
-
-/***************************************************************************
- Function : IntUartInitialize
-
- Description : This initialises the internal uart hardware for all
- internal uarts. If the internal uart is to be interrupt driven then the
- interrupt vectors are hooked.
- ***************************************************************************/
-static void
-IntUartInitialize(void)
-{
- unsigned int chan;
- struct IntUartInfoStruct *info;
- rtems_isr_entry old_handler;
-
- for ( chan = 0; chan < MAX_UART_INFO; chan++ )
- {
- info = &IntUartInfo[chan];
-
- info->ttyp = NULL;
- info->rx_in = 0;
- info->rx_out = 0;
- info->baud = -1;
- info->databits = -1;
- info->parity = -1;
- info->stopbits = -1;
- info->hwflow = -1;
-
- MCF548X_PSC_ACR(chan) = 0;
- MCF548X_PSC_IMR(chan) = 0;
- if ( info->iomode != TERMIOS_POLLED )
- {
- rtems_interrupt_catch (IntUartInterruptHandler,
- UART_INTC0_IRQ_VECTOR(chan),
- &old_handler);
- }
-
- /* set uart default values */
- IntUartSetAttributes(chan, NULL);
-
- /* unmask interrupt */
- bsp_interrupt_vector_enable(MCF548X_IRQ_PSC(chan));
- } /* of chan loop */
-
- BSP_output_char = psc_output_char;
-} /* IntUartInitialise */
-
-/***************************************************************************
- Function : IntUartInterruptWrite
-
- Description : This writes a single character to the appropriate uart
- channel. This is either called during an interrupt or in the user's task
- to initiate a transmit sequence. Calling this routine enables Tx
- interrupts.
- ***************************************************************************/
-static ssize_t
-IntUartInterruptWrite (int minor, const char *buf, size_t len)
-{
- if (len > 0) {
- /* write out character */
- *(volatile uint8_t *)(&MCF548X_PSC_TB(minor)) = *buf;
-
- /* enable tx interrupt */
- IntUartInfo[minor].imr |= MCF548X_PSC_IMR_TXRDY;
- MCF548X_PSC_IMR(minor) = IntUartInfo[minor].imr;
- }
-
- return 0;
-}
-
-/***************************************************************************
- Function : IntUartInterruptOpen
-
- Description : This enables interrupts when the tty is opened.
- ***************************************************************************/
-static int
-IntUartInterruptOpen(int major, int minor, void *arg)
-{
- struct IntUartInfoStruct *info = &IntUartInfo[minor];
-
- /* enable the uart */
- MCF548X_PSC_CR(minor) = (MCF548X_PSC_CR_TX_ENABLED | MCF548X_PSC_CR_RX_ENABLED);
-
- /* check to see if interrupts need to be enabled */
- if ( info->iomode != TERMIOS_POLLED )
- {
- /* enable rx interrupts */
- info->imr |= MCF548X_PSC_IMR_RXRDY_FU;
- MCF548X_PSC_IMR(minor) = info->imr;
- }
-
- /* check to see if doing hardware flow control */
- if ( info->hwflow )
- {
- /* assert the RTS line */
- MCF548X_PSC_OPSET(minor) = MCF548X_PSC_OPSET_RTS;
- }
-
- return 0;
-}
-
-
-/***************************************************************************
- Function : IntUartInterruptClose
-
- Description : This disables interrupts when the tty is closed.
- ***************************************************************************/
-static int
-IntUartInterruptClose(int major, int minor, void *arg)
-{
- struct IntUartInfoStruct *info = &IntUartInfo[minor];
-
- /* disable the interrupts and the uart */
- MCF548X_PSC_IMR(minor) = 0;
- MCF548X_PSC_CR(minor) = (MCF548X_PSC_CR_TX_ENABLED | MCF548X_PSC_CR_RX_ENABLED);
-
- /* reset values */
- info->ttyp = NULL;
- info->imr = 0;
- info->rx_in = 0;
- info->rx_out = 0;
-
- return 0;
-}
-
-/***************************************************************************
- Function : IntUartTaskRead
-
- Description : This reads all available characters from the internal uart
- and places them into the termios buffer. The rx interrupts will be
- re-enabled after all data has been read.
- ***************************************************************************/
-static int
-IntUartTaskRead(int minor)
-{
- char buffer[RX_BUFFER_SIZE];
- int count;
- int rx_in;
- int index = 0;
- struct IntUartInfoStruct *info = &IntUartInfo[minor];
-
- /* determine number of values to copy out */
- rx_in = info->rx_in;
- if ( info->rx_out <= rx_in )
- {
- count = rx_in - info->rx_out;
- }
- else
- {
- count = (RX_BUFFER_SIZE - info->rx_out) + rx_in;
- }
-
- /* copy data into local buffer from rx buffer */
- while ( ( index < count ) && ( index < RX_BUFFER_SIZE ) )
- {
- /* copy data byte */
- buffer[index] = info->rx_buffer[info->rx_out];
- index++;
-
- /* increment rx buffer values */
- info->rx_out++;
- if ( info->rx_out >= RX_BUFFER_SIZE )
- {
- info->rx_out = 0;
- }
- }
-
- /* check to see if buffer is not empty */
- if ( count > 0 )
- {
- /* set characters into termios buffer */
- rtems_termios_enqueue_raw_characters(info->ttyp, buffer, count);
- }
-
- return EOF;
-}
-
-
-/***************************************************************************
- Function : IntUartPollRead
-
- Description : This reads a character from the internal uart. It returns
- to the caller without blocking if not character is waiting.
- ***************************************************************************/
-static int
-IntUartPollRead (int minor)
-{
-if (!((MCF548X_PSC_SR(minor) & MCF548X_PSC_SR_RXRDY)))
- return(-1);
-
- return *((uint8_t *)&MCF548X_PSC_RB(minor));
-}
-
-
-/***************************************************************************
- Function : IntUartPollWrite
-
- Description : This writes out each character in the buffer to the
- appropriate internal uart channel waiting till each one is sucessfully
- transmitted.
- ***************************************************************************/
-static ssize_t
-IntUartPollWrite (int minor, const char *buf, size_t len)
-{
- size_t retval = len;
-/* loop over buffer */
- while ( len-- )
- {
- /* block until we can transmit */
- while (!((MCF548X_PSC_SR(minor) & MCF548X_PSC_SR_TXRDY)))
- continue;
- /* transmit data byte */
- *((uint8_t *)&MCF548X_PSC_TB(minor)) = *buf++;
- }
- return retval;
-}
-
-/***************************************************************************
- Function : console_initialize
-
- Description : This initialises termios, both sets of uart hardware before
- registering /dev/tty devices for each channel and the system /dev/console.
- ***************************************************************************/
-rtems_device_driver console_initialize(
- rtems_device_major_number major,
- rtems_device_minor_number minor,
- void *arg )
-{
- rtems_status_code status;
-
-
- /* Set up TERMIOS */
- rtems_termios_initialize ();
-
- /* set io modes for the different channels and initialize device */
- IntUartInfo[minor].iomode = TERMIOS_IRQ_DRIVEN; //TERMIOS_POLLED;
- IntUartInitialize();
-
- /* Register the console port */
- status = rtems_io_register_name ("/dev/console", major, CONSOLE_PORT);
- if ( status != RTEMS_SUCCESSFUL )
- {
- rtems_fatal_error_occurred (status);
- }
-
- /* Register the other port */
- if ( CONSOLE_PORT != 0 )
- {
- status = rtems_io_register_name ("/dev/tty00", major, 0);
- if ( status != RTEMS_SUCCESSFUL )
- {
- rtems_fatal_error_occurred (status);
- }
- }
- if ( CONSOLE_PORT != 1 )
- {
- status = rtems_io_register_name ("/dev/tty01", major, 1);
- if ( status != RTEMS_SUCCESSFUL )
- {
- rtems_fatal_error_occurred (status);
- }
- }
-
- return(RTEMS_SUCCESSFUL);
-}
-
-/***************************************************************************
- Function : console_open
-
- Description : This actually opens the device depending on the minor
- number set during initialisation. The device specific access routines are
- passed to termios when the devices is opened depending on whether it is
- polled or not.
- ***************************************************************************/
-rtems_device_driver console_open(
- rtems_device_major_number major,
- rtems_device_minor_number minor,
- void * arg)
-{
- rtems_status_code status = RTEMS_INVALID_NUMBER;
- rtems_libio_open_close_args_t *args = (rtems_libio_open_close_args_t *)arg;
- struct IntUartInfoStruct *info;
-
- static const rtems_termios_callbacks IntUartPollCallbacks = {
- NULL, /* firstOpen */
- NULL, /* lastClose */
- IntUartPollRead, /* pollRead */
- IntUartPollWrite, /* write */
- IntUartSetAttributes, /* setAttributes */
- NULL, /* stopRemoteTx */
- NULL, /* startRemoteTx */
- TERMIOS_POLLED /* mode */
- };
- static const rtems_termios_callbacks IntUartIntrCallbacks = {
- IntUartInterruptOpen, /* firstOpen */
- IntUartInterruptClose, /* lastClose */
- NULL, /* pollRead */
- IntUartInterruptWrite, /* write */
- IntUartSetAttributes, /* setAttributes */
- NULL, /* stopRemoteTx */
- NULL, /* startRemoteTx */
- TERMIOS_IRQ_DRIVEN /* mode */
- };
-
- static const rtems_termios_callbacks IntUartTaskCallbacks = {
- IntUartInterruptOpen, /* firstOpen */
- IntUartInterruptClose, /* lastClose */
- IntUartTaskRead, /* pollRead */
- IntUartInterruptWrite, /* write */
- IntUartSetAttributes, /* setAttributes */
- NULL, /* stopRemoteTx */
- NULL, /* startRemoteTx */
- TERMIOS_TASK_DRIVEN /* mode */
- };
-
- /* open the port depending on the minor device number */
- if ( ( minor >= 0 ) && ( minor < MAX_UART_INFO ) )
- {
- info = &IntUartInfo[minor];
- switch ( info->iomode )
- {
- case TERMIOS_POLLED:
- status = rtems_termios_open(major, minor, arg, &IntUartPollCallbacks);
- break;
- case TERMIOS_IRQ_DRIVEN:
- status = rtems_termios_open(major, minor, arg, &IntUartIntrCallbacks);
- info->ttyp = args->iop->data1;
- break;
- case TERMIOS_TASK_DRIVEN:
- status = rtems_termios_open(major, minor, arg, &IntUartTaskCallbacks);
- info->ttyp = args->iop->data1;
- break;
- }
- }
-
- return( status );
-}
-
-/***************************************************************************
- Function : console_close
-
- Description : This closes the device via termios
- ***************************************************************************/
-rtems_device_driver console_close(
- rtems_device_major_number major,
- rtems_device_minor_number minor,
- void * arg)
-{
- return(rtems_termios_close (arg));
-}
-
-/***************************************************************************
- Function : console_read
-
- Description : Read from the device via termios
- ***************************************************************************/
-rtems_device_driver console_read(
- rtems_device_major_number major,
- rtems_device_minor_number minor,
- void * arg)
-{
- return(rtems_termios_read (arg));
-}
-
-/***************************************************************************
- Function : console_write
-
- Description : Write to the device via termios
- ***************************************************************************/
-rtems_device_driver console_write(
- rtems_device_major_number major,
- rtems_device_minor_number minor,
- void * arg)
-{
- return(rtems_termios_write (arg));
-}
-
-/***************************************************************************
- Function : console_ioctl
-
- Description : Pass the IOCtl call to termios
- ***************************************************************************/
-rtems_device_driver console_control(
- rtems_device_major_number major,
- rtems_device_minor_number minor,
- void * arg)
-{
- return( rtems_termios_ioctl (arg) );
-}