diff options
author | Thomas Doerfler <Thomas.Doerfler@embedded-brains.de> | 2010-01-12 15:03:22 +0000 |
---|---|---|
committer | Thomas Doerfler <Thomas.Doerfler@embedded-brains.de> | 2010-01-12 15:03:22 +0000 |
commit | 39c8fdb416327c5ec0c23807ae701798a5739cdf (patch) | |
tree | 0f2bb4acb60e60d74b7ef08e345a21d7896aba20 /c/src/lib/libbsp/arm/lpc32xx | |
parent | 2010-01-11 Marc Pignat <marc.pignat@hevs.ch> (diff) | |
download | rtems-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/ChangeLog | 8 | ||||
-rw-r--r-- | c/src/lib/libbsp/arm/lpc32xx/Makefile.am | 31 | ||||
-rw-r--r-- | c/src/lib/libbsp/arm/lpc32xx/configure.ac | 3 | ||||
-rw-r--r-- | c/src/lib/libbsp/arm/lpc32xx/include/bsp.h | 4 | ||||
-rw-r--r-- | c/src/lib/libbsp/arm/lpc32xx/include/bspopts.h.in | 3 | ||||
-rw-r--r-- | c/src/lib/libbsp/arm/lpc32xx/include/irq.h | 2 | ||||
-rw-r--r-- | c/src/lib/libbsp/arm/lpc32xx/include/lpc-ethernet-config.h | 81 | ||||
-rw-r--r-- | c/src/lib/libbsp/arm/lpc32xx/include/lpc32xx.h | 1 | ||||
-rw-r--r-- | c/src/lib/libbsp/arm/lpc32xx/irq/irq.c | 53 | ||||
-rw-r--r-- | c/src/lib/libbsp/arm/lpc32xx/preinstall.am | 27 | ||||
-rw-r--r-- | c/src/lib/libbsp/arm/lpc32xx/rtc/rtc-config.c | 114 | ||||
-rw-r--r-- | c/src/lib/libbsp/arm/lpc32xx/startup/bspstarthooks.c | 124 | ||||
-rw-r--r-- | c/src/lib/libbsp/arm/lpc32xx/startup/linkcmds.lpc32xx_phycore | 5 |
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 |