2 * (c) 2013 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_cadence.h"
10 #include "poll_timeout_counter.h"
29 Baud_rate_divider_reg0 = 0x34,
30 Flow_delay_reg0 = 0x38,
31 Tx_FIFO_trigger_level0 = 0x44,
56 bool Uart_cadence::startup(Io_register_block const *regs)
59 _regs->write<unsigned>(CR, Ctrl::Txres | Ctrl::Rxres);
60 change_mode(0, 115200);
61 _regs->write<unsigned>(CR, Ctrl::Rxen | Ctrl::Txen);
65 bool Uart_cadence::enable_rx_irq(bool enable)
67 _regs->write<unsigned>(RXWM, 1);
68 _regs->write<unsigned>(ISR, ~0U);
69 _regs->write<unsigned>(IER, enable ? IXR_RXOVR : 0);
73 void Uart_cadence::shutdown()
75 _regs->write<unsigned>(CR, Ctrl::Rxdis | Ctrl::Txdis);
78 bool Uart_cadence::change_mode(Transfer_mode, Baud_rate r)
81 _regs->write<unsigned>(Baud_rate_divider_reg0, div);
82 _regs->write<unsigned>(BAUDGEN, 50000000 / r / (div + 1));
83 _regs->write<unsigned>(MR, 0x20); // 8N1
87 int Uart_cadence::get_char(bool blocking) const
93 _regs->write<unsigned>(ISR, IXR_RXOVR);
94 return _regs->read<unsigned>(FIFO);
97 int Uart_cadence::char_avail() const
99 return !(_regs->read<unsigned>(SR) & IXR_RXEMPTY);
102 void Uart_cadence::out_char(char c) const
104 // check for some free fifo space
105 Poll_timeout_counter i(3000000);
106 while (i.test(_regs->read<unsigned>(SR) & IXR_TXFULL))
109 _regs->write<unsigned>(FIFO, c);
112 int Uart_cadence::write(char const *s, unsigned long count) const
114 unsigned long c = count;