/* * (c) 2007 Sascha Hauer * * (C) Copyright 2009 Freescale Semiconductor, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include #ifdef CONFIG_STMP3XXX_DBGUART #include "stmp3xxx_dbguart.h" DECLARE_GLOBAL_DATA_PTR; /* * Set baud rate. The settings are always 8n1: * 8 data bits, no parity, 1 stop bit */ void serial_setbrg(void) { u32 cr, lcr_h; u32 quot; /* Disable everything */ cr = REG_RD(DBGUART_BASE + UARTDBGCR); REG_WR(DBGUART_BASE + UARTDBGCR, 0); /* Calculate and set baudrate */ quot = (CONFIG_DBGUART_CLK * 4) / gd->baudrate; REG_WR(DBGUART_BASE + UARTDBGFBRD, quot & 0x3f); REG_WR(DBGUART_BASE + UARTDBGIBRD, quot >> 6); /* Set 8n1 mode, enable FIFOs */ lcr_h = WLEN8 | FEN; REG_WR(DBGUART_BASE + UARTDBGLCR_H, lcr_h); /* Enable Debug UART */ REG_WR(DBGUART_BASE + UARTDBGCR, cr); } int serial_init(void) { u32 cr; /* Disable UART */ REG_WR(DBGUART_BASE + UARTDBGCR, 0); /* Mask interrupts */ REG_WR(DBGUART_BASE + UARTDBGIMSC, 0); /* Set default baudrate */ serial_setbrg(); /* Enable UART */ cr = TXE | RXE | UARTEN; REG_WR(DBGUART_BASE + UARTDBGCR, cr); return 0; } /* Send a character */ void serial_putc(const char c) { /* Wait for room in TX FIFO */ while (REG_RD(DBGUART_BASE + UARTDBGFR) & TXFF) ; /* Write the data byte */ REG_WR(DBGUART_BASE + UARTDBGDR, c); if (c == '\n') serial_putc('\r'); } void serial_puts(const char *s) { while (*s) { serial_putc(*s++); } } /* Test whether a character is in TX buffer */ int serial_tstc(void) { /* Check if RX FIFO is not empty */ return !(REG_RD(DBGUART_BASE + UARTDBGFR) & RXFE); } /* Receive character */ int serial_getc(void) { /* Wait while TX FIFO is empty */ while (REG_RD(DBGUART_BASE + UARTDBGFR) & RXFE) ; /* Read data byte */ return REG_RD(DBGUART_BASE + UARTDBGDR) & 0xff; } #endif /* CONFIG_STMP378X_DBGUART */