ZOOM2 Add serial support.
authorTom Rix <Tom.Rix@windriver.com>
Sun, 31 May 2009 10:44:37 +0000 (12:44 +0200)
committerWolfgang Denk <wd@denx.de>
Fri, 12 Jun 2009 18:39:53 +0000 (20:39 +0200)
Zoom2 serial is in general supplied by one of the 4 UARTS on the debug board.
The default serial is from the USB connector on left side of the debug board.
The USB connector will produce 2 of the 4 UARTS.  On your host pick the first
enumeration.

The details of the setting of the serial gpmc setup are not available.
The values were provided by another party.

The serial port set up is the same with Zoom1.
Baud rate 115200, 8 bit data, no parity, 1 stop bit, no flow.

The kernel bootargs are
console=ttyS3,115200n8

Signed-off-by: Tom Rix <Tom.Rix@windriver.com>
board/omap3/zoom2/Makefile
board/omap3/zoom2/zoom2.c
board/omap3/zoom2/zoom2_serial.c [new file with mode: 0644]
board/omap3/zoom2/zoom2_serial.h [new file with mode: 0644]
common/serial.c
drivers/serial/ns16550.c
include/configs/omap3_zoom2.h
include/serial.h

index b8fa5a78bbeb47e0893d8b777fe3598ddbd7ce67..d27990c993888de68ac7491164de54d585c9ac25 100644 (file)
@@ -26,7 +26,8 @@ include $(TOPDIR)/config.mk
 LIB    = $(obj)lib$(BOARD).a
 
 COBJS  := zoom2.o \
-       debug_board.o
+       debug_board.o \
+       zoom2_serial.o
 
 SRCS   := $(COBJS:.o=.c)
 OBJS   := $(addprefix $(obj),$(COBJS))
index 0700c56d709b7ea7e336bb14b8ed7aa0b28dc24f..83e02f6b46dc32b91251380f1c7a29f62cf41cb5 100644 (file)
  */
 #include <common.h>
 #include <asm/io.h>
+#include <asm/arch/mem.h>
 #include <asm/arch/mux.h>
 #include <asm/arch/sys_proto.h>
 #include <asm/mach-types.h>
 #include "zoom2.h"
+#include "zoom2_serial.h"
+
+/*
+ * This the the zoom2, board specific, gpmc configuration for the
+ * quad uart on the debug board.   The more general gpmc configurations
+ * are setup at the cpu level in cpu/arm_cortexa8/omap3/mem.c
+ *
+ * The details of the setting of the serial gpmc setup are not available.
+ * The values were provided by another party.
+ */
+extern void enable_gpmc_config(u32 *gpmc_config, gpmc_csx_t *gpmc_cs_base,
+                              u32 base, u32 size);
+
+static u32 gpmc_serial_TL16CP754C[GPMC_MAX_REG] = {
+       0x00011000,
+       0x001F1F01,
+       0x00080803,
+       0x1D091D09,
+       0x041D1F1F,
+       0x1D0904C4, 0
+};
 
 /*
  * Routine: board_init
 int board_init (void)
 {
        DECLARE_GLOBAL_DATA_PTR;
+       gpmc_csx_t *serial_cs_base;
+       u32 *gpmc_config;
 
        gpmc_init ();           /* in SRAM or SDRAM, finish GPMC */
+
+       /* Configure console support on zoom2 */
+       gpmc_config = gpmc_serial_TL16CP754C;
+       serial_cs_base = (gpmc_csx_t *) (GPMC_CONFIG_CS0_BASE +
+                                        (3 * GPMC_CONFIG_WIDTH));
+       enable_gpmc_config(gpmc_config,
+                          serial_cs_base,
+                          SERIAL_TL16CP754C_BASE,
+                          GPMC_SIZE_16M);
+
        /* board id for Linux */
        gd->bd->bi_arch_number = MACH_TYPE_OMAP_ZOOM2;
        /* boot param addr */
        gd->bd->bi_boot_params = (OMAP34XX_SDRC_CS0 + 0x100);
 
+#if defined(CONFIG_STATUS_LED) && defined(STATUS_LED_BOOT)
+       status_led_set (STATUS_LED_BOOT, STATUS_LED_ON);
+#endif
+
        return 0;
 }
 
diff --git a/board/omap3/zoom2/zoom2_serial.c b/board/omap3/zoom2/zoom2_serial.c
new file mode 100644 (file)
index 0000000..a3d777d
--- /dev/null
@@ -0,0 +1,130 @@
+/*
+ * Copyright (c) 2009 Wind River Systems, Inc.
+ * Tom Rix <Tom.Rix@windriver.com>
+ *
+ * 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
+ *
+ * This file was adapted from cpu/mpc5xxx/serial.c
+ *
+ */
+
+#include <common.h>
+#include <serial.h>
+#include <ns16550.h>
+#include <asm/arch/cpu.h>
+#include "zoom2_serial.h"
+
+int quad_init_dev (unsigned long base)
+{
+       /*
+        * The Quad UART is on the debug board.
+        * Check if the debug board is attached before using the UART
+        */
+       if (zoom2_debug_board_connected ()) {
+               NS16550_t com_port = (NS16550_t) base;
+               int baud_divisor = CONFIG_SYS_NS16550_CLK / 16 /
+                       CONFIG_BAUDRATE;
+
+               /*
+                * Zoom2 has a board specific initialization of its UART.
+                * This generic initialization has been copied from
+                * drivers/serial/ns16550.c. The macros have been expanded.
+                *
+                * Do the following instead of
+                *
+                * NS16550_init (com_port, clock_divisor);
+                */
+               com_port->ier = 0x00;
+
+               /*
+                * On Zoom2 board Set pre-scalar to 1
+                * CLKSEL is GND => MCR[7] is 1 => preslr is 4
+                * So change the prescl to 1
+                */
+               com_port->lcr = 0xBF;
+               com_port->fcr |= 0x10;
+               com_port->mcr &= 0x7F;
+
+               /* This is generic ns16550.c setup */
+               com_port->lcr = UART_LCR_BKSE | UART_LCR_8N1;
+               com_port->dll = 0;
+               com_port->dlm = 0;
+               com_port->lcr = UART_LCR_8N1;
+               com_port->mcr = UART_MCR_DTR | UART_MCR_RTS;
+               com_port->fcr = UART_FCR_FIFO_EN | UART_FCR_RXSR |
+                       UART_FCR_TXSR;
+               com_port->lcr = UART_LCR_BKSE | UART_LCR_8N1;
+               com_port->dll = baud_divisor & 0xff;
+               com_port->dlm = (baud_divisor >> 8) & 0xff;
+               com_port->lcr = UART_LCR_8N1;
+       }
+       /*
+        * We have to lie here, otherwise the board init code will hang
+        * on the check
+        */
+       return 0;
+}
+
+void quad_putc_dev (unsigned long base, const char c)
+{
+       if (zoom2_debug_board_connected ()) {
+
+               if (c == '\n')
+                       quad_putc_dev (base, '\r');
+
+               NS16550_putc ((NS16550_t) base, c);
+       }
+}
+
+void quad_puts_dev (unsigned long base, const char *s)
+{
+       if (zoom2_debug_board_connected ()) {
+               while ((s != NULL) && (*s != '\0'))
+                       quad_putc_dev (base, *s++);
+       }
+}
+
+int quad_getc_dev (unsigned long base)
+{
+       if (zoom2_debug_board_connected ())
+               return NS16550_getc ((NS16550_t) base);
+       else
+               return 0;
+}
+
+int quad_tstc_dev (unsigned long base)
+{
+       if (zoom2_debug_board_connected ())
+               return NS16550_tstc ((NS16550_t) base);
+       else
+               return 0;
+}
+
+void quad_setbrg_dev (unsigned long base)
+{
+       if (zoom2_debug_board_connected ()) {
+
+               int clock_divisor = CONFIG_SYS_NS16550_CLK / 16 /
+                       CONFIG_BAUDRATE;
+
+               NS16550_reinit ((NS16550_t) base, clock_divisor);
+       }
+}
+
+QUAD_INIT (0)
+QUAD_INIT (1)
+QUAD_INIT (2)
+QUAD_INIT (3)
diff --git a/board/omap3/zoom2/zoom2_serial.h b/board/omap3/zoom2/zoom2_serial.h
new file mode 100644 (file)
index 0000000..c98158f
--- /dev/null
@@ -0,0 +1,75 @@
+/*
+ * Copyright (c) 2009 Wind River Systems, Inc.
+ * Tom Rix <Tom.Rix@windriver.com>
+ *
+ * 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
+ *
+ */
+
+#ifndef ZOOM2_SERIAL_H
+#define ZOOM2_SERIAL_H
+
+extern int zoom2_debug_board_connected (void);
+
+#define SERIAL_TL16CP754C_BASE 0x10000000      /* Zoom2 Serial chip address */
+
+#define QUAD_BASE_0    SERIAL_TL16CP754C_BASE
+#define QUAD_BASE_1    (SERIAL_TL16CP754C_BASE + 0x100)
+#define QUAD_BASE_2    (SERIAL_TL16CP754C_BASE + 0x200)
+#define QUAD_BASE_3    (SERIAL_TL16CP754C_BASE + 0x300)
+
+#define S(a) #a
+#define N(a) S(quad##a)
+#define U(a) S(UART##a)
+
+#define QUAD_INIT(n)                           \
+int quad_init_##n(void)                                \
+{                                              \
+       return quad_init_dev(QUAD_BASE_##n);    \
+}                                              \
+void quad_setbrg_##n(void)                     \
+{                                              \
+       quad_setbrg_dev(QUAD_BASE_##n);         \
+}                                              \
+void quad_putc_##n(const char c)               \
+{                                              \
+       quad_putc_dev(QUAD_BASE_##n, c);        \
+}                                              \
+void quad_puts_##n(const char *s)              \
+{                                              \
+       quad_puts_dev(QUAD_BASE_##n, s);        \
+}                                              \
+int quad_getc_##n(void)                                \
+{                                              \
+       return quad_getc_dev(QUAD_BASE_##n);    \
+}                                              \
+int quad_tstc_##n(void)                                \
+{                                              \
+       return quad_tstc_dev(QUAD_BASE_##n);    \
+}                                              \
+struct serial_device zoom2_serial_device##n =  \
+{                                              \
+       N(n),                                   \
+       U(n),                                   \
+       quad_init_##n,                          \
+       quad_setbrg_##n,                        \
+       quad_getc_##n,                          \
+       quad_tstc_##n,                          \
+       quad_putc_##n,                          \
+       quad_puts_##n,                          \
+};
+
+#endif /* ZOOM2_SERIAL_H */
index 09385d017d47ce30c6dd816a4c297d385b391877..dd80e7c863e6c6bcc5a75493b1c3d9e67666c722 100644 (file)
@@ -68,6 +68,8 @@ struct serial_device *__default_serial_console (void)
 #else
 #error "CONFIG_SERIAL? missing."
 #endif
+#elif defined(CONFIG_OMAP3_ZOOM2)
+               return ZOOM2_DEFAULT_SERIAL_DEVICE;
 #else
 #error No default console
 #endif
index 657c9dadf9cd5f3e56f5e0c7858b26fbecc6e921..2fcc8c31633ab9d41e859847c17b02e9d0805545 100644 (file)
@@ -17,7 +17,7 @@
 void NS16550_init (NS16550_t com_port, int baud_divisor)
 {
        com_port->ier = 0x00;
-#ifdef CONFIG_OMAP
+#if defined(CONFIG_OMAP) && !defined(CONFIG_OMAP3_ZOOM2)
        com_port->mdr1 = 0x7;   /* mode select reset TL16C750*/
 #endif
        com_port->lcr = UART_LCR_BKSE | UART_LCRVAL;
@@ -30,7 +30,7 @@ void NS16550_init (NS16550_t com_port, int baud_divisor)
        com_port->dll = baud_divisor & 0xff;
        com_port->dlm = (baud_divisor >> 8) & 0xff;
        com_port->lcr = UART_LCRVAL;
-#if defined(CONFIG_OMAP)
+#if defined(CONFIG_OMAP) && !defined(CONFIG_OMAP3_ZOOM2)
 #if defined(CONFIG_APTIX)
        com_port->mdr1 = 3;     /* /13 mode so Aptix 6MHz can hit 115200 */
 #else
index 8aea4cbc074a7ae22720cda6120a664867985b69..d9a9c1a830b052d2677064d8a068a13e9e1a38d8 100644 (file)
 
 /*
  * NS16550 Configuration
+ * Zoom2 uses the TL16CP754C on the debug board
  */
-#define V_NS16550_CLK                  48000000        /* 48MHz (APLL96/2) */
+#define CONFIG_SERIAL_MULTI            1
+/*
+ * 0 - 1 : first  USB with respect to the left edge of the debug board
+ * 2 - 3 : second USB with respect to the left edge of the debug board
+ */
+#define ZOOM2_DEFAULT_SERIAL_DEVICE    (&zoom2_serial_device0)
+
+#define V_NS16550_CLK                  (1843200)       /* 1.8432 Mhz */
 
 #define CONFIG_SYS_NS16550
-#define CONFIG_SYS_NS16550_SERIAL
-#define CONFIG_SYS_NS16550_REG_SIZE    (-4)
+#define CONFIG_SYS_NS16550_REG_SIZE    (-2)
 #define CONFIG_SYS_NS16550_CLK         V_NS16550_CLK
-
-/*
- * select serial console configuration
- */
-#define CONFIG_CONS_INDEX              3
-#define CONFIG_SYS_NS16550_COM3                OMAP34XX_UART3
-#define CONFIG_SERIAL3                 3       /* UART3 */
+#define CONFIG_BAUDRATE                        115200
+#define CONFIG_SYS_BAUDRATE_TABLE      {115200}
 
 /* allow to overwrite serial and ethaddr */
 #define CONFIG_ENV_OVERWRITE
-#define CONFIG_BAUDRATE                        115200
-#define CONFIG_SYS_BAUDRATE_TABLE      {4800, 9600, 19200, 38400, 57600,\
-                                       115200}
+
 #define CONFIG_MMC                     1
 #define CONFIG_OMAP3_MMC               1
 #define CONFIG_DOS_PARTITION           1
index e3d8b3679b5e8852e1c2caa2c2b857c27b4ea257..aca5221044f869f4bf4568e76a9a9d1dcd900705 100644 (file)
@@ -42,6 +42,13 @@ extern struct serial_device s3c24xx_serial1_device;
 extern struct serial_device s3c24xx_serial2_device;
 #endif
 
+#if defined(CONFIG_OMAP3_ZOOM2)
+extern struct serial_device zoom2_serial_device0;
+extern struct serial_device zoom2_serial_device1;
+extern struct serial_device zoom2_serial_device2;
+extern struct serial_device zoom2_serial_device3;
+#endif
+
 extern struct serial_device serial_ffuart_device;
 extern struct serial_device serial_btuart_device;
 extern struct serial_device serial_stuart_device;