11378df79SJean-Christophe PLAGNIOL-VILLARD /* 21378df79SJean-Christophe PLAGNIOL-VILLARD * Copyright (C) 2004-2006 Atmel Corporation 31378df79SJean-Christophe PLAGNIOL-VILLARD * 4125637c5SAndreas Bießmann * Modified to support C structur SoC access by 5125637c5SAndreas Bießmann * Andreas Bießmann <biessmann@corscience.de> 6125637c5SAndreas Bießmann * 71378df79SJean-Christophe PLAGNIOL-VILLARD * This program is free software; you can redistribute it and/or modify 81378df79SJean-Christophe PLAGNIOL-VILLARD * it under the terms of the GNU General Public License as published by 91378df79SJean-Christophe PLAGNIOL-VILLARD * the Free Software Foundation; either version 2 of the License, or 101378df79SJean-Christophe PLAGNIOL-VILLARD * (at your option) any later version. 111378df79SJean-Christophe PLAGNIOL-VILLARD * 121378df79SJean-Christophe PLAGNIOL-VILLARD * This program is distributed in the hope that it will be useful, 131378df79SJean-Christophe PLAGNIOL-VILLARD * but WITHOUT ANY WARRANTY; without even the implied warranty of 141378df79SJean-Christophe PLAGNIOL-VILLARD * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 151378df79SJean-Christophe PLAGNIOL-VILLARD * GNU General Public License for more details. 161378df79SJean-Christophe PLAGNIOL-VILLARD * 171378df79SJean-Christophe PLAGNIOL-VILLARD * You should have received a copy of the GNU General Public License 181378df79SJean-Christophe PLAGNIOL-VILLARD * along with this program; if not, write to the Free Software 191378df79SJean-Christophe PLAGNIOL-VILLARD * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 201378df79SJean-Christophe PLAGNIOL-VILLARD */ 211378df79SJean-Christophe PLAGNIOL-VILLARD #include <common.h> 22843a2654SJean-Christophe PLAGNIOL-VILLARD #include <watchdog.h> 231378df79SJean-Christophe PLAGNIOL-VILLARD 241378df79SJean-Christophe PLAGNIOL-VILLARD #include <asm/io.h> 251378df79SJean-Christophe PLAGNIOL-VILLARD #include <asm/arch/clk.h> 26*329f0f52SReinhard Meyer #include <asm/arch/hardware.h> 271378df79SJean-Christophe PLAGNIOL-VILLARD 281378df79SJean-Christophe PLAGNIOL-VILLARD #include "atmel_usart.h" 291378df79SJean-Christophe PLAGNIOL-VILLARD 301378df79SJean-Christophe PLAGNIOL-VILLARD DECLARE_GLOBAL_DATA_PTR; 311378df79SJean-Christophe PLAGNIOL-VILLARD 321378df79SJean-Christophe PLAGNIOL-VILLARD void serial_setbrg(void) 331378df79SJean-Christophe PLAGNIOL-VILLARD { 34*329f0f52SReinhard Meyer atmel_usart3_t *usart = (atmel_usart3_t *)CONFIG_USART_BASE; 351378df79SJean-Christophe PLAGNIOL-VILLARD unsigned long divisor; 361378df79SJean-Christophe PLAGNIOL-VILLARD unsigned long usart_hz; 371378df79SJean-Christophe PLAGNIOL-VILLARD 381378df79SJean-Christophe PLAGNIOL-VILLARD /* 391378df79SJean-Christophe PLAGNIOL-VILLARD * Master Clock 401378df79SJean-Christophe PLAGNIOL-VILLARD * Baud Rate = -------------- 411378df79SJean-Christophe PLAGNIOL-VILLARD * 16 * CD 421378df79SJean-Christophe PLAGNIOL-VILLARD */ 43*329f0f52SReinhard Meyer usart_hz = get_usart_clk_rate(CONFIG_USART_ID); 441378df79SJean-Christophe PLAGNIOL-VILLARD divisor = (usart_hz / 16 + gd->baudrate / 2) / gd->baudrate; 45125637c5SAndreas Bießmann writel(USART3_BF(CD, divisor), &usart->brgr); 461378df79SJean-Christophe PLAGNIOL-VILLARD } 471378df79SJean-Christophe PLAGNIOL-VILLARD 481378df79SJean-Christophe PLAGNIOL-VILLARD int serial_init(void) 491378df79SJean-Christophe PLAGNIOL-VILLARD { 50*329f0f52SReinhard Meyer atmel_usart3_t *usart = (atmel_usart3_t *)CONFIG_USART_BASE; 51125637c5SAndreas Bießmann 52125637c5SAndreas Bießmann writel(USART3_BIT(RSTRX) | USART3_BIT(RSTTX), &usart->cr); 531378df79SJean-Christophe PLAGNIOL-VILLARD 541378df79SJean-Christophe PLAGNIOL-VILLARD serial_setbrg(); 551378df79SJean-Christophe PLAGNIOL-VILLARD 56125637c5SAndreas Bießmann writel(USART3_BIT(RXEN) | USART3_BIT(TXEN), &usart->cr); 57125637c5SAndreas Bießmann writel((USART3_BF(USART_MODE, USART3_USART_MODE_NORMAL) 581378df79SJean-Christophe PLAGNIOL-VILLARD | USART3_BF(USCLKS, USART3_USCLKS_MCK) 591378df79SJean-Christophe PLAGNIOL-VILLARD | USART3_BF(CHRL, USART3_CHRL_8) 601378df79SJean-Christophe PLAGNIOL-VILLARD | USART3_BF(PAR, USART3_PAR_NONE) 61125637c5SAndreas Bießmann | USART3_BF(NBSTOP, USART3_NBSTOP_1)), 62125637c5SAndreas Bießmann &usart->mr); 631378df79SJean-Christophe PLAGNIOL-VILLARD 641378df79SJean-Christophe PLAGNIOL-VILLARD return 0; 651378df79SJean-Christophe PLAGNIOL-VILLARD } 661378df79SJean-Christophe PLAGNIOL-VILLARD 671378df79SJean-Christophe PLAGNIOL-VILLARD void serial_putc(char c) 681378df79SJean-Christophe PLAGNIOL-VILLARD { 69*329f0f52SReinhard Meyer atmel_usart3_t *usart = (atmel_usart3_t *)CONFIG_USART_BASE; 70125637c5SAndreas Bießmann 711378df79SJean-Christophe PLAGNIOL-VILLARD if (c == '\n') 721378df79SJean-Christophe PLAGNIOL-VILLARD serial_putc('\r'); 731378df79SJean-Christophe PLAGNIOL-VILLARD 74125637c5SAndreas Bießmann while (!(readl(&usart->csr) & USART3_BIT(TXRDY))); 75125637c5SAndreas Bießmann writel(c, &usart->thr); 761378df79SJean-Christophe PLAGNIOL-VILLARD } 771378df79SJean-Christophe PLAGNIOL-VILLARD 781378df79SJean-Christophe PLAGNIOL-VILLARD void serial_puts(const char *s) 791378df79SJean-Christophe PLAGNIOL-VILLARD { 801378df79SJean-Christophe PLAGNIOL-VILLARD while (*s) 811378df79SJean-Christophe PLAGNIOL-VILLARD serial_putc(*s++); 821378df79SJean-Christophe PLAGNIOL-VILLARD } 831378df79SJean-Christophe PLAGNIOL-VILLARD 841378df79SJean-Christophe PLAGNIOL-VILLARD int serial_getc(void) 851378df79SJean-Christophe PLAGNIOL-VILLARD { 86*329f0f52SReinhard Meyer atmel_usart3_t *usart = (atmel_usart3_t *)CONFIG_USART_BASE; 87125637c5SAndreas Bießmann 88125637c5SAndreas Bießmann while (!(readl(&usart->csr) & USART3_BIT(RXRDY))) 89843a2654SJean-Christophe PLAGNIOL-VILLARD WATCHDOG_RESET(); 90125637c5SAndreas Bießmann return readl(&usart->rhr); 911378df79SJean-Christophe PLAGNIOL-VILLARD } 921378df79SJean-Christophe PLAGNIOL-VILLARD 931378df79SJean-Christophe PLAGNIOL-VILLARD int serial_tstc(void) 941378df79SJean-Christophe PLAGNIOL-VILLARD { 95*329f0f52SReinhard Meyer atmel_usart3_t *usart = (atmel_usart3_t *)CONFIG_USART_BASE; 96125637c5SAndreas Bießmann return (readl(&usart->csr) & USART3_BIT(RXRDY)) != 0; 971378df79SJean-Christophe PLAGNIOL-VILLARD } 98