summaryrefslogtreecommitdiffstats
path: root/c
diff options
context:
space:
mode:
authorGedare Bloom <gedare@rtems.org>2011-11-27 17:26:32 +0000
committerGedare Bloom <gedare@rtems.org>2011-11-27 17:26:32 +0000
commit0f653ba9844790ead3408f588697ebd72eda0d80 (patch)
tree27c544a49e30144426d10f5750cc439f4ff7bfd3 /c
parent2011-11-27 Sebastien Bourdeauducq <seb@tmplab.org> (diff)
downloadrtems-0f653ba9844790ead3408f588697ebd72eda0d80.tar.bz2
2011-11-27 Sebastien Bourdeauducq <seb@tmplab.org>
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
Diffstat (limited to 'c')
-rw-r--r--c/src/lib/libbsp/lm32/shared/ChangeLog7
-rw-r--r--c/src/lib/libbsp/lm32/shared/milkymist_console/console.c30
-rw-r--r--c/src/lib/libbsp/lm32/shared/milkymist_console/uart.c26
-rw-r--r--c/src/lib/libbsp/lm32/shared/milkymist_console/uart.h7
-rw-r--r--c/src/lib/libbsp/lm32/shared/milkymist_midi/midi.c16
5 files changed, 35 insertions, 51 deletions
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 <seb@tmplab.org>
+
+ 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 <sebastien.bourdeauducq@gmail.com>
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 <yann.sionneau@telecom-sudparis.eu> (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;
}