1/* 2 * (C) Copyright 2002 3 * Gary Jennejohn, DENX Software Engineering, <garyj@denx.de> 4 * 5 * This program is free software; you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License as published by 7 * the Free Software Foundation; either version 2 of the License, or 8 * (at your option) any later version. 9 * 10 * This program is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 * GNU General Public License for more details. 14 * 15 * You should have received a copy of the GNU General Public License 16 * along with this program; if not, write to the Free Software 17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 18 * 19 */ 20 21#include <common.h> 22#include <lh7a40x.h> 23 24DECLARE_GLOBAL_DATA_PTR; 25 26#if defined(CONFIG_CONSOLE_UART1) 27# define UART_CONSOLE 1 28#elif defined(CONFIG_CONSOLE_UART2) 29# define UART_CONSOLE 2 30#elif defined(CONFIG_CONSOLE_UART3) 31# define UART_CONSOLE 3 32#else 33# error "No console configured ... " 34#endif 35 36void serial_setbrg (void) 37{ 38 lh7a40x_uart_t* uart = LH7A40X_UART_PTR(UART_CONSOLE); 39 int i; 40 unsigned int reg = 0; 41 42 /* 43 * userguide 15.1.2.4 44 * 45 * BAUDDIV is (UART_REF_FREQ/(16 X BAUD))-1 46 * 47 * UART_REF_FREQ = external system clock input / 2 (Hz) 48 * BAUD is desired baudrate (bits/s) 49 * 50 * NOTE: we add (divisor/2) to numerator to round for 51 * more precision 52 */ 53 reg = (((get_PLLCLK()/2) + ((16*gd->baudrate)/2)) / (16 * gd->baudrate)) - 1; 54 uart->brcon = reg; 55 56 for (i = 0; i < 100; i++); 57} 58 59/* 60 * Initialise the serial port with the given baudrate. The settings 61 * are always 8 data bits, no parity, 1 stop bit, no start bits. 62 * 63 */ 64int serial_init (void) 65{ 66 lh7a40x_uart_t* uart = LH7A40X_UART_PTR(UART_CONSOLE); 67 68 /* UART must be enabled before writing to any config registers */ 69 uart->con |= (UART_EN); 70 71#ifdef CONFIG_CONSOLE_UART1 72 /* infrared disabled */ 73 uart->con |= UART_SIRD; 74#endif 75 /* loopback disabled */ 76 uart->con &= ~(UART_LBE); 77 78 /* modem lines and tx/rx polarities */ 79 uart->con &= ~(UART_MXP | UART_TXP | UART_RXP); 80 81 /* FIFO enable, N81 */ 82 uart->fcon = (UART_WLEN_8 | UART_FEN | UART_STP2_1); 83 84 /* set baudrate */ 85 serial_setbrg (); 86 87 /* enable rx interrupt */ 88 uart->inten |= UART_RI; 89 90 return (0); 91} 92 93/* 94 * Read a single byte from the serial port. Returns 1 on success, 0 95 * otherwise. When the function is succesfull, the character read is 96 * written into its argument c. 97 */ 98int serial_getc (void) 99{ 100 lh7a40x_uart_t* uart = LH7A40X_UART_PTR(UART_CONSOLE); 101 102 /* wait for character to arrive */ 103 while (uart->status & UART_RXFE); 104 105 return(uart->data & 0xff); 106} 107 108#ifdef CONFIG_HWFLOW 109static int hwflow = 0; /* turned off by default */ 110int hwflow_onoff(int on) 111{ 112 switch(on) { 113 case 0: 114 default: 115 break; /* return current */ 116 case 1: 117 hwflow = 1; /* turn on */ 118 break; 119 case -1: 120 hwflow = 0; /* turn off */ 121 break; 122 } 123 return hwflow; 124} 125#endif 126 127#ifdef CONFIG_MODEM_SUPPORT 128static int be_quiet = 0; 129void disable_putc(void) 130{ 131 be_quiet = 1; 132} 133 134void enable_putc(void) 135{ 136 be_quiet = 0; 137} 138#endif 139 140 141/* 142 * Output a single byte to the serial port. 143 */ 144void serial_putc (const char c) 145{ 146 lh7a40x_uart_t* uart = LH7A40X_UART_PTR(UART_CONSOLE); 147 148#ifdef CONFIG_MODEM_SUPPORT 149 if (be_quiet) 150 return; 151#endif 152 153 /* wait for room in the tx FIFO */ 154 while (!(uart->status & UART_TXFE)); 155 156#ifdef CONFIG_HWFLOW 157 /* Wait for CTS up */ 158 while(hwflow && !(uart->status & UART_CTS)); 159#endif 160 161 uart->data = c; 162 163 /* If \n, also do \r */ 164 if (c == '\n') 165 serial_putc ('\r'); 166} 167 168/* 169 * Test whether a character is in the RX buffer 170 */ 171int serial_tstc (void) 172{ 173 lh7a40x_uart_t* uart = LH7A40X_UART_PTR(UART_CONSOLE); 174 175 return(!(uart->status & UART_RXFE)); 176} 177 178void 179serial_puts (const char *s) 180{ 181 while (*s) { 182 serial_putc (*s++); 183 } 184} 185