-
old
|
new
|
|
15 | 15 | #include "../include/system_conf.h" |
16 | 16 | #include "uart.h" |
17 | 17 | |
18 | | bool BSP_uart_txbusy; |
19 | | |
20 | 18 | void BSP_uart_init(int baud) |
21 | 19 | { |
22 | 20 | MM_WRITE(MM_UART_DIV, CPU_FREQUENCY/baud/16); |
… |
… |
|
24 | 22 | |
25 | 23 | void BSP_uart_polled_write(char ch) |
26 | 24 | { |
27 | | int ip; |
28 | 25 | rtems_interrupt_level level; |
29 | 26 | |
30 | 27 | rtems_interrupt_disable(level); |
31 | | if (BSP_uart_txbusy) { |
32 | | /* wait for the end of the transmission by the IRQ-based driver */ |
33 | | do { |
34 | | lm32_read_interrupts(ip); |
35 | | } while (!(ip & (1 << MM_IRQ_UARTTX))); |
36 | | lm32_interrupt_ack(1 << MM_IRQ_UARTTX); |
37 | | } |
| 28 | while(!(MM_READ(MM_UART_STAT) & UART_STAT_THRE)); |
38 | 29 | MM_WRITE(MM_UART_RXTX, ch); |
39 | | do { |
40 | | lm32_read_interrupts(ip); |
41 | | } while (!(ip & (1 << MM_IRQ_UARTTX))); |
42 | | /* if TX was busy, do not ack the IRQ |
43 | | * so that the IRQ-based driver ISR is run */ |
44 | | if (!BSP_uart_txbusy) |
45 | | lm32_interrupt_ack(1 << MM_IRQ_UARTTX); |
| 30 | while(!(MM_READ(MM_UART_STAT) & UART_STAT_THRE)); |
46 | 31 | rtems_interrupt_enable(level); |
47 | 32 | } |
48 | 33 | |
49 | 34 | int BSP_uart_polled_read(void) |
50 | 35 | { |
51 | | int ip; |
52 | 36 | char r; |
53 | 37 | rtems_interrupt_level level; |
54 | 38 | |
55 | 39 | rtems_interrupt_disable(level); |
56 | | do { |
57 | | lm32_read_interrupts(ip); |
58 | | } while (!(ip & (1 << MM_IRQ_UARTRX))); |
59 | | lm32_interrupt_ack(1 << MM_IRQ_UARTRX); |
| 40 | while(!(MM_READ(MM_UART_STAT) & UART_STAT_RX_EVT)); |
60 | 41 | r = MM_READ(MM_UART_RXTX); |
| 42 | MM_WRITE(MM_UART_STAT, UART_STAT_RX_EVT); |
61 | 43 | rtems_interrupt_enable(level); |
62 | 44 | |
63 | 45 | return r; |
-
old
|
new
|
|
1 | 1 | /* |
2 | | * This file contains definitions for LatticeMico32 UART |
| 2 | * This file contains definitions for the Milkymist UART |
3 | 3 | * |
4 | 4 | * The license and distribution terms for this file may be |
5 | 5 | * found in the file LICENSE in this distribution or at |
6 | 6 | * http://www.rtems.com/license/LICENSE. |
7 | 7 | * |
8 | 8 | * $Id: uart.h,v 1.2 2011/08/01 13:48:39 joel Exp $ |
9 | | * |
10 | | * COPYRIGHT (c) Yann Sionneau <yann.sionneau@telecom-sudparis.eu> (GSoC 2010) |
11 | | * Telecom SudParis |
12 | 9 | */ |
13 | 10 | |
14 | 11 | #ifndef _BSPUART_H |
15 | 12 | #define _BSPUART_H |
16 | 13 | |
17 | | extern bool BSP_uart_txbusy; |
18 | | |
19 | 14 | void BSP_uart_init(int baud); |
20 | 15 | void BSP_uart_polled_write(char ch); |
21 | 16 | int BSP_uart_polled_read(void); |
-
old
|
new
|
|
119 | 119 | rtems_interrupt_level level; |
120 | 120 | |
121 | 121 | rtems_interrupt_disable(level); |
122 | | BSP_uart_txbusy = true; |
123 | 122 | MM_WRITE(MM_UART_RXTX, *buf); |
124 | 123 | rtems_interrupt_enable(level); |
125 | 124 | return 0; |
126 | 125 | } |
127 | 126 | |
128 | | static rtems_isr mmconsole_txdone(rtems_vector_number n) |
129 | | { |
130 | | BSP_uart_txbusy = false; |
131 | | lm32_interrupt_ack(1 << MM_IRQ_UARTTX); |
132 | | rtems_termios_dequeue_characters(tty, 1); |
133 | | } |
134 | | |
135 | | static rtems_isr mmconsole_rxdone(rtems_vector_number n) |
| 127 | static rtems_isr mmconsole_interrupt(rtems_vector_number n) |
136 | 128 | { |
137 | 129 | char c; |
138 | | c = MM_READ(MM_UART_RXTX); |
139 | | lm32_interrupt_ack(1 << MM_IRQ_UARTRX); |
140 | | rtems_termios_enqueue_raw_characters(tty, &c, 1); |
| 130 | while (MM_READ(MM_UART_STAT) & UART_STAT_RX_EVT) { |
| 131 | c = MM_READ(MM_UART_RXTX); |
| 132 | MM_WRITE(MM_UART_STAT, UART_STAT_RX_EVT); |
| 133 | rtems_termios_enqueue_raw_characters(tty, &c, 1); |
| 134 | } |
| 135 | if (MM_READ(MM_UART_STAT) & UART_STAT_TX_EVT) { |
| 136 | MM_WRITE(MM_UART_STAT, UART_STAT_TX_EVT); |
| 137 | rtems_termios_dequeue_characters(tty, 1); |
| 138 | } |
| 139 | lm32_interrupt_ack(1 << MM_IRQ_UART); |
141 | 140 | } |
142 | 141 | |
143 | 142 | static const rtems_termios_callbacks mmconsole_callbacks = { |
… |
… |
|
166 | 165 | if (status != RTEMS_SUCCESSFUL) |
167 | 166 | rtems_fatal_error_occurred(status); |
168 | 167 | |
169 | | rtems_interrupt_catch(mmconsole_txdone, MM_IRQ_UARTTX, &dummy); |
170 | | rtems_interrupt_catch(mmconsole_rxdone, MM_IRQ_UARTRX, &dummy); |
171 | | bsp_interrupt_vector_enable(MM_IRQ_UARTTX); |
172 | | bsp_interrupt_vector_enable(MM_IRQ_UARTRX); |
| 168 | rtems_interrupt_catch(mmconsole_interrupt, MM_IRQ_UART, &dummy); |
| 169 | bsp_interrupt_vector_enable(MM_IRQ_UART); |
| 170 | MM_WRITE(MM_UART_CTRL, UART_CTRL_RX_INT|UART_CTRL_TX_INT); |
173 | 171 | |
174 | 172 | return RTEMS_SUCCESSFUL; |
175 | 173 | } |
-
old
|
new
|
|
31 | 31 | { |
32 | 32 | unsigned char msg; |
33 | 33 | |
34 | | lm32_interrupt_ack(1 << MM_IRQ_MIDIRX); |
35 | | msg = MM_READ(MM_MIDI_RXTX); |
36 | | rtems_message_queue_send(midi_q, &msg, 1); |
| 34 | while (MM_READ(MM_MIDI_STAT) & MIDI_STAT_RX_EVT) { |
| 35 | msg = MM_READ(MM_MIDI_RXTX); |
| 36 | MM_WRITE(MM_MIDI_STAT, MIDI_STAT_RX_EVT); |
| 37 | rtems_message_queue_send(midi_q, &msg, 1); |
| 38 | } |
| 39 | lm32_interrupt_ack(1 << MM_IRQ_MIDI); |
37 | 40 | } |
38 | 41 | |
39 | 42 | rtems_device_driver midi_initialize( |
… |
… |
|
57 | 60 | ); |
58 | 61 | RTEMS_CHECK_SC(sc, "create MIDI queue"); |
59 | 62 | |
60 | | rtems_interrupt_catch(interrupt_handler, MM_IRQ_MIDIRX, &dummy); |
61 | | bsp_interrupt_vector_enable(MM_IRQ_MIDIRX); |
62 | | |
| 63 | rtems_interrupt_catch(interrupt_handler, MM_IRQ_MIDI, &dummy); |
| 64 | bsp_interrupt_vector_enable(MM_IRQ_MIDI); |
63 | 65 | /* Only MIDI THRU mode is supported atm */ |
64 | | MM_WRITE(MM_MIDI_THRU, 1); |
| 66 | MM_WRITE(MM_MIDI_CTRL, MIDI_CTRL_RX_INT|MIDI_CTRL_THRU); |
65 | 67 | |
66 | 68 | return RTEMS_SUCCESSFUL; |
67 | 69 | } |
-
old
|
new
|
|
26 | 26 | /* UART */ |
27 | 27 | #define MM_UART_RXTX (0xe0000000) |
28 | 28 | #define MM_UART_DIV (0xe0000004) |
| 29 | #define MM_UART_STAT (0xe0000008) |
| 30 | #define MM_UART_CTRL (0xe000000c) |
| 31 | |
| 32 | #define UART_STAT_THRE (0x1) |
| 33 | #define UART_STAT_RX_EVT (0x2) |
| 34 | #define UART_STAT_TX_EVT (0x4) |
| 35 | |
| 36 | #define UART_CTRL_RX_INT (0x1) |
| 37 | #define UART_CTRL_TX_INT (0x2) |
| 38 | #define UART_CTRL_THRU (0x4) |
29 | 39 | |
30 | 40 | /* Timers */ |
31 | 41 | #define MM_TIMER1_COMPARE (0xe0001024) |
… |
… |
|
225 | 235 | |
226 | 236 | /* MIDI */ |
227 | 237 | #define MM_MIDI_RXTX (0xe000b000) |
228 | | #define MM_MIDI_DIVISOR (0xe000b004) |
229 | | #define MM_MIDI_THRU (0xe000b008) |
| 238 | #define MM_MIDI_DIV (0xe000b004) |
| 239 | #define MM_MIDI_STAT (0xe000b008) |
| 240 | #define MM_MIDI_CTRL (0xe000b00c) |
| 241 | |
| 242 | #define MIDI_STAT_THRE (0x1) |
| 243 | #define MIDI_STAT_RX_EVT (0x2) |
| 244 | #define MIDI_STAT_TX_EVT (0x4) |
| 245 | |
| 246 | #define MIDI_CTRL_RX_INT (0x1) |
| 247 | #define MIDI_CTRL_TX_INT (0x2) |
| 248 | #define MIDI_CTRL_THRU (0x4) |
230 | 249 | |
231 | 250 | /* IR */ |
232 | 251 | #define MM_IR_RX (0xe000e000) |
… |
… |
|
248 | 267 | #define BT656_FILTER_INFRAME (0x4) |
249 | 268 | |
250 | 269 | /* Interrupts */ |
251 | | #define MM_IRQ_UARTRX (0) |
252 | | #define MM_IRQ_UARTTX (1) |
253 | | #define MM_IRQ_GPIO (2) |
254 | | #define MM_IRQ_TIMER0 (3) |
255 | | #define MM_IRQ_TIMER1 (4) |
256 | | #define MM_IRQ_AC97CRREQUEST (5) |
257 | | #define MM_IRQ_AC97CRREPLY (6) |
258 | | #define MM_IRQ_AC97DMAR (7) |
259 | | #define MM_IRQ_AC97DMAW (8) |
260 | | #define MM_IRQ_PFPU (9) |
261 | | #define MM_IRQ_TMU (10) |
262 | | #define MM_IRQ_ETHRX (11) |
263 | | #define MM_IRQ_ETHTX (12) |
264 | | #define MM_IRQ_VIDEOIN (13) |
265 | | #define MM_IRQ_MIDIRX (14) |
266 | | #define MM_IRQ_MIDITX (15) |
267 | | #define MM_IRQ_IR (16) |
268 | | #define MM_IRQ_USB (17) |
| 270 | #define MM_IRQ_UART (0) |
| 271 | #define MM_IRQ_GPIO (1) |
| 272 | #define MM_IRQ_TIMER0 (2) |
| 273 | #define MM_IRQ_TIMER1 (3) |
| 274 | #define MM_IRQ_AC97CRREQUEST (4) |
| 275 | #define MM_IRQ_AC97CRREPLY (5) |
| 276 | #define MM_IRQ_AC97DMAR (6) |
| 277 | #define MM_IRQ_AC97DMAW (7) |
| 278 | #define MM_IRQ_PFPU (8) |
| 279 | #define MM_IRQ_TMU (9) |
| 280 | #define MM_IRQ_ETHRX (10) |
| 281 | #define MM_IRQ_ETHTX (11) |
| 282 | #define MM_IRQ_VIDEOIN (12) |
| 283 | #define MM_IRQ_MIDI (13) |
| 284 | #define MM_IRQ_IR (14) |
| 285 | #define MM_IRQ_USB (15) |
269 | 286 | |
270 | 287 | /* Flash layout */ |
271 | 288 | #define FLASH_BASE (0x80000000) |
Download in other formats: