[PATCH] arm: mx6ulevk: Initial BSP support for i.MX 6UltraLite EVK board.
Peng Fan
van.freenix at gmail.com
Tue Apr 19 09:11:28 UTC 2016
Hi Gedare, Joel,
Kindly ask, Do you any comments on this patch?
Thanks,
Peng.
On Thu, Apr 14, 2016 at 05:49:43PM +0800, Peng Fan wrote:
>Initial BSP support for i.MX 6UltraLite EVK board.
>Add uart driver
>Add gpt driver to service tick function
>
>The i.MX 6UltraLite is a high performance, ultra-efficient processor
>family featuring an advanced implementation of a single ARM® Cortex®-A7
>core, which operates at speeds up to 528 MHz. The i.MX 6UltraLite
>applications processor includes an integrated power management module
>that reduces the complexity of external power supply and simplifies
>power sequencing.
>
>Now, clock management module and pinmux module not added,
>so relies the setting in U-Boot.
>---
> c/src/lib/libbsp/arm/acinclude.m4 | 2 +
> c/src/lib/libbsp/arm/mx6ulevk/Makefile.am | 139 +++++++++++++++++
> c/src/lib/libbsp/arm/mx6ulevk/README | 28 ++++
> c/src/lib/libbsp/arm/mx6ulevk/bsp_specs | 13 ++
> c/src/lib/libbsp/arm/mx6ulevk/configure.ac | 34 +++++
> .../libbsp/arm/mx6ulevk/console/console-config.c | 82 +++++++++++
> c/src/lib/libbsp/arm/mx6ulevk/console/imx-uart.c | 131 ++++++++++++++++
> c/src/lib/libbsp/arm/mx6ulevk/gpt.c | 164 +++++++++++++++++++++
> c/src/lib/libbsp/arm/mx6ulevk/include/bsp.h | 121 +++++++++++++++
> c/src/lib/libbsp/arm/mx6ulevk/include/imx6-gpt.h | 48 ++++++
> c/src/lib/libbsp/arm/mx6ulevk/include/imx6-uart.h | 60 ++++++++
> c/src/lib/libbsp/arm/mx6ulevk/include/irq.h | 38 +++++
> c/src/lib/libbsp/arm/mx6ulevk/include/tm27.h | 24 +++
> .../libbsp/arm/mx6ulevk/make/custom/mx6ulevk.cfg | 9 ++
> c/src/lib/libbsp/arm/mx6ulevk/preinstall.am | 151 +++++++++++++++++++
> c/src/lib/libbsp/arm/mx6ulevk/startup/bspreset.c | 24 +++
> c/src/lib/libbsp/arm/mx6ulevk/startup/bspstart.c | 25 ++++
> .../libbsp/arm/mx6ulevk/startup/bspstarthooks.c | 70 +++++++++
> .../libbsp/arm/mx6ulevk/startup/linkcmds.mx6ulevk | 48 ++++++
> 19 files changed, 1211 insertions(+)
> create mode 100644 c/src/lib/libbsp/arm/mx6ulevk/Makefile.am
> create mode 100644 c/src/lib/libbsp/arm/mx6ulevk/README
> create mode 100644 c/src/lib/libbsp/arm/mx6ulevk/bsp_specs
> create mode 100644 c/src/lib/libbsp/arm/mx6ulevk/configure.ac
> create mode 100644 c/src/lib/libbsp/arm/mx6ulevk/console/console-config.c
> create mode 100644 c/src/lib/libbsp/arm/mx6ulevk/console/imx-uart.c
> create mode 100644 c/src/lib/libbsp/arm/mx6ulevk/gpt.c
> create mode 100644 c/src/lib/libbsp/arm/mx6ulevk/include/bsp.h
> create mode 100644 c/src/lib/libbsp/arm/mx6ulevk/include/imx6-gpt.h
> create mode 100644 c/src/lib/libbsp/arm/mx6ulevk/include/imx6-uart.h
> create mode 100644 c/src/lib/libbsp/arm/mx6ulevk/include/irq.h
> create mode 100644 c/src/lib/libbsp/arm/mx6ulevk/include/tm27.h
> create mode 100644 c/src/lib/libbsp/arm/mx6ulevk/make/custom/mx6ulevk.cfg
> create mode 100644 c/src/lib/libbsp/arm/mx6ulevk/preinstall.am
> create mode 100644 c/src/lib/libbsp/arm/mx6ulevk/startup/bspreset.c
> create mode 100644 c/src/lib/libbsp/arm/mx6ulevk/startup/bspstart.c
> create mode 100644 c/src/lib/libbsp/arm/mx6ulevk/startup/bspstarthooks.c
> create mode 100644 c/src/lib/libbsp/arm/mx6ulevk/startup/linkcmds.mx6ulevk
>
>diff --git a/c/src/lib/libbsp/arm/acinclude.m4 b/c/src/lib/libbsp/arm/acinclude.m4
>index f5ca105..c15dc82 100644
>--- a/c/src/lib/libbsp/arm/acinclude.m4
>+++ b/c/src/lib/libbsp/arm/acinclude.m4
>@@ -26,6 +26,8 @@ AC_DEFUN([RTEMS_CHECK_BSPDIR],
> AC_CONFIG_SUBDIRS([lpc24xx]);;
> lpc32xx )
> AC_CONFIG_SUBDIRS([lpc32xx]);;
>+ mx6ulevk )
>+ AC_CONFIG_SUBDIRS([mx6ulevk]);;
> raspberrypi )
> AC_CONFIG_SUBDIRS([raspberrypi]);;
> realview-pbx-a9 )
>diff --git a/c/src/lib/libbsp/arm/mx6ulevk/Makefile.am b/c/src/lib/libbsp/arm/mx6ulevk/Makefile.am
>new file mode 100644
>index 0000000..517b524
>--- /dev/null
>+++ b/c/src/lib/libbsp/arm/mx6ulevk/Makefile.am
>@@ -0,0 +1,139 @@
>+##
>+#
>+# @file
>+#
>+# @brief Makefile of libBSP for the i.MX 6UltraLite EVK platform (Cortex-A7).
>+#
>+
>+ACLOCAL_AMFLAGS = -I ../../../../aclocal
>+
>+include $(top_srcdir)/../../../../automake/compile.am
>+
>+include_bspdir = $(includedir)/bsp
>+include_libcpudir = $(includedir)/libcpu
>+
>+dist_project_lib_DATA = bsp_specs
>+
>+###############################################################################
>+# Header #
>+###############################################################################
>+
>+include_HEADERS = include/bsp.h
>+include_HEADERS += ../../shared/include/tm27.h
>+
>+nodist_include_HEADERS = ../../shared/include/coverhd.h \
>+ include/bspopts.h
>+
>+nodist_include_bsp_HEADERS = ../../shared/include/bootcard.h
>+
>+include_bsp_HEADERS =
>+include_bsp_HEADERS += ../../shared/include/utility.h
>+include_bsp_HEADERS += ../../shared/include/irq-generic.h
>+include_bsp_HEADERS += ../../shared/include/irq-info.h
>+include_bsp_HEADERS += ../../shared/include/stackalloc.h
>+include_bsp_HEADERS += ../../shared/include/uart-output-char.h
>+include_bsp_HEADERS += ../shared/include/arm-a8core-start.h
>+include_bsp_HEADERS += ../shared/include/arm-cp15-start.h
>+include_bsp_HEADERS += ../shared/include/arm-errata.h
>+include_bsp_HEADERS += ../shared/include/arm-gic.h
>+include_bsp_HEADERS += ../shared/include/arm-gic-irq.h
>+include_bsp_HEADERS += ../shared/include/arm-gic-regs.h
>+include_bsp_HEADERS += ../shared/include/arm-gic-tm27.h
>+include_bsp_HEADERS += ../shared/include/arm-release-id.h
>+include_bsp_HEADERS += ../shared/include/start.h
>+include_bsp_HEADERS += include/irq.h
>+include_bsp_HEADERS += include/imx6-uart.h
>+include_bsp_HEADERS += include/imx6-gpt.h
>+
>+include_libcpu_HEADERS =
>+include_libcpu_HEADERS += ../../../libcpu/arm/shared/include/arm-cp15.h
>+
>+###############################################################################
>+# Data #
>+###############################################################################
>+
>+noinst_LIBRARIES = libbspstart.a
>+
>+libbspstart_a_SOURCES = ../shared/start/start.S
>+
>+project_lib_DATA = start.$(OBJEXT)
>+
>+project_lib_DATA += startup/linkcmds
>+project_lib_DATA += startup/linkcmds.mx6ulevk
>+
>+EXTRA_DIST = startup/linkcmds.mx6ulevk
>+
>+###############################################################################
>+# LibBSP #
>+###############################################################################
>+
>+noinst_LIBRARIES += libbsp.a
>+
>+libbsp_a_SOURCES =
>+libbsp_a_CPPFLAGS =
>+libbsp_a_LIBADD =
>+
>+# Shared
>+libbsp_a_SOURCES += ../../shared/bootcard.c
>+libbsp_a_SOURCES += ../../shared/bspclean.c
>+libbsp_a_SOURCES += ../../shared/bspgetworkarea.c
>+libbsp_a_SOURCES += ../../shared/bsppredriverhook.c
>+libbsp_a_SOURCES += ../../shared/cpucounterdiff.c
>+libbsp_a_SOURCES += ../../shared/gnatinstallhandler.c
>+libbsp_a_SOURCES += ../../shared/sbrk.c
>+libbsp_a_SOURCES += ../../shared/timerstub.c
>+libbsp_a_SOURCES += ../../shared/src/stackalloc.c
>+libbsp_a_SOURCES += ../shared/abort/simple_abort.c
>+libbsp_a_SOURCES += ../shared/startup/bsp-start-memcpy.S
>+libbsp_a_SOURCES += ../shared/arm-cp15-set-exception-handler.c
>+libbsp_a_SOURCES += ../shared/arm-cp15-set-ttb-entries.c
>+
>+# Startup
>+libbsp_a_SOURCES += startup/bspreset.c
>+libbsp_a_SOURCES += startup/bspstart.c
>+
>+# IRQ
>+libbsp_a_SOURCES += ../../shared/src/irq-default-handler.c
>+libbsp_a_SOURCES += ../../shared/src/irq-generic.c
>+libbsp_a_SOURCES += ../../shared/src/irq-info.c
>+libbsp_a_SOURCES += ../../shared/src/irq-legacy.c
>+libbsp_a_SOURCES += ../../shared/src/irq-server.c
>+libbsp_a_SOURCES += ../../shared/src/irq-shell.c
>+libbsp_a_SOURCES += ../shared/arm-gic-irq.c
>+
>+# Console
>+libbsp_a_SOURCES += ../../shared/console.c
>+libbsp_a_SOURCES += ../../shared/console_control.c
>+libbsp_a_SOURCES += ../../shared/console_read.c
>+libbsp_a_SOURCES += ../../shared/console_select_simple.c
>+libbsp_a_SOURCES += ../../shared/console_write.c
>+libbsp_a_SOURCES += ../../shared/console-output-char.c
>+libbsp_a_SOURCES += console/console-config.c
>+libbsp_a_SOURCES += console/imx-uart.c
>+
>+#I2C
>+
>+#GPIO
>+
>+#RTC
>+
>+# Clock
>+libbsp_a_SOURCES += ../../shared/clockdrv_shell.h
>+libbsp_a_SOURCES += gpt.c
>+
>+# Cache
>+libbsp_a_SOURCES += ../../../libcpu/shared/src/cache_manager.c
>+libbsp_a_SOURCES += ../../../libcpu/arm/shared/include/cache_.h
>+libbsp_a_CPPFLAGS += -I$(srcdir)/../../../libcpu/arm/shared/include
>+
>+# Start hooks
>+libbsp_a_SOURCES += startup/bspstarthooks.c
>+
>+###############################################################################
>+# Special Rules #
>+###############################################################################
>+
>+DISTCLEANFILES = include/bspopts.h
>+
>+include $(srcdir)/preinstall.am
>+include $(top_srcdir)/../../../../automake/local.am
>diff --git a/c/src/lib/libbsp/arm/mx6ulevk/README b/c/src/lib/libbsp/arm/mx6ulevk/README
>new file mode 100644
>index 0000000..bca7661
>--- /dev/null
>+++ b/c/src/lib/libbsp/arm/mx6ulevk/README
>@@ -0,0 +1,28 @@
>+How to compile:
>+$mkdir b-rtems
>+$cd b-rtems
>+$../rtems-source/configure --target=arm-rtems4.12 --enable-tests --disable-networking
>+$gmake RTEMS_BSP="mx6ulevk"
>+
>+After compile:
>+$arm-rtems4.12-objcopy -O binary hello.exe hello.bin
>+$arm-rtems4.12-objcopy -O binary ticker.exe ticker.bin
>+
>+U-Boot source:
>+http://git.freescale.com/git/cgit.cgi/imx/uboot-imx.git/log/?h=imx_v2015.04_3.14.38_6ul_ga
>+Build U-Boot:
>+$export CROSS_COMPILE=arm-poky-linux-gnueabi-
>+$make ARCH=arm mx6ul_14x14_evk_config
>+$make
>+Burn u-boot.imx to offset 0x400 of sd card.
>+
>+How to run using U-Boot:
>+Run hello example
>+=>fatload mmc 1:1 0x80000000 hello.bin
>+=>dcache off; icache off; dcache flush; icache flush
>+=>go 0x80000000
>+
>+Or using tftp to load test bin
>+=>tftp 0x80000000 ticker.bin
>+=>dcache off; icache off; dcache flush; icache flush
>+=>go 0x80000000
>diff --git a/c/src/lib/libbsp/arm/mx6ulevk/bsp_specs b/c/src/lib/libbsp/arm/mx6ulevk/bsp_specs
>new file mode 100644
>index 0000000..32c105f
>--- /dev/null
>+++ b/c/src/lib/libbsp/arm/mx6ulevk/bsp_specs
>@@ -0,0 +1,13 @@
>+%rename endfile old_endfile
>+%rename startfile old_startfile
>+%rename link old_link
>+
>+*startfile:
>+%{!qrtems: %(old_startfile)} \
>+%{!nostdlib: %{qrtems: start.o%s crti.o%s crtbegin.o%s -e _start}}
>+
>+*link:
>+%{!qrtems: %(old_link)} %{qrtems: -dc -dp -N}
>+
>+*endfile:
>+%{!qrtems: %(old_endfiles)} %{qrtems: crtend.o%s crtn.o%s }
>diff --git a/c/src/lib/libbsp/arm/mx6ulevk/configure.ac b/c/src/lib/libbsp/arm/mx6ulevk/configure.ac
>new file mode 100644
>index 0000000..6f2d1e4
>--- /dev/null
>+++ b/c/src/lib/libbsp/arm/mx6ulevk/configure.ac
>@@ -0,0 +1,34 @@
>+##
>+#
>+# @file
>+#
>+# @brief Configure script of LibBSP for the i.MX 6UltraLite Processor.
>+#
>+
>+AC_PREREQ([2.69])
>+AC_INIT([rtems-c-src-lib-libbsp-arm-mx6ulevk],[_RTEMS_VERSION],[http://www.rtems.org/bugzilla])
>+AC_CONFIG_SRCDIR([bsp_specs])
>+RTEMS_TOP(../../../../../..)
>+
>+RTEMS_CANONICAL_TARGET_CPU
>+AM_INIT_AUTOMAKE([no-define nostdinc foreign 1.12.2])
>+RTEMS_BSP_CONFIGURE
>+
>+RTEMS_PROG_CC_FOR_TARGET
>+RTEMS_CANONICALIZE_TOOLS
>+RTEMS_PROG_CCAS
>+
>+RTEMS_CHECK_NETWORKING
>+AM_CONDITIONAL(HAS_NETWORKING,test "$HAS_NETWORKING" = "yes")
>+
>+RTEMS_BSPOPTS_SET([BSP_START_RESET_VECTOR],[*],[])
>+RTEMS_BSPOPTS_HELP([BSP_START_RESET_VECTOR],[reset vector address for BSP start])
>+
>+RTEMS_BSPOPTS_SET([BSP_CONSOLE_MINOR],[*],[0])
>+RTEMS_BSPOPTS_HELP([BSP_CONSOLE_MINOR],[minor number of console device])
>+
>+RTEMS_BSP_CLEANUP_OPTIONS(0, 1)
>+RTEMS_BSP_LINKCMDS
>+
>+AC_CONFIG_FILES([Makefile])
>+AC_OUTPUT
>diff --git a/c/src/lib/libbsp/arm/mx6ulevk/console/console-config.c b/c/src/lib/libbsp/arm/mx6ulevk/console/console-config.c
>new file mode 100644
>index 0000000..cc6b074
>--- /dev/null
>+++ b/c/src/lib/libbsp/arm/mx6ulevk/console/console-config.c
>@@ -0,0 +1,82 @@
>+/*
>+ * Copyright (c) 2016 Peng Fan <van.freenix at gmail.com>
>+ *
>+ * Copyright (c) 2013 embedded brains GmbH. All rights reserved.
>+ *
>+ * embedded brains GmbH
>+ * Dornierstr. 4
>+ * 82178 Puchheim
>+ * Germany
>+ * <info at embedded-brains.de>
>+ *
>+ * The license and distribution terms for this file may be
>+ * found in the file LICENSE in this distribution or at
>+ * http://www.rtems.com/license/LICENSE.
>+ */
>+
>+#include <libchip/serial.h>
>+
>+#include <bsp.h>
>+#include <bsp/irq.h>
>+
>+extern const console_fns imx_uart_fns;
>+console_tbl Console_Configuration_Ports[] = {
>+ {
>+ .sDeviceName = "/dev/ttyS0",
>+ .deviceType = SERIAL_CUSTOM,
>+ .pDeviceFns = &imx_uart_fns,
>+ .deviceProbe = NULL,
>+ .pDeviceFlow = NULL,
>+ .ulMargin = 0,
>+ .ulHysteresis = 0,
>+ .pDeviceParams = (void *) 115200,
>+ .ulCtrlPort1 = UART_BASE,
>+ .ulCtrlPort2 = 0,
>+ .ulDataPort = 0,
>+ .getRegister = NULL,
>+ .setRegister = NULL,
>+ .getData = NULL,
>+ .setData = NULL,
>+ .ulClock = 0,
>+ .ulIntVector = UART_IRQ
>+ }
>+};
>+
>+unsigned long Console_Configuration_Count =
>+ RTEMS_ARRAY_SIZE(Console_Configuration_Ports);
>+
>+static void output_char(char c)
>+{
>+ int minor = (int) Console_Port_Minor;
>+ const console_tbl *ct = Console_Port_Tbl != NULL ?
>+ Console_Port_Tbl[minor] : &Console_Configuration_Ports[minor];
>+ const console_fns *cf = ct->pDeviceFns;
>+
>+ if (c == '\n') {
>+ (*cf->deviceWritePolled)(minor, '\r');
>+ }
>+
>+ (*cf->deviceWritePolled)(minor, c);
>+}
>+
>+static void output_char_init(char c)
>+{
>+ if (Console_Port_Tbl == NULL) {
>+ int minor;
>+ const console_fns *cf;
>+
>+ bsp_console_select();
>+
>+ minor = (int) Console_Port_Minor;
>+ cf = Console_Configuration_Ports[minor].pDeviceFns;
>+
>+ (*cf->deviceInitialize)(minor);
>+ }
>+
>+ BSP_output_char = output_char;
>+ output_char(c);
>+}
>+
>+BSP_output_char_function_type BSP_output_char = output_char_init;
>+
>+BSP_polling_getchar_function_type BSP_poll_char = NULL;
>diff --git a/c/src/lib/libbsp/arm/mx6ulevk/console/imx-uart.c b/c/src/lib/libbsp/arm/mx6ulevk/console/imx-uart.c
>new file mode 100644
>index 0000000..dd7f8ae
>--- /dev/null
>+++ b/c/src/lib/libbsp/arm/mx6ulevk/console/imx-uart.c
>@@ -0,0 +1,131 @@
>+/*
>+ * Copyright (c) 2016 Peng Fan <van.freenix at gmail.com>.
>+ *
>+ * The license and distribution terms for this file may be
>+ * found in the file LICENSE in this distribution or at
>+ * http://www.rtems.org/license/LICENSE.
>+ */
>+
>+#include <bspopts.h>
>+
>+#include <libchip/serial.h>
>+#include <libchip/sersupp.h>
>+
>+#include <bsp.h>
>+#include <bsp/irq.h>
>+#include <bsp/utility.h>
>+#include <bsp/uart-output-char.h>
>+
>+#include <bsp/imx6-uart.h>
>+
>+static uint32_t imx_uart_get_regs(int minor)
>+{
>+ const console_tbl *ct = Console_Port_Tbl != NULL ?
>+ Console_Port_Tbl[minor] : &Console_Configuration_Ports[minor];
>+
>+ return ct->ulCtrlPort1;
>+}
>+
>+/* Make weak and let the user override. */
>+uint32_t imx_uart_input_clock(void) __attribute__ ((weak));
>+
>+uint32_t imx_uart_input_clock(void)
>+{
>+ /*
>+ * Now we use clock set from U-Boot, 80M.
>+ * TODO:
>+ * Handling clock
>+ */
>+ return 80000000;
>+}
>+
>+static int imx_calculate_baudrate(uint32_t baudrate,
>+ uint32_t* brgr,
>+ uint32_t* bauddiv,
>+ uint32_t modereg)
>+{
>+ /*
>+ * Use the initialized baudrate from U-Boot.
>+ * TODO:
>+ * Add baudrate handling
>+ */
>+ return 0;
>+}
>+
>+static void imx_uart_initialize(int minor)
>+{
>+ /* TODO */
>+}
>+
>+static int imx_uart_first_open(int major, int minor, void *arg)
>+{
>+ rtems_libio_open_close_args_t *oc = (rtems_libio_open_close_args_t *) arg;
>+ struct rtems_termios_tty *tty = (struct rtems_termios_tty *) oc->iop->data1;
>+ console_data *cd = &Console_Port_Data[minor];
>+ const console_tbl *ct = Console_Port_Tbl[minor];
>+
>+ cd->termios_data = tty;
>+ rtems_termios_set_initial_baud(tty, (rtems_termios_baud_t) ct->pDeviceParams);
>+
>+ return 0;
>+}
>+
>+static int imx_uart_last_close(int major, int minor, void *arg)
>+{
>+ return 0;
>+}
>+
>+static int imx_uart_read_polled(int minor)
>+{
>+ uint32_t reg_base = imx_uart_get_regs(minor);
>+
>+ while (readl(reg_base + UTS_OFF) & UTS_RXEMPTY)
>+ ;
>+
>+ return (readl(reg_base + URXD_OFF) & URXD_RX_DATA);
>+}
>+
>+static void imx_uart_write_polled(int minor, char c)
>+{
>+ uint32_t reg_base = imx_uart_get_regs(minor);
>+
>+ writel(c, reg_base + UTXD_OFF);
>+
>+ while (!(readl(reg_base + UTS_OFF) & UTS_TXEMPTY))
>+ ;
>+
>+ if (c == '\n')
>+ imx_uart_write_polled(minor, '\r');
>+}
>+
>+static ssize_t imx_uart_write_support_polled(
>+ int minor,
>+ const char *s,
>+ size_t n
>+)
>+{
>+ ssize_t i = 0;
>+
>+ for (i = 0; i < n; ++i) {
>+ imx_uart_write_polled(minor, s[i]);
>+ }
>+
>+ return n;
>+}
>+
>+static int imx_uart_set_attribues(int minor, const struct termios *term)
>+{
>+ return -1;
>+}
>+
>+const console_fns imx_uart_fns = {
>+ .deviceProbe = libchip_serial_default_probe,
>+ .deviceFirstOpen = imx_uart_first_open,
>+ .deviceLastClose = imx_uart_last_close,
>+ .deviceRead = imx_uart_read_polled,
>+ .deviceWrite = imx_uart_write_support_polled,
>+ .deviceInitialize = imx_uart_initialize,
>+ .deviceWritePolled = imx_uart_write_polled,
>+ .deviceSetAttributes = imx_uart_set_attribues,
>+ .deviceOutputUsesInterrupts = false
>+};
>diff --git a/c/src/lib/libbsp/arm/mx6ulevk/gpt.c b/c/src/lib/libbsp/arm/mx6ulevk/gpt.c
>new file mode 100644
>index 0000000..47b1659
>--- /dev/null
>+++ b/c/src/lib/libbsp/arm/mx6ulevk/gpt.c
>@@ -0,0 +1,164 @@
>+/*
>+ * Copyright (c) 2016 Peng Fan <van.freenix at gmail.com>.
>+ *
>+ * The license and distribution terms for this file may be
>+ * found in the file LICENSE in this distribution or at
>+ * http://www.rtems.org/license/LICENSE.
>+ */
>+
>+#include <rtems.h>
>+#include <rtems/timecounter.h>
>+#include <bsp.h>
>+
>+#include <bsp/irq.h>
>+
>+#include <bsp/imx6-gpt.h>
>+
>+static imx6_gpt_timer_t gpt_timer = {
>+ .base = GPT_TIMER_BASE,
>+ .irq_nr = GPT_IRQ,
>+};
>+
>+static struct timecounter gpt_clock_tc;
>+static struct imx6_gpt_timer *timer = &gpt_timer;
>+
>+static uint32_t gpt_clock_get_timecount(struct timecounter *tc)
>+{
>+ return readl(timer->base + GPT_CNT);
>+}
>+
>+static inline void gpt_irq_enable(void)
>+{
>+ writel(1 << 0, timer->base + GPT_IR);
>+}
>+
>+static inline void gpt_irq_disable(void)
>+{
>+ writel(0, timer->base + GPT_IR);
>+}
>+
>+static inline void gpt_irq_ack(void)
>+{
>+ writel(TSTAT_OF1, timer->base + GPT_SR);
>+}
>+
>+static void gpt_clock_initialize(void)
>+{
>+ uint32_t gpt_cr;
>+ uint32_t tprer_val, cur_cnt;
>+ uint32_t interval = 3 * rtems_configuration_get_microseconds_per_tick();
>+
>+ /* Software reset */
>+ writel(1 << 15, timer->base + GPT_CR);
>+ /* Dead loop until reset finished */
>+ while (readl(timer->base + GPT_CR) & (1 << 15));
>+
>+ writel(0, timer->base + GPT_CR);
>+ writel(0, timer->base + GPT_PR);
>+
>+ gpt_cr = TCTL_CLK_OSC_DIV8 | TCTL_FRR | TCTL_WAITEN | TCTL_TEN;
>+ gpt_cr |= TCTL_24MEN;
>+
>+ /* 3M = 24M / 8*/
>+ tprer_val = 7 << TPRER_PRE24M;
>+ writel(tprer_val, timer->base + GPT_PR);
>+
>+ writel(gpt_cr, timer->base + GPT_CR);
>+
>+ /* Install timecounter */ \
>+ gpt_clock_tc.tc_get_timecount = gpt_clock_get_timecount;
>+ gpt_clock_tc.tc_counter_mask = 0xffffffff;
>+ /* Runs at 3M */
>+ gpt_clock_tc.tc_frequency = 3000000;
>+ gpt_clock_tc.tc_quality = RTEMS_TIMECOUNTER_QUALITY_CLOCK_DRIVER;
>+ rtems_timecounter_install(&gpt_clock_tc);
>+
>+ /* Clear pending interrupt */
>+ gpt_irq_ack();
>+
>+ /* Fill the value to trigger the tick compare event */
>+ cur_cnt = readl(timer->base + GPT_CNT);
>+ writel(cur_cnt + interval, timer->base + GPT_OCR1);
>+
>+ /* Enable interrupt */
>+ gpt_irq_enable();
>+}
>+
>+static void gpt_clock_at_tick(void)
>+{
>+ uint32_t gpt_cnt;
>+ /*
>+ * The GPT runs at 3M.
>+ *
>+ * rtems_configuration_get_microseconds_per_tick
>+ * interval = ----------------------
>+ * 1000000 / 3000000
>+ */
>+ uint32_t interval = 3 * rtems_configuration_get_microseconds_per_tick();
>+
>+ gpt_irq_disable();
>+ gpt_irq_ack();
>+
>+ gpt_cnt = readl(timer->base + GPT_CNT);
>+ writel(gpt_cnt + interval, timer->base + GPT_OCR1);
>+
>+ gpt_irq_enable();
>+}
>+
>+CPU_Counter_ticks _CPU_Counter_read(void)
>+{
>+ return gpt_clock_get_timecount(NULL);
>+}
>+
>+static rtems_interrupt_handler clock_isr = NULL;
>+
>+static void gpt_clock_handler_install(rtems_interrupt_handler isr)
>+{
>+ rtems_status_code sc = RTEMS_SUCCESSFUL;
>+
>+ sc = rtems_interrupt_handler_install(
>+ timer->irq_nr,
>+ "Clock",
>+ RTEMS_INTERRUPT_UNIQUE,
>+ isr,
>+ NULL
>+ );
>+
>+ if (sc != RTEMS_SUCCESSFUL) {
>+ rtems_fatal_error_occurred(0xdeadbeef);
>+ }
>+ clock_isr = isr;
>+}
>+
>+static void gpt_clock_cleanup(void)
>+{
>+ rtems_status_code sc = RTEMS_SUCCESSFUL;
>+
>+ gpt_irq_ack();
>+
>+ gpt_irq_disable();
>+
>+ /* Remove interrupt handler */
>+ sc = rtems_interrupt_handler_remove(
>+ timer->irq_nr,
>+ clock_isr,
>+ NULL
>+ );
>+ if (sc != RTEMS_SUCCESSFUL) {
>+ rtems_fatal_error_occurred(0xdeadbeef);
>+ }
>+ clock_isr = NULL;
>+}
>+
>+#define Clock_driver_support_at_tick() gpt_clock_at_tick()
>+#define Clock_driver_support_initialize_hardware() gpt_clock_initialize()
>+#define Clock_driver_support_install_isr(isr, old_isr) \
>+ do { \
>+ gpt_clock_handler_install(isr); \
>+ old_isr = NULL; \
>+ } while (0)
>+
>+#define Clock_driver_support_shutdown_hardware() gpt_clock_cleanup()
>+
>+/* Include shared source clock driver code */
>+#include "../../shared/clockdrv_shell.h"
>diff --git a/c/src/lib/libbsp/arm/mx6ulevk/include/bsp.h b/c/src/lib/libbsp/arm/mx6ulevk/include/bsp.h
>new file mode 100644
>index 0000000..516294a
>--- /dev/null
>+++ b/c/src/lib/libbsp/arm/mx6ulevk/include/bsp.h
>@@ -0,0 +1,121 @@
>+/*
>+ * Copyright (c) 2016 Peng Fan <van.freenix at gmail.com>.
>+ *
>+ * The license and distribution terms for this file may be
>+ * found in the file LICENSE in this distribution or at
>+ * http://www.rtems.org/license/LICENSE.
>+ */
>+
>+#ifndef LIBBSP_ARM_MX6ULEVK_BSP_H
>+#define LIBBSP_ARM_MX6ULEVK_BSP_H
>+
>+#include <bspopts.h>
>+#include <stdint.h>
>+#include <bsp/start.h>
>+#include <bsp/default-initial-extension.h>
>+
>+#include <rtems.h>
>+#include <rtems/irq-extension.h>
>+
>+#define BSP_FEATURE_IRQ_EXTENSION
>+
>+/* Access memory-mapped I/O devices */
>+#define mmio_read(a) (*(volatile uint32_t *)(a))
>+#define mmio_write(a,v) (*(volatile uint32_t *)(a) = (v))
>+#define mmio_set(a,v) mmio_write((a), mmio_read((a)) | (v))
>+#define mmio_clear(a,v) mmio_write((a), mmio_read((a)) & ~(v))
>+
>+#define REG16(x)(*((volatile uint16_t *)(x)))
>+#define REG(x)(*((volatile uint32_t *)(x)))
>+#define BIT(x)(0x1 << x)
>+
>+#define udelay(u) rtems_task_wake_after(1 + ((u)/rtems_configuration_get_microseconds_per_tick()))
>+
>+/* Write a uint32_t value to a memory address. */
>+static inline void
>+write32(uint32_t address, uint32_t value)
>+{
>+ REG(address) = value;
>+}
>+
>+/* Read an uint32_t from a memory address */
>+static inline uint32_t
>+read32(uint32_t address)
>+{
>+ return REG(address);
>+}
>+
>+/* Set a 32 bits value depending on a mask */
>+static inline void
>+set32(uint32_t address, uint32_t mask, uint32_t value)
>+{
>+ uint32_t val;
>+ val = read32(address);
>+ /* clear the bits */
>+ val &= ~(mask);
>+ /* apply the value using the mask */
>+ val |= (value & mask);
>+ write32(address, val);
>+}
>+
>+/* Write a uint16_t value to a memory address. */
>+static inline void
>+write16(uint32_t address, uint16_t value)
>+{
>+ REG16(address) = value;
>+}
>+
>+/* Read an uint16_t from a memory address */
>+static inline uint16_t
>+read16(uint32_t address)
>+{
>+ return REG16(address);
>+}
>+
>+/* Data synchronization barrier */
>+static inline void dsb(void)
>+{
>+ asm volatile("dsb" : : : "memory");
>+}
>+
>+/* Instruction synchronization barrier */
>+static inline void isb(void)
>+{
>+ asm volatile("isb" : : : "memory");
>+}
>+
>+/* flush data cache */
>+static inline void flush_data_cache(void)
>+{
>+ asm volatile(
>+ "mov r0, #0\n"
>+ "mcr p15, #0, r0, c7, c10, #4\n"
>+ : /* No outputs */
>+ : /* No inputs */
>+ : "r0","memory"
>+ );
>+}
>+
>+#define __arch_getb(a) (*(volatile unsigned char *)(a))
>+#define __arch_getw(a) (*(volatile unsigned short *)(a))
>+#define __arch_getl(a) (*(volatile unsigned int *)(a))
>+
>+#define __arch_putb(v,a) (*(volatile unsigned char *)(a) = (v))
>+#define __arch_putw(v,a) (*(volatile unsigned short *)(a) = (v))
>+#define __arch_putl(v,a) (*(volatile unsigned int *)(a) = (v))
>+
>+#define writeb(v,c) ({ unsigned char __v = v; __arch_putb(__v,c); __v; })
>+#define writew(v,c) ({ unsigned short __v = v; __arch_putw(__v,c); __v; })
>+#define writel(v,c) ({ unsigned int __v = v; __arch_putl(__v,c); __v; })
>+
>+#define readb(c) ({ unsigned char __v = __arch_getb(c); __v; })
>+#define readw(c) ({ unsigned short __v = __arch_getw(c); __v; })
>+#define readl(c) ({ unsigned int __v = __arch_getl(c); __v; })
>+
>+#define BSP_ARM_GIC_DIST_BASE 0x00a01000
>+#define BSP_ARM_GIC_CPUIF_BASE 0x00a02000
>+
>+#define GPT_TIMER_BASE 0x02098000
>+#define UART_BASE 0x02020000
>+
>+#endif /* LIBBSP_ARM_BEAGLE_BSP_H */
>diff --git a/c/src/lib/libbsp/arm/mx6ulevk/include/imx6-gpt.h b/c/src/lib/libbsp/arm/mx6ulevk/include/imx6-gpt.h
>new file mode 100644
>index 0000000..6ce9c15
>--- /dev/null
>+++ b/c/src/lib/libbsp/arm/mx6ulevk/include/imx6-gpt.h
>@@ -0,0 +1,48 @@
>+/*
>+ * Copyright (c) 2016 Peng Fan <van.freenix at gmail.com>.
>+ *
>+ * The license and distribution terms for this file may be
>+ * found in the file LICENSE in this distribution or at
>+ * http://www.rtems.org/license/LICENSE.
>+ */
>+
>+#ifndef LIBBSP_ARM_MX6ULEVK_GPT_H
>+#define LIBBSP_ARM_MX6ULEVK_GPT_H
>+
>+#include <stdint.h>
>+
>+/* i.MX6 GPT register bit definition */
>+#define TCTL_WAITEN (1 << 3)
>+#define TCTL_CLK_IPG (1 << 6)
>+#define TCTL_CLK_PER (2 << 6)
>+#define TCTL_CLK_OSC_DIV8 (5 << 6)
>+#define TCTL_CLK_OSC (7 << 6)
>+#define TCTL_24MEN (1 << 10)
>+#define TCTL_FRR (1 << 9)
>+#define TPRER_PRE24M 12
>+#define IR 0x0c
>+#define TSTAT 0x08
>+#define TSTAT_OF1 (1 << 0)
>+#define TCN 0x24
>+#define TCMP 0x10
>+#define TCTL_TEN (1 << 0) /* Enable module */
>+
>+/* Register offset */
>+#define GPT_CR 0x0
>+#define GPT_PR 0x4
>+#define GPT_SR 0x8
>+#define GPT_IR 0xC
>+#define GPT_OCR1 0x10
>+#define GPT_OCR2 0x14
>+#define GPT_OCR3 0x18
>+#define GPT_ICR1 0x1C
>+#define GPT_ICR2 0x20
>+#define GPT_CNT 0x24
>+
>+typedef struct imx6_gpt_timer
>+{
>+ uint32_t base;
>+ int irq_nr;
>+} imx6_gpt_timer_t;
>+
>+#endif
>diff --git a/c/src/lib/libbsp/arm/mx6ulevk/include/imx6-uart.h b/c/src/lib/libbsp/arm/mx6ulevk/include/imx6-uart.h
>new file mode 100644
>index 0000000..cbce66a
>--- /dev/null
>+++ b/c/src/lib/libbsp/arm/mx6ulevk/include/imx6-uart.h
>@@ -0,0 +1,60 @@
>+/*
>+ * Copyright (c) 2016 Peng Fan <van.freenix at gmail.com>.
>+ *
>+ * The license and distribution terms for this file may be
>+ * found in the file LICENSE in this distribution or at
>+ * http://www.rtems.org/license/LICENSE.
>+ */
>+
>+#ifndef LIBBSP_ARM_MX6ULEVK_UART_REGS_H
>+#define LIBBSP_ARM_MX6ULEVK_UART_REGS_H
>+
>+/* Register offset */
>+#define URXD_OFF 0x0
>+#define UTXD_OFF 0x40
>+#define UCR1_OFF 0x80
>+#define UCR2_OFF 0x84
>+#define UCR3_OFF 0x88
>+#define UCR4_OFF 0x8c
>+#define UFCR_OFF 0x90
>+#define USR1_OFF 0x94
>+#define USR2_OFF 0x98
>+#define UESC_OFF 0x9c
>+#define UTIM_OFF 0xa0
>+#define UBIR_OFF 0xa4
>+#define UBMR_OFF 0xa8
>+#define UBRC_OFF 0xac
>+#define ONEMS_OFF 0xb0
>+#define UTS_OFF 0xb4
>+
>+/* Register Bit Fields.*/
>+#define URXD_CHARRDY (1<<15)
>+#define URXD_ERR (1<<14)
>+#define URXD_OVRRUN (1<<13)
>+#define URXD_FRMERR (1<<12)
>+#define URXD_BRK (1<<11)
>+#define URXD_PRERR (1<<10)
>+#define URXD_RX_DATA (0xFF)
>+#define UCR1_ADEN (1<<15)
>+#define UCR1_ADBR (1<<14)
>+#define UCR1_TRDYEN (1<<13)
>+#define UCR1_IDEN (1<<12)
>+#define UCR1_RRDYEN (1<<9)
>+#define UCR1_RDMAEN (1<<8)
>+#define UCR1_IREN (1<<7)
>+#define UCR1_TXMPTYEN (1<<6)
>+#define UCR1_RTSDEN (1<<5)
>+#define UCR1_SNDBRK (1<<4)
>+#define UCR1_TDMAEN (1<<3)
>+#define UCR1_UARTCLKEN (1<<2)
>+#define UCR1_DOZE (1<<1)
>+#define UCR1_UARTEN (1<<0)
>+#define UTS_FRCPERR (1<<13)
>+#define UTS_LOOP (1<<12)
>+#define UTS_TXEMPTY (1<<6)
>+#define UTS_RXEMPTY (1<<5)
>+#define UTS_TXFULL (1<<4)
>+#define UTS_RXFULL (1<<3)
>+#define UTS_SOFTRST (1<<0)
>+
>+#endif
>diff --git a/c/src/lib/libbsp/arm/mx6ulevk/include/irq.h b/c/src/lib/libbsp/arm/mx6ulevk/include/irq.h
>new file mode 100644
>index 0000000..ff75953
>--- /dev/null
>+++ b/c/src/lib/libbsp/arm/mx6ulevk/include/irq.h
>@@ -0,0 +1,38 @@
>+/*
>+ * Copyright (c) 2016 Peng Fan <van.freenix at gmail.com>.
>+ *
>+ * The license and distribution terms for this file may be
>+ * found in the file LICENSE in this distribution or at
>+ * http://www.rtems.com/license/LICENSE.
>+ */
>+
>+#ifndef LIBBSP_ARM_MX6ULEVK_IRQ_H
>+#define LIBBSP_ARM_MX6ULEVK_IRQ_H
>+
>+#ifndef ASM
>+
>+#include <rtems/irq.h>
>+#include <rtems/irq-extension.h>
>+
>+#include <bsp/arm-gic-irq.h>
>+
>+#ifdef __cplusplus
>+extern "C" {
>+#endif /* __cplusplus */
>+
>+/*
>+ * Interrupt Vector numbers
>+ */
>+#define UART_IRQ 58
>+#define GPT_IRQ 87
>+
>+#define BSP_INTERRUPT_VECTOR_MIN 0
>+#define BSP_INTERRUPT_VECTOR_MAX 158
>+
>+#ifdef __cplusplus
>+}
>+#endif /* __cplusplus */
>+
>+#endif /* ASM */
>+
>+#endif /* LIBBSP_ARM_MX6ULEVK_IRQ_H */
>diff --git a/c/src/lib/libbsp/arm/mx6ulevk/include/tm27.h b/c/src/lib/libbsp/arm/mx6ulevk/include/tm27.h
>new file mode 100644
>index 0000000..96ab469
>--- /dev/null
>+++ b/c/src/lib/libbsp/arm/mx6ulevk/include/tm27.h
>@@ -0,0 +1,24 @@
>+/*
>+ * Copyright (c) 2013 embedded brains GmbH. All rights reserved.
>+ *
>+ * embedded brains GmbH
>+ * Dornierstr. 4
>+ * 82178 Puchheim
>+ * Germany
>+ * <info at embedded-brains.de>
>+ *
>+ * The license and distribution terms for this file may be
>+ * found in the file LICENSE in this distribution or at
>+ * http://www.rtems.com/license/LICENSE.
>+ */
>+
>+#ifndef _RTEMS_TMTEST27
>+#error "This is an RTEMS internal file you must not include directly."
>+#endif
>+
>+#ifndef __tm27_h
>+#define __tm27_h
>+
>+#include <bsp/arm-gic-tm27.h>
>+
>+#endif /* __tm27_h */
>diff --git a/c/src/lib/libbsp/arm/mx6ulevk/make/custom/mx6ulevk.cfg b/c/src/lib/libbsp/arm/mx6ulevk/make/custom/mx6ulevk.cfg
>new file mode 100644
>index 0000000..162e1ad
>--- /dev/null
>+++ b/c/src/lib/libbsp/arm/mx6ulevk/make/custom/mx6ulevk.cfg
>@@ -0,0 +1,9 @@
>+include $(RTEMS_ROOT)/make/custom/default.cfg
>+
>+RTEMS_CPU_MODEL=mx6
>+
>+RTEMS_CPU = arm
>+
>+CPU_CFLAGS = -march=armv7-a -mfpu=neon -mfloat-abi=soft -mtune=cortex-a7
>+
>+CFLAGS_OPTIMIZE_V ?= -O0 -g
>diff --git a/c/src/lib/libbsp/arm/mx6ulevk/preinstall.am b/c/src/lib/libbsp/arm/mx6ulevk/preinstall.am
>new file mode 100644
>index 0000000..7a0dee4
>--- /dev/null
>+++ b/c/src/lib/libbsp/arm/mx6ulevk/preinstall.am
>@@ -0,0 +1,151 @@
>+## Automatically generated by ampolish3 - Do not edit
>+
>+if AMPOLISH3
>+$(srcdir)/preinstall.am: Makefile.am
>+ $(AMPOLISH3) $(srcdir)/Makefile.am > $(srcdir)/preinstall.am
>+endif
>+
>+PREINSTALL_DIRS =
>+DISTCLEANFILES += $(PREINSTALL_DIRS)
>+
>+all-local: $(TMPINSTALL_FILES)
>+
>+TMPINSTALL_FILES =
>+CLEANFILES = $(TMPINSTALL_FILES)
>+
>+all-am: $(PREINSTALL_FILES)
>+
>+PREINSTALL_FILES =
>+CLEANFILES += $(PREINSTALL_FILES)
>+
>+$(PROJECT_LIB)/$(dirstamp):
>+ @$(MKDIR_P) $(PROJECT_LIB)
>+ @: > $(PROJECT_LIB)/$(dirstamp)
>+PREINSTALL_DIRS += $(PROJECT_LIB)/$(dirstamp)
>+
>+$(PROJECT_INCLUDE)/$(dirstamp):
>+ @$(MKDIR_P) $(PROJECT_INCLUDE)
>+ @: > $(PROJECT_INCLUDE)/$(dirstamp)
>+PREINSTALL_DIRS += $(PROJECT_INCLUDE)/$(dirstamp)
>+
>+$(PROJECT_INCLUDE)/bsp/$(dirstamp):
>+ @$(MKDIR_P) $(PROJECT_INCLUDE)/bsp
>+ @: > $(PROJECT_INCLUDE)/bsp/$(dirstamp)
>+PREINSTALL_DIRS += $(PROJECT_INCLUDE)/bsp/$(dirstamp)
>+
>+$(PROJECT_INCLUDE)/libcpu/$(dirstamp):
>+ @$(MKDIR_P) $(PROJECT_INCLUDE)/libcpu
>+ @: > $(PROJECT_INCLUDE)/libcpu/$(dirstamp)
>+PREINSTALL_DIRS += $(PROJECT_INCLUDE)/libcpu/$(dirstamp)
>+
>+$(PROJECT_LIB)/bsp_specs: bsp_specs $(PROJECT_LIB)/$(dirstamp)
>+ $(INSTALL_DATA) $< $(PROJECT_LIB)/bsp_specs
>+PREINSTALL_FILES += $(PROJECT_LIB)/bsp_specs
>+
>+$(PROJECT_INCLUDE)/bsp.h: include/bsp.h $(PROJECT_INCLUDE)/$(dirstamp)
>+ $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp.h
>+PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp.h
>+
>+$(PROJECT_INCLUDE)/bsp/imx6-gpt.h: include/imx6-gpt.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
>+ $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/imx6-gpt.h
>+PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/imx6-gpt.h
>+
>+$(PROJECT_INCLUDE)/bsp/imx6-uart.h: include/imx6-uart.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
>+ $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/imx6-uart.h
>+PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/imx6-uart.h
>+
>+$(PROJECT_INCLUDE)/tm27.h: include/tm27.h $(PROJECT_INCLUDE)/$(dirstamp)
>+ $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/tm27.h
>+PREINSTALL_FILES += $(PROJECT_INCLUDE)/tm27.h
>+
>+$(PROJECT_INCLUDE)/coverhd.h: ../../shared/include/coverhd.h $(PROJECT_INCLUDE)/$(dirstamp)
>+ $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/coverhd.h
>+PREINSTALL_FILES += $(PROJECT_INCLUDE)/coverhd.h
>+
>+$(PROJECT_INCLUDE)/bspopts.h: include/bspopts.h $(PROJECT_INCLUDE)/$(dirstamp)
>+ $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bspopts.h
>+PREINSTALL_FILES += $(PROJECT_INCLUDE)/bspopts.h
>+
>+$(PROJECT_INCLUDE)/bsp/bootcard.h: ../../shared/include/bootcard.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
>+ $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/bootcard.h
>+PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/bootcard.h
>+
>+$(PROJECT_INCLUDE)/bsp/utility.h: ../../shared/include/utility.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
>+ $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/utility.h
>+PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/utility.h
>+
>+$(PROJECT_INCLUDE)/bsp/irq-generic.h: ../../shared/include/irq-generic.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
>+ $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/irq-generic.h
>+PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/irq-generic.h
>+
>+$(PROJECT_INCLUDE)/bsp/irq-info.h: ../../shared/include/irq-info.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
>+ $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/irq-info.h
>+PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/irq-info.h
>+
>+$(PROJECT_INCLUDE)/bsp/stackalloc.h: ../../shared/include/stackalloc.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
>+ $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/stackalloc.h
>+PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/stackalloc.h
>+
>+$(PROJECT_INCLUDE)/bsp/uart-output-char.h: ../../shared/include/uart-output-char.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
>+ $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/uart-output-char.h
>+PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/uart-output-char.h
>+
>+$(PROJECT_INCLUDE)/bsp/arm-a8core-start.h: ../shared/include/arm-a8core-start.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
>+ $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/arm-a8core-start.h
>+PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/arm-a8core-start.h
>+
>+$(PROJECT_INCLUDE)/bsp/arm-cp15-start.h: ../shared/include/arm-cp15-start.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
>+ $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/arm-cp15-start.h
>+PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/arm-cp15-start.h
>+
>+$(PROJECT_INCLUDE)/bsp/arm-errata.h: ../shared/include/arm-errata.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
>+ $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/arm-errata.h
>+PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/arm-errata.h
>+
>+$(PROJECT_INCLUDE)/bsp/arm-release-id.h: ../shared/include/arm-release-id.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
>+ $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/arm-release-id.h
>+PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/arm-release-id.h
>+
>+$(PROJECT_INCLUDE)/bsp/start.h: ../shared/include/start.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
>+ $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/start.h
>+PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/start.h
>+
>+$(PROJECT_INCLUDE)/bsp/arm-gic.h: ../shared/include/arm-gic.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
>+ $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/arm-gic.h
>+PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/arm-gic.h
>+
>+$(PROJECT_INCLUDE)/bsp/arm-gic-irq.h: ../shared/include/arm-gic-irq.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
>+ $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/arm-gic-irq.h
>+PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/arm-gic-irq.h
>+
>+$(PROJECT_INCLUDE)/bsp/arm-gic-regs.h: ../shared/include/arm-gic-regs.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
>+ $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/arm-gic-regs.h
>+PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/arm-gic-regs.h
>+
>+$(PROJECT_INCLUDE)/bsp/arm-gic-tm27.h: ../shared/include/arm-gic-tm27.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
>+ $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/arm-gic-tm27.h
>+PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/arm-gic-tm27.h
>+
>+$(PROJECT_INCLUDE)/bsp/arm-release-id.h: ../shared/include/arm-release-id.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
>+ $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/arm-release-id.h
>+PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/arm-release-id.h
>+
>+$(PROJECT_INCLUDE)/bsp/irq.h: include/irq.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
>+ $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/irq.h
>+PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/irq.h
>+
>+$(PROJECT_INCLUDE)/libcpu/arm-cp15.h: ../../../libcpu/arm/shared/include/arm-cp15.h $(PROJECT_INCLUDE)/libcpu/$(dirstamp)
>+ $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/libcpu/arm-cp15.h
>+PREINSTALL_FILES += $(PROJECT_INCLUDE)/libcpu/arm-cp15.h
>+
>+$(PROJECT_LIB)/start.$(OBJEXT): start.$(OBJEXT) $(PROJECT_LIB)/$(dirstamp)
>+ $(INSTALL_DATA) $< $(PROJECT_LIB)/start.$(OBJEXT)
>+TMPINSTALL_FILES += $(PROJECT_LIB)/start.$(OBJEXT)
>+
>+$(PROJECT_LIB)/linkcmds: startup/linkcmds $(PROJECT_LIB)/$(dirstamp)
>+ $(INSTALL_DATA) $< $(PROJECT_LIB)/linkcmds
>+TMPINSTALL_FILES += $(PROJECT_LIB)/linkcmds
>+
>+$(PROJECT_LIB)/linkcmds.mx6ulevk: startup/linkcmds.mx6ulevk $(PROJECT_LIB)/$(dirstamp)
>+ $(INSTALL_DATA) $< $(PROJECT_LIB)/linkcmds.mx6ulevk
>+TMPINSTALL_FILES += $(PROJECT_LIB)/linkcmds.mx6ulevk
>diff --git a/c/src/lib/libbsp/arm/mx6ulevk/startup/bspreset.c b/c/src/lib/libbsp/arm/mx6ulevk/startup/bspreset.c
>new file mode 100644
>index 0000000..52d07cd
>--- /dev/null
>+++ b/c/src/lib/libbsp/arm/mx6ulevk/startup/bspreset.c
>@@ -0,0 +1,24 @@
>+/*
>+ * Copyright (c) 2016 Peng Fan <van.freenix at gmail.com>
>+ *
>+ * Copyright (c) 2013 embedded brains GmbH. All rights reserved.
>+ *
>+ * embedded brains GmbH
>+ * Dornierstr. 4
>+ * 82178 Puchheim
>+ * Germany
>+ * <info at embedded-brains.de>
>+ *
>+ * The license and distribution terms for this file may be
>+ * found in the file LICENSE in this distribution or at
>+ * http://www.rtems.com/license/LICENSE.
>+ */
>+
>+#include <bsp/bootcard.h>
>+
>+void bsp_reset(void)
>+{
>+ while (true) {
>+ /* TODO */;
>+ }
>+}
>diff --git a/c/src/lib/libbsp/arm/mx6ulevk/startup/bspstart.c b/c/src/lib/libbsp/arm/mx6ulevk/startup/bspstart.c
>new file mode 100644
>index 0000000..8ebd187
>--- /dev/null
>+++ b/c/src/lib/libbsp/arm/mx6ulevk/startup/bspstart.c
>@@ -0,0 +1,25 @@
>+/*
>+ * Copyright (c) 2016 Peng Fan <van.freenix at gmail.com>
>+ *
>+ * Copyright (c) 2013 embedded brains GmbH. All rights reserved.
>+ *
>+ * embedded brains GmbH
>+ * Dornierstr. 4
>+ * 82178 Puchheim
>+ * Germany
>+ * <info at embedded-brains.de>
>+ *
>+ * The license and distribution terms for this file may be
>+ * found in the file LICENSE in this distribution or at
>+ * http://www.rtems.com/license/LICENSE.
>+ */
>+
>+#include <bsp.h>
>+#include <bsp/bootcard.h>
>+#include <bsp/irq-generic.h>
>+
>+void bsp_start(void)
>+{
>+ bsp_interrupt_initialize();
>+ printk("\n RTEMS MX6ULEVK board \n");
>+}
>diff --git a/c/src/lib/libbsp/arm/mx6ulevk/startup/bspstarthooks.c b/c/src/lib/libbsp/arm/mx6ulevk/startup/bspstarthooks.c
>new file mode 100644
>index 0000000..28288f9
>--- /dev/null
>+++ b/c/src/lib/libbsp/arm/mx6ulevk/startup/bspstarthooks.c
>@@ -0,0 +1,70 @@
>+/*
>+ * Copyright (c) 2016 Peng Fan <van.freenix at gmail.com>
>+ *
>+ * Copyright (c) 2013 embedded brains GmbH. All rights reserved.
>+ *
>+ * embedded brains GmbH
>+ * Dornierstr. 4
>+ * 82178 Puchheim
>+ * Germany
>+ * <info at embedded-brains.de>
>+ *
>+ * The license and distribution terms for this file may be
>+ * found in the file LICENSE in this distribution or at
>+ * http://www.rtems.com/license/LICENSE.
>+ */
>+
>+#include <bsp.h>
>+#include <bsp/start.h>
>+#include <bsp/arm-cp15-start.h>
>+#include <bsp/arm-a8core-start.h>
>+
>+BSP_START_DATA_SECTION static const arm_cp15_start_section_config
>+mx6ulevk_mmu_config_table[] = {
>+ ARMV7_CP15_START_DEFAULT_SECTIONS,
>+ {
>+ /* ARM CORE */
>+ .begin = 0x00A00000U,
>+ .end = 0x00A08000U,
>+ .flags = ARMV7_MMU_DEVICE
>+ }, {
>+ /* AIPS1 */
>+ .begin = 0x02000000U,
>+ .end = 0x02100000U,
>+ .flags = ARMV7_MMU_DEVICE
>+ }, {
>+ /* AIPS2 */
>+ .begin = 0x02100000U,
>+ .end = 0x02200000U,
>+ .flags = ARMV7_MMU_DEVICE
>+ }
>+};
>+
>+BSP_START_TEXT_SECTION static void setup_mmu_and_cache(void)
>+{
>+
>+ uint32_t ctrl = arm_cp15_start_setup_mmu_and_cache(
>+ ARM_CP15_CTRL_A | ARM_CP15_CTRL_M,
>+ ARM_CP15_CTRL_AFE | ARM_CP15_CTRL_Z
>+ );
>+
>+ arm_cp15_start_setup_translation_table_and_enable_mmu_and_cache(
>+ ctrl,
>+ (uint32_t *) bsp_translation_table_base,
>+ ARM_MMU_DEFAULT_CLIENT_DOMAIN,
>+ &mx6ulevk_mmu_config_table[0],
>+ RTEMS_ARRAY_SIZE(mx6ulevk_mmu_config_table)
>+ );
>+}
>+
>+BSP_START_TEXT_SECTION void bsp_start_hook_0(void)
>+{
>+}
>+
>+BSP_START_TEXT_SECTION void bsp_start_hook_1(void)
>+{
>+ arm_a8core_start_hook_1();
>+ bsp_start_copy_sections();
>+ setup_mmu_and_cache();
>+ bsp_start_clear_bss();
>+}
>diff --git a/c/src/lib/libbsp/arm/mx6ulevk/startup/linkcmds.mx6ulevk b/c/src/lib/libbsp/arm/mx6ulevk/startup/linkcmds.mx6ulevk
>new file mode 100644
>index 0000000..20ea3eb
>--- /dev/null
>+++ b/c/src/lib/libbsp/arm/mx6ulevk/startup/linkcmds.mx6ulevk
>@@ -0,0 +1,48 @@
>+/**
>+ * @file
>+ *
>+ * @ingroup arm_beagle
>+ *
>+ * @brief Linker script for beagles.
>+ */
>+
>+MEMORY {
>+ /* Beagleboards and beaglebones all
>+ * have either 256M or 512M memory. We just
>+ * use 256M for all.
>+ */
>+ RAM : ORIGIN = 0x80000000, LENGTH = 256M - 4M
>+ RAM_MMU : ORIGIN = 0x80000000 + 256M - 4M, LENGTH = 16k
>+}
>+
>+REGION_ALIAS ("REGION_START", RAM);
>+REGION_ALIAS ("REGION_VECTOR", RAM);
>+REGION_ALIAS ("REGION_TEXT", RAM);
>+REGION_ALIAS ("REGION_TEXT_LOAD", RAM);
>+REGION_ALIAS ("REGION_RODATA", RAM);
>+REGION_ALIAS ("REGION_RODATA_LOAD", RAM);
>+REGION_ALIAS ("REGION_DATA", RAM);
>+REGION_ALIAS ("REGION_DATA_LOAD", RAM);
>+REGION_ALIAS ("REGION_FAST_TEXT", RAM);
>+REGION_ALIAS ("REGION_FAST_TEXT_LOAD", RAM);
>+REGION_ALIAS ("REGION_FAST_DATA", RAM);
>+REGION_ALIAS ("REGION_FAST_DATA_LOAD", RAM);
>+REGION_ALIAS ("REGION_BSS", RAM);
>+REGION_ALIAS ("REGION_WORK", RAM);
>+REGION_ALIAS ("REGION_STACK", RAM);
>+REGION_ALIAS ("REGION_NOCACHE", RAM);
>+REGION_ALIAS ("REGION_NOCACHE_LOAD", RAM);
>+
>+bsp_stack_irq_size = DEFINED (bsp_stack_irq_size) ? bsp_stack_irq_size : 4096;
>+bsp_stack_abt_size = DEFINED (bsp_stack_abt_size) ? bsp_stack_abt_size : 1024;
>+
>+bsp_section_rwbarrier_align = DEFINED (bsp_section_rwbarrier_align) ? bsp_section_rwbarrier_align : 1M;
>+
>+bsp_vector_table_in_start_section = 1;
>+
>+bsp_translation_table_base = ORIGIN (RAM_MMU);
>+bsp_translation_table_end = ORIGIN (RAM_MMU) + LENGTH (RAM_MMU);
>+
>+INCLUDE linkcmds.armv4
>+
>+HeapSize = 1024 * 1024;
>--
>2.6.2
>
More information about the devel
mailing list