mirror of
https://gitlab.rtems.org/rtems/rtos/rtems.git
synced 2026-08-27 00:13:46 +08:00
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
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user