summaryrefslogtreecommitdiffstats
path: root/c
diff options
context:
space:
mode:
authorThomas Doerfler <Thomas.Doerfler@embedded-brains.de>2010-04-09 12:25:22 +0000
committerThomas Doerfler <Thomas.Doerfler@embedded-brains.de>2010-04-09 12:25:22 +0000
commit22f107b6e4f667512d9563f0a5d235947fc7c850 (patch)
tree233c80a0df4c2376c626317db4363e4c22f3b721 /c
parentadded dma header (diff)
downloadrtems-22f107b6e4f667512d9563f0a5d235947fc7c850.tar.bz2
Changes throughout
Diffstat (limited to '')
-rw-r--r--c/src/lib/libbsp/arm/lpc24xx/ChangeLog6
-rw-r--r--c/src/lib/libbsp/arm/lpc24xx/Makefile.am8
-rw-r--r--c/src/lib/libbsp/arm/lpc24xx/configure.ac25
-rw-r--r--c/src/lib/libbsp/arm/lpc24xx/include/lpc24xx.h6
-rw-r--r--c/src/lib/libbsp/arm/lpc24xx/irq/irq.c6
-rw-r--r--c/src/lib/libbsp/arm/lpc24xx/make/custom/lpc24xx.inc3
-rw-r--r--c/src/lib/libbsp/arm/lpc24xx/misc/io.c9
-rw-r--r--c/src/lib/libbsp/arm/lpc24xx/startup/bspstart.c30
-rw-r--r--c/src/lib/libbsp/arm/lpc24xx/startup/bspstarthooks.c76
-rw-r--r--c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc236212
-rw-r--r--c/src/lib/libbsp/arm/lpc32xx/ChangeLog8
-rw-r--r--c/src/lib/libbsp/arm/lpc32xx/Makefile.am11
-rw-r--r--c/src/lib/libbsp/arm/lpc32xx/configure.ac19
-rw-r--r--c/src/lib/libbsp/arm/lpc32xx/console/console-config.c65
-rw-r--r--c/src/lib/libbsp/arm/lpc32xx/console/hsu.c202
-rw-r--r--c/src/lib/libbsp/arm/lpc32xx/include/bsp.h20
-rw-r--r--c/src/lib/libbsp/arm/lpc32xx/include/bspopts.h.in15
-rw-r--r--c/src/lib/libbsp/arm/lpc32xx/include/lpc-clock-config.h14
-rw-r--r--c/src/lib/libbsp/arm/lpc32xx/include/lpc-ethernet-config.h14
-rw-r--r--c/src/lib/libbsp/arm/lpc32xx/include/lpc32xx.h101
-rw-r--r--c/src/lib/libbsp/arm/lpc32xx/include/mmu.h14
-rw-r--r--c/src/lib/libbsp/arm/lpc32xx/preinstall.am4
-rw-r--r--c/src/lib/libbsp/arm/lpc32xx/startup/bspstart.c38
-rw-r--r--c/src/lib/libbsp/arm/lpc32xx/startup/bspstarthooks.c28
24 files changed, 664 insertions, 70 deletions
diff --git a/c/src/lib/libbsp/arm/lpc24xx/ChangeLog b/c/src/lib/libbsp/arm/lpc24xx/ChangeLog
index 01835eaa4c..00dbd6afa7 100644
--- a/c/src/lib/libbsp/arm/lpc24xx/ChangeLog
+++ b/c/src/lib/libbsp/arm/lpc24xx/ChangeLog
@@ -1,3 +1,9 @@
+2010-04-09 Sebastian Huber <sebastian.huber@embedded-brains.de>
+
+ * Makefile.am, configure.ac, include/lpc24xx.h, irq/irq.c,
+ make/custom/lpc24xx.inc, misc/io.c, startup/bspstart.c,
+ startup/bspstarthooks.c, startup/linkcmds.lpc2362: Changes throughout.
+
2010-03-29 Thomas Doerfler <Thomas.Doerfler@embedded-brains.de>
* configure.ac: make the lpc2362 a SMALL MEMORY BSP
diff --git a/c/src/lib/libbsp/arm/lpc24xx/Makefile.am b/c/src/lib/libbsp/arm/lpc24xx/Makefile.am
index 1ea711b82d..f10bfec9de 100644
--- a/c/src/lib/libbsp/arm/lpc24xx/Makefile.am
+++ b/c/src/lib/libbsp/arm/lpc24xx/Makefile.am
@@ -86,7 +86,6 @@ libbsp_a_SOURCES += ../../shared/bootcard.c \
../../shared/bsplibc.c \
../../shared/bsppost.c \
../../shared/bsppredriverhook.c \
- ../../shared/bsppretaskinghook.c \
../../shared/gnatinstallhandler.c \
../../shared/sbrk.c \
../../shared/src/stackalloc.c \
@@ -135,13 +134,8 @@ 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.)
+# Start hooks
libbsp_a_SOURCES += startup/bspstarthooks.c
-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 #
diff --git a/c/src/lib/libbsp/arm/lpc24xx/configure.ac b/c/src/lib/libbsp/arm/lpc24xx/configure.ac
index 37c6ab34b9..1dd90bf09a 100644
--- a/c/src/lib/libbsp/arm/lpc24xx/configure.ac
+++ b/c/src/lib/libbsp/arm/lpc24xx/configure.ac
@@ -6,7 +6,7 @@
#
AC_PREREQ(2.59)
-AC_INIT([rtems-c-src-lib-libbsp-arm-lpc247x],[_RTEMS_VERSION],[rtems-bugs@rtems.com])
+AC_INIT([rtems-c-src-lib-libbsp-arm-lpc24xx],[_RTEMS_VERSION],[rtems-bugs@rtems.com])
AC_CONFIG_SRCDIR([bsp_specs])
RTEMS_TOP(../../../../../..)
@@ -21,22 +21,25 @@ RTEMS_PROG_CCAS
RTEMS_CHECK_NETWORKING
AM_CONDITIONAL(HAS_NETWORKING,test "$HAS_NETWORKING" = "yes")
-RTEMS_BSPOPTS_SET([BSP_SMALL_MEMORY],[lpc2362],[TRUE])
+RTEMS_BSPOPTS_SET([BSP_SMALL_MEMORY],[lpc2362],[1])
RTEMS_BSPOPTS_SET([BSP_SMALL_MEMORY],[*],[])
-RTEMS_BSPOPTS_HELP([BSP_SMALL_MEMORY],[set to true fo low memory footprint])
+RTEMS_BSPOPTS_HELP([BSP_SMALL_MEMORY],[disable testsuite samples with high memory demands])
+RTEMS_BSPOPTS_SET([LPC24XX_OSCILLATOR_MAIN],[lpc2362],[3686400U])
RTEMS_BSPOPTS_SET([LPC24XX_OSCILLATOR_MAIN],[*],[12000000U])
RTEMS_BSPOPTS_HELP([LPC24XX_OSCILLATOR_MAIN],[main oscillator frequency in Hz])
RTEMS_BSPOPTS_SET([LPC24XX_OSCILLATOR_RTC],[*],[32768U])
RTEMS_BSPOPTS_HELP([LPC24XX_OSCILLATOR_RTC],[RTC oscillator frequency in Hz])
+RTEMS_BSPOPTS_SET([LPC24XX_CCLK],[lpc2362],[58982400U])
RTEMS_BSPOPTS_SET([LPC24XX_CCLK],[*],[72000000U])
RTEMS_BSPOPTS_HELP([LPC24XX_CCLK],[CPU clock in Hz])
RTEMS_BSPOPTS_SET([LPC24XX_UART_BAUD],[*],[115200U])
RTEMS_BSPOPTS_HELP([LPC24XX_UART_BAUD],[baud for UARTs])
+RTEMS_BSPOPTS_SET([LPC24XX_ETHERNET_RMII],[lpc24xx_ea],[1])
RTEMS_BSPOPTS_SET([LPC24XX_ETHERNET_RMII],[*],[])
RTEMS_BSPOPTS_HELP([LPC24XX_ETHERNET_RMII],[enable RMII for Ethernet])
@@ -59,9 +62,11 @@ RTEMS_BSPOPTS_HELP([LPC24XX_CONFIG_CONSOLE],[configuration for console (UART 0)]
RTEMS_BSPOPTS_SET([LPC24XX_CONFIG_UART_1],[*],[])
RTEMS_BSPOPTS_HELP([LPC24XX_CONFIG_UART_1],[configuration for UART 1])
+RTEMS_BSPOPTS_SET([LPC24XX_CONFIG_UART_2],[lpc2362],[0])
RTEMS_BSPOPTS_SET([LPC24XX_CONFIG_UART_2],[lpc24xx_ncs_*],[0])
RTEMS_BSPOPTS_HELP([LPC24XX_CONFIG_UART_2],[configuration for UART 2])
+RTEMS_BSPOPTS_SET([LPC24XX_CONFIG_UART_3],[lpc2362],[0])
RTEMS_BSPOPTS_SET([LPC24XX_CONFIG_UART_3],[lpc24xx_ncs_*],[0])
RTEMS_BSPOPTS_HELP([LPC24XX_CONFIG_UART_3],[configuration for UART 3])
@@ -74,6 +79,20 @@ RTEMS_BSPOPTS_HELP([LPC24XX_CONFIG_I2C_1],[configuration for I2C 1])
RTEMS_BSPOPTS_SET([LPC24XX_CONFIG_I2C_2],[*],[])
RTEMS_BSPOPTS_HELP([LPC24XX_CONFIG_I2C_2],[configuration for I2C 2])
+RTEMS_BSPOPTS_SET([LPC24XX_HEAP_EXTEND],[lpc2362],[1])
+RTEMS_BSPOPTS_HELP([LPC24XX_HEAP_EXTEND],[enable heap extend by Ethernet and USB regions])
+
+RTEMS_BSPOPTS_SET([LPC24XX_STOP_GPDMA],[*],[1])
+RTEMS_BSPOPTS_HELP([LPC24XX_STOP_GPDMA],[stop general purpose DMA at start-up to avoid DMA interference])
+
+RTEMS_BSPOPTS_SET([LPC24XX_STOP_ETHERNET],[lpc2362],[])
+RTEMS_BSPOPTS_SET([LPC24XX_STOP_ETHERNET],[*],[1])
+RTEMS_BSPOPTS_HELP([LPC24XX_STOP_ETHERNET],[stop Ethernet controller at start-up to avoid DMA interference])
+
+RTEMS_BSPOPTS_SET([LPC24XX_STOP_USB],[lpc2362],[])
+RTEMS_BSPOPTS_SET([LPC24XX_STOP_USB],[*],[1])
+RTEMS_BSPOPTS_HELP([LPC24XX_STOP_USB],[stop USB controller at start-up to avoid DMA interference])
+
RTEMS_BSPOPTS_SET([BSP_START_RESET_VECTOR],[lpc24xx_ncs_rom_ext],[0x80000040])
RTEMS_BSPOPTS_HELP([BSP_START_RESET_VECTOR],[reset vector address for BSP start])
diff --git a/c/src/lib/libbsp/arm/lpc24xx/include/lpc24xx.h b/c/src/lib/libbsp/arm/lpc24xx/include/lpc24xx.h
index 2f296036d5..d7a5d11c0f 100644
--- a/c/src/lib/libbsp/arm/lpc24xx/include/lpc24xx.h
+++ b/c/src/lib/libbsp/arm/lpc24xx/include/lpc24xx.h
@@ -1970,6 +1970,12 @@ typedef struct {
#define LPC24XX_FIO ((volatile lpc24xx_fio *) FIO_BASE_ADDR)
+/* PCONP */
+
+#define PCONP_GPDMA (1U << 29)
+#define PCONP_ETHERNET (1U << 30)
+#define PCONP_USB (1U << 31)
+
/** @} */
#endif /* LIBBSP_ARM_LPC24XX_LPC24XX_H */
diff --git a/c/src/lib/libbsp/arm/lpc24xx/irq/irq.c b/c/src/lib/libbsp/arm/lpc24xx/irq/irq.c
index d3073315f8..c16bd46bd8 100644
--- a/c/src/lib/libbsp/arm/lpc24xx/irq/irq.c
+++ b/c/src/lib/libbsp/arm/lpc24xx/irq/irq.c
@@ -110,8 +110,10 @@ rtems_status_code bsp_interrupt_facility_initialize(void)
/* Reset priority mask register */
VICSWPrioMask = 0xffff;
- /* Acknowledge interrupt */
- VICVectAddr = 0;
+ /* Acknowledge interrupts for all priorities */
+ for (i = LPC24XX_IRQ_PRIORITY_VALUE_MIN; i <= LPC24XX_IRQ_PRIORITY_VALUE_MAX; ++i) {
+ VICVectAddr = 0;
+ }
/* Install the IRQ exception handler */
_CPU_ISR_install_vector(ARM_EXCEPTION_IRQ, arm_exc_interrupt, NULL);
diff --git a/c/src/lib/libbsp/arm/lpc24xx/make/custom/lpc24xx.inc b/c/src/lib/libbsp/arm/lpc24xx/make/custom/lpc24xx.inc
index e2018939a9..f8b1cbf072 100644
--- a/c/src/lib/libbsp/arm/lpc24xx/make/custom/lpc24xx.inc
+++ b/c/src/lib/libbsp/arm/lpc24xx/make/custom/lpc24xx.inc
@@ -8,6 +8,7 @@ include $(RTEMS_ROOT)/make/custom/default.cfg
RTEMS_CPU = arm
-CPU_CFLAGS = -mcpu=arm7tdmi-s -mstructure-size-boundary=8 -mthumb
+CPU_CFLAGS = -mcpu=arm7tdmi-s -mthumb -mstructure-size-boundary=8 \
+ -Wextra -Wno-unused -Wpointer-arith -Wcast-qual -Wconversion -Wmissing-prototypes
CFLAGS_OPTIMIZE_V = -Os -g
diff --git a/c/src/lib/libbsp/arm/lpc24xx/misc/io.c b/c/src/lib/libbsp/arm/lpc24xx/misc/io.c
index 340ce2153a..877131fa77 100644
--- a/c/src/lib/libbsp/arm/lpc24xx/misc/io.c
+++ b/c/src/lib/libbsp/arm/lpc24xx/misc/io.c
@@ -77,6 +77,7 @@ static const lpc24xx_io_entry lpc24xx_io_config_table [] = {
/* ADC */
LPC24XX_IO_ENTRY(LPC24XX_MODULE_ADC, 0, 0, 12, 0, 13, LPC24XX_IO_ALTERNATE_2),
+ LPC24XX_IO_ENTRY(LPC24XX_MODULE_ADC, 1, 0, 23, 0, 25, LPC24XX_IO_ALTERNATE_0),
/* I2C */
LPC24XX_IO_ENTRY(LPC24XX_MODULE_I2C_0, 0, 0, 27, 0, 28, LPC24XX_IO_ALTERNATE_0),
@@ -103,8 +104,14 @@ static const lpc24xx_io_entry lpc24xx_io_config_table [] = {
LPC24XX_IO_ENTRY(LPC24XX_MODULE_USB, 0, 0, 29, 0, 30, LPC24XX_IO_ALTERNATE_0),
LPC24XX_IO_ENTRY(LPC24XX_MODULE_USB, 0, 1, 19, 1, 19, LPC24XX_IO_ALTERNATE_1),
+ /* SPI */
+ LPC24XX_IO_ENTRY(LPC24XX_MODULE_SPI, 0, 0, 15, 0, 18, LPC24XX_IO_ALTERNATE_2),
+
+ /* PWM */
+ LPC24XX_IO_ENTRY(LPC24XX_MODULE_PWM_1, 0, 2, 0, 2, 0, LPC24XX_IO_ALTERNATE_0),
+
/* Terminate */
- LPC24XX_IO_ENTRY(LPC24XX_MODULE_COUNT, 0, 0, 0, 0, 0, 0),
+ LPC24XX_IO_ENTRY(LPC24XX_MODULE_COUNT, 0, 0, 0, 0, 0, 0)
};
static rtems_status_code lpc24xx_io_iterate(
diff --git a/c/src/lib/libbsp/arm/lpc24xx/startup/bspstart.c b/c/src/lib/libbsp/arm/lpc24xx/startup/bspstart.c
index 76e1aa79aa..097b66c513 100644
--- a/c/src/lib/libbsp/arm/lpc24xx/startup/bspstart.c
+++ b/c/src/lib/libbsp/arm/lpc24xx/startup/bspstart.c
@@ -30,6 +30,36 @@
#include <bsp/stackalloc.h>
#include <bsp/system-clocks.h>
+#ifdef LPC24XX_HEAP_EXTEND
+ LINKER_SYMBOL(lpc24xx_region_heap_0_begin);
+ LINKER_SYMBOL(lpc24xx_region_heap_0_size);
+ LINKER_SYMBOL(lpc24xx_region_heap_0_end);
+
+ LINKER_SYMBOL(lpc24xx_region_heap_1_begin);
+ LINKER_SYMBOL(lpc24xx_region_heap_1_size);
+ LINKER_SYMBOL(lpc24xx_region_heap_1_end);
+
+ extern Heap_Control *RTEMS_Malloc_Heap;
+#endif
+
+void bsp_pretasking_hook(void)
+{
+ #ifdef LPC24XX_HEAP_EXTEND
+ _Heap_Extend(
+ RTEMS_Malloc_Heap,
+ lpc24xx_region_heap_0_begin,
+ (uintptr_t) lpc24xx_region_heap_0_size,
+ NULL
+ );
+ _Heap_Extend(
+ RTEMS_Malloc_Heap,
+ lpc24xx_region_heap_1_begin,
+ (uintptr_t) lpc24xx_region_heap_1_size,
+ NULL
+ );
+ #endif
+}
+
void bsp_start(void)
{
/* Initialize Timer 1 */
diff --git a/c/src/lib/libbsp/arm/lpc24xx/startup/bspstarthooks.c b/c/src/lib/libbsp/arm/lpc24xx/startup/bspstarthooks.c
index 732d30ddf5..9d56df2c7a 100644
--- a/c/src/lib/libbsp/arm/lpc24xx/startup/bspstarthooks.c
+++ b/c/src/lib/libbsp/arm/lpc24xx/startup/bspstarthooks.c
@@ -28,6 +28,10 @@
#define BSP_START_SECTION __attribute__((section(".bsp_start")))
+#if defined(LPC24XX_EMC_MICRON) || defined(LPC24XX_EMC_NUMONYX)
+ #define LPC24XX_EMC_INIT
+#endif
+
#ifdef LPC24XX_EMC_MICRON
static void BSP_START_SECTION lpc24xx_ram_test_32(void)
{
@@ -114,15 +118,17 @@ static void BSP_START_SECTION lpc24xx_init_emc_0(void)
numonyx.waitrun = 0xf;
#endif
- /* Set pin functions for EMC */
- PINSEL5 = (PINSEL5 & 0xf000f000) | 0x05550555;
- PINSEL6 = 0x55555555;
- PINSEL8 = 0x55555555;
- PINSEL9 = (PINSEL9 & 0x0f000000) | 0x50555555;
+ #ifdef LPC24XX_EMC_INIT
+ /* Set pin functions for EMC */
+ PINSEL5 = (PINSEL5 & 0xf000f000) | 0x05550555;
+ PINSEL6 = 0x55555555;
+ PINSEL8 = 0x55555555;
+ PINSEL9 = (PINSEL9 & 0x0f000000) | 0x50555555;
+ #endif
#ifdef LPC24XX_EMC_NUMONYX
/* Static Memory 1 settings */
- bsp_start_memcpy_arm(
+ bsp_start_memcpy(
(int *) EMC_STA_BASE_1,
(const int *) &numonyx,
sizeof(numonyx)
@@ -135,8 +141,10 @@ static void BSP_START_SECTION lpc24xx_init_emc_0(void)
*/
static void BSP_START_SECTION lpc24xx_init_emc_1(void)
{
- /* Use normal memory map */
- EMC_CTRL = CLEAR_FLAG(EMC_CTRL, 0x2);
+ #ifdef LPC24XX_EMC_INIT
+ /* Use normal memory map */
+ EMC_CTRL = CLEAR_FLAG(EMC_CTRL, 0x2);
+ #endif
#ifdef LPC24XX_EMC_MICRON
/* Check if we need to initialize it */
@@ -326,7 +334,13 @@ static void BSP_START_SECTION lpc24xx_init_pll(void)
}
/* Set PLL */
- lpc24xx_set_pll(1, 0, 11, 3);
+ #if LPC24XX_OSCILLATOR_MAIN == 12000000U
+ lpc24xx_set_pll(1, 0, 11, 3);
+ #elif LPC24XX_OSCILLATOR_MAIN == 3686400U
+ lpc24xx_set_pll(1, 0, 47, 5);
+ #else
+ #error "unexpected main oscillator frequency"
+ #endif
}
static void BSP_START_SECTION lpc24xx_clear_bss(void)
@@ -355,9 +369,18 @@ void BSP_START_SECTION bsp_start_hook_1(void)
/* Re-map interrupt vectors to internal RAM */
MEMMAP = SET_MEMMAP_MAP(MEMMAP, 2);
- /* Set memory accelerator module (MAM) */
+ /* Fully enable memory accelerator module functions (MAM) */
MAMCR = 0;
- MAMTIM = 4;
+ #if LPC24XX_CCLK <= 20000000U
+ MAMTIM = 0x1;
+ #elif LPC24XX_CCLK <= 40000000U
+ MAMTIM = 0x2;
+ #elif LPC24XX_CCLK <= 60000000U
+ MAMTIM = 0x3;
+ #else
+ MAMTIM = 0x4;
+ #endif
+ MAMCR = 0x2;
/* Enable fast IO for ports 0 and 1 */
SCS = SET_FLAG(SCS, 0x1);
@@ -377,29 +400,52 @@ void BSP_START_SECTION bsp_start_hook_1(void)
/* Initialize EMC hook 1 */
lpc24xx_init_emc_1();
+ #ifdef LPC24XX_STOP_GPDMA
+ if ((PCONP & PCONP_GPDMA) != 0) {
+ GPDMA_CONFIG = 0;
+ PCONP &= ~PCONP_GPDMA;
+ }
+ #endif
+
+ #ifdef LPC24XX_STOP_ETHERNET
+ if ((PCONP & PCONP_ETHERNET) != 0) {
+ MAC_COMMAND = 0x38;
+ MAC_MAC1 = 0xcf00;
+ MAC_MAC1 = 0;
+ PCONP &= ~PCONP_ETHERNET;
+ }
+ #endif
+
+ #ifdef LPC24XX_STOP_USB
+ if ((PCONP & PCONP_USB) != 0) {
+ OTG_CLK_CTRL = 0;
+ PCONP &= ~PCONP_USB;
+ }
+ #endif
+
/* Copy .text section */
- bsp_start_memcpy_arm(
+ bsp_start_memcpy(
(int *) bsp_section_text_begin,
(const int *) bsp_section_text_load_begin,
(size_t) bsp_section_text_size
);
/* Copy .rodata section */
- bsp_start_memcpy_arm(
+ bsp_start_memcpy(
(int *) bsp_section_rodata_begin,
(const int *) bsp_section_rodata_load_begin,
(size_t) bsp_section_rodata_size
);
/* Copy .data section */
- bsp_start_memcpy_arm(
+ bsp_start_memcpy(
(int *) bsp_section_data_begin,
(const int *) bsp_section_data_load_begin,
(size_t) bsp_section_data_size
);
/* Copy .fast section */
- bsp_start_memcpy_arm(
+ bsp_start_memcpy(
(int *) bsp_section_fast_begin,
(const int *) bsp_section_fast_load_begin,
(size_t) bsp_section_fast_size
diff --git a/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc2362 b/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc2362
index 76e2358f2f..3446994f8b 100644
--- a/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc2362
+++ b/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc2362
@@ -48,12 +48,20 @@ REGION_ALIAS ("REGION_TEXT", ROM_INT);
REGION_ALIAS ("REGION_TEXT_LOAD", ROM_INT);
REGION_ALIAS ("REGION_RODATA", ROM_INT);
REGION_ALIAS ("REGION_RODATA_LOAD", ROM_INT);
-REGION_ALIAS ("REGION_DATA", RAM_ETH);
+REGION_ALIAS ("REGION_DATA", RAM_INT);
REGION_ALIAS ("REGION_DATA_LOAD", ROM_INT);
REGION_ALIAS ("REGION_FAST", RAM_INT);
REGION_ALIAS ("REGION_FAST_LOAD", ROM_INT);
-REGION_ALIAS ("REGION_BSS", RAM_ETH);
+REGION_ALIAS ("REGION_BSS", RAM_INT);
REGION_ALIAS ("REGION_WORK", RAM_INT);
REGION_ALIAS ("REGION_STACK", RAM_INT);
+lpc24xx_region_heap_0_begin = ORIGIN (RAM_ETH);
+lpc24xx_region_heap_0_size = LENGTH (RAM_ETH);
+lpc24xx_region_heap_0_end = lpc24xx_region_heap_0_begin + lpc24xx_region_heap_0_size;
+
+lpc24xx_region_heap_1_begin = ORIGIN (RAM_USB);
+lpc24xx_region_heap_1_size = LENGTH (RAM_USB);
+lpc24xx_region_heap_1_end = lpc24xx_region_heap_1_begin + lpc24xx_region_heap_1_size;
+
INCLUDE linkcmds.base
diff --git a/c/src/lib/libbsp/arm/lpc32xx/ChangeLog b/c/src/lib/libbsp/arm/lpc32xx/ChangeLog
index 2b4c062194..7d5fd87f26 100644
--- a/c/src/lib/libbsp/arm/lpc32xx/ChangeLog
+++ b/c/src/lib/libbsp/arm/lpc32xx/ChangeLog
@@ -1,3 +1,11 @@
+2010-04-09 Sebastian Huber <sebastian.huber@embedded-brains.de>
+
+ * console/hsu.c: New file.
+ * Makefile.am, configure.ac, preinstall.am, console/console-config.c,
+ include/bsp.h, include/bspopts.h.in, include/lpc-clock-config.h,
+ include/lpc-ethernet-config.h, include/lpc32xx.h, include/mmu.h,
+ startup/bspstart.c, startup/bspstarthooks.c: Changes throughout.
+
2010-03-03 Sebastian Huber <sebastian.huber@embedded-brains.de>
* README, include/lpc32xx.h, irq/irq.c, startup/bspstarthooks.c:
diff --git a/c/src/lib/libbsp/arm/lpc32xx/Makefile.am b/c/src/lib/libbsp/arm/lpc32xx/Makefile.am
index fd33ab5a9c..553ef85da1 100644
--- a/c/src/lib/libbsp/arm/lpc32xx/Makefile.am
+++ b/c/src/lib/libbsp/arm/lpc32xx/Makefile.am
@@ -37,6 +37,7 @@ include_bsp_HEADERS += ../../shared/tod.h
include_bsp_HEADERS += ../shared/include/linker-symbols.h
include_bsp_HEADERS += ../shared/include/start.h
include_bsp_HEADERS += ../shared/lpc/include/lpc-timer.h
+include_bsp_HEADERS += ../shared/lpc/include/lpc-dma.h
include_bsp_HEADERS += include/irq-config.h
include_bsp_HEADERS += include/irq.h
include_bsp_HEADERS += include/mmu.h
@@ -99,7 +100,8 @@ libbsp_a_SOURCES += ../../shared/src/irq-generic.c \
# Console
libbsp_a_SOURCES += ../../shared/console.c \
- console/console-config.c
+ console/console-config.c \
+ console/hsu.c
# Clock
libbsp_a_SOURCES += ../shared/lpc/clock/lpc-clock-config.c \
@@ -121,13 +123,8 @@ 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.)
+# Start hooks
libbsp_a_SOURCES += startup/bspstarthooks.c
-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 #
diff --git a/c/src/lib/libbsp/arm/lpc32xx/configure.ac b/c/src/lib/libbsp/arm/lpc32xx/configure.ac
index a3e90456c3..c9f84e8fff 100644
--- a/c/src/lib/libbsp/arm/lpc32xx/configure.ac
+++ b/c/src/lib/libbsp/arm/lpc32xx/configure.ac
@@ -33,11 +33,20 @@ 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_PERIPH_CLK],[*],[13000000U])
+RTEMS_BSPOPTS_HELP([LPC32XX_PERIPH_CLK],[peripheral 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])
+RTEMS_BSPOPTS_SET([LPC32XX_UART_1_BAUD],[*],[])
+RTEMS_BSPOPTS_HELP([LPC32XX_UART_1_BAUD],[baud for UART 1])
+
+RTEMS_BSPOPTS_SET([LPC32XX_UART_2_BAUD],[*],[])
+RTEMS_BSPOPTS_HELP([LPC32XX_UART_2_BAUD],[baud for UART 2])
+
+RTEMS_BSPOPTS_SET([LPC32XX_UART_7_BAUD],[*],[])
+RTEMS_BSPOPTS_HELP([LPC32XX_UART_7_BAUD],[baud for UART 7])
RTEMS_BSPOPTS_SET([LPC32XX_CONFIG_U3CLK],[*],[])
RTEMS_BSPOPTS_HELP([LPC32XX_CONFIG_U3CLK],[clock configuration for UART 3])
@@ -54,6 +63,12 @@ RTEMS_BSPOPTS_HELP([LPC32XX_CONFIG_U6CLK],[clock configuration for UART 6])
RTEMS_BSPOPTS_SET([LPC32XX_CONFIG_UART_CLKMODE],[*],[0x00000200U])
RTEMS_BSPOPTS_HELP([LPC32XX_CONFIG_UART_CLKMODE],[clock mode configuration for UARTs])
+RTEMS_BSPOPTS_SET([LPC32XX_DISABLE_READ_WRITE_DATA_CACHE],[*],[])
+RTEMS_BSPOPTS_HELP([LPC32XX_DISABLE_READ_WRITE_DATA_CACHE],[disable cache for read-write data sections])
+
+RTEMS_BSPOPTS_SET([LPC32XX_DISABLE_READ_ONLY_PROTECTION],[*],[])
+RTEMS_BSPOPTS_HELP([LPC32XX_DISABLE_READ_ONLY_PROTECTION],[disable MMU protection of read-only sections])
+
RTEMS_BSPOPTS_SET([BSP_START_RESET_VECTOR],[*],[])
RTEMS_BSPOPTS_HELP([BSP_START_RESET_VECTOR],[reset vector address for BSP start])
diff --git a/c/src/lib/libbsp/arm/lpc32xx/console/console-config.c b/c/src/lib/libbsp/arm/lpc32xx/console/console-config.c
index 1504919a55..3b8f8a3c25 100644
--- a/c/src/lib/libbsp/arm/lpc32xx/console/console-config.c
+++ b/c/src/lib/libbsp/arm/lpc32xx/console/console-config.c
@@ -26,6 +26,8 @@
#include <bsp/lpc32xx.h>
#include <bsp/irq.h>
+extern console_fns lpc32xx_hsu_fns;
+
static uint8_t lpc32xx_uart_get_register(uint32_t addr, uint8_t i)
{
volatile uint32_t *reg = (volatile uint32_t *) addr;
@@ -129,6 +131,69 @@ console_tbl Console_Port_Tbl [] = {
.ulIntVector = LPC32XX_IRQ_UART_6
},
#endif
+ #ifdef LPC32XX_UART_1_BAUD
+ {
+ .sDeviceName = "/dev/ttyS1",
+ .deviceType = SERIAL_CUSTOM,
+ .pDeviceFns = &lpc32xx_hsu_fns,
+ .deviceProbe = NULL,
+ .pDeviceFlow = NULL,
+ .ulMargin = 16,
+ .ulHysteresis = 8,
+ .pDeviceParams = (void *) LPC32XX_UART_1_BAUD,
+ .ulCtrlPort1 = LPC32XX_BASE_UART_1,
+ .ulCtrlPort2 = 0,
+ .ulDataPort = 0,
+ .getRegister = NULL,
+ .setRegister = NULL,
+ .getData = NULL,
+ .setData = NULL,
+ .ulClock = 16,
+ .ulIntVector = LPC32XX_IRQ_UART_1
+ },
+ #endif
+ #ifdef LPC32XX_UART_2_BAUD
+ {
+ .sDeviceName = "/dev/ttyS2",
+ .deviceType = SERIAL_CUSTOM,
+ .pDeviceFns = &lpc32xx_hsu_fns,
+ .deviceProbe = NULL,
+ .pDeviceFlow = NULL,
+ .ulMargin = 16,
+ .ulHysteresis = 8,
+ .pDeviceParams = (void *) LPC32XX_UART_2_BAUD,
+ .ulCtrlPort1 = LPC32XX_BASE_UART_2,
+ .ulCtrlPort2 = 0,
+ .ulDataPort = 0,
+ .getRegister = NULL,
+ .setRegister = NULL,
+ .getData = NULL,
+ .setData = NULL,
+ .ulClock = 16,
+ .ulIntVector = LPC32XX_IRQ_UART_2
+ },
+ #endif
+ #ifdef LPC32XX_UART_7_BAUD
+ {
+ .sDeviceName = "/dev/ttyS7",
+ .deviceType = SERIAL_CUSTOM,
+ .pDeviceFns = &lpc32xx_hsu_fns,
+ .deviceProbe = NULL,
+ .pDeviceFlow = NULL,
+ .ulMargin = 16,
+ .ulHysteresis = 8,
+ .pDeviceParams = (void *) LPC32XX_UART_7_BAUD,
+ .ulCtrlPort1 = LPC32XX_BASE_UART_7,
+ .ulCtrlPort2 = 0,
+ .ulDataPort = 0,
+ .getRegister = NULL,
+ .setRegister = NULL,
+ .getData = NULL,
+ .setData = NULL,
+ .ulClock = 16,
+ .ulIntVector = LPC32XX_IRQ_UART_7
+ },
+ #endif
};
#define LPC32XX_UART_COUNT \
diff --git a/c/src/lib/libbsp/arm/lpc32xx/console/hsu.c b/c/src/lib/libbsp/arm/lpc32xx/console/hsu.c
new file mode 100644
index 0000000000..607429f4a0
--- /dev/null
+++ b/c/src/lib/libbsp/arm/lpc32xx/console/hsu.c
@@ -0,0 +1,202 @@
+/**
+ * @file
+ *
+ * @ingroup lpc32xx
+ *
+ * @brief High speed UART driver (14-clock).
+ */
+
+/*
+ * Copyright (c) 2010
+ * 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.
+ */
+
+#include <rtems.h>
+#include <rtems/libio.h>
+#include <rtems/termiostypes.h>
+
+#include <libchip/serial.h>
+#include <libchip/sersupp.h>
+
+#include <bsp.h>
+#include <bsp/lpc32xx.h>
+#include <bsp/irq.h>
+
+typedef struct {
+ uint32_t fifo;
+ uint32_t level;
+ uint32_t iir;
+ uint32_t ctrl;
+ uint32_t rate;
+} lpc32xx_hsu;
+
+#define HSU_FIFO_SIZE 64
+
+#define HSU_LEVEL_RX_MASK 0xffU
+#define HSU_LEVEL_TX_MASK 0xff00U
+#define HSU_LEVEL_TX_SHIFT 8
+
+#define HSU_RX_DATA_MASK 0xffU
+#define HSU_RX_EMPTY (1U << 8)
+#define HSU_RX_ERROR (1U << 9)
+#define HSU_RX_BREAK (1U << 10)
+
+#define HSU_IIR_TX (1U << 0)
+#define HSU_IIR_RX_TRIG (1U << 1)
+#define HSU_IIR_RX_TIMEOUT (1U << 2)
+
+#define HSU_CTRL_INTR_DISABLED 0x1280fU
+#define HSU_CTRL_RX_INTR_ENABLED 0x1284fU
+#define HSU_CTRL_RX_AND_TX_INTR_ENABLED 0x1286fU
+
+/* We are interested in RX timeout, RX trigger and TX trigger interrupts */
+#define HSU_IIR_MASK 0x7U
+
+static int lpc32xx_hsu_first_open(int major, int minor, void *arg)
+{
+ rtems_libio_open_close_args_t *oca = arg;
+ struct rtems_termios_tty *tty = oca->iop->data1;
+ console_tbl *ct = &Console_Port_Tbl [minor];
+ console_data *cd = &Console_Port_Data [minor];
+ volatile lpc32xx_hsu *hsu = (volatile lpc32xx_hsu *) ct->ulCtrlPort1;
+
+ cd->termios_data = tty;
+ rtems_termios_set_initial_baud(tty, (int32_t) ct->pDeviceParams);
+ hsu->ctrl = HSU_CTRL_RX_INTR_ENABLED;
+
+ return 0;
+}
+
+static int lpc32xx_hsu_write(int minor, const char *buf, int len)
+{
+ console_tbl *ct = &Console_Port_Tbl [minor];
+ console_data *cd = &Console_Port_Data [minor];
+ volatile lpc32xx_hsu *hsu = (volatile lpc32xx_hsu *) ct->ulCtrlPort1;
+ int tx_level = (hsu->level & HSU_LEVEL_TX_MASK) >> HSU_LEVEL_TX_SHIFT;
+ int tx_free = HSU_FIFO_SIZE - tx_level;
+ int i = 0;
+ int out = len > tx_free ? tx_free : len;
+
+ for (i = 0; i < out; ++i) {
+ hsu->fifo = buf [i];
+ }
+
+ if (len > 0) {
+ cd->pDeviceContext = (void *) out;
+ cd->bActive = true;
+ hsu->ctrl = HSU_CTRL_RX_AND_TX_INTR_ENABLED;
+ }
+
+ return 0;
+}
+
+static void lpc32xx_hsu_interrupt_handler(void *arg)
+{
+ int minor = (int) arg;
+ console_tbl *ct = &Console_Port_Tbl [minor];
+ console_data *cd = &Console_Port_Data [minor];
+ volatile lpc32xx_hsu *hsu = (volatile lpc32xx_hsu *) ct->ulCtrlPort1;
+
+ /* Iterate until no more interrupts are pending */
+ do {
+ int chars_to_dequeue = (int) cd->pDeviceContext;
+ int rv = 0;
+ int i = 0;
+ char buf [HSU_FIFO_SIZE];
+
+ /* Enqueue received characters */
+ while (i < HSU_FIFO_SIZE) {
+ uint32_t in = hsu->fifo;
+
+ if ((in & HSU_RX_EMPTY) == 0) {
+ if ((in & HSU_RX_BREAK) == 0) {
+ buf [i] = in & HSU_RX_DATA_MASK;
+ ++i;
+ }
+ } else {
+ break;
+ }
+ }
+ rtems_termios_enqueue_raw_characters(cd->termios_data, buf, i);
+
+ /* Dequeue transmitted characters */
+ cd->pDeviceContext = 0;
+ rv = rtems_termios_dequeue_characters(cd->termios_data, chars_to_dequeue);
+ if (rv == 0) {
+ /* Nothing to transmit */
+ cd->bActive = false;
+ hsu->ctrl = HSU_CTRL_RX_INTR_ENABLED;
+ hsu->iir = HSU_IIR_TX;
+ }
+ } while ((hsu->iir & HSU_IIR_MASK) != 0);
+}
+
+static void lpc32xx_hsu_initialize(int minor)
+{
+ console_tbl *ct = &Console_Port_Tbl [minor];
+ console_data *cd = &Console_Port_Data [minor];
+ volatile lpc32xx_hsu *hsu = (volatile lpc32xx_hsu *) ct->ulCtrlPort1;
+
+ hsu->ctrl = HSU_CTRL_INTR_DISABLED;
+
+ cd->bActive = false;
+ cd->pDeviceContext = 0;
+
+ /* Drain FIFOs */
+ while (hsu->level != 0) {
+ hsu->fifo;
+ }
+
+ rtems_interrupt_handler_install(
+ ct->ulIntVector,
+ "HSU",
+ RTEMS_INTERRUPT_UNIQUE,
+ lpc32xx_hsu_interrupt_handler,
+ (void *) minor
+ );
+}
+
+static int lpc32xx_hsu_set_attributes(int minor, const struct termios *term)
+{
+ console_tbl *ct = &Console_Port_Tbl [minor];
+ volatile lpc32xx_hsu *hsu = (volatile lpc32xx_hsu *) ct->ulCtrlPort1;
+ int baud_flags = term->c_cflag & CBAUD;
+
+ if (baud_flags != 0) {
+ int32_t baud = rtems_termios_baud_to_number(baud_flags);
+
+ if (baud > 0) {
+ uint32_t baud_divisor = 14 * (uint32_t) baud;
+ uint32_t rate = LPC32XX_PERIPH_CLK / baud_divisor;
+ uint32_t remainder = LPC32XX_PERIPH_CLK - rate * baud_divisor;
+
+ if (2 * remainder >= baud_divisor) {
+ ++rate;
+ }
+
+ hsu->rate = rate - 1;
+ }
+ }
+
+ return 0;
+}
+
+console_fns lpc32xx_hsu_fns = {
+ .deviceProbe = libchip_serial_default_probe,
+ .deviceFirstOpen = lpc32xx_hsu_first_open,
+ .deviceLastClose = NULL,
+ .deviceRead = NULL,
+ .deviceWrite = lpc32xx_hsu_write,
+ .deviceInitialize = lpc32xx_hsu_initialize,
+ .deviceWritePolled = NULL,
+ .deviceSetAttributes = lpc32xx_hsu_set_attributes,
+ .deviceOutputUsesInterrupts = true
+};
diff --git a/c/src/lib/libbsp/arm/lpc32xx/include/bsp.h b/c/src/lib/libbsp/arm/lpc32xx/include/bsp.h
index c512ab28c2..fcee27899a 100644
--- a/c/src/lib/libbsp/arm/lpc32xx/include/bsp.h
+++ b/c/src/lib/libbsp/arm/lpc32xx/include/bsp.h
@@ -28,6 +28,9 @@
#include <rtems/console.h>
#include <rtems/clockdrv.h>
+#include <bsp/lpc32xx.h>
+#include <bsp/lpc-timer.h>
+
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
@@ -88,8 +91,25 @@ int lpc_eth_attach_detach(
*/
void *lpc32xx_idle(uintptr_t ignored);
+#define LPC32XX_STANDARD_TIMER ((volatile lpc_timer *) LPC32XX_BASE_TIMER_1)
+
+static inline unsigned lpc32xx_timer(void)
+{
+ volatile lpc_timer *timer = LPC32XX_STANDARD_TIMER;
+
+ return timer->tc;
+}
+
/** @} */
+/**
+ * @defgroup lpc LPC Support
+ *
+ * @ingroup lpc32xx
+ *
+ * @brief LPC support package.
+ */
+
#endif /* ASM */
#ifdef __cplusplus
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 0de9964d9b..b5054133d3 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,12 @@
/* clock mode configuration for UARTs */
#undef LPC32XX_CONFIG_UART_CLKMODE
+/* disable MMU protection of read-only sections */
+#undef LPC32XX_DISABLE_READ_ONLY_PROTECTION
+
+/* disable cache for read-write data sections */
+#undef LPC32XX_DISABLE_READ_WRITE_DATA_CACHE
+
/* enable RMII for Ethernet */
#undef LPC32XX_ETHERNET_RMII
@@ -48,6 +54,15 @@
/* peripheral clock in Hz */
#undef LPC32XX_PERIPH_CLK
+/* baud for UART 1 */
+#undef LPC32XX_UART_1_BAUD
+
+/* baud for UART 2 */
+#undef LPC32XX_UART_2_BAUD
+
+/* baud for UART 7 */
+#undef LPC32XX_UART_7_BAUD
+
/* Define to the address where bug reports for this package should be sent. */
#undef PACKAGE_BUGREPORT
diff --git a/c/src/lib/libbsp/arm/lpc32xx/include/lpc-clock-config.h b/c/src/lib/libbsp/arm/lpc32xx/include/lpc-clock-config.h
index c4d7906632..2ce5813840 100644
--- a/c/src/lib/libbsp/arm/lpc32xx/include/lpc-clock-config.h
+++ b/c/src/lib/libbsp/arm/lpc32xx/include/lpc-clock-config.h
@@ -1,7 +1,7 @@
/**
* @file
*
- * @ingroup lpc32xx
+ * @ingroup lpc_clock
*
* @brief Clock driver configuration.
*/
@@ -30,6 +30,16 @@
extern "C" {
#endif /* __cplusplus */
+/**
+ * @defgroup lpc_clock Clock Support
+ *
+ * @ingroup lpc
+ *
+ * @brief Clock support.
+ *
+ * @{
+ */
+
#define LPC_CLOCK_INTERRUPT LPC32XX_IRQ_TIMER_0
#define LPC_CLOCK_TIMER_BASE LPC32XX_BASE_TIMER_0
@@ -38,6 +48,8 @@ extern "C" {
#define LPC_CLOCK_MODULE_ENABLE()
+/** @} */
+
#ifdef __cplusplus
}
#endif /* __cplusplus */
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
index dd20823303..12dbd792f6 100644
--- a/c/src/lib/libbsp/arm/lpc32xx/include/lpc-ethernet-config.h
+++ b/c/src/lib/libbsp/arm/lpc32xx/include/lpc-ethernet-config.h
@@ -1,7 +1,7 @@
/**
* @file
*
- * @ingroup lpc32xx
+ * @ingroup lpc_eth
*
* @brief Ethernet driver configuration.
*/
@@ -35,6 +35,16 @@
extern "C" {
#endif /* __cplusplus */
+/**
+ * @defgroup lpc_eth Ethernet Support
+ *
+ * @ingroup lpc
+ *
+ * @brief Ethernet support.
+ *
+ * @{
+ */
+
#define LPC_ETH_CONFIG_INTERRUPT LPC32XX_IRQ_ETHERNET
#define LPC_ETH_CONFIG_REG_BASE LPC32XX_BASE_ETHERNET
@@ -74,6 +84,8 @@ static void lpc_eth_config_free_table_area(char *table_area)
free(table_area, (int) 0xdeadbeef);
}
+/** @} */
+
#ifdef __cplusplus
}
#endif /* __cplusplus */
diff --git a/c/src/lib/libbsp/arm/lpc32xx/include/lpc32xx.h b/c/src/lib/libbsp/arm/lpc32xx/include/lpc32xx.h
index bb52e40164..0c90c4355b 100644
--- a/c/src/lib/libbsp/arm/lpc32xx/include/lpc32xx.h
+++ b/c/src/lib/libbsp/arm/lpc32xx/include/lpc32xx.h
@@ -1,7 +1,7 @@
/**
* @file
*
- * @ingroup lpc32xx
+ * @ingroup lpc32xx_reg
*
* @brief Register base addresses.
*/
@@ -22,6 +22,22 @@
#ifndef LIBBSP_ARM_LPC32XX_LPC32XX_H
#define LIBBSP_ARM_LPC32XX_LPC32XX_H
+/**
+ * @defgroup lpc32xx_reg Register Definitions
+ *
+ * @ingroup lpc32xx
+ *
+ * @brief Register definitions.
+ *
+ * @{
+ */
+
+/**
+ * @name Register Base Addresses
+ *
+ * @{
+ */
+
#define LPC32XX_BASE_ADC 0x40048000
#define LPC32XX_BASE_SYSCON 0x40004000
#define LPC32XX_BASE_DEBUG_CTRL 0x40040000
@@ -81,6 +97,14 @@
#define LPC32XX_BASE_USB_OTG_I2C 0x31020300
#define LPC32XX_BASE_WDT 0x4003c000
+/** @} */
+
+/**
+ * @name Miscanellanous Registers
+ *
+ * @{
+ */
+
#define LPC32XX_U3CLK (*(volatile uint32_t *) 0x400040d0)
#define LPC32XX_U4CLK (*(volatile uint32_t *) 0x400040d4)
#define LPC32XX_U5CLK (*(volatile uint32_t *) 0x400040d8)
@@ -91,7 +115,6 @@
#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)
-#define LPC32XX_USB_CTRL (*(volatile uint32_t *) 0x40004064)
#define LPC32XX_USB_DIV (*(volatile uint32_t *) 0x4000401c)
#define LPC32XX_OTG_CLK_CTRL (*(volatile uint32_t *) 0x31020ff4)
#define LPC32XX_OTG_CLK_STAT (*(volatile uint32_t *) 0x31020ff8)
@@ -102,5 +125,79 @@
#define LPC32XX_I2C_CTL (*(volatile uint32_t *) 0x31020308)
#define LPC32XX_I2C_CLKHI (*(volatile uint32_t *) 0x3102030c)
#define LPC32XX_I2C_CLKLO (*(volatile uint32_t *) 0x31020310)
+#define LPC32XX_PWR_CTRL (*(volatile uint32_t *) 0x40004044)
+#define LPC32XX_OSC_CTRL (*(volatile uint32_t *) 0x4000404c)
+#define LPC32XX_SYSCLK_CTRL (*(volatile uint32_t *) 0x40004050)
+#define LPC32XX_PLL397_CTRL (*(volatile uint32_t *) 0x40004048)
+#define LPC32XX_HCLKPLL_CTRL (*(volatile uint32_t *) 0x40004058)
+#define LPC32XX_HCLKDIV_CTRL (*(volatile uint32_t *) 0x40004040)
+#define LPC32XX_TEST_CLK (*(volatile uint32_t *) 0x400040a4)
+#define LPC32XX_AUTOCLK_CTRL (*(volatile uint32_t *) 0x400040ec)
+#define LPC32XX_START_ER_PIN (*(volatile uint32_t *) 0x40004030)
+#define LPC32XX_START_ER_INT (*(volatile uint32_t *) 0x40004020)
+#define LPC32XX_P0_INTR_ER (*(volatile uint32_t *) 0x40004018)
+#define LPC32XX_START_SR_PIN (*(volatile uint32_t *) 0x40004038)
+#define LPC32XX_START_SR_INT (*(volatile uint32_t *) 0x40004028)
+#define LPC32XX_START_RSR_PIN (*(volatile uint32_t *) 0x40004034)
+#define LPC32XX_START_RSR_INT (*(volatile uint32_t *) 0x40004024)
+#define LPC32XX_START_APR_PIN (*(volatile uint32_t *) 0x4000403c)
+#define LPC32XX_START_APR_INT (*(volatile uint32_t *) 0x4000402c)
+#define LPC32XX_USB_CTRL (*(volatile uint32_t *) 0x40004064)
+#define LPC32XX_USBDIV_CTRL (*(volatile uint32_t *) 0x4000401c)
+#define LPC32XX_MS_CTRL (*(volatile uint32_t *) 0x40004080)
+#define LPC32XX_DMACLK_CTRL (*(volatile uint32_t *) 0x400040e8)
+#define LPC32XX_FLASHCLK_CTRL (*(volatile uint32_t *) 0x400040c8)
+#define LPC32XX_MACCLK_CTRL (*(volatile uint32_t *) 0x40004090)
+#define LPC32XX_LCDCLK_CTRL (*(volatile uint32_t *) 0x40004054)
+#define LPC32XX_I2S_CTRL (*(volatile uint32_t *) 0x4000407c)
+#define LPC32XX_SSP_CTRL (*(volatile uint32_t *) 0x40004078)
+#define LPC32XX_SPI_CTRL (*(volatile uint32_t *) 0x400040c4)
+#define LPC32XX_I2CCLK_CTRL (*(volatile uint32_t *) 0x400040ac)
+#define LPC32XX_TIMCLK_CTRL1 (*(volatile uint32_t *) 0x400040c0)
+#define LPC32XX_TIMCLK_CTRL (*(volatile uint32_t *) 0x400040bc)
+#define LPC32XX_ADCLK_CTRL (*(volatile uint32_t *) 0x400040b4)
+#define LPC32XX_ADCLK_CTRL1 (*(volatile uint32_t *) 0x40004060)
+#define LPC32XX_KEYCLK_CTRL (*(volatile uint32_t *) 0x400040b0)
+#define LPC32XX_PWMCLK_CTRL (*(volatile uint32_t *) 0x400040b8)
+#define LPC32XX_UARTCLK_CTRL (*(volatile uint32_t *) 0x400040e4)
+#define LPC32XX_POS0_IRAM_CTRl (*(volatile uint32_t *) 0x40004110)
+#define LPC32XX_POS1_IRAM_CTRl (*(volatile uint32_t *) 0x40004114)
+
+/** @} */
+
+/**
+ * @name GPIO Registers
+ *
+ * @{
+ */
+
+#define LPC32XX_P0_INP_STATE (*(volatile uint32_t *) 0x40028040)
+#define LPC32XX_P0_OUTP_SET (*(volatile uint32_t *) 0x40028044)
+#define LPC32XX_P0_OUTP_CLR (*(volatile uint32_t *) 0x40028048)
+#define LPC32XX_P0_DIR_SET (*(volatile uint32_t *) 0x40028050)
+#define LPC32XX_P0_DIR_CLR (*(volatile uint32_t *) 0x40028054)
+#define LPC32XX_P0_DIR_STATE (*(volatile uint32_t *) 0x40028058)
+#define LPC32XX_P0_OUTP_STATE (*(volatile uint32_t *) 0x4002804c)
+#define LPC32XX_P1_INP_STATE (*(volatile uint32_t *) 0x40028060)
+#define LPC32XX_P1_OUTP_SET (*(volatile uint32_t *) 0x40028064)
+#define LPC32XX_P1_OUTP_CLR (*(volatile uint32_t *) 0x40028068)
+#define LPC32XX_P1_DIR_SET (*(volatile uint32_t *) 0x40028070)
+#define LPC32XX_P1_DIR_CLR (*(volatile uint32_t *) 0x40028074)
+#define LPC32XX_P1_DIR_STATE (*(volatile uint32_t *) 0x40028078)
+#define LPC32XX_P1_OUTP_STATE (*(volatile uint32_t *) 0x4002806c)
+#define LPC32XX_P2_INP_STATE (*(volatile uint32_t *) 0x4002801c)
+#define LPC32XX_P2_OUTP_SET (*(volatile uint32_t *) 0x40028020)
+#define LPC32XX_P2_OUTP_CLR (*(volatile uint32_t *) 0x40028024)
+#define LPC32XX_P2_DIR_SET (*(volatile uint32_t *) 0x40028010)
+#define LPC32XX_P2_DIR_CLR (*(volatile uint32_t *) 0x40028014)
+#define LPC32XX_P2_DIR_STATE (*(volatile uint32_t *) 0x40028018)
+#define LPC32XX_P3_INP_STATE (*(volatile uint32_t *) 0x40028000)
+#define LPC32XX_P3_OUTP_SET (*(volatile uint32_t *) 0x40028004)
+#define LPC32XX_P3_OUTP_CLR (*(volatile uint32_t *) 0x40028008)
+#define LPC32XX_P3_OUTP_STATE (*(volatile uint32_t *) 0x4002800c)
+
+/** @} */
+
+/** @} */
#endif /* LIBBSP_ARM_LPC32XX_LPC32XX_H */
diff --git a/c/src/lib/libbsp/arm/lpc32xx/include/mmu.h b/c/src/lib/libbsp/arm/lpc32xx/include/mmu.h
index 5409569c47..0418cd025e 100644
--- a/c/src/lib/libbsp/arm/lpc32xx/include/mmu.h
+++ b/c/src/lib/libbsp/arm/lpc32xx/include/mmu.h
@@ -1,7 +1,7 @@
/**
* @file
*
- * @ingroup lpc32xx
+ * @ingroup lpc32xx_mmu
*
* @brief MMU API.
*/
@@ -28,6 +28,16 @@
extern "C" {
#endif /* __cplusplus */
+/**
+ * @defgroup lpc32xx_mmu MMU Support
+ *
+ * @ingroup lpc32xx
+ *
+ * @brief MMU support.
+ *
+ * @{
+ */
+
#define LPC32XX_MMU_CLIENT_DOMAIN 15U
#define LPC32XX_MMU_READ_ONLY \
@@ -45,6 +55,8 @@ extern "C" {
#define LPC32XX_MMU_READ_WRITE_CACHED \
(LPC32XX_MMU_READ_WRITE | ARM_MMU_SECT_C | ARM_MMU_SECT_B)
+/** @} */
+
#ifdef __cplusplus
}
#endif /* __cplusplus */
diff --git a/c/src/lib/libbsp/arm/lpc32xx/preinstall.am b/c/src/lib/libbsp/arm/lpc32xx/preinstall.am
index 41a5255bd7..79bf68e1d4 100644
--- a/c/src/lib/libbsp/arm/lpc32xx/preinstall.am
+++ b/c/src/lib/libbsp/arm/lpc32xx/preinstall.am
@@ -94,6 +94,10 @@ $(PROJECT_INCLUDE)/bsp/lpc-timer.h: ../shared/lpc/include/lpc-timer.h $(PROJECT_
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/lpc-timer.h
PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/lpc-timer.h
+$(PROJECT_INCLUDE)/bsp/lpc-dma.h: ../shared/lpc/include/lpc-dma.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
+ $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/lpc-dma.h
+PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/lpc-dma.h
+
$(PROJECT_INCLUDE)/bsp/irq-config.h: include/irq-config.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/irq-config.h
PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/irq-config.h
diff --git a/c/src/lib/libbsp/arm/lpc32xx/startup/bspstart.c b/c/src/lib/libbsp/arm/lpc32xx/startup/bspstart.c
index 02247bb96c..a005054222 100644
--- a/c/src/lib/libbsp/arm/lpc32xx/startup/bspstart.c
+++ b/c/src/lib/libbsp/arm/lpc32xx/startup/bspstart.c
@@ -43,18 +43,39 @@
#define CONSOLE_FDR (*(volatile uint32_t *) (LPC32XX_BASE_UART_5 + 0x28))
#define CONSOLE_TER (*(volatile uint32_t *) (LPC32XX_BASE_UART_5 + 0x30))
+static void lpc32xx_timer_initialize(void)
+{
+ volatile lpc_timer *timer = LPC32XX_STANDARD_TIMER;
+
+ LPC32XX_TIMCLK_CTRL1 = (1U << 2) | (1U << 3);
+
+ timer->tcr = LPC_TIMER_TCR_RST;
+ timer->ctcr = 0x0;
+ timer->pr = 0x0;
+ timer->ir = 0xff;
+ timer->mcr = 0x0;
+ timer->ccr = 0x0;
+ timer->tcr = LPC_TIMER_TCR_EN;
+}
+
void bsp_start(void)
{
+ uint32_t uartclk_ctrl = 0;
+
#ifdef LPC32XX_CONFIG_U3CLK
+ uartclk_ctrl |= 1U << 0;
LPC32XX_U3CLK = LPC32XX_CONFIG_U3CLK;
#endif
#ifdef LPC32XX_CONFIG_U4CLK
+ uartclk_ctrl |= 1U << 1;
LPC32XX_U4CLK = LPC32XX_CONFIG_U4CLK;
#endif
#ifdef LPC32XX_CONFIG_U5CLK
+ uartclk_ctrl |= 1U << 2;
LPC32XX_U5CLK = LPC32XX_CONFIG_U5CLK;
#endif
#ifdef LPC32XX_CONFIG_U6CLK
+ uartclk_ctrl |= 1U << 3;
LPC32XX_U6CLK = LPC32XX_CONFIG_U6CLK;
#endif
@@ -62,6 +83,7 @@ void bsp_start(void)
LPC32XX_UART_CLKMODE = LPC32XX_CONFIG_UART_CLKMODE;
#endif
+ LPC32XX_UARTCLK_CTRL = uartclk_ctrl;
LPC32XX_UART_CTRL = 0x0;
LPC32XX_UART_LOOP = 0x0;
@@ -74,28 +96,16 @@ void bsp_start(void)
CONSOLE_LCR = 0x3;
CONSOLE_FCR = 0x7;
-#if 0
- /* FIXME */
- printk("LPC32XX_U3CLK %08x\n", LPC32XX_U3CLK);
- printk("LPC32XX_U4CLK %08x\n", LPC32XX_U4CLK);
- printk("LPC32XX_U5CLK %08x\n", LPC32XX_U5CLK);
- printk("LPC32XX_U6CLK %08x\n", LPC32XX_U6CLK);
- printk("LPC32XX_IRDACLK %08x\n", LPC32XX_IRDACLK);
- printk("LPC32XX_UART_CTRL %08x\n", LPC32XX_UART_CTRL);
- printk("LPC32XX_UART_CLKMODE %08x\n", LPC32XX_UART_CLKMODE);
- printk("LPC32XX_UART_LOOP %08x\n", LPC32XX_UART_LOOP);
-#endif
-
- /* Interrupts */
if (bsp_interrupt_initialize() != RTEMS_SUCCESSFUL) {
_CPU_Fatal_halt(0xe);
}
- /* Task stacks */
bsp_stack_initialize(
bsp_section_stack_begin,
(uintptr_t) bsp_section_stack_size
);
+
+ lpc32xx_timer_initialize();
}
#define UART_LSR_THRE 0x00000020U
diff --git a/c/src/lib/libbsp/arm/lpc32xx/startup/bspstarthooks.c b/c/src/lib/libbsp/arm/lpc32xx/startup/bspstarthooks.c
index 767bde6bec..32c9f1a3d1 100644
--- a/c/src/lib/libbsp/arm/lpc32xx/startup/bspstarthooks.c
+++ b/c/src/lib/libbsp/arm/lpc32xx/startup/bspstarthooks.c
@@ -27,14 +27,20 @@
#include <bsp/mmu.h>
#include <bsp/linker-symbols.h>
-#define LPC32XX_DISABLE_READ_WRITE_DATA_CACHE
-
#ifdef LPC32XX_DISABLE_READ_WRITE_DATA_CACHE
#define LPC32XX_MMU_READ_WRITE_DATA LPC32XX_MMU_READ_WRITE
#else
#define LPC32XX_MMU_READ_WRITE_DATA LPC32XX_MMU_READ_WRITE_CACHED
#endif
+#ifdef LPC32XX_DISABLE_READ_ONLY_PROTECTION
+ #define LPC32XX_MMU_READ_ONLY_DATA LPC32XX_MMU_READ_WRITE_CACHED
+ #define LPC32XX_MMU_CODE LPC32XX_MMU_READ_WRITE_CACHED
+#else
+ #define LPC32XX_MMU_READ_ONLY_DATA LPC32XX_MMU_READ_ONLY_CACHED
+ #define LPC32XX_MMU_CODE LPC32XX_MMU_READ_ONLY_CACHED
+#endif
+
#define BSP_START_SECTION __attribute__((section(".bsp_start")))
#define BSP_START_DATA_SECTION __attribute__((section(".bsp_start_data")))
@@ -61,7 +67,7 @@ static const BSP_START_DATA_SECTION lpc32xx_mmu_config
{
.begin = (uint32_t) bsp_section_start_begin,
.end = (uint32_t) bsp_section_start_end,
- .flags = LPC32XX_MMU_READ_WRITE_CACHED
+ .flags = LPC32XX_MMU_CODE
}, {
.begin = (uint32_t) bsp_section_vector_begin,
.end = (uint32_t) bsp_section_vector_end,
@@ -69,11 +75,11 @@ static const BSP_START_DATA_SECTION lpc32xx_mmu_config
}, {
.begin = (uint32_t) bsp_section_text_begin,
.end = (uint32_t) bsp_section_text_end,
- .flags = LPC32XX_MMU_READ_WRITE_CACHED
+ .flags = LPC32XX_MMU_CODE
}, {
.begin = (uint32_t) bsp_section_rodata_begin,
.end = (uint32_t) bsp_section_rodata_end,
- .flags = LPC32XX_MMU_READ_WRITE_CACHED
+ .flags = LPC32XX_MMU_READ_ONLY_DATA
}, {
.begin = (uint32_t) bsp_section_data_begin,
.end = (uint32_t) bsp_section_data_end,
@@ -81,7 +87,7 @@ static const BSP_START_DATA_SECTION lpc32xx_mmu_config
}, {
.begin = (uint32_t) bsp_section_fast_begin,
.end = (uint32_t) bsp_section_fast_end,
- .flags = LPC32XX_MMU_READ_WRITE_CACHED
+ .flags = LPC32XX_MMU_CODE
}, {
.begin = (uint32_t) bsp_section_bss_begin,
.end = (uint32_t) bsp_section_bss_end,
@@ -93,7 +99,7 @@ static const BSP_START_DATA_SECTION lpc32xx_mmu_config
}, {
.begin = (uint32_t) bsp_section_stack_begin,
.end = (uint32_t) bsp_section_stack_end,
- .flags = LPC32XX_MMU_READ_WRITE_CACHED
+ .flags = LPC32XX_MMU_READ_WRITE_DATA
}, {
.begin = 0x0U,
.end = 0x100000U,
@@ -177,7 +183,7 @@ void BSP_START_SECTION bsp_start_hook_1(void)
/* Copy .text section */
arm_cp15_instruction_cache_invalidate();
- bsp_start_memcpy_arm(
+ bsp_start_memcpy(
(int *) bsp_section_text_begin,
(const int *) bsp_section_text_load_begin,
(size_t) bsp_section_text_size
@@ -185,7 +191,7 @@ void BSP_START_SECTION bsp_start_hook_1(void)
/* Copy .rodata section */
arm_cp15_instruction_cache_invalidate();
- bsp_start_memcpy_arm(
+ bsp_start_memcpy(
(int *) bsp_section_rodata_begin,
(const int *) bsp_section_rodata_load_begin,
(size_t) bsp_section_rodata_size
@@ -193,7 +199,7 @@ void BSP_START_SECTION bsp_start_hook_1(void)
/* Copy .data section */
arm_cp15_instruction_cache_invalidate();
- bsp_start_memcpy_arm(
+ bsp_start_memcpy(
(int *) bsp_section_data_begin,
(const int *) bsp_section_data_load_begin,
(size_t) bsp_section_data_size
@@ -201,7 +207,7 @@ void BSP_START_SECTION bsp_start_hook_1(void)
/* Copy .fast section */
arm_cp15_instruction_cache_invalidate();
- bsp_start_memcpy_arm(
+ bsp_start_memcpy(
(int *) bsp_section_fast_begin,
(const int *) bsp_section_fast_load_begin,
(size_t) bsp_section_fast_size