1/* 2 * Author: Xilinx, Inc. 3 * 4 * 5 * This program is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License as published by the 7 * Free Software Foundation; either version 2 of the License, or (at your 8 * option) any later version. 9 * 10 * 11 * XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" AS A 12 * COURTESY TO YOU. BY PROVIDING THIS DESIGN, CODE, OR INFORMATION AS 13 * ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE, APPLICATION OR STANDARD, 14 * XILINX IS MAKING NO REPRESENTATION THAT THIS IMPLEMENTATION IS FREE 15 * FROM ANY CLAIMS OF INFRINGEMENT, AND YOU ARE RESPONSIBLE FOR OBTAINING 16 * ANY THIRD PARTY RIGHTS YOU MAY REQUIRE FOR YOUR IMPLEMENTATION. 17 * XILINX EXPRESSLY DISCLAIMS ANY WARRANTY WHATSOEVER WITH RESPECT TO 18 * THE ADEQUACY OF THE IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO ANY 19 * WARRANTIES OR REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE FROM 20 * CLAIMS OF INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND 21 * FITNESS FOR A PARTICULAR PURPOSE. 22 * 23 * 24 * Xilinx hardware products are not intended for use in life support 25 * appliances, devices, or systems. Use in such applications is 26 * expressly prohibited. 27 * 28 * 29 * (c) Copyright 2002-2004 Xilinx Inc. 30 * All rights reserved. 31 * 32 * 33 * You should have received a copy of the GNU General Public License along 34 * with this program; if not, write to the Free Software Foundation, Inc., 35 * 675 Mass Ave, Cambridge, MA 02139, USA. 36 * 37 */ 38 39#include <common.h> 40#include <asm/u-boot.h> 41#include <asm/processor.h> 42#include <command.h> 43#include <config.h> 44 45DECLARE_GLOBAL_DATA_PTR; 46 47#define USE_CHAN1 \ 48 ((defined XPAR_UARTNS550_0_BASEADDR) && (defined CONFIG_SYS_INIT_CHAN1)) 49#define USE_CHAN2 \ 50 ((defined XPAR_UARTNS550_1_BASEADDR) && (defined CONFIG_SYS_INIT_CHAN2)) 51 52#if USE_CHAN1 53#include <ns16550.h> 54#endif 55 56#if USE_CHAN1 57const NS16550_t COM_PORTS[] = { (NS16550_t) (XPAR_UARTNS550_0_BASEADDR + 3) 58#if USE_CHAN2 59 , (NS16550_t) (XPAR_UARTNS550_1_BASEADDR + 3) 60#endif 61}; 62#endif 63 64int 65serial_init(void) 66{ 67#if USE_CHAN1 68 int clock_divisor; 69 70 clock_divisor = XPAR_UARTNS550_0_CLOCK_FREQ_HZ / 16 / gd->baudrate; 71 (void) NS16550_init(COM_PORTS[0], clock_divisor); 72#if USE_CHAN2 73 clock_divisor = XPAR_UARTNS550_1_CLOCK_FREQ_HZ / 16 / gd->baudrate; 74 (void) NS16550_init(COM_PORTS[1], clock_divisor); 75#endif 76#endif 77 return 0; 78 79} 80 81void 82serial_putc(const char c) 83{ 84 if (c == '\n') 85 NS16550_putc(COM_PORTS[CONFIG_SYS_DUART_CHAN], '\r'); 86 87 NS16550_putc(COM_PORTS[CONFIG_SYS_DUART_CHAN], c); 88} 89 90int 91serial_getc(void) 92{ 93 return NS16550_getc(COM_PORTS[CONFIG_SYS_DUART_CHAN]); 94} 95 96int 97serial_tstc(void) 98{ 99 return NS16550_tstc(COM_PORTS[CONFIG_SYS_DUART_CHAN]); 100} 101 102void 103serial_setbrg(void) 104{ 105#if USE_CHAN1 106 int clock_divisor; 107 108 clock_divisor = XPAR_UARTNS550_0_CLOCK_FREQ_HZ / 16 / gd->baudrate; 109 NS16550_reinit(COM_PORTS[0], clock_divisor); 110#if USE_CHAN2 111 clock_divisor = XPAR_UARTNS550_1_CLOCK_FREQ_HZ / 16 / gd->baudrate; 112 NS16550_reinit(COM_PORTS[1], clock_divisor); 113#endif 114#endif 115} 116 117void 118serial_puts(const char *s) 119{ 120 while (*s) { 121 serial_putc(*s++); 122 } 123} 124 125#if defined(CONFIG_CMD_KGDB) 126void 127kgdb_serial_init(void) 128{ 129} 130 131void 132putDebugChar(int c) 133{ 134 serial_putc(c); 135} 136 137void 138putDebugStr(const char *str) 139{ 140 serial_puts(str); 141} 142 143int 144getDebugChar(void) 145{ 146 return serial_getc(); 147} 148 149void 150kgdb_interruptible(int yes) 151{ 152 return; 153} 154#endif 155