From 0f653ba9844790ead3408f588697ebd72eda0d80 Mon Sep 17 00:00:00 2001 From: Gedare Bloom Date: Sun, 27 Nov 2011 17:26:32 +0000 Subject: 2011-11-27 Sebastien Bourdeauducq PR 1966/bsps * milkymist_console/console.c, milkymist_console/uart.c, milkymist_console/uart.h, milkymist_midi/midi.c: support for the new UART core and interrupt map --- c/src/lib/libbsp/lm32/shared/ChangeLog | 7 +++++ .../libbsp/lm32/shared/milkymist_console/console.c | 30 ++++++++++------------ .../libbsp/lm32/shared/milkymist_console/uart.c | 26 +++---------------- .../libbsp/lm32/shared/milkymist_console/uart.h | 7 +---- c/src/lib/libbsp/lm32/shared/milkymist_midi/midi.c | 16 +++++++----- 5 files changed, 35 insertions(+), 51 deletions(-) (limited to 'c') diff --git a/c/src/lib/libbsp/lm32/shared/ChangeLog b/c/src/lib/libbsp/lm32/shared/ChangeLog index f128ea0cac..39062618ef 100644 --- a/c/src/lib/libbsp/lm32/shared/ChangeLog +++ b/c/src/lib/libbsp/lm32/shared/ChangeLog @@ -1,3 +1,10 @@ +2011-11-27 Sebastien Bourdeauducq + + PR 1966/bsps + * milkymist_console/console.c, milkymist_console/uart.c, + milkymist_console/uart.h, milkymist_midi/midi.c: support for the new + UART core and interrupt map + 2011-08-02 Sebastien Bourdeauducq PR 1869/bsps 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 6a000090f2..04b2c1f12e 100644 --- a/c/src/lib/libbsp/lm32/shared/milkymist_console/console.c +++ b/c/src/lib/libbsp/lm32/shared/milkymist_console/console.c @@ -119,25 +119,24 @@ static ssize_t mmconsole_write(int minor, const char *buf, size_t n) rtems_interrupt_level level; rtems_interrupt_disable(level); - BSP_uart_txbusy = true; MM_WRITE(MM_UART_RXTX, *buf); rtems_interrupt_enable(level); return 0; } -static rtems_isr mmconsole_txdone(rtems_vector_number n) -{ - BSP_uart_txbusy = false; - lm32_interrupt_ack(1 << MM_IRQ_UARTTX); - rtems_termios_dequeue_characters(tty, 1); -} - -static rtems_isr mmconsole_rxdone(rtems_vector_number n) +static rtems_isr mmconsole_interrupt(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); + while (MM_READ(MM_UART_STAT) & UART_STAT_RX_EVT) { + c = MM_READ(MM_UART_RXTX); + MM_WRITE(MM_UART_STAT, UART_STAT_RX_EVT); + rtems_termios_enqueue_raw_characters(tty, &c, 1); + } + if (MM_READ(MM_UART_STAT) & UART_STAT_TX_EVT) { + MM_WRITE(MM_UART_STAT, UART_STAT_TX_EVT); + rtems_termios_dequeue_characters(tty, 1); + } + lm32_interrupt_ack(1 << MM_IRQ_UART); } static const rtems_termios_callbacks mmconsole_callbacks = { @@ -166,10 +165,9 @@ rtems_device_driver console_initialize( 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); + rtems_interrupt_catch(mmconsole_interrupt, MM_IRQ_UART, &dummy); + bsp_interrupt_vector_enable(MM_IRQ_UART); + MM_WRITE(MM_UART_CTRL, UART_CTRL_RX_INT|UART_CTRL_TX_INT); return RTEMS_SUCCESSFUL; } diff --git a/c/src/lib/libbsp/lm32/shared/milkymist_console/uart.c b/c/src/lib/libbsp/lm32/shared/milkymist_console/uart.c index f32a1615fd..8ca8950b99 100644 --- a/c/src/lib/libbsp/lm32/shared/milkymist_console/uart.c +++ b/c/src/lib/libbsp/lm32/shared/milkymist_console/uart.c @@ -17,8 +17,6 @@ #include "../include/system_conf.h" #include "uart.h" -bool BSP_uart_txbusy; - void BSP_uart_init(int baud) { MM_WRITE(MM_UART_DIV, CPU_FREQUENCY/baud/16); @@ -26,40 +24,24 @@ void BSP_uart_init(int baud) void BSP_uart_polled_write(char ch) { - int ip; rtems_interrupt_level level; rtems_interrupt_disable(level); - if (BSP_uart_txbusy) { - /* wait for the end of the transmission by the IRQ-based driver */ - do { - lm32_read_interrupts(ip); - } while (!(ip & (1 << MM_IRQ_UARTTX))); - lm32_interrupt_ack(1 << MM_IRQ_UARTTX); - } + while(!(MM_READ(MM_UART_STAT) & UART_STAT_THRE)); MM_WRITE(MM_UART_RXTX, ch); - do { - lm32_read_interrupts(ip); - } while (!(ip & (1 << MM_IRQ_UARTTX))); - /* if TX was busy, do not ack the IRQ - * so that the IRQ-based driver ISR is run */ - if (!BSP_uart_txbusy) - lm32_interrupt_ack(1 << MM_IRQ_UARTTX); + while(!(MM_READ(MM_UART_STAT) & UART_STAT_THRE)); rtems_interrupt_enable(level); } int BSP_uart_polled_read(void) { - int ip; char r; rtems_interrupt_level level; rtems_interrupt_disable(level); - do { - lm32_read_interrupts(ip); - } while (!(ip & (1 << MM_IRQ_UARTRX))); - lm32_interrupt_ack(1 << MM_IRQ_UARTRX); + while(!(MM_READ(MM_UART_STAT) & UART_STAT_RX_EVT)); r = MM_READ(MM_UART_RXTX); + MM_WRITE(MM_UART_STAT, UART_STAT_RX_EVT); rtems_interrupt_enable(level); return r; diff --git a/c/src/lib/libbsp/lm32/shared/milkymist_console/uart.h b/c/src/lib/libbsp/lm32/shared/milkymist_console/uart.h index 806f491bba..1c966cd008 100644 --- a/c/src/lib/libbsp/lm32/shared/milkymist_console/uart.h +++ b/c/src/lib/libbsp/lm32/shared/milkymist_console/uart.h @@ -1,21 +1,16 @@ /* - * This file contains definitions for LatticeMico32 UART + * This file contains definitions for the Milkymist UART * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at * http://www.rtems.com/license/LICENSE. * * $Id$ - * - * COPYRIGHT (c) Yann Sionneau (GSoC 2010) - * Telecom SudParis */ #ifndef _BSPUART_H #define _BSPUART_H -extern bool BSP_uart_txbusy; - void BSP_uart_init(int baud); void BSP_uart_polled_write(char ch); int BSP_uart_polled_read(void); diff --git a/c/src/lib/libbsp/lm32/shared/milkymist_midi/midi.c b/c/src/lib/libbsp/lm32/shared/milkymist_midi/midi.c index e71350bf1f..ad5c4342d8 100644 --- a/c/src/lib/libbsp/lm32/shared/milkymist_midi/midi.c +++ b/c/src/lib/libbsp/lm32/shared/milkymist_midi/midi.c @@ -31,9 +31,12 @@ static rtems_isr interrupt_handler(rtems_vector_number n) { unsigned char msg; - lm32_interrupt_ack(1 << MM_IRQ_MIDIRX); - msg = MM_READ(MM_MIDI_RXTX); - rtems_message_queue_send(midi_q, &msg, 1); + while (MM_READ(MM_MIDI_STAT) & MIDI_STAT_RX_EVT) { + msg = MM_READ(MM_MIDI_RXTX); + MM_WRITE(MM_MIDI_STAT, MIDI_STAT_RX_EVT); + rtems_message_queue_send(midi_q, &msg, 1); + } + lm32_interrupt_ack(1 << MM_IRQ_MIDI); } rtems_device_driver midi_initialize( @@ -57,11 +60,10 @@ rtems_device_driver midi_initialize( ); RTEMS_CHECK_SC(sc, "create MIDI queue"); - rtems_interrupt_catch(interrupt_handler, MM_IRQ_MIDIRX, &dummy); - bsp_interrupt_vector_enable(MM_IRQ_MIDIRX); - + rtems_interrupt_catch(interrupt_handler, MM_IRQ_MIDI, &dummy); + bsp_interrupt_vector_enable(MM_IRQ_MIDI); /* Only MIDI THRU mode is supported atm */ - MM_WRITE(MM_MIDI_THRU, 1); + MM_WRITE(MM_MIDI_CTRL, MIDI_CTRL_RX_INT|MIDI_CTRL_THRU); return RTEMS_SUCCESSFUL; } -- cgit v1.2.3