summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/arm/lpc32xx
diff options
context:
space:
mode:
authorThomas Doerfler <Thomas.Doerfler@embedded-brains.de>2010-01-12 15:03:22 +0000
committerThomas Doerfler <Thomas.Doerfler@embedded-brains.de>2010-01-12 15:03:22 +0000
commit39c8fdb416327c5ec0c23807ae701798a5739cdf (patch)
tree0f2bb4acb60e60d74b7ef08e345a21d7896aba20 /c/src/lib/libbsp/arm/lpc32xx
parent2010-01-11 Marc Pignat <marc.pignat@hevs.ch> (diff)
downloadrtems-39c8fdb416327c5ec0c23807ae701798a5739cdf.tar.bz2
add support for lpc32xx
Diffstat (limited to 'c/src/lib/libbsp/arm/lpc32xx')
-rw-r--r--c/src/lib/libbsp/arm/lpc32xx/ChangeLog8
-rw-r--r--c/src/lib/libbsp/arm/lpc32xx/Makefile.am31
-rw-r--r--c/src/lib/libbsp/arm/lpc32xx/configure.ac3
-rw-r--r--c/src/lib/libbsp/arm/lpc32xx/include/bsp.h4
-rw-r--r--c/src/lib/libbsp/arm/lpc32xx/include/bspopts.h.in3
-rw-r--r--c/src/lib/libbsp/arm/lpc32xx/include/irq.h2
-rw-r--r--c/src/lib/libbsp/arm/lpc32xx/include/lpc-ethernet-config.h81
-rw-r--r--c/src/lib/libbsp/arm/lpc32xx/include/lpc32xx.h1
-rw-r--r--c/src/lib/libbsp/arm/lpc32xx/irq/irq.c53
-rw-r--r--c/src/lib/libbsp/arm/lpc32xx/preinstall.am27
-rw-r--r--c/src/lib/libbsp/arm/lpc32xx/rtc/rtc-config.c114
-rw-r--r--c/src/lib/libbsp/arm/lpc32xx/startup/bspstarthooks.c124
-rw-r--r--c/src/lib/libbsp/arm/lpc32xx/startup/linkcmds.lpc32xx_phycore5
13 files changed, 387 insertions, 69 deletions
diff --git a/c/src/lib/libbsp/arm/lpc32xx/ChangeLog b/c/src/lib/libbsp/arm/lpc32xx/ChangeLog
index a89ffbd4d7..13500d9840 100644
--- a/c/src/lib/libbsp/arm/lpc32xx/ChangeLog
+++ b/c/src/lib/libbsp/arm/lpc32xx/ChangeLog
@@ -1,3 +1,11 @@
+2010-01-12 Sebastian Huber <sebastian.huber@embedded-brains.de>
+
+ * include/lpc-ethernet-config.h, include/mmu.h: New files.
+ * Makefile.am, configure.ac, preinstall.am, include/bsp.h,
+ include/bspopts.h.in, include/irq.h, include/lpc32xx.h, irq/irq.c,
+ rtc/rtc-config.c, startup/bspstarthooks.c,
+ startup/linkcmds.lpc32xx_phycore: Changes throughout.
+
2009-12-17 Joel Sherrill <joel.sherrill@oarcorp.com>
* include/bspopts.h.in: Regenerated.
diff --git a/c/src/lib/libbsp/arm/lpc32xx/Makefile.am b/c/src/lib/libbsp/arm/lpc32xx/Makefile.am
index fd866bcdcd..fd33ab5a9c 100644
--- a/c/src/lib/libbsp/arm/lpc32xx/Makefile.am
+++ b/c/src/lib/libbsp/arm/lpc32xx/Makefile.am
@@ -12,6 +12,7 @@ ACLOCAL_AMFLAGS = -I ../../../../aclocal
include $(top_srcdir)/../../../../automake/compile.am
include_bspdir = $(includedir)/bsp
+include_libcpudir = $(includedir)/libcpu
dist_project_lib_DATA = bsp_specs
@@ -20,6 +21,7 @@ dist_project_lib_DATA = bsp_specs
###############################################################################
include_HEADERS = include/bsp.h
+include_HEADERS += ../../shared/include/tm27.h
nodist_include_HEADERS = ../../shared/include/coverhd.h \
include/bspopts.h
@@ -37,10 +39,13 @@ include_bsp_HEADERS += ../shared/include/start.h
include_bsp_HEADERS += ../shared/lpc/include/lpc-timer.h
include_bsp_HEADERS += include/irq-config.h
include_bsp_HEADERS += include/irq.h
+include_bsp_HEADERS += include/mmu.h
include_bsp_HEADERS += include/lpc32xx.h
include_bsp_HEADERS += include/lpc-clock-config.h
+include_bsp_HEADERS += include/lpc-ethernet-config.h
-include_HEADERS += ../../shared/include/tm27.h
+include_libcpu_HEADERS = ../../../libcpu/arm/shared/include/cache.h \
+ ../../../libcpu/arm/shared/include/arm-cp15.h
###############################################################################
# Data #
@@ -64,6 +69,8 @@ EXTRA_DIST = startup/linkcmds.lpc32xx_phycore
noinst_LIBRARIES += libbsp.a
libbsp_a_SOURCES =
+libbsp_a_CPPFLAGS =
+libbsp_a_LIBADD =
# Shared
libbsp_a_SOURCES += ../../shared/bootcard.c \
@@ -109,12 +116,18 @@ libbsp_a_SOURCES += misc/timer.c
# I2C
+# Cache
+libbsp_a_SOURCES += ../../../libcpu/shared/src/cache_manager.c \
+ ../../../libcpu/arm/shared/cache/cache_.h
+libbsp_a_CPPFLAGS += -I$(srcdir)/../../../libcpu/arm/shared/include
+
# Start hooks (FIXME: This is brittle.)
libbsp_a_SOURCES += startup/bspstarthooks.c
-bspstarthooks.o: startup/bspstarthooks.c
- $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS:-mthumb=) \
- -MT bspstarthooks.o -MD -MP -MF $(DEPDIR)/bspstarthooks.Tpo -c -o bspstarthooks.o \
+libbsp_a-bspstarthooks.o: startup/bspstarthooks.c
+ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbsp_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS:-mthumb=) \
+ -MT libbsp_a-bspstarthooks.o -MD -MP -MF $(DEPDIR)/libbsp_a-bspstarthooks.Tpo -c -o libbsp_a-bspstarthooks.o \
`test -f 'startup/bspstarthooks.c' || echo '$(srcdir)/'`startup/bspstarthooks.c
+ $(am__mv) $(DEPDIR)/libbsp_a-bspstarthooks.Tpo $(DEPDIR)/libbsp_a-bspstarthooks.Po
###############################################################################
# Network #
@@ -122,13 +135,13 @@ bspstarthooks.o: startup/bspstarthooks.c
if HAS_NETWORKING
-# noinst_PROGRAMS = network.rel
+noinst_PROGRAMS = network.rel
-# network_rel_SOURCES = network/network.c
-# network_rel_CPPFLAGS = $(AM_CPPFLAGS) -D__INSIDE_RTEMS_BSD_TCPIP_STACK__ -D__BSD_VISIBLE
-# network_rel_LDFLAGS = $(RTEMS_RELLDFLAGS)
+network_rel_SOURCES = ../shared/lpc/network/lpc-ethernet.c
+network_rel_CPPFLAGS = $(AM_CPPFLAGS) -D__INSIDE_RTEMS_BSD_TCPIP_STACK__ -D__BSD_VISIBLE
+network_rel_LDFLAGS = $(RTEMS_RELLDFLAGS)
-# libbsp_a_LIBADD = network.rel
+libbsp_a_LIBADD += network.rel
endif
diff --git a/c/src/lib/libbsp/arm/lpc32xx/configure.ac b/c/src/lib/libbsp/arm/lpc32xx/configure.ac
index 6febd9d350..a3e90456c3 100644
--- a/c/src/lib/libbsp/arm/lpc32xx/configure.ac
+++ b/c/src/lib/libbsp/arm/lpc32xx/configure.ac
@@ -33,6 +33,9 @@ RTEMS_BSPOPTS_HELP([LPC32XX_ARM_CLK],[ARM clock in Hz])
RTEMS_BSPOPTS_SET([LPC32XX_HCLK],[*],[104000000U])
RTEMS_BSPOPTS_HELP([LPC32XX_HCLK],[AHB bus clock in Hz])
+RTEMS_BSPOPTS_SET([LPC32XX_ETHERNET_RMII],[*],[1])
+RTEMS_BSPOPTS_HELP([LPC32XX_ETHERNET_RMII],[enable RMII for Ethernet])
+
RTEMS_BSPOPTS_SET([LPC32XX_PERIPH_CLK],[*],[13000000U])
RTEMS_BSPOPTS_HELP([LPC32XX_PERIPH_CLK],[peripheral clock in Hz])
diff --git a/c/src/lib/libbsp/arm/lpc32xx/include/bsp.h b/c/src/lib/libbsp/arm/lpc32xx/include/bsp.h
index a42dd7b0be..c512ab28c2 100644
--- a/c/src/lib/libbsp/arm/lpc32xx/include/bsp.h
+++ b/c/src/lib/libbsp/arm/lpc32xx/include/bsp.h
@@ -51,7 +51,7 @@ struct rtems_bsdnet_ifconfig;
/**
* @brief Network driver attach and detach function.
*/
-int lpc32xx_eth_attach_detach(
+int lpc_eth_attach_detach(
struct rtems_bsdnet_ifconfig *config,
int attaching
);
@@ -59,7 +59,7 @@ int lpc32xx_eth_attach_detach(
/**
* @brief Standard network driver attach and detach function.
*/
-#define RTEMS_BSP_NETWORK_DRIVER_ATTACH lpc32xx_eth_attach_detach
+#define RTEMS_BSP_NETWORK_DRIVER_ATTACH lpc_eth_attach_detach
/**
* @brief Standard network driver name.
diff --git a/c/src/lib/libbsp/arm/lpc32xx/include/bspopts.h.in b/c/src/lib/libbsp/arm/lpc32xx/include/bspopts.h.in
index f89ed3a90a..0de9964d9b 100644
--- a/c/src/lib/libbsp/arm/lpc32xx/include/bspopts.h.in
+++ b/c/src/lib/libbsp/arm/lpc32xx/include/bspopts.h.in
@@ -33,6 +33,9 @@
/* clock mode configuration for UARTs */
#undef LPC32XX_CONFIG_UART_CLKMODE
+/* enable RMII for Ethernet */
+#undef LPC32XX_ETHERNET_RMII
+
/* AHB bus clock in Hz */
#undef LPC32XX_HCLK
diff --git a/c/src/lib/libbsp/arm/lpc32xx/include/irq.h b/c/src/lib/libbsp/arm/lpc32xx/include/irq.h
index 62d28fe7e0..2e047d27c1 100644
--- a/c/src/lib/libbsp/arm/lpc32xx/include/irq.h
+++ b/c/src/lib/libbsp/arm/lpc32xx/include/irq.h
@@ -158,6 +158,8 @@ void lpc32xx_irq_set_activation_type(rtems_vector_number vector, lpc32xx_irq_act
lpc32xx_irq_activation_type lpc32xx_irq_get_activation_type(rtems_vector_number vector);
+void lpc32xx_set_exception_handler(Arm_symbolic_exception_name exception, void (*handler)(void));
+
/** @} */
#endif /* ASM */
diff --git a/c/src/lib/libbsp/arm/lpc32xx/include/lpc-ethernet-config.h b/c/src/lib/libbsp/arm/lpc32xx/include/lpc-ethernet-config.h
new file mode 100644
index 0000000000..dd20823303
--- /dev/null
+++ b/c/src/lib/libbsp/arm/lpc32xx/include/lpc-ethernet-config.h
@@ -0,0 +1,81 @@
+/**
+ * @file
+ *
+ * @ingroup lpc32xx
+ *
+ * @brief Ethernet driver configuration.
+ */
+
+/*
+ * Copyright (c) 2009
+ * embedded brains GmbH
+ * Obere Lagerstr. 30
+ * D-82178 Puchheim
+ * Germany
+ * <rtems@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 LIBBSP_ARM_LPC32XX_LPC_ETHERNET_CONFIG_H
+#define LIBBSP_ARM_LPC32XX_LPC_ETHERNET_CONFIG_H
+
+#include <stdlib.h>
+#include <limits.h>
+
+#include <rtems.h>
+#include <rtems/malloc.h>
+
+#include <bsp.h>
+#include <bsp/lpc32xx.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+#define LPC_ETH_CONFIG_INTERRUPT LPC32XX_IRQ_ETHERNET
+
+#define LPC_ETH_CONFIG_REG_BASE LPC32XX_BASE_ETHERNET
+
+#define LPC_ETH_CONFIG_RX_UNIT_COUNT_DEFAULT 16
+#define LPC_ETH_CONFIG_RX_UNIT_COUNT_MAX INT_MAX
+
+#define LPC_ETH_CONFIG_TX_UNIT_COUNT_DEFAULT 32
+#define LPC_ETH_CONFIG_TX_UNIT_COUNT_MAX INT_MAX
+
+#define LPC_ETH_CONFIG_UNIT_MULTIPLE 8U
+
+#ifdef LPC32XX_ETHERNET_RMII
+ #define LPC_ETH_CONFIG_RMII
+
+ static void lpc_eth_config_module_enable(void)
+ {
+ LPC32XX_MAC_CLK_CTRL = 0x1f;
+ }
+#else
+ static void lpc_eth_config_module_enable(void)
+ {
+ LPC32XX_MAC_CLK_CTRL = 0x0f;
+ }
+#endif
+
+#define LPC_ETH_CONFIG_USE_TRANSMIT_DMA
+
+static char *lpc_eth_config_alloc_table_area(size_t size)
+{
+ return rtems_heap_allocate_aligned_with_boundary(size, 32, 0);
+}
+
+static void lpc_eth_config_free_table_area(char *table_area)
+{
+ /* FIXME: Type */
+ free(table_area, (int) 0xdeadbeef);
+}
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* LIBBSP_ARM_LPC32XX_LPC_ETHERNET_CONFIG_H */
diff --git a/c/src/lib/libbsp/arm/lpc32xx/include/lpc32xx.h b/c/src/lib/libbsp/arm/lpc32xx/include/lpc32xx.h
index 2e82d34b80..d69e7db7f3 100644
--- a/c/src/lib/libbsp/arm/lpc32xx/include/lpc32xx.h
+++ b/c/src/lib/libbsp/arm/lpc32xx/include/lpc32xx.h
@@ -90,5 +90,6 @@
#define LPC32XX_UART_CLKMODE (*(volatile uint32_t *) 0x40054004)
#define LPC32XX_UART_LOOP (*(volatile uint32_t *) 0x40054008)
#define LPC32XX_SW_INT (*(volatile uint32_t *) 0x400040a8)
+#define LPC32XX_MAC_CLK_CTRL (*(volatile uint32_t *) 0x40004090)
#endif /* LIBBSP_ARM_LPC32XX_LPC32XX_H */
diff --git a/c/src/lib/libbsp/arm/lpc32xx/irq/irq.c b/c/src/lib/libbsp/arm/lpc32xx/irq/irq.c
index 187b4b310b..04eec9c921 100644
--- a/c/src/lib/libbsp/arm/lpc32xx/irq/irq.c
+++ b/c/src/lib/libbsp/arm/lpc32xx/irq/irq.c
@@ -23,6 +23,8 @@
#include <bsp/irq.h>
#include <bsp/irq-generic.h>
#include <bsp/lpc32xx.h>
+#include <bsp/linker-symbols.h>
+#include <bsp/mmu.h>
/*
* Mask out SIC 1 and 2 IRQ request. There is no need to mask out the FIQ,
@@ -125,15 +127,15 @@ static inline void lpc32xx_irq_clear_bit_in_field(unsigned index, lpc32xx_irq_fi
static inline unsigned lpc32xx_irq_get_index(uint32_t val)
{
- uint32_t reg;
+ ARM_SWITCH_REGISTERS;
asm volatile (
- THUMB_TO_ARM
- "clz %1, %1\n"
- "rsb %1, %1, #31\n"
- ARM_TO_THUMB
- : "=&r" (reg), "=r" (val)
- : "1" (val)
+ ARM_SWITCH_TO_ARM
+ "clz %[val], %[val]\n"
+ "rsb %[val], %[val], #31\n"
+ ARM_SWITCH_BACK
+ : [val] "=r" (val) ARM_SWITCH_ADDITIONAL_OUTPUT
+ : "[val]" (val)
);
return val;
@@ -304,6 +306,21 @@ rtems_status_code bsp_interrupt_vector_disable(rtems_vector_number vector)
return RTEMS_SUCCESSFUL;
}
+void lpc32xx_set_exception_handler(
+ Arm_symbolic_exception_name exception,
+ void (*handler)(void)
+)
+{
+ if ((unsigned) exception < MAX_EXCEPTIONS) {
+ uint32_t *table = (uint32_t *) bsp_section_vector_begin + MAX_EXCEPTIONS;
+
+ table [exception] = (uint32_t) handler;
+
+ rtems_cache_flush_multiple_data_lines(NULL, 64);
+ rtems_cache_invalidate_multiple_data_lines(NULL, 64);
+ }
+}
+
rtems_status_code bsp_interrupt_facility_initialize(void)
{
size_t i = 0;
@@ -341,7 +358,7 @@ rtems_status_code bsp_interrupt_facility_initialize(void)
lpc32xx_sic_1->atr = 0x26000;
lpc32xx_sic_2->atr = 0x0;
- _CPU_ISR_install_vector(ARM_EXCEPTION_IRQ, arm_exc_interrupt, NULL);
+ lpc32xx_set_exception_handler(ARM_EXCEPTION_IRQ, arm_exc_interrupt);
return RTEMS_SUCCESSFUL;
}
@@ -350,23 +367,3 @@ void bsp_interrupt_handler_default(rtems_vector_number vector)
{
printk("spurious interrupt: %u\n", vector);
}
-
-static void lpc32xx_irq_dump_controller(volatile lpc32xx_irq_controller *controller)
-{
- printk(
- "er %08x\nrsr %08x\nsr %08x\napr %08x\natr %08x\nitr %08x\n",
- controller->er,
- controller->rsr,
- controller->sr,
- controller->apr,
- controller->atr,
- controller->itr
- );
-}
-
-void lpc32xx_irq_dump(void)
-{
- lpc32xx_irq_dump_controller(lpc32xx_mic);
- lpc32xx_irq_dump_controller(lpc32xx_sic_1);
- lpc32xx_irq_dump_controller(lpc32xx_sic_2);
-}
diff --git a/c/src/lib/libbsp/arm/lpc32xx/preinstall.am b/c/src/lib/libbsp/arm/lpc32xx/preinstall.am
index 3f2aa0c774..41a5255bd7 100644
--- a/c/src/lib/libbsp/arm/lpc32xx/preinstall.am
+++ b/c/src/lib/libbsp/arm/lpc32xx/preinstall.am
@@ -33,6 +33,11 @@ $(PROJECT_INCLUDE)/bsp/$(dirstamp):
@: > $(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
@@ -41,6 +46,10 @@ $(PROJECT_INCLUDE)/bsp.h: include/bsp.h $(PROJECT_INCLUDE)/$(dirstamp)
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp.h
PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp.h
+$(PROJECT_INCLUDE)/tm27.h: ../../shared/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
@@ -93,6 +102,10 @@ $(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)/bsp/mmu.h: include/mmu.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
+ $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/mmu.h
+PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/mmu.h
+
$(PROJECT_INCLUDE)/bsp/lpc32xx.h: include/lpc32xx.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/lpc32xx.h
PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/lpc32xx.h
@@ -101,9 +114,17 @@ $(PROJECT_INCLUDE)/bsp/lpc-clock-config.h: include/lpc-clock-config.h $(PROJECT_
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/lpc-clock-config.h
PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/lpc-clock-config.h
-$(PROJECT_INCLUDE)/tm27.h: ../../shared/include/tm27.h $(PROJECT_INCLUDE)/$(dirstamp)
- $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/tm27.h
-PREINSTALL_FILES += $(PROJECT_INCLUDE)/tm27.h
+$(PROJECT_INCLUDE)/bsp/lpc-ethernet-config.h: include/lpc-ethernet-config.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
+ $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/lpc-ethernet-config.h
+PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/lpc-ethernet-config.h
+
+$(PROJECT_INCLUDE)/libcpu/cache.h: ../../../libcpu/arm/shared/include/cache.h $(PROJECT_INCLUDE)/libcpu/$(dirstamp)
+ $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/libcpu/cache.h
+PREINSTALL_FILES += $(PROJECT_INCLUDE)/libcpu/cache.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)
diff --git a/c/src/lib/libbsp/arm/lpc32xx/rtc/rtc-config.c b/c/src/lib/libbsp/arm/lpc32xx/rtc/rtc-config.c
index 35a2c75be9..b518db3c1f 100644
--- a/c/src/lib/libbsp/arm/lpc32xx/rtc/rtc-config.c
+++ b/c/src/lib/libbsp/arm/lpc32xx/rtc/rtc-config.c
@@ -21,44 +21,108 @@
#include <libchip/rtc.h>
+#include <bsp.h>
#include <bsp/lpc32xx.h>
-#define LPC32XX_RTC_COUNT 1
+#define LPC32XX_RTC_COUNT 1U
+
+#define LPC32XX_RTC_COUNTER_DELTA 0xfffffffeU
+
+#define LPC32XX_RTC_KEY 0xb5c13f27U
+
+#define LPC32XX_RTC_CTRL_FORCE_ONSW (1U << 7)
+#define LPC32XX_RTC_CTRL_STOP (1U << 6)
+#define LPC32XX_RTC_CTRL_RESET (1U << 4)
+#define LPC32XX_RTC_CTRL_MATCH_1_ONSW (1U << 3)
+#define LPC32XX_RTC_CTRL_MATCH_0_ONSW (1U << 2)
+#define LPC32XX_RTC_CTRL_MATCH_1_INTR (1U << 1)
+#define LPC32XX_RTC_CTRL_MATCH_0_INTR (1U << 0)
+
+typedef struct {
+ uint32_t ucount;
+ uint32_t dcount;
+ uint32_t match0;
+ uint32_t match1;
+ uint32_t ctrl;
+ uint32_t intstat;
+ uint32_t key;
+ uint32_t sram [32];
+} lpc32xx_rtc_registers;
+
+static volatile lpc32xx_rtc_registers *const lpc32xx_rtc =
+ (volatile lpc32xx_rtc_registers *) LPC32XX_BASE_RTC;
+
+static void lpc32xx_rtc_set(uint32_t val)
+{
+ unsigned i = LPC32XX_ARM_CLK / LPC32XX_OSCILLATOR_RTC;
+
+ lpc32xx_rtc->ctrl |= LPC32XX_RTC_CTRL_STOP;
+ lpc32xx_rtc->ucount = val;
+ lpc32xx_rtc->dcount = LPC32XX_RTC_COUNTER_DELTA - val;
+ lpc32xx_rtc->ctrl &= ~LPC32XX_RTC_CTRL_STOP;
+
+ /* It needs some time before we can read the values back */
+ while (i != 0) {
+ asm volatile ("nop");
+ --i;
+ }
+}
+
+static void lpc32xx_rtc_reset(void)
+{
+ lpc32xx_rtc->ctrl = LPC32XX_RTC_CTRL_RESET;
+ lpc32xx_rtc->ctrl = 0;
+ lpc32xx_rtc->key = LPC32XX_RTC_KEY;
+ lpc32xx_rtc_set(0);
+}
static void lpc32xx_rtc_initialize(int minor)
{
- /* TODO */
+ uint32_t up_first = 0;
+ uint32_t up_second = 0;
+ uint32_t down_first = 0;
+ uint32_t down_second = 0;
+
+ if (lpc32xx_rtc->key != LPC32XX_RTC_KEY) {
+ lpc32xx_rtc_reset();
+ }
+
+ do {
+ up_first = lpc32xx_rtc->ucount;
+ down_first = lpc32xx_rtc->dcount;
+ up_second = lpc32xx_rtc->ucount;
+ down_second = lpc32xx_rtc->dcount;
+ } while (up_first != up_second || down_first != down_second);
+
+ if (up_first + down_first != LPC32XX_RTC_COUNTER_DELTA) {
+ lpc32xx_rtc_reset();
+ }
}
static int lpc32xx_rtc_get_time(int minor, rtems_time_of_day *tod)
{
- /* TODO */
-
-#if 0
- tod->ticks = 0;
- tod->second = RTC_SEC;
- tod->minute = RTC_MIN;
- tod->hour = RTC_HOUR;
- tod->day = RTC_DOM;
- tod->month = RTC_MONTH;
- tod->year = RTC_YEAR;
-#endif
-
- return 0;
+ struct timeval now = {
+ .tv_sec = lpc32xx_rtc->ucount,
+ .tv_usec = 0
+ };
+ struct tm time;
+
+ gmtime_r(&now.tv_sec, &time);
+
+ tod->year = time.tm_year + 1900;
+ tod->month = time.tm_mon + 1;
+ tod->day = time.tm_mday;
+ tod->hour = time.tm_hour;
+ tod->minute = time.tm_min;
+ tod->second = time.tm_sec;
+ tod->ticks = 0;
+
+ return RTEMS_SUCCESSFUL;
}
static int lpc32xx_rtc_set_time(int minor, const rtems_time_of_day *tod)
{
- /* TODO */
-
-#if 0
- RTC_SEC = tod->second;
- RTC_MIN = tod->minute;
- RTC_HOUR = tod->hour;
- RTC_DOM = tod->day;
- RTC_MONTH = tod->month;
- RTC_YEAR = tod->year;
-#endif
+ lpc32xx_rtc_set(_TOD_To_seconds(tod));
return 0;
}
diff --git a/c/src/lib/libbsp/arm/lpc32xx/startup/bspstarthooks.c b/c/src/lib/libbsp/arm/lpc32xx/startup/bspstarthooks.c
index 7f668f83c5..86164f518a 100644
--- a/c/src/lib/libbsp/arm/lpc32xx/startup/bspstarthooks.c
+++ b/c/src/lib/libbsp/arm/lpc32xx/startup/bspstarthooks.c
@@ -24,9 +24,11 @@
#include <bspopts.h>
#include <bsp/start.h>
#include <bsp/lpc32xx.h>
+#include <bsp/mmu.h>
#include <bsp/linker-symbols.h>
#define BSP_START_SECTION __attribute__((section(".bsp_start")))
+#define BSP_START_DATA_SECTION __attribute__((section(".bsp_start_data")))
static void BSP_START_SECTION lpc32xx_clear_bss(void)
{
@@ -40,9 +42,125 @@ static void BSP_START_SECTION lpc32xx_clear_bss(void)
}
}
+typedef struct {
+ uint32_t begin;
+ uint32_t end;
+ uint32_t flags;
+} lpc32xx_mmu_config;
+
+static const BSP_START_DATA_SECTION lpc32xx_mmu_config
+ lpc32xx_mmu_config_table [] = {
+ {
+ .begin = (uint32_t) bsp_section_start_begin,
+ .end = (uint32_t) bsp_section_start_end,
+ .flags = LPC32XX_MMU_READ_WRITE_CACHED
+ }, {
+ .begin = (uint32_t) bsp_section_vector_begin,
+ .end = (uint32_t) bsp_section_vector_end,
+ .flags = LPC32XX_MMU_READ_WRITE_CACHED
+ }, {
+ .begin = (uint32_t) bsp_section_text_begin,
+ .end = (uint32_t) bsp_section_text_end,
+ .flags = LPC32XX_MMU_READ_WRITE_CACHED
+ }, {
+ .begin = (uint32_t) bsp_section_rodata_begin,
+ .end = (uint32_t) bsp_section_rodata_end,
+ .flags = LPC32XX_MMU_READ_ONLY_CACHED
+ }, {
+ .begin = (uint32_t) bsp_section_data_begin,
+ .end = (uint32_t) bsp_section_data_end,
+ .flags = LPC32XX_MMU_READ_WRITE
+ }, {
+ .begin = (uint32_t) bsp_section_fast_begin,
+ .end = (uint32_t) bsp_section_fast_end,
+ .flags = LPC32XX_MMU_READ_ONLY_CACHED
+ }, {
+ .begin = (uint32_t) bsp_section_bss_begin,
+ .end = (uint32_t) bsp_section_bss_end,
+ .flags = LPC32XX_MMU_READ_WRITE
+ }, {
+ .begin = (uint32_t) bsp_section_work_begin,
+ .end = (uint32_t) bsp_section_work_end,
+ .flags = LPC32XX_MMU_READ_WRITE_CACHED
+ }, {
+ .begin = (uint32_t) bsp_section_stack_begin,
+ .end = (uint32_t) bsp_section_stack_end,
+ .flags = LPC32XX_MMU_READ_WRITE_CACHED
+ }, {
+ .begin = 0x0U,
+ .end = 0x100000U,
+ .flags = LPC32XX_MMU_READ_ONLY_CACHED
+ }, {
+ .begin = 0x20000000U,
+ .end = 0x200c0000U,
+ .flags = LPC32XX_MMU_READ_WRITE
+ }, {
+ .begin = 0x30000000U,
+ .end = 0x32000000U,
+ .flags = LPC32XX_MMU_READ_WRITE
+ }, {
+ .begin = 0x40000000U,
+ .end = 0x40100000U,
+ .flags = LPC32XX_MMU_READ_WRITE
+ }
+};
+
+static void BSP_START_SECTION lpc32xx_mmu_set_entries(
+ uint32_t *ttb,
+ const lpc32xx_mmu_config *config
+)
+{
+ uint32_t i = ARM_MMU_SECT_GET_INDEX(config->begin);
+ uint32_t iend = ARM_MMU_SECT_GET_INDEX(ARM_MMU_SECT_MVA_ALIGN_UP(config->end));
+
+ if (config->begin != config->end) {
+ while (i < iend) {
+ ttb [i] = (i << ARM_MMU_SECT_BASE_SHIFT) | config->flags;
+ ++i;
+ }
+ }
+}
+
+static void BSP_START_SECTION lpc32xx_mmu_and_cache_setup(void)
+{
+ uint32_t const dac =
+ ARM_CP15_DAC_DOMAIN(LPC32XX_MMU_CLIENT_DOMAIN, ARM_CP15_DAC_CLIENT);
+ uint32_t ctrl = 0;
+ uint32_t *const ttb = (uint32_t *) bsp_section_work_end;
+ size_t const config_entry_count =
+ sizeof(lpc32xx_mmu_config_table) / sizeof(lpc32xx_mmu_config_table [0]);
+ size_t i = 0;
+
+ /* Disable MMU and cache, basic settings */
+ ctrl = arm_cp15_get_control();
+ ctrl &= ~(ARM_CP15_CTRL_I | ARM_CP15_CTRL_R | ARM_CP15_CTRL_C
+ | ARM_CP15_CTRL_V | ARM_CP15_CTRL_M);
+ ctrl |= ARM_CP15_CTRL_S | ARM_CP15_CTRL_A;
+ arm_cp15_set_control(ctrl);
+
+ arm_cp15_cache_invalidate();
+ arm_cp15_tlb_invalidate();
+
+ arm_cp15_set_domain_access_control(dac);
+ arm_cp15_set_translation_table_base(ttb);
+
+ /* Initialize translation table with invalid entries */
+ for (i = 0; i < ARM_MMU_TRANSLATION_TABLE_ENTRY_COUNT; ++i) {
+ ttb [i] = 0;
+ }
+
+ for (i = 0; i < config_entry_count; ++i) {
+ lpc32xx_mmu_set_entries(ttb, &lpc32xx_mmu_config_table [i]);
+ }
+
+ /* Enable MMU and cache */
+ ctrl |= ARM_CP15_CTRL_I | ARM_CP15_CTRL_C | ARM_CP15_CTRL_M;
+ arm_cp15_set_control(ctrl);
+}
+
void BSP_START_SECTION bsp_start_hook_0(void)
{
- /* TODO */
+ lpc32xx_mmu_and_cache_setup();
}
void BSP_START_SECTION bsp_start_hook_1(void)
@@ -50,6 +168,7 @@ void BSP_START_SECTION bsp_start_hook_1(void)
/* TODO */
/* Copy .text section */
+ arm_cp15_instruction_cache_invalidate();
bsp_start_memcpy_arm(
(int *) bsp_section_text_begin,
(const int *) bsp_section_text_load_begin,
@@ -57,6 +176,7 @@ void BSP_START_SECTION bsp_start_hook_1(void)
);
/* Copy .rodata section */
+ arm_cp15_instruction_cache_invalidate();
bsp_start_memcpy_arm(
(int *) bsp_section_rodata_begin,
(const int *) bsp_section_rodata_load_begin,
@@ -64,6 +184,7 @@ void BSP_START_SECTION bsp_start_hook_1(void)
);
/* Copy .data section */
+ arm_cp15_instruction_cache_invalidate();
bsp_start_memcpy_arm(
(int *) bsp_section_data_begin,
(const int *) bsp_section_data_load_begin,
@@ -71,6 +192,7 @@ void BSP_START_SECTION bsp_start_hook_1(void)
);
/* Copy .fast section */
+ arm_cp15_instruction_cache_invalidate();
bsp_start_memcpy_arm(
(int *) bsp_section_fast_begin,
(const int *) bsp_section_fast_load_begin,
diff --git a/c/src/lib/libbsp/arm/lpc32xx/startup/linkcmds.lpc32xx_phycore b/c/src/lib/libbsp/arm/lpc32xx/startup/linkcmds.lpc32xx_phycore
index 8003ecc996..2c2743caf0 100644
--- a/c/src/lib/libbsp/arm/lpc32xx/startup/linkcmds.lpc32xx_phycore
+++ b/c/src/lib/libbsp/arm/lpc32xx/startup/linkcmds.lpc32xx_phycore
@@ -36,7 +36,7 @@
MEMORY {
RAM_INT (AIW) : ORIGIN = 0x08000000, LENGTH = 256k
- RAM_EXT (AIW) : ORIGIN = 0x80000000, LENGTH = 64M /* SDRAM on DYCS0 */
+ RAM_EXT (AIW) : ORIGIN = 0x80000000, LENGTH = 64M - 16k /* SDRAM on DYCS0 */
ROM_EXT (RX) : ORIGIN = 0xe0000000, LENGTH = 2M /* NOR flash on CS0 */
NIRVANA : ORIGIN = 0, LENGTH = 0
}
@@ -56,5 +56,8 @@ REGION_ALIAS ("REGION_WORK", RAM_EXT);
REGION_ALIAS ("REGION_STACK", RAM_INT);
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_robarrier_align = DEFINED (bsp_section_robarrier_align) ? bsp_section_robarrier_align : 1M;
INCLUDE linkcmds.base