summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/lm32/shared/milkymist_console/console.c
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>2011-08-01 13:48:40 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>2011-08-01 13:48:40 +0000
commitdce1032b6cdc2cd3c4e6b0ca3695aca6558c56c3 (patch)
treee485d78b238db7255395470e037305af8b8a642c /c/src/lib/libbsp/lm32/shared/milkymist_console/console.c
parent2011-08-01 Jennifer Averett <Jennifer.Averett@OARcorp.com> (diff)
downloadrtems-dce1032b6cdc2cd3c4e6b0ca3695aca6558c56c3.tar.bz2
2011-08-01 Sebastien Bourdeauducq <sebastien.bourdeauducq@gmail.com>
PR 1869/bsps * startup/bspclean.c: New file. * include/tm27.h: Removed. * ChangeLog, Makefile.am, README, preinstall.am, include/bsp.h, include/system_conf.h, make/custom/milkymist.cfg, startup/linkcmds: Complete BSP for Milkymist One supporting Milkymist SOC 1.0.x. Includes new or updated drivers for: - Multi-standard video input (PAL/SECAM/NTSC) - Two DMX512 (RS485) ports - MIDI IN and MIDI OUT ports - VGA output - AC'97 audio - NOR flash - 10/100 Ethernet - Memory card (experimental and incomplete) - USB host connectors (input devices only) - RC5 infrared receiver - RS232 debug port
Diffstat (limited to 'c/src/lib/libbsp/lm32/shared/milkymist_console/console.c')
-rw-r--r--c/src/lib/libbsp/lm32/shared/milkymist_console/console.c306
1 files changed, 150 insertions, 156 deletions
diff --git a/c/src/lib/libbsp/lm32/shared/milkymist_console/console.c b/c/src/lib/libbsp/lm32/shared/milkymist_console/console.c
index 05ac7803df..6a000090f2 100644
--- a/c/src/lib/libbsp/lm32/shared/milkymist_console/console.c
+++ b/c/src/lib/libbsp/lm32/shared/milkymist_console/console.c
@@ -1,5 +1,5 @@
/*
- * Console driver for Lattice Mico32 (lm32).
+ * Console driver for Milkymist
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
@@ -7,220 +7,214 @@
*
* $Id$
*
- * Jukka Pietarinen <jukka.pietarinen@mrf.fi>, 2008,
- * Micro-Research Finland Oy
- *
- * COPYRIGHT (c) Yann Sionneau <yann.sionneau@telecom-sudparis.eu>, GSoc 2010
- * Telecom SudParis
+ * COPYRIGHT (c) 2010 Sebastien Bourdeauducq
*/
-#define NO_BSP_INIT
+#include <unistd.h>
+#include <termios.h>
#include <rtems.h>
-#include <bsp.h>
#include <rtems/libio.h>
+#include <rtems/console.h>
+#include <rtems/termiostypes.h>
+#include <bsp/irq-generic.h>
-void BSP_uart_polled_write(char ch);
-int BSP_uart_polled_read( void );
-char BSP_uart_is_character_ready(char *ch);
+#include "../include/system_conf.h"
+#include "uart.h"
-/* console_initialize
- *
- * This routine initializes the console IO driver.
- *
- * Input parameters: NONE
- *
- * Output parameters: NONE
- *
- * Return values:
- */
+BSP_output_char_function_type BSP_output_char = BSP_uart_polled_write;
+BSP_polling_getchar_function_type BSP_poll_char = BSP_uart_polled_read;
-rtems_device_driver console_initialize(
- rtems_device_major_number major,
- rtems_device_minor_number minor,
- void *arg
-)
+static struct rtems_termios_tty *tty;
+
+static int mmconsole_first_open(int major, int minor, void *arg)
{
- rtems_status_code status;
+ tty = ((rtems_libio_open_close_args_t *) arg)->iop->data1;
+ return rtems_termios_set_initial_baud(tty, UART_BAUD_RATE);
+}
- printk("console_initialize\n");
+static int mmconsole_last_close(int major, int minor, void *arg)
+{
+ return 0;
+}
- status = rtems_io_register_name(
- "/dev/console",
- major,
- (rtems_device_minor_number) 0
- );
+static int mmconsole_set_attributes(int minor, const struct termios *t)
+{
+ int baud;
- if (status != RTEMS_SUCCESSFUL)
- rtems_fatal_error_occurred(status);
+ switch (t->c_cflag & CBAUD) {
+ case B0:
+ baud = 0;
+ break;
+ case B50:
+ baud = 50;
+ break;
+ case B75:
+ baud = 75;
+ break;
+ case B110:
+ baud = 110;
+ break;
+ case B134:
+ baud = 134;
+ break;
+ case B150:
+ baud = 150;
+ break;
+ case B200:
+ baud = 200;
+ break;
+ case B300:
+ baud = 300;
+ break;
+ case B600:
+ baud = 600;
+ break;
+ case B1200:
+ baud = 1200;
+ break;
+ case B1800:
+ baud = 1800;
+ break;
+ case B2400:
+ baud = 2400;
+ break;
+ case B4800:
+ baud = 4800;
+ break;
+ case B9600:
+ baud = 9600;
+ break;
+ case B19200:
+ baud = 19200;
+ break;
+ case B38400:
+ baud = 38400;
+ break;
+ case B57600:
+ baud = 57600;
+ break;
+ case B115200:
+ baud = 115200;
+ break;
+ case B230400:
+ baud = 230400;
+ break;
+ case B460800:
+ baud = 460800;
+ break;
+ default:
+ baud = -1;
+ break;
+ }
- return RTEMS_SUCCESSFUL;
-}
+ if (baud > 0)
+ MM_WRITE(MM_UART_DIV, CPU_FREQUENCY/baud/16);
-/* is_character_ready
- *
- * This routine returns TRUE if a character is available.
- *
- * Input parameters: NONE
- *
- * Output parameters: NONE
- *
- * Return values:
- */
+ return 0;
+}
-bool is_character_ready(
- char *ch
-)
+static ssize_t mmconsole_write(int minor, const char *buf, size_t n)
{
- return BSP_uart_is_character_ready(ch);
-}
+ rtems_interrupt_level level;
-/* inbyte
- *
- * This routine reads a character from the SOURCE.
- *
- * Input parameters: NONE
- *
- * Output parameters: NONE
- *
- * Return values:
- * character read from SOURCE
- */
+ rtems_interrupt_disable(level);
+ BSP_uart_txbusy = true;
+ MM_WRITE(MM_UART_RXTX, *buf);
+ rtems_interrupt_enable(level);
+ return 0;
+}
-int inbyte( void )
+static rtems_isr mmconsole_txdone(rtems_vector_number n)
{
- /*
- * If polling, wait until a character is available.
- */
+ BSP_uart_txbusy = false;
+ lm32_interrupt_ack(1 << MM_IRQ_UARTTX);
+ rtems_termios_dequeue_characters(tty, 1);
+}
- return BSP_uart_polled_read();
+static rtems_isr mmconsole_rxdone(rtems_vector_number n)
+{
+ char c;
+ c = MM_READ(MM_UART_RXTX);
+ lm32_interrupt_ack(1 << MM_IRQ_UARTRX);
+ rtems_termios_enqueue_raw_characters(tty, &c, 1);
}
-/* outbyte
- *
- * This routine transmits a character out the SOURCE. It may support
- * XON/XOFF flow control.
- *
- * Input parameters:
- * ch - character to be transmitted
- *
- * Output parameters: NONE
- */
+static const rtems_termios_callbacks mmconsole_callbacks = {
+ .firstOpen = mmconsole_first_open,
+ .lastClose = mmconsole_last_close,
+ .pollRead = NULL,
+ .write = mmconsole_write,
+ .setAttributes = mmconsole_set_attributes,
+ .stopRemoteTx = NULL,
+ .startRemoteTx = NULL,
+ .outputUsesInterrupts = TERMIOS_IRQ_DRIVEN
+};
-void outbyte(
- char ch
+rtems_device_driver console_initialize(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *arg
)
{
- /*
- * If polling, wait for the transmitter to be ready.
- * Check for flow control requests and process.
- * Then output the character.
- */
+ rtems_status_code status;
+ rtems_isr_entry dummy;
- BSP_uart_polled_write(ch);
-}
+ rtems_termios_initialize();
-/*
- * Open entry point
- */
+ status = rtems_io_register_name("/dev/console", major, 0);
+ if (status != RTEMS_SUCCESSFUL)
+ rtems_fatal_error_occurred(status);
+
+ rtems_interrupt_catch(mmconsole_txdone, MM_IRQ_UARTTX, &dummy);
+ rtems_interrupt_catch(mmconsole_rxdone, MM_IRQ_UARTRX, &dummy);
+ bsp_interrupt_vector_enable(MM_IRQ_UARTTX);
+ bsp_interrupt_vector_enable(MM_IRQ_UARTRX);
+
+ return RTEMS_SUCCESSFUL;
+}
rtems_device_driver console_open(
rtems_device_major_number major,
rtems_device_minor_number minor,
- void * arg
+ void *arg
)
{
- return RTEMS_SUCCESSFUL;
+ return rtems_termios_open(major, minor, arg, &mmconsole_callbacks);
}
-/*
- * Close entry point
- */
-
rtems_device_driver console_close(
rtems_device_major_number major,
rtems_device_minor_number minor,
- void * arg
+ void *arg
)
{
- return RTEMS_SUCCESSFUL;
+ return rtems_termios_close(arg);
}
-/*
- * read bytes from the serial port. We only have stdin.
- */
-
rtems_device_driver console_read(
rtems_device_major_number major,
rtems_device_minor_number minor,
- void * arg
+ void *arg
)
{
- rtems_libio_rw_args_t *rw_args;
- char *buffer;
- int maximum;
- int count = 0;
-
- rw_args = (rtems_libio_rw_args_t *) arg;
-
- buffer = rw_args->buffer;
- maximum = rw_args->count;
-
- for (count = 0; count < maximum; count++) {
- buffer[ count ] = inbyte();
- if (buffer[ count ] == '\n' || buffer[ count ] == '\r') {
- buffer[ count++ ] = '\n';
- break;
- }
- }
-
- rw_args->bytes_moved = count;
- return (count >= 0) ? RTEMS_SUCCESSFUL : RTEMS_UNSATISFIED;
+ return rtems_termios_read(arg);
}
-/*
- * write bytes to the serial port. Stdout and stderr are the same.
- */
-
rtems_device_driver console_write(
rtems_device_major_number major,
rtems_device_minor_number minor,
- void * arg
+ void *arg
)
{
- int count;
- int maximum;
- rtems_libio_rw_args_t *rw_args;
- char *buffer;
-
- rw_args = (rtems_libio_rw_args_t *) arg;
-
- buffer = rw_args->buffer;
- maximum = rw_args->count;
-
- for (count = 0; count < maximum; count++) {
- if ( buffer[ count ] == '\n') {
- outbyte('\r');
- }
- outbyte( buffer[ count ] );
- }
-
- rw_args->bytes_moved = maximum;
- return 0;
+ return rtems_termios_write(arg);
}
-/*
- * IO Control entry point
- */
-
rtems_device_driver console_control(
rtems_device_major_number major,
rtems_device_minor_number minor,
- void * arg
+ void *arg
)
{
- return RTEMS_SUCCESSFUL;
+ return rtems_termios_ioctl(arg);
}
-
-BSP_output_char_function_type BSP_output_char = BSP_uart_polled_write;
-BSP_polling_getchar_function_type BSP_poll_char = BSP_uart_polled_read;