2 * (c) 2009 Adam Lackorzynski <adam@os.inf.tu-dresden.de>
3 * economic rights: Technische Universität Dresden (Germany)
5 * This file is part of TUD:OS and distributed under the terms of the
6 * GNU General Public License 2.
7 * Please see the COPYING-GPL-2 file for details.
9 #include "uart_pl011.h"
14 UART011_RXIM = 1 << 4,
15 UART011_TXIM = 1 << 5,
16 UART011_RTIM = 1 << 6,
17 UART011_FEIM = 1 << 7,
18 UART011_PEIM = 1 << 8,
19 UART011_BEIM = 1 << 9,
20 UART011_OEIM = 1 << 10,
22 UART011_RXIS = 1 << 4,
23 UART011_RTIS = 1 << 6,
25 UART011_RXIC = 1 << 4,
26 UART011_RTIC = 1 << 6,
28 UART01x_CR_UARTEN = 1, // UART enable
29 UART011_CR_LBE = 0x080, // loopback enable
30 UART011_CR_TXE = 0x100, // transmit enable
31 UART011_CR_RXE = 0x200, // receive enable
33 UART01x_FR_BUSY = 0x008,
34 UART01x_FR_RXFE = 0x010,
35 UART01x_FR_TXFF = 0x020,
37 UART01x_LCRH_PEN = 0x02, // parity enable
38 UART01x_LCRH_FEN = 0x10, // FIFO enable
39 UART01x_LCRH_WLEN_8 = 0x60,
54 unsigned long Uart_pl011::rd(unsigned long reg) const
56 volatile unsigned long *r = (unsigned long*)(_base + reg);
60 void Uart_pl011::wr(unsigned long reg, unsigned long val) const
62 volatile unsigned long *r = (unsigned long*)(_base + reg);
66 bool Uart_pl011::startup(unsigned long base)
69 wr(UART011_CR, UART01x_CR_UARTEN | UART011_CR_TXE | UART011_CR_RXE);
72 wr(UART011_LCRH, 0x60);
74 while (rd(UART01x_FR) & UART01x_FR_BUSY)
79 void Uart_pl011::shutdown()
82 wr(UART011_ICR, 0xffff);
86 bool Uart_pl011::enable_rx_irq(bool enable)
88 unsigned long mask = UART011_RXIM | UART011_RTIM;
90 wr(UART011_ICR, 0xffff);
91 wr(UART011_ECR, 0xff);
93 wr(UART011_IMSC, rd(UART011_IMSC) | mask);
95 wr(UART011_IMSC, rd(UART011_IMSC) & ~mask);
98 bool Uart_pl011::enable_tx_irq(bool /*enable*/) { return false; }
99 bool Uart_pl011::change_mode(Transfer_mode, Baud_rate r)
104 unsigned long old_cr = rd(UART011_CR);
108 wr(UART011_IBRD, 13);
109 wr(UART011_LCRH, UART01x_LCRH_WLEN_8 | UART01x_LCRH_FEN);
111 wr(UART011_CR, old_cr);
116 int Uart_pl011::get_char(bool blocking) const
118 while (!char_avail())
119 if (!blocking) return -1;
121 //wr(UART011_ICR, UART011_RXIC | UART011_RTIC);
123 int c = rd(UART01x_DR);
124 wr(UART011_ECR, 0xff);
128 int Uart_pl011::char_avail() const
130 return !(rd(UART01x_FR) & UART01x_FR_RXFE);
133 void Uart_pl011::out_char(char c) const
135 while (rd(UART01x_FR) & UART01x_FR_TXFF)
140 int Uart_pl011::write(char const *s, unsigned long count) const
142 unsigned long c = count;
150 while (rd(UART01x_FR) & UART01x_FR_BUSY)