diff options
author | Joel Sherrill <joel.sherrill@OARcorp.com> | 2011-08-01 13:48:40 +0000 |
---|---|---|
committer | Joel Sherrill <joel.sherrill@OARcorp.com> | 2011-08-01 13:48:40 +0000 |
commit | dce1032b6cdc2cd3c4e6b0ca3695aca6558c56c3 (patch) | |
tree | e485d78b238db7255395470e037305af8b8a642c /c/src/lib/libbsp/lm32/shared/milkymist_console/console.c | |
parent | 2011-08-01 Jennifer Averett <Jennifer.Averett@OARcorp.com> (diff) | |
download | rtems-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.c | 306 |
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; |