mirror of
https://github.com/brain-hackers/u-boot-brain
synced 2024-08-23 18:38:51 +09:00
![Wolfgang Denk](/assets/img/avatar_default.png)
According to the OMAP5912 Serial Interfaces Reference Guide (see http://focus.ti.com/lit/ug/spru760c/spru760c.pdf, page 150), the FIFO_EN enable bit in the FIFO Control Register (FCR) can only be changed when the baud clock is not running, i. e. when both DLL and DLH are set to 0. Thus make sure that DLL and DLH are 0 when writing the FCR. Signed-off-by: Wolfgang Denk <wd@denx.de>
80 lines
1.8 KiB
C
80 lines
1.8 KiB
C
/*
|
|
* COM1 NS16550 support
|
|
* originally from linux source (arch/ppc/boot/ns16550.c)
|
|
* modified to use CFG_ISA_MEM and new defines
|
|
*/
|
|
|
|
#include <config.h>
|
|
|
|
#ifdef CFG_NS16550
|
|
|
|
#include <ns16550.h>
|
|
|
|
#define LCRVAL LCR_8N1 /* 8 data, 1 stop, no parity */
|
|
#define MCRVAL (MCR_DTR | MCR_RTS) /* RTS/DTR */
|
|
#define FCRVAL (FCR_FIFO_EN | FCR_RXSR | FCR_TXSR) /* Clear & enable FIFOs */
|
|
|
|
void NS16550_init (NS16550_t com_port, int baud_divisor)
|
|
{
|
|
com_port->ier = 0x00;
|
|
#ifdef CONFIG_OMAP
|
|
com_port->mdr1 = 0x7; /* mode select reset TL16C750*/
|
|
#endif
|
|
com_port->lcr = LCR_BKSE | LCRVAL;
|
|
com_port->dll = 0;
|
|
com_port->dlm = 0;
|
|
com_port->lcr = LCRVAL;
|
|
com_port->mcr = MCRVAL;
|
|
com_port->fcr = FCRVAL;
|
|
com_port->lcr = LCR_BKSE | LCRVAL;
|
|
com_port->dll = baud_divisor & 0xff;
|
|
com_port->dlm = (baud_divisor >> 8) & 0xff;
|
|
com_port->lcr = LCRVAL;
|
|
#if defined(CONFIG_OMAP)
|
|
#if defined(CONFIG_APTIX)
|
|
com_port->mdr1 = 3; /* /13 mode so Aptix 6MHz can hit 115200 */
|
|
#else
|
|
com_port->mdr1 = 0; /* /16 is proper to hit 115200 with 48MHz */
|
|
#endif
|
|
#endif
|
|
}
|
|
|
|
void NS16550_reinit (NS16550_t com_port, int baud_divisor)
|
|
{
|
|
com_port->ier = 0x00;
|
|
com_port->lcr = LCR_BKSE | LCRVAL;
|
|
com_port->dll = 0;
|
|
com_port->dlm = 0;
|
|
com_port->lcr = LCRVAL;
|
|
com_port->mcr = MCRVAL;
|
|
com_port->fcr = FCRVAL;
|
|
com_port->lcr = LCR_BKSE;
|
|
com_port->dll = baud_divisor & 0xff;
|
|
com_port->dlm = (baud_divisor >> 8) & 0xff;
|
|
com_port->lcr = LCRVAL;
|
|
}
|
|
|
|
void NS16550_putc (NS16550_t com_port, char c)
|
|
{
|
|
while ((com_port->lsr & LSR_THRE) == 0);
|
|
com_port->thr = c;
|
|
}
|
|
|
|
char NS16550_getc (NS16550_t com_port)
|
|
{
|
|
while ((com_port->lsr & LSR_DR) == 0) {
|
|
#ifdef CONFIG_USB_TTY
|
|
extern void usbtty_poll(void);
|
|
usbtty_poll();
|
|
#endif
|
|
}
|
|
return (com_port->rbr);
|
|
}
|
|
|
|
int NS16550_tstc (NS16550_t com_port)
|
|
{
|
|
return ((com_port->lsr & LSR_DR) != 0);
|
|
}
|
|
|
|
#endif
|