[U-Boot] [PATCH 03/28] serial: move altera uart driver to drivers/serial
Thomas Chou
thomas at wytron.com.tw
Fri Mar 19 08:43:28 CET 2010
This patch moves the altera uart driver from cpu/nios2/serial.c to
drivers/serial/altera_uart.c.
The registers access is changed from "volatile struct" to readl()/
writel(). This is consistent with Altera HAL and Linux.
Signed-off-by: Thomas Chou <thomas at wytron.com.tw>
---
drivers/serial/Makefile | 1 +
drivers/serial/altera_uart.c | 116 ++++++++++++++++++++++++++++++++++++++++++
2 files changed, 117 insertions(+), 0 deletions(-)
create mode 100644 drivers/serial/altera_uart.c
diff --git a/drivers/serial/Makefile b/drivers/serial/Makefile
index 3c77a7c..7ce920d 100644
--- a/drivers/serial/Makefile
+++ b/drivers/serial/Makefile
@@ -25,6 +25,7 @@ include $(TOPDIR)/config.mk
LIB := $(obj)libserial.a
+COBJS-$(CONFIG_ALTERA_UART) += altera_uart.o
COBJS-$(CONFIG_ARM_DCC) += arm_dcc.o
COBJS-$(CONFIG_AT91RM9200_USART) += at91rm9200_usart.o
COBJS-$(CONFIG_ATMEL_USART) += atmel_usart.o
diff --git a/drivers/serial/altera_uart.c b/drivers/serial/altera_uart.c
new file mode 100644
index 0000000..b8c97b2
--- /dev/null
+++ b/drivers/serial/altera_uart.c
@@ -0,0 +1,116 @@
+/*
+ * (C) Copyright 2004, Psyent Corporation <www.psyent.com>
+ * Scott McNutt <smcnutt at psyent.com>
+ * (C) Copyright 2008, Thomas Chou <thomas at wytron.com.tw>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * 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 <common.h>
+#include <watchdog.h>
+#include <asm/io.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+/*
+ * Altera UART reg defs
+ */
+
+#define ALTERA_UART_SIZE 32
+
+#define ALTERA_UART_RXDATA_REG 0
+#define ALTERA_UART_TXDATA_REG 4
+#define ALTERA_UART_STATUS_REG 8
+#define ALTERA_UART_CONTROL_REG 12
+#define ALTERA_UART_DIVISOR_REG 16
+#define ALTERA_UART_EOP_REG 20
+
+#define ALTERA_UART_STATUS_PE_MSK (0x1)
+#define ALTERA_UART_STATUS_FE_MSK (0x2)
+#define ALTERA_UART_STATUS_BRK_MSK (0x4)
+#define ALTERA_UART_STATUS_ROE_MSK (0x8)
+#define ALTERA_UART_STATUS_TOE_MSK (0x10)
+#define ALTERA_UART_STATUS_TMT_MSK (0x20)
+#define ALTERA_UART_STATUS_TRDY_MSK (0x40)
+#define ALTERA_UART_STATUS_RRDY_MSK (0x80)
+#define ALTERA_UART_STATUS_E_MSK (0x100)
+#define ALTERA_UART_STATUS_DCTS_MSK (0x400)
+#define ALTERA_UART_STATUS_CTS_MSK (0x800)
+#define ALTERA_UART_STATUS_EOP_MSK (0x1000)
+
+#define ALTERA_UART_CONTROL_PE_MSK (0x1)
+#define ALTERA_UART_CONTROL_FE_MSK (0x2)
+#define ALTERA_UART_CONTROL_BRK_MSK (0x4)
+#define ALTERA_UART_CONTROL_ROE_MSK (0x8)
+#define ALTERA_UART_CONTROL_TOE_MSK (0x10)
+#define ALTERA_UART_CONTROL_TMT_MSK (0x20)
+#define ALTERA_UART_CONTROL_TRDY_MSK (0x40)
+#define ALTERA_UART_CONTROL_RRDY_MSK (0x80)
+#define ALTERA_UART_CONTROL_E_MSK (0x100)
+#define ALTERA_UART_CONTROL_TRBK_MSK (0x200)
+#define ALTERA_UART_CONTROL_DCTS_MSK (0x400)
+#define ALTERA_UART_CONTROL_RTS_MSK (0x800)
+#define ALTERA_UART_CONTROL_EOP_MSK (0x1000)
+
+#define ALTERA_UART_EOP_MSK (0xFF)
+#define ALTERA_UART_EOP_OFST (0)
+
+void serial_setbrg(void)
+{
+ unsigned div;
+
+ div = (CONFIG_SYS_UART_FREQ / gd->baudrate) - 1;
+ writel(div, CONFIG_SYS_UART_BASE + ALTERA_UART_DIVISOR_REG);
+ return;
+}
+
+int serial_init(void)
+{
+ serial_setbrg();
+ return 0;
+}
+
+void serial_putc(char c)
+{
+ if (c == '\n')
+ serial_putc('\r');
+ while ((readl(CONFIG_SYS_UART_BASE + ALTERA_UART_STATUS_REG)
+ & ALTERA_UART_CONTROL_TRDY_MSK) == 0)
+ WATCHDOG_RESET();
+ writel((unsigned char)c, CONFIG_SYS_UART_BASE + ALTERA_UART_TXDATA_REG);
+}
+
+void serial_puts(const char *s)
+{
+ while (*s != 0)
+ serial_putc(*s++);
+}
+
+int serial_tstc(void)
+{
+ return readl(CONFIG_SYS_UART_BASE + ALTERA_UART_STATUS_REG)
+ & ALTERA_UART_STATUS_RRDY_MSK;
+}
+
+int serial_getc(void)
+{
+ while (serial_tstc() == 0)
+ WATCHDOG_RESET();
+ return readl(CONFIG_SYS_UART_BASE + ALTERA_UART_RXDATA_REG) & 0x00ff;
+}
--
1.6.6.1
More information about the U-Boot
mailing list