1 /* 2 * (C) Copyright 2004, Psyent Corporation <www.psyent.com> 3 * Scott McNutt <smcnutt@psyent.com> 4 * 5 * See file CREDITS for list of people who contributed to this 6 * project. 7 * 8 * This program is free software; you can redistribute it and/or 9 * modify it under the terms of the GNU General Public License as 10 * published by the Free Software Foundation; either version 2 of 11 * the License, or (at your option) any later version. 12 * 13 * This program is distributed in the hope that it will be useful, 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 * GNU General Public License for more details. 17 * 18 * You should have received a copy of the GNU General Public License 19 * along with this program; if not, write to the Free Software 20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 21 * MA 02111-1307 USA 22 */ 23 24 25 #include <common.h> 26 #include <watchdog.h> 27 #include <asm/io.h> 28 #include <nios2-io.h> 29 30 DECLARE_GLOBAL_DATA_PTR; 31 32 /*------------------------------------------------------------------ 33 * UART the serial port 34 *-----------------------------------------------------------------*/ 35 36 static nios_uart_t *uart = (nios_uart_t *) CONFIG_SYS_NIOS_CONSOLE; 37 38 #if defined(CONFIG_SYS_NIOS_FIXEDBAUD) 39 40 /* Everything's already setup for fixed-baud PTF 41 * assignment 42 */ 43 void serial_setbrg (void){ return; } 44 int serial_init (void) { return (0);} 45 46 #else 47 48 void serial_setbrg (void) 49 { 50 unsigned div; 51 52 div = (CONFIG_SYS_CLK_FREQ/gd->baudrate)-1; 53 writel (div, &uart->divisor); 54 return; 55 } 56 57 int serial_init (void) 58 { 59 serial_setbrg (); 60 return (0); 61 } 62 63 #endif /* CONFIG_SYS_NIOS_FIXEDBAUD */ 64 65 /*----------------------------------------------------------------------- 66 * UART CONSOLE 67 *---------------------------------------------------------------------*/ 68 void serial_putc (char c) 69 { 70 if (c == '\n') 71 serial_putc ('\r'); 72 while ((readl (&uart->status) & NIOS_UART_TRDY) == 0) 73 WATCHDOG_RESET (); 74 writel ((unsigned char)c, &uart->txdata); 75 } 76 77 void serial_puts (const char *s) 78 { 79 while (*s != 0) { 80 serial_putc (*s++); 81 } 82 } 83 84 int serial_tstc (void) 85 { 86 return (readl (&uart->status) & NIOS_UART_RRDY); 87 } 88 89 int serial_getc (void) 90 { 91 while (serial_tstc () == 0) 92 WATCHDOG_RESET (); 93 return (readl (&uart->rxdata) & 0x00ff ); 94 } 95