summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/arm/lpc24xx
diff options
context:
space:
mode:
authorThomas Doerfler <Thomas.Doerfler@embedded-brains.de>2009-07-17 13:53:04 +0000
committerThomas Doerfler <Thomas.Doerfler@embedded-brains.de>2009-07-17 13:53:04 +0000
commit7ae27751322a9b29ea9ff2adc146f064237127eb (patch)
tree0da82709cd17aeb997dee9da035042e68affd2e5 /c/src/lib/libbsp/arm/lpc24xx
parentexception handling maintenance (diff)
downloadrtems-7ae27751322a9b29ea9ff2adc146f064237127eb.tar.bz2
ARM bsp maintenance
Diffstat (limited to '')
-rw-r--r--c/src/lib/libbsp/arm/lpc24xx/ChangeLog12
-rw-r--r--c/src/lib/libbsp/arm/lpc24xx/Makefile.am14
-rw-r--r--c/src/lib/libbsp/arm/lpc24xx/README3
-rw-r--r--c/src/lib/libbsp/arm/lpc24xx/clock/clock-config.c8
-rw-r--r--c/src/lib/libbsp/arm/lpc24xx/configure.ac37
-rw-r--r--c/src/lib/libbsp/arm/lpc24xx/console/console-config.c118
-rw-r--r--c/src/lib/libbsp/arm/lpc24xx/include/dma.h14
-rw-r--r--c/src/lib/libbsp/arm/lpc24xx/include/irq.h9
-rw-r--r--c/src/lib/libbsp/arm/lpc24xx/include/lpc24xx.h138
-rw-r--r--c/src/lib/libbsp/arm/lpc24xx/include/system-clocks.h2
-rw-r--r--c/src/lib/libbsp/arm/lpc24xx/irq/irq.c56
-rw-r--r--c/src/lib/libbsp/arm/lpc24xx/misc/dma.c78
-rw-r--r--c/src/lib/libbsp/arm/lpc24xx/misc/system-clocks.c24
-rw-r--r--c/src/lib/libbsp/arm/lpc24xx/network/network.c280
-rw-r--r--c/src/lib/libbsp/arm/lpc24xx/preinstall.am20
-rw-r--r--c/src/lib/libbsp/arm/lpc24xx/rtc/rtc-config.c6
-rw-r--r--c/src/lib/libbsp/arm/lpc24xx/startup/bspreset.c19
-rw-r--r--c/src/lib/libbsp/arm/lpc24xx/startup/bspstart.c138
-rw-r--r--c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds14
-rw-r--r--c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc247814
-rw-r--r--c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc2478_ncs23
-rw-r--r--c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc2478_ncs_ram16
22 files changed, 694 insertions, 349 deletions
diff --git a/c/src/lib/libbsp/arm/lpc24xx/ChangeLog b/c/src/lib/libbsp/arm/lpc24xx/ChangeLog
index d0c2bfeb1a..0c9790246c 100644
--- a/c/src/lib/libbsp/arm/lpc24xx/ChangeLog
+++ b/c/src/lib/libbsp/arm/lpc24xx/ChangeLog
@@ -4,6 +4,18 @@
RTEMS_BSP_BOOTCARD_OPTIONS. Add RTEMS_BSP_CLEANUP_OPTIONS so all BSPs
have the same options.
+2009-07-15 Sebastian Huber <sebastian.huber@embedded-brains.de>
+
+ * i2c/i2c.c, include/i2c.h, include/idle.h, include/io.h, misc/idle.c,
+ misc/io.c: New files.
+ * Makefile.am, README, configure.ac, preinstall.am,
+ clock/clock-config.c, console/console-config.c, include/irq.h,
+ include/dma.h, include/lpc24xx.h, include/system-clocks.h, irq/irq.c,
+ misc/dma.c, misc/system-clocks.c, network/network.c, rtc/rtc-config.c,
+ startup/bspreset.c, startup/bspstart.c, startup/linkcmds,
+ startup/linkcmds.lpc2478, startup/linkcmds.lpc2478_ncs,
+ startup/linkcmds.lpc2478_ncs_ram: Changes throughout.
+
2009-02-27 Sebastian Huber <sebastian.huber@embedded-brains.de>
* README: Added NCS.
diff --git a/c/src/lib/libbsp/arm/lpc24xx/Makefile.am b/c/src/lib/libbsp/arm/lpc24xx/Makefile.am
index 0c3e6e0ee4..7d5e53320c 100644
--- a/c/src/lib/libbsp/arm/lpc24xx/Makefile.am
+++ b/c/src/lib/libbsp/arm/lpc24xx/Makefile.am
@@ -30,6 +30,7 @@ include_bsp_HEADERS =
include_bsp_HEADERS += ../../shared/include/utility.h
include_bsp_HEADERS += ../../shared/include/irq-generic.h
include_bsp_HEADERS += ../../shared/include/irq-info.h
+include_bsp_HEADERS += ../../shared/include/stackalloc.h
include_bsp_HEADERS += ../../shared/tod.h
include_bsp_HEADERS += ../shared/include/linker-symbols.h
include_bsp_HEADERS += ../shared/include/start.h
@@ -39,6 +40,9 @@ include_bsp_HEADERS += include/lpc24xx.h
include_bsp_HEADERS += include/system-clocks.h
include_bsp_HEADERS += include/ssp.h
include_bsp_HEADERS += include/dma.h
+include_bsp_HEADERS += include/idle.h
+include_bsp_HEADERS += include/i2c.h
+include_bsp_HEADERS += include/io.h
include_HEADERS += ../../shared/include/tm27.h
@@ -53,7 +57,6 @@ libbspstart_a_SOURCES = ../shared/start/start.S
project_lib_DATA = start.$(OBJEXT)
dist_project_lib_DATA += ../shared/startup/linkcmds.base \
- ../shared/startup/linkcmds.rom \
startup/linkcmds.lpc2478 \
startup/linkcmds.lpc2478_ncs \
startup/linkcmds.lpc2478_ncs_ram
@@ -76,6 +79,7 @@ libbsp_a_SOURCES += ../../shared/bootcard.c \
../../shared/bsppretaskinghook.c \
../../shared/gnatinstallhandler.c \
../../shared/sbrk.c \
+ ../../shared/src/stackalloc.c \
../shared/abort/simple_abort.c
# Startup
@@ -87,7 +91,6 @@ libbsp_a_SOURCES += ../../shared/src/irq-generic.c \
../../shared/src/irq-legacy.c \
../../shared/src/irq-info.c \
../../shared/src/irq-shell.c \
- ../shared/irq/irq_asm.S \
irq/irq.c
# Console
@@ -106,11 +109,16 @@ libbsp_a_SOURCES += ../../shared/timerstub.c
# Misc
libbsp_a_SOURCES += misc/system-clocks.c \
- misc/dma.c
+ misc/dma.c \
+ misc/idle.c \
+ misc/io.c
# SSP
libbsp_a_SOURCES += ssp/ssp.c
+# I2C
+libbsp_a_SOURCES += i2c/i2c.c
+
###############################################################################
# Network #
###############################################################################
diff --git a/c/src/lib/libbsp/arm/lpc24xx/README b/c/src/lib/libbsp/arm/lpc24xx/README
index 6a98e5996f..aec3a9c3be 100644
--- a/c/src/lib/libbsp/arm/lpc24xx/README
+++ b/c/src/lib/libbsp/arm/lpc24xx/README
@@ -2,6 +2,8 @@
# $Id$
#
+Note: A Binutils version with REGION_ALIAS feature is required to link the BSP.
+
Development Board: QVGA Base Board from Embedded Artists
http://www.embeddedartists.com/products/uclinux/oem_lpc2478.php
@@ -13,6 +15,7 @@ Drivers:
o RTC
o SSP (SPI mode): This driver is in active development. Use with care.
o Network
+ o I2C
Howto setup QVGA Base Board?
diff --git a/c/src/lib/libbsp/arm/lpc24xx/clock/clock-config.c b/c/src/lib/libbsp/arm/lpc24xx/clock/clock-config.c
index 26ac30d72c..0e95791720 100644
--- a/c/src/lib/libbsp/arm/lpc24xx/clock/clock-config.c
+++ b/c/src/lib/libbsp/arm/lpc24xx/clock/clock-config.c
@@ -25,6 +25,7 @@
#include <bsp.h>
#include <bsp/lpc24xx.h>
#include <bsp/irq.h>
+#include <bsp/io.h>
#include <bsp/system-clocks.h>
/* This is defined in ../../../shared/clockdrv_shell.h */
@@ -55,11 +56,8 @@ static void lpc24xx_clock_initialize( void)
uint64_t interval = ((uint64_t) lpc24xx_cclk()
* (uint64_t) rtems_configuration_get_microseconds_per_tick()) / 1000000;
- /* Set timer pclk to cclk */
- rtems_interrupt_disable( level);
- PCONP = SET_FLAGS( PCONP, 0x02);
- PCLKSEL0 = SET_FLAGS( PCLKSEL0, 0x04);
- rtems_interrupt_enable( level);
+ /* Enable module power */
+ lpc24xx_module_enable( LPC24XX_MODULE_TIMER, 0, LPC24XX_MODULE_CCLK);
/* Reset timer */
T0TCR = TCR_RST;
diff --git a/c/src/lib/libbsp/arm/lpc24xx/configure.ac b/c/src/lib/libbsp/arm/lpc24xx/configure.ac
index 20edb5dba7..0740c5145a 100644
--- a/c/src/lib/libbsp/arm/lpc24xx/configure.ac
+++ b/c/src/lib/libbsp/arm/lpc24xx/configure.ac
@@ -24,27 +24,48 @@ RTEMS_CHECK_NETWORKING
AM_CONDITIONAL(HAS_NETWORKING,test "$HAS_NETWORKING" = "yes")
RTEMS_BSPOPTS_SET([LPC24XX_OSCILLATOR_MAIN],[*],[12000000U])
-RTEMS_BSPOPTS_HELP([LPC24XX_OSCILLATOR_MAIN],[Main oscillator frequency in Hz])
+RTEMS_BSPOPTS_HELP([LPC24XX_OSCILLATOR_MAIN],[main oscillator frequency in Hz])
-RTEMS_BSPOPTS_SET([LPC24XX_OSCILLATOR_RTC],[*],[32768])
+RTEMS_BSPOPTS_SET([LPC24XX_OSCILLATOR_RTC],[*],[32768U])
RTEMS_BSPOPTS_HELP([LPC24XX_OSCILLATOR_RTC],[RTC oscillator frequency in Hz])
-RTEMS_BSPOPTS_SET([LPC24XX_CCLK],[*],[72000000])
+RTEMS_BSPOPTS_SET([LPC24XX_CCLK],[*],[72000000U])
RTEMS_BSPOPTS_HELP([LPC24XX_CCLK],[CPU clock in Hz])
-RTEMS_BSPOPTS_SET([LPC24XX_UART_BAUD],[*],[115200])
-RTEMS_BSPOPTS_HELP([LPC24XX_UART_BAUD],[Baud for UARTs])
+RTEMS_BSPOPTS_SET([LPC24XX_UART_BAUD],[*],[115200U])
+RTEMS_BSPOPTS_HELP([LPC24XX_UART_BAUD],[baud for UARTs])
RTEMS_BSPOPTS_SET([LPC24XX_HAS_UBOOT],[lpc2478],[1])
RTEMS_BSPOPTS_SET([LPC24XX_HAS_UBOOT],[lpc2478_ncs_ram],[1])
-RTEMS_BSPOPTS_HELP([LPC24XX_HAS_UBOOT],[Enable U-Boot startup])
+RTEMS_BSPOPTS_HELP([LPC24XX_HAS_UBOOT],[enable U-Boot startup])
RTEMS_BSPOPTS_SET([LPC24XX_ETHERNET_RMII],[lpc2478_ncs],[1])
RTEMS_BSPOPTS_SET([LPC24XX_ETHERNET_RMII],[lpc2478_ncs_ram],[1])
-RTEMS_BSPOPTS_HELP([LPC24XX_ETHERNET_RMII],[Enable RMII for Ethernet])
+RTEMS_BSPOPTS_HELP([LPC24XX_ETHERNET_RMII],[enable RMII for Ethernet])
RTEMS_BSPOPTS_SET([LPC24XX_EMC_MICRON],[lpc2478_ncs],[1])
-RTEMS_BSPOPTS_HELP([LPC24XX_EMC_MICRON],[Enable RMII for Ethernet])
+RTEMS_BSPOPTS_HELP([LPC24XX_EMC_MICRON],[use Micron configuration for EMC])
+
+RTEMS_BSPOPTS_SET([LPC24XX_CONFIG_CONSOLE],[*],[0])
+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],[*],[])
+RTEMS_BSPOPTS_HELP([LPC24XX_CONFIG_UART_2],[configuration for UART 2])
+
+RTEMS_BSPOPTS_SET([LPC24XX_CONFIG_UART_3],[*],[])
+RTEMS_BSPOPTS_HELP([LPC24XX_CONFIG_UART_3],[configuration for UART 3])
+
+RTEMS_BSPOPTS_SET([LPC24XX_CONFIG_I2C_0],[lpc2478_ncs_ram],[0])
+RTEMS_BSPOPTS_HELP([LPC24XX_CONFIG_I2C_0],[configuration for I2C 0])
+
+RTEMS_BSPOPTS_SET([LPC24XX_CONFIG_I2C_1],[*],[])
+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_BSP_BOOTCARD_OPTIONS
RTEMS_BSP_CLEANUP_OPTIONS(0, 0)
diff --git a/c/src/lib/libbsp/arm/lpc24xx/console/console-config.c b/c/src/lib/libbsp/arm/lpc24xx/console/console-config.c
index 0c298421da..d639ef9818 100644
--- a/c/src/lib/libbsp/arm/lpc24xx/console/console-config.c
+++ b/c/src/lib/libbsp/arm/lpc24xx/console/console-config.c
@@ -25,8 +25,6 @@
#include <bsp/lpc24xx.h>
#include <bsp/irq.h>
-#define LPC24XX_UART_NUMBER 1
-
static uint8_t lpc24xx_uart_register( uint32_t addr, uint8_t i)
{
volatile uint32_t *reg = (volatile uint32_t *) addr;
@@ -41,30 +39,98 @@ static void lpc24xx_uart_set_register( uint32_t addr, uint8_t i, uint8_t val)
reg [i] = val;
}
-unsigned long Console_Port_Count = LPC24XX_UART_NUMBER;
+rtems_device_minor_number Console_Port_Minor = 0;
+
+console_tbl Console_Port_Tbl [] = {
+ #ifdef LPC24XX_CONFIG_CONSOLE
+ {
+ .sDeviceName = "/dev/ttyS0",
+ .deviceType = SERIAL_NS16550,
+ .pDeviceFns = &ns16550_fns,
+ .deviceProbe = NULL,
+ .pDeviceFlow = NULL,
+ .ulMargin = 16,
+ .ulHysteresis = 8,
+ .pDeviceParams = (void *) LPC24XX_UART_BAUD,
+ .ulCtrlPort1 = UART0_BASE_ADDR,
+ .ulCtrlPort2 = 0,
+ .ulDataPort = UART0_BASE_ADDR,
+ .getRegister = lpc24xx_uart_register,
+ .setRegister = lpc24xx_uart_set_register,
+ .getData = NULL,
+ .setData = NULL,
+ .ulClock = LPC24XX_CCLK,
+ .ulIntVector = LPC24XX_IRQ_UART_0
+ },
+ #endif
+ #ifdef LPC24XX_CONFIG_UART_1
+ {
+ .sDeviceName = "/dev/ttyS1",
+ .deviceType = SERIAL_NS16550,
+ .pDeviceFns = &ns16550_fns,
+ .deviceProbe = NULL,
+ .pDeviceFlow = NULL,
+ .ulMargin = 16,
+ .ulHysteresis = 8,
+ .pDeviceParams = (void *) LPC24XX_UART_BAUD,
+ .ulCtrlPort1 = UART1_BASE_ADDR,
+ .ulCtrlPort2 = 0,
+ .ulDataPort = UART1_BASE_ADDR,
+ .getRegister = lpc24xx_uart_register,
+ .setRegister = lpc24xx_uart_set_register,
+ .getData = NULL,
+ .setData = NULL,
+ .ulClock = LPC24XX_CCLK,
+ .ulIntVector = LPC24XX_IRQ_UART_1
+ },
+ #endif
+ #ifdef LPC24XX_CONFIG_UART_2
+ {
+ .sDeviceName = "/dev/ttyS2",
+ .deviceType = SERIAL_NS16550,
+ .pDeviceFns = &ns16550_fns,
+ .deviceProbe = NULL,
+ .pDeviceFlow = NULL,
+ .ulMargin = 16,
+ .ulHysteresis = 8,
+ .pDeviceParams = (void *) LPC24XX_UART_BAUD,
+ .ulCtrlPort1 = UART2_BASE_ADDR,
+ .ulCtrlPort2 = 0,
+ .ulDataPort = UART2_BASE_ADDR,
+ .getRegister = lpc24xx_uart_register,
+ .setRegister = lpc24xx_uart_set_register,
+ .getData = NULL,
+ .setData = NULL,
+ .ulClock = LPC24XX_CCLK,
+ .ulIntVector = LPC24XX_IRQ_UART_2
+ },
+ #endif
+ #ifdef LPC24XX_CONFIG_UART_3
+ {
+ .sDeviceName = "/dev/ttyS3",
+ .deviceType = SERIAL_NS16550,
+ .pDeviceFns = &ns16550_fns,
+ .deviceProbe = NULL,
+ .pDeviceFlow = NULL,
+ .ulMargin = 16,
+ .ulHysteresis = 8,
+ .pDeviceParams = (void *) LPC24XX_UART_BAUD,
+ .ulCtrlPort1 = UART3_BASE_ADDR,
+ .ulCtrlPort2 = 0,
+ .ulDataPort = UART3_BASE_ADDR,
+ .getRegister = lpc24xx_uart_register,
+ .setRegister = lpc24xx_uart_set_register,
+ .getData = NULL,
+ .setData = NULL,
+ .ulClock = LPC24XX_CCLK,
+ .ulIntVector = LPC24XX_IRQ_UART_3
+ },
+ #endif
+};
-rtems_device_minor_number Console_Port_Minor = 0;
+#define LPC24XX_UART_NUMBER \
+ (sizeof( Console_Port_Tbl) / sizeof( Console_Port_Tbl [0]))
-console_data Console_Port_Data [LPC24XX_UART_NUMBER];
+unsigned long Console_Port_Count = LPC24XX_UART_NUMBER;
-console_tbl Console_Port_Tbl [LPC24XX_UART_NUMBER] = {
- {
- .sDeviceName = "/dev/ttyS0",
- .deviceType = SERIAL_NS16550,
- .pDeviceFns = &ns16550_fns,
- .deviceProbe = NULL,
- .pDeviceFlow = NULL,
- .ulMargin = 16,
- .ulHysteresis = 8,
- .pDeviceParams = (void *) LPC24XX_UART_BAUD,
- .ulCtrlPort1 = UART0_BASE_ADDR,
- .ulCtrlPort2 = 0,
- .ulDataPort = UART0_BASE_ADDR,
- .getRegister = lpc24xx_uart_register,
- .setRegister = lpc24xx_uart_set_register,
- .getData = NULL,
- .setData = NULL,
- .ulClock = LPC24XX_CCLK,
- .ulIntVector = LPC24XX_IRQ_UART_0
- }
-};
+console_data Console_Port_Data [LPC24XX_UART_NUMBER];
diff --git a/c/src/lib/libbsp/arm/lpc24xx/include/dma.h b/c/src/lib/libbsp/arm/lpc24xx/include/dma.h
index a083510c3c..0871372a2c 100644
--- a/c/src/lib/libbsp/arm/lpc24xx/include/dma.h
+++ b/c/src/lib/libbsp/arm/lpc24xx/include/dma.h
@@ -7,8 +7,8 @@
*/
/*
- * Copyright (c) 2008
- * Embedded Brains GmbH
+ * Copyright (c) 2008, 2009
+ * embedded brains GmbH
* Obere Lagerstr. 30
* D-82178 Puchheim
* Germany
@@ -21,19 +21,19 @@
#ifndef LIBBSP_ARM_LPC24XX_DMA_H
#define LIBBSP_ARM_LPC24XX_DMA_H
-#include <stdbool.h>
+#include <rtems.h>
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
-void lpc24xx_dma_initialize( void);
+void lpc24xx_dma_initialize(void);
-bool lpc24xx_dma_channel_obtain( unsigned channel);
+rtems_status_code lpc24xx_dma_channel_obtain(unsigned channel);
-void lpc24xx_dma_channel_release( unsigned channel);
+void lpc24xx_dma_channel_release(unsigned channel);
-void lpc24xx_dma_channel_disable( unsigned channel, bool force);
+void lpc24xx_dma_channel_disable(unsigned channel, bool force);
#ifdef __cplusplus
}
diff --git a/c/src/lib/libbsp/arm/lpc24xx/include/irq.h b/c/src/lib/libbsp/arm/lpc24xx/include/irq.h
index d37cf7af94..dfc86c5946 100644
--- a/c/src/lib/libbsp/arm/lpc24xx/include/irq.h
+++ b/c/src/lib/libbsp/arm/lpc24xx/include/irq.h
@@ -66,6 +66,9 @@
#define LPC24XX_IRQ_I2C_2 30
#define LPC24XX_IRQ_I2S 31
+#define LPC24XX_IRQ_PRIORITY_VALUE_MIN 0
+#define LPC24XX_IRQ_PRIORITY_VALUE_MAX 15
+
/**
* @brief Minimum vector number.
*/
@@ -76,6 +79,12 @@
*/
#define BSP_INTERRUPT_VECTOR_MAX LPC24XX_IRQ_I2S
+void bsp_interrupt_dispatch( void);
+
+void lpc24xx_irq_set_priority( rtems_vector_number vector, unsigned priority);
+
+unsigned lpc24xx_irq_priority( rtems_vector_number vector);
+
/** @} */
#endif /* ASM */
diff --git a/c/src/lib/libbsp/arm/lpc24xx/include/lpc24xx.h b/c/src/lib/libbsp/arm/lpc24xx/include/lpc24xx.h
index bb538cb487..33f03048a2 100644
--- a/c/src/lib/libbsp/arm/lpc24xx/include/lpc24xx.h
+++ b/c/src/lib/libbsp/arm/lpc24xx/include/lpc24xx.h
@@ -38,7 +38,7 @@
#define VICProtection (*(volatile uint32_t *) (VIC_BASE_ADDR + 0x020))
#define VICSWPrioMask (*(volatile uint32_t *) (VIC_BASE_ADDR + 0x024))
-#define VICVectAddrBase ((uint32_t *) (VIC_BASE_ADDR + 0x100))
+#define VICVectAddrBase ((volatile uint32_t *) (VIC_BASE_ADDR + 0x100))
#define VICVectAddr0 (*(volatile uint32_t *) (VIC_BASE_ADDR + 0x100))
#define VICVectAddr1 (*(volatile uint32_t *) (VIC_BASE_ADDR + 0x104))
#define VICVectAddr2 (*(volatile uint32_t *) (VIC_BASE_ADDR + 0x108))
@@ -72,8 +72,7 @@
#define VICVectAddr30 (*(volatile uint32_t *) (VIC_BASE_ADDR + 0x178))
#define VICVectAddr31 (*(volatile uint32_t *) (VIC_BASE_ADDR + 0x17C))
-#define VICVectPriorityBase ((uint32_t *) (VIC_BASE_ADDR + 0x200))
-#define VICVectPriority( i) (*((volatile uint32_t *) (VIC_BASE_ADDR + 0x200) + (i)))
+#define VICVectPriorityBase ((volatile uint32_t *) (VIC_BASE_ADDR + 0x200))
#define VICVectPriority0 (*(volatile uint32_t *) (VIC_BASE_ADDR + 0x200))
#define VICVectPriority1 (*(volatile uint32_t *) (VIC_BASE_ADDR + 0x204))
#define VICVectPriority2 (*(volatile uint32_t *) (VIC_BASE_ADDR + 0x208))
@@ -123,6 +122,7 @@
#define PINSEL8 (*(volatile uint32_t *) (PINSEL_BASE_ADDR + 0x20))
#define PINSEL9 (*(volatile uint32_t *) (PINSEL_BASE_ADDR + 0x24))
#define PINSEL10 (*(volatile uint32_t *) (PINSEL_BASE_ADDR + 0x28))
+#define PINSEL11 (*(volatile uint32_t *) (PINSEL_BASE_ADDR + 0x2C))
#define PINMODE0 (*(volatile uint32_t *) (PINSEL_BASE_ADDR + 0x40))
#define PINMODE1 (*(volatile uint32_t *) (PINSEL_BASE_ADDR + 0x44))
@@ -794,6 +794,7 @@ Reset, and Code Security/Debugging */
#define AD0CR (*(volatile uint32_t *) (AD0_BASE_ADDR + 0x00))
#define AD0GDR (*(volatile uint32_t *) (AD0_BASE_ADDR + 0x04))
#define AD0INTEN (*(volatile uint32_t *) (AD0_BASE_ADDR + 0x0C))
+#define AD0_DATA_START ((volatile uint32_t *) (AD0_BASE_ADDR + 0x10))
#define AD0DR0 (*(volatile uint32_t *) (AD0_BASE_ADDR + 0x10))
#define AD0DR1 (*(volatile uint32_t *) (AD0_BASE_ADDR + 0x14))
#define AD0DR2 (*(volatile uint32_t *) (AD0_BASE_ADDR + 0x18))
@@ -1121,63 +1122,37 @@ Reset, and Code Security/Debugging */
#define MAC_POWERDOWN (*(volatile uint32_t *) (MAC_BASE_ADDR + 0xFF4)) /* Power-down reg */
#define MAC_MODULEID (*(volatile uint32_t *) (MAC_BASE_ADDR + 0xFFC)) /* Module ID reg (RO) */
-/* Register Fields */
-
-/* PCONP */
-
-#define PCONP_PCTIM0 0x00000002U
-
-#define PCONP_PCTIM1 0x00000004U
-
-#define PCONP_PCUART0 0x00000008U
-
-#define PCONP_PCUART1 0x00000010U
-
-#define PCONP_PCPWM0 0x00000020U
-
-#define PCONP_PCPWM1 0x00000040U
-
-#define PCONP_PCI2C0 0x00000080U
-
-#define PCONP_PCSPI 0x00000100U
-
-#define PCONP_PCRTC 0x00000200U
-
-#define PCONP_PCSSP1 0x00000400U
-
-#define PCONP_PCEMC 0x00000800U
-
-#define PCONP_PCAD 0x00001000U
-
-#define PCONP_PCCAN1 0x00002000U
-
-#define PCONP_PCCAN2 0x00004000U
-
-#define PCONP_PCI2C1 0x00080000U
-
-#define PCONP_PCLCD 0x00100000U
-
-#define PCONP_PCSSP0 0x00200000U
-
-#define PCONP_PCTIM2 0x00400000U
-
-#define PCONP_PCTIM3 0x00800000U
-
-#define PCONP_PCUART2 0x01000000U
-
-#define PCONP_PCUART3 0x02000000U
+/* LCD Controller */
+
+#define LCD_BASE_ADDR 0xFFE10000
+#define LCD_CFG (*(volatile uint32_t *) 0xE01FC1B8)
+#define LCD_TIMH (*(volatile uint32_t *) (LCD_BASE_ADDR + 0x000))
+#define LCD_TIMV (*(volatile uint32_t *) (LCD_BASE_ADDR + 0x004))
+#define LCD_POL (*(volatile uint32_t *) (LCD_BASE_ADDR + 0x008))
+#define LCD_LE (*(volatile uint32_t *) (LCD_BASE_ADDR + 0x00C))
+#define LCD_UPBASE (*(volatile uint32_t *) (LCD_BASE_ADDR + 0x010))
+#define LCD_LPBASE (*(volatile uint32_t *) (LCD_BASE_ADDR + 0x014))
+#define LCD_CTRL (*(volatile uint32_t *) (LCD_BASE_ADDR + 0x018))
+#define LCD_INTMSK (*(volatile uint32_t *) (LCD_BASE_ADDR + 0x01C))
+#define LCD_INTRAW (*(volatile uint32_t *) (LCD_BASE_ADDR + 0x020))
+#define LCD_INTSTAT (*(volatile uint32_t *) (LCD_BASE_ADDR + 0x024))
+#define LCD_INTCLR (*(volatile uint32_t *) (LCD_BASE_ADDR + 0x028))
+#define LCD_UPCURR (*(volatile uint32_t *) (LCD_BASE_ADDR + 0x02C))
+#define LCD_LPCURR (*(volatile uint32_t *) (LCD_BASE_ADDR + 0x030))
+#define LCD_PAL_ADDR (*(volatile uint32_t *) (LCD_BASE_ADDR + 0x200))
+#define CRSR_IMG (*(volatile uint32_t *) (LCD_BASE_ADDR + 0x800))
+#define CRSR_CTLR (*(volatile uint32_t *) (LCD_BASE_ADDR + 0xC00))
+#define CRSR_CFG (*(volatile uint32_t *) (LCD_BASE_ADDR + 0xC04))
+#define CRSR_PAL0 (*(volatile uint32_t *) (LCD_BASE_ADDR + 0xC08))
+#define CRSR_PAL1 (*(volatile uint32_t *) (LCD_BASE_ADDR + 0xC0C))
+#define CRSR_XY (*(volatile uint32_t *) (LCD_BASE_ADDR + 0xC10))
+#define CRSR_CLIP (*(volatile uint32_t *) (LCD_BASE_ADDR + 0xC14))
+#define CRSR_INTMSK (*(volatile uint32_t *) (LCD_BASE_ADDR + 0xC20))
+#define CRSR_INTCLR (*(volatile uint32_t *) (LCD_BASE_ADDR + 0xC24))
+#define CRSR_INTRAW (*(volatile uint32_t *) (LCD_BASE_ADDR + 0xC28))
+#define CRSR_INTSTAT (*(volatile uint32_t *) (LCD_BASE_ADDR + 0xC2C))
-#define PCONP_PCI2C2 0x04000000U
-
-#define PCONP_PCI2S 0x08000000U
-
-#define PCONP_PCSDC 0x10000000U
-
-#define PCONP_PCGPDMA 0x20000000U
-
-#define PCONP_PCENET 0x40000000U
-
-#define PCONP_PCUSB 0x80000000U
+/* Register Fields */
/* CLKSRCSEL */
@@ -2022,6 +1997,12 @@ typedef struct {
#define ETH_CMD_FULL_DUPLEX 0x00000400U
+/* ETH_STAT */
+
+#define ETH_STAT_RX_ACTIVE 0x00000001U
+
+#define ETH_STAT_TX_ACTIVE 0x00000002U
+
/* AHBCFG */
#define AHBCFG_SCHEDULER_UNIFORM 0x00000001U
@@ -2106,4 +2087,43 @@ typedef struct {
#define EMC_DYN_CTRL_CMD_NOP 0x00000180U
+/* I2C */
+
+typedef struct {
+ uint32_t conset;
+ uint32_t stat;
+ uint32_t dat;
+ uint32_t adr;
+ uint32_t sclh;
+ uint32_t scll;
+ uint32_t conclr;
+} lpc24xx_i2c;
+
+#define LPC24XX_I2C_AA (1U << 2U)
+
+#define LPC24XX_I2C_SI (1U << 3U)
+
+#define LPC24XX_I2C_STO (1U << 4U)
+
+#define LPC24XX_I2C_STA (1U << 5U)
+
+#define LPC24XX_I2C_EN (1U << 6U)
+
+/* IO */
+
+typedef struct {
+ uint32_t dir;
+ uint32_t reserved [3];
+ uint32_t mask;
+ uint32_t pin;
+ uint32_t set;
+ uint32_t clr;
+} lpc24xx_fio;
+
+static volatile uint32_t * const LPC24XX_PINSEL = &PINSEL0;
+
+static volatile uint32_t * const LPC24XX_PINMODE = &PINMODE0;
+
+static volatile lpc24xx_fio * const LPC24XX_FIO = (volatile lpc24xx_fio *) FIO_BASE_ADDR;
+
#endif /* LIBBSP_ARM_LPC24XX_LPC24XX_H */
diff --git a/c/src/lib/libbsp/arm/lpc24xx/include/system-clocks.h b/c/src/lib/libbsp/arm/lpc24xx/include/system-clocks.h
index ea2fa46699..8205b54dec 100644
--- a/c/src/lib/libbsp/arm/lpc24xx/include/system-clocks.h
+++ b/c/src/lib/libbsp/arm/lpc24xx/include/system-clocks.h
@@ -27,6 +27,8 @@ extern "C" {
void lpc24xx_micro_seconds_delay( unsigned us);
+unsigned lpc24xx_pllclk( void);
+
unsigned lpc24xx_cclk( void);
void lpc24xx_set_pll( unsigned clksrc, unsigned nsel, unsigned msel, unsigned cclksel);
diff --git a/c/src/lib/libbsp/arm/lpc24xx/irq/irq.c b/c/src/lib/libbsp/arm/lpc24xx/irq/irq.c
index 00275418bd..72165c0501 100644
--- a/c/src/lib/libbsp/arm/lpc24xx/irq/irq.c
+++ b/c/src/lib/libbsp/arm/lpc24xx/irq/irq.c
@@ -7,8 +7,8 @@
*/
/*
- * Copyright (c) 2008
- * Embedded Brains GmbH
+ * Copyright (c) 2008, 2009
+ * embedded brains GmbH
* Obere Lagerstr. 30
* D-82178 Puchheim
* Germany
@@ -23,32 +23,70 @@
#include <bsp/irq-generic.h>
#include <bsp/lpc24xx.h>
-void ExecuteITHandler( void)
+static inline bool lpc24xx_irq_is_valid( rtems_vector_number vector)
+{
+ return vector <= BSP_INTERRUPT_VECTOR_MAX;
+}
+
+void lpc24xx_irq_set_priority( rtems_vector_number vector, unsigned priority)
+{
+ if (lpc24xx_irq_is_valid( vector)) {
+ if (priority > LPC24XX_IRQ_PRIORITY_VALUE_MAX) {
+ priority = LPC24XX_IRQ_PRIORITY_VALUE_MAX;
+ }
+
+ VICVectPriorityBase [vector] = priority;
+ }
+}
+
+unsigned lpc24xx_irq_priority( rtems_vector_number vector)
+{
+ if (lpc24xx_irq_is_valid( vector)) {
+ return VICVectPriorityBase [vector];
+ } else {
+ return LPC24XX_IRQ_PRIORITY_VALUE_MIN - 1;
+ }
+}
+
+void bsp_interrupt_dispatch( void)
{
/* Read current vector number */
rtems_vector_number vector = VICVectAddr;
- /* Acknowledge interrupt */
- VICVectAddr = 0;
+ /* Enable interrupts in program status register */
+ uint32_t psr = arm_status_irq_enable();
/* Dispatch interrupt handlers */
bsp_interrupt_handler_dispatch( vector);
+
+ /* Restore program status register */
+ arm_status_restore( psr);
+
+ /* Acknowledge interrupt */
+ VICVectAddr = 0;
}
rtems_status_code bsp_interrupt_vector_enable( rtems_vector_number vector)
{
- VICIntEnable = 1U << vector;
+ if (lpc24xx_irq_is_valid( vector)) {
+ VICIntEnable = 1U << vector;
+ }
return RTEMS_SUCCESSFUL;
}
rtems_status_code bsp_interrupt_vector_disable( rtems_vector_number vector)
{
- VICIntEnClear = 1U << vector;
+ if (lpc24xx_irq_is_valid( vector)) {
+ VICIntEnClear = 1U << vector;
+ }
return RTEMS_SUCCESSFUL;
}
+/* FIXME */
+void arm_exc_interrupt( void);
+
rtems_status_code bsp_interrupt_facility_initialize( void)
{
volatile uint32_t *addr = VICVectAddrBase;
@@ -79,12 +117,12 @@ rtems_status_code bsp_interrupt_facility_initialize( void)
VICVectAddr = 0;
/* Install the IRQ exception handler */
- _CPU_ISR_install_vector( ARM_EXCEPTION_IRQ, _ISR_Handler, NULL);
+ _CPU_ISR_install_vector( ARM_EXCEPTION_IRQ, arm_exc_interrupt, NULL);
return RTEMS_SUCCESSFUL;
}
void bsp_interrupt_handler_default( rtems_vector_number vector)
{
- printk( "Spurious interrupt: %u\n", vector);
+ printk( "spurious interrupt: %u\n", vector);
}
diff --git a/c/src/lib/libbsp/arm/lpc24xx/misc/dma.c b/c/src/lib/libbsp/arm/lpc24xx/misc/dma.c
index 127f1934eb..5b3ba6fa0b 100644
--- a/c/src/lib/libbsp/arm/lpc24xx/misc/dma.c
+++ b/c/src/lib/libbsp/arm/lpc24xx/misc/dma.c
@@ -7,8 +7,8 @@
*/
/*
- * Copyright (c) 2008
- * Embedded Brains GmbH
+ * Copyright (c) 2008, 2009
+ * embedded brains GmbH
* Obere Lagerstr. 30
* D-82178 Puchheim
* Germany
@@ -22,6 +22,7 @@
#include <bsp/lpc24xx.h>
#include <bsp/dma.h>
+#include <bsp/io.h>
/**
* @brief Table that indicates if a channel is currently occupied.
@@ -31,14 +32,12 @@ static bool lpc24xx_dma_channel_occupation [GPDMA_CH_NUMBER];
/**
* @brief Initializes the general purpose DMA.
*/
-void lpc24xx_dma_initialize( void)
+void lpc24xx_dma_initialize(void)
{
rtems_interrupt_level level;
- /* Enable power */
- rtems_interrupt_disable( level);
- PCONP = SET_FLAG( PCONP, PCONP_PCGPDMA);
- rtems_interrupt_enable( level);
+ /* Enable module power */
+ lpc24xx_module_enable(LPC24XX_MODULE_GPDMA, 0, LPC24XX_MODULE_PCLK_DEFAULT);
/* Disable module */
GPDMA_CONFIG = 0;
@@ -59,66 +58,67 @@ void lpc24xx_dma_initialize( void)
}
/**
- * @brief Returns true if the channel @a channel was obtained.
+ * @brief Tries to obtain the channel @a channel.
*
- * If the channel number @a channel is out of range the last valid channel will
- * be used.
+ * @retval RTEMS_SUCCESSFUL Successful operation.
+ * @retval RTEMS_INVALID_ID Invalid channel number.
+ * @retval RTEMS_RESOURCE_IN_USE Channel already occupied.
*/
-bool lpc24xx_dma_channel_obtain( unsigned channel)
+rtems_status_code lpc24xx_dma_channel_obtain(unsigned channel)
{
- rtems_interrupt_level level;
- bool occupation = true;
-
- if (channel > GPDMA_CH_NUMBER) {
- channel = GPDMA_CH_NUMBER - 1;
+ if (channel < GPDMA_CH_NUMBER) {
+ rtems_interrupt_level level;
+ bool occupation = true;
+
+ rtems_interrupt_disable(level);
+ occupation = lpc24xx_dma_channel_occupation [channel];
+ lpc24xx_dma_channel_occupation [channel] = true;
+ rtems_interrupt_enable(level);
+
+ return occupation ? RTEMS_RESOURCE_IN_USE : RTEMS_SUCCESSFUL;
+ } else {
+ return RTEMS_INVALID_ID;
}
-
- rtems_interrupt_disable( level);
- occupation = lpc24xx_dma_channel_occupation [channel];
- lpc24xx_dma_channel_occupation [channel] = true;
- rtems_interrupt_enable( level);
-
- return !occupation;
}
/**
- * @brief Releases the channel @a channel. You must have obtained this channel
- * with lpc24xx_dma_channel_obtain() previously.
+ * @brief Releases the channel @a channel.
*
- * If the channel number @a channel is out of range the last valid channel will
- * be used.
+ * You must have obtained this channel with lpc24xx_dma_channel_obtain()
+ * previously.
+ *
+ * If the channel number @a channel is out of range nothing will happen.
*/
-void lpc24xx_dma_channel_release( unsigned channel)
+void lpc24xx_dma_channel_release(unsigned channel)
{
- if (channel > GPDMA_CH_NUMBER) {
- channel = GPDMA_CH_NUMBER - 1;
+ if (channel < GPDMA_CH_NUMBER) {
+ lpc24xx_dma_channel_occupation [channel] = false;
}
-
- lpc24xx_dma_channel_occupation [channel] = false;
}
/**
* @brief Disables the channel @a channel.
*
* If @a force is false the channel will be halted and disabled when the
- * channel is inactive. If the channel number @a channel is out of range the
- * last valid channel will be used.
+ * channel is inactive.
+ *
+ * If the channel number @a channel is out of range the behaviour is undefined.
*/
-void lpc24xx_dma_channel_disable( unsigned channel, bool force)
+void lpc24xx_dma_channel_disable(unsigned channel, bool force)
{
- volatile lpc24xx_dma_channel *ch = GPDMA_CH_BASE_ADDR( channel);
+ volatile lpc24xx_dma_channel *ch = GPDMA_CH_BASE_ADDR(channel);
uint32_t cfg = ch->cfg;
if (!force) {
/* Halt */
- ch->cfg = SET_FLAG( cfg, GPDMA_CH_CFG_HALT);
+ ch->cfg = SET_FLAG(cfg, GPDMA_CH_CFG_HALT);
/* Wait for inactive */
do {
cfg = ch->cfg;
- } while (IS_FLAG_SET( cfg, GPDMA_CH_CFG_ACTIVE));
+ } while (IS_FLAG_SET(cfg, GPDMA_CH_CFG_ACTIVE));
}
/* Disable */
- ch->cfg = CLEAR_FLAG( cfg, GPDMA_CH_CFG_EN);
+ ch->cfg = CLEAR_FLAG(cfg, GPDMA_CH_CFG_EN);
}
diff --git a/c/src/lib/libbsp/arm/lpc24xx/misc/system-clocks.c b/c/src/lib/libbsp/arm/lpc24xx/misc/system-clocks.c
index 6de7dd7d8d..d470295211 100644
--- a/c/src/lib/libbsp/arm/lpc24xx/misc/system-clocks.c
+++ b/c/src/lib/libbsp/arm/lpc24xx/misc/system-clocks.c
@@ -68,16 +68,15 @@ void lpc24xx_micro_seconds_delay( unsigned us)
}
/**
- * @brief Returns the CPU clock frequency in [Hz].
+ * @brief Returns the PLL output clock frequency in [Hz].
*
- * Return zero in case of an unexpected PLL input frequency.
+ * Returns zero in case of an unexpected PLL input frequency.
*/
-unsigned lpc24xx_cclk( void)
+unsigned lpc24xx_pllclk( void)
{
unsigned clksrc = GET_CLKSRCSEL_CLKSRC( CLKSRCSEL);
unsigned pllinclk = 0;
unsigned pllclk = 0;
- unsigned cclk = 0;
/* Get PLL input frequency */
switch (clksrc) {
@@ -105,8 +104,21 @@ unsigned lpc24xx_cclk( void)
pllclk = pllinclk;
}
- /* Get CPU clock frequency */
- cclk = pllclk / (GET_CCLKCFG_CCLKSEL( CCLKCFG) + 1);
+ return pllclk;
+}
+
+/**
+ * @brief Returns the CPU clock frequency in [Hz].
+ *
+ * Returns zero in case of an unexpected PLL input frequency.
+ */
+unsigned lpc24xx_cclk( void)
+{
+ /* Get PLL output frequency */
+ unsigned pllclk = lpc24xx_pllclk();
+
+ /* Get CPU frequency */
+ unsigned cclk = pllclk / (GET_CCLKCFG_CCLKSEL( CCLKCFG) + 1);
return cclk;
}
diff --git a/c/src/lib/libbsp/arm/lpc24xx/network/network.c b/c/src/lib/libbsp/arm/lpc24xx/network/network.c
index ede668a3ce..6dc5538eb6 100644
--- a/c/src/lib/libbsp/arm/lpc24xx/network/network.c
+++ b/c/src/lib/libbsp/arm/lpc24xx/network/network.c
@@ -43,6 +43,7 @@
#include <bsp.h>
#include <bsp/lpc24xx.h>
#include <bsp/irq.h>
+#include <bsp/io.h>
#include <bsp/utility.h>
#include <rtems/status-checks.h>
@@ -141,22 +142,17 @@ static char lpc24xx_eth_transmit_buffer [LPC24XX_ETH_TRANSMIT_DATA_SIZE];
(LPC24XX_ETH_TRANSMIT_STATUS_START \
+ LPC24XX_ETH_TRANSMIT_UNIT_NUMBER * ETH_TRANSMIT_STATUS_SIZE)
-#define LPC24XX_ETH_EVENT_TRANSMIT RTEMS_EVENT_1
+#define LPC24XX_ETH_EVENT_INITIALIZE RTEMS_EVENT_1
-#define LPC24XX_ETH_EVENT_TRANSMIT_START RTEMS_EVENT_2
+#define LPC24XX_ETH_EVENT_START RTEMS_EVENT_2
-#define LPC24XX_ETH_EVENT_TRANSMIT_ERROR RTEMS_EVENT_3
-
-#define LPC24XX_ETH_EVENT_RECEIVE RTEMS_EVENT_4
-
-#define LPC24XX_ETH_EVENT_RECEIVE_ERROR RTEMS_EVENT_5
-
-#define LPC24XX_ETH_TIMEOUT 10
+#define LPC24XX_ETH_EVENT_INTERRUPT RTEMS_EVENT_3
#define LPC24XX_ETH_INTERRUPT_RECEIVE \
(ETH_INT_RX_ERROR | ETH_INT_RX_FINISHED | ETH_INT_RX_DONE)
-#define LPC24XX_ETH_INTERRUPT_TRANSMIT (ETH_INT_TX_DONE | ETH_INT_TX_FINISHED | ETH_INT_TX_ERROR)
+#define LPC24XX_ETH_INTERRUPT_TRANSMIT \
+ (ETH_INT_TX_DONE | ETH_INT_TX_FINISHED | ETH_INT_TX_ERROR)
#define LPC24XX_ETH_RX_STAT_ERRORS \
(ETH_RX_STAT_CRC_ERROR \
@@ -272,13 +268,10 @@ static void lpc24xx_eth_interrupt_handler(
/* Check receive interrupts */
if (IS_FLAG_SET( is, ETH_INT_RX_OVERRUN)) {
- re = LPC24XX_ETH_EVENT_RECEIVE_ERROR;
+ re = LPC24XX_ETH_EVENT_INITIALIZE;
++e->receive_fatal_errors;
- /* FIXME */
- printk( "%s: fatal receive error\n", __func__);
- while (1);
} else if (IS_ANY_FLAG_SET( is, LPC24XX_ETH_INTERRUPT_RECEIVE)) {
- re = LPC24XX_ETH_EVENT_RECEIVE;
+ re = LPC24XX_ETH_EVENT_INTERRUPT;
ie = SET_FLAGS( ie, LPC24XX_ETH_INTERRUPT_RECEIVE);
}
@@ -290,13 +283,10 @@ static void lpc24xx_eth_interrupt_handler(
/* Check transmit interrupts */
if (IS_FLAG_SET( is, ETH_INT_TX_UNDERRUN)) {
- te = LPC24XX_ETH_EVENT_TRANSMIT_ERROR;
+ te = LPC24XX_ETH_EVENT_INITIALIZE;
++e->transmit_fatal_errors;
- /* FIXME */
- printk( "%s: fatal transmit error\n", __func__);
- while (1);
} else if (IS_ANY_FLAG_SET( is, LPC24XX_ETH_INTERRUPT_TRANSMIT)) {
- te = LPC24XX_ETH_EVENT_TRANSMIT;
+ te = LPC24XX_ETH_EVENT_INTERRUPT;
ie = SET_FLAGS( ie, LPC24XX_ETH_INTERRUPT_TRANSMIT);
}
@@ -379,7 +369,7 @@ static bool lpc24xx_eth_add_new_mbuf(
struct ifnet *ifp,
volatile lpc24xx_eth_transfer_descriptor *desc,
struct mbuf **mbuf_table,
- unsigned i,
+ uint32_t i,
bool wait
)
{
@@ -416,67 +406,20 @@ static void lpc24xx_eth_receive_task( void *arg)
LPC24XX_ETH_RECEIVE_INFO_START;
struct mbuf **const mbuf_table =
(struct mbuf **) LPC24XX_ETH_RECEIVE_MBUF_START;
- uint32_t index_max = e->receive_unit_number - 1;
+ uint32_t index_max = 0;
uint32_t produce_index = 0;
uint32_t consume_index = 0;
uint32_t receive_index = 0;
LPC24XX_ETH_PRINTF( "%s\n", __func__);
- /* Disable receive interrupts */
- lpc24xx_eth_disable_receive_interrupts();
-
- /* Disable receiver */
- MAC_COMMAND = CLEAR_FLAG( MAC_COMMAND, ETH_CMD_RX_ENABLE);
-
- /* Clear receive interrupts */
- MAC_INTCLEAR = LPC24XX_ETH_INTERRUPT_RECEIVE;
-
- /* Fill receive queue */
- for (produce_index = 0; produce_index <= index_max; ++produce_index) {
- if (
- !lpc24xx_eth_add_new_mbuf( ifp, desc, mbuf_table, produce_index, false)
- ) {
- break;
- }
- }
-
- /* Check if the queue is full */
- if (produce_index == 0) {
- RTEMS_DO_CLEANUP(
- cleanup,
- "no buffers to fill receive queue: terminate receive task\n"
- );
- } else if (produce_index <= index_max) {
- /* Reduce the queue size */
- index_max = produce_index - 1;
-
- RTEMS_SYSLOG_ERROR( "not enough buffers to fill receive queue");
- }
-
- /* Receive descriptor table */
- MAC_RXDESCRIPTORNUM = index_max;
- MAC_RXDESCRIPTOR = (uint32_t) desc;
- MAC_RXSTATUS = (uint32_t) info;
-
- /* Initialize indices */
- produce_index = MAC_RXPRODUCEINDEX;
- consume_index = MAC_RXCONSUMEINDEX;
- receive_index = consume_index;
-
- /* Enable receiver */
- MAC_COMMAND = SET_FLAG( MAC_COMMAND, ETH_CMD_RX_ENABLE);
-
- /* Enable receive interrupts */
- lpc24xx_eth_enable_receive_interrupts();
-
/* Main event loop */
while (true) {
bool wait_for_mbuf = false;
/* Wait for events */
sc = rtems_bsdnet_event_receive(
- LPC24XX_ETH_EVENT_RECEIVE,
+ LPC24XX_ETH_EVENT_INITIALIZE | LPC24XX_ETH_EVENT_INTERRUPT,
RTEMS_EVENT_ANY | RTEMS_WAIT,
RTEMS_NO_TIMEOUT,
&events
@@ -485,6 +428,79 @@ static void lpc24xx_eth_receive_task( void *arg)
LPC24XX_ETH_PRINTF( "rx: wake up: 0x%08" PRIx32 "\n", events);
+ /* Initialize receiver? */
+ if (IS_FLAG_SET( events, LPC24XX_ETH_EVENT_INITIALIZE)) {
+ /* Disable receive interrupts */
+ lpc24xx_eth_disable_receive_interrupts();
+
+ /* Disable receiver */
+ MAC_COMMAND = CLEAR_FLAG( MAC_COMMAND, ETH_CMD_RX_ENABLE);
+
+ /* Wait for inactive status */
+ while (IS_FLAG_SET( MAC_STATUS, ETH_STAT_RX_ACTIVE)) {
+ /* Wait */
+ }
+
+ /* Reset */
+ MAC_COMMAND = SET_FLAG( MAC_COMMAND, ETH_CMD_RX_RESET);
+
+ /* Clear receive interrupts */
+ MAC_INTCLEAR = LPC24XX_ETH_INTERRUPT_RECEIVE;
+
+ /* Index maximum (determines queue size) */
+ index_max = e->receive_unit_number - 1;
+
+ /* Move existing mbufs to the front */
+ consume_index = 0;
+ for (produce_index = 0; produce_index <= index_max; ++produce_index) {
+ if (mbuf_table [produce_index] != NULL) {
+ mbuf_table [consume_index] = mbuf_table [produce_index];
+ ++consume_index;
+ }
+ }
+
+ /* Fill receive queue */
+ for (produce_index = consume_index; produce_index <= index_max; ++produce_index) {
+ if (
+ !lpc24xx_eth_add_new_mbuf( ifp, desc, mbuf_table, produce_index, false)
+ ) {
+ break;
+ }
+ }
+
+ /* Check if the queue is full */
+ if (produce_index == 0) {
+ RTEMS_DO_CLEANUP(
+ cleanup,
+ "no mbufs to fill receive queue: terminate receive task\n"
+ );
+ } else if (produce_index <= index_max) {
+ /* Reduce the queue size */
+ index_max = produce_index - 1;
+
+ RTEMS_SYSLOG_ERROR( "not enough mbufs to fill receive queue");
+ }
+
+ /* Receive descriptor table */
+ MAC_RXDESCRIPTORNUM = index_max;
+ MAC_RXDESCRIPTOR = (uint32_t) desc;
+ MAC_RXSTATUS = (uint32_t) info;
+
+ /* Initialize indices */
+ produce_index = MAC_RXPRODUCEINDEX;
+ consume_index = MAC_RXCONSUMEINDEX;
+ receive_index = consume_index;
+
+ /* Enable receiver */
+ MAC_COMMAND = SET_FLAG( MAC_COMMAND, ETH_CMD_RX_ENABLE);
+
+ /* Enable receive interrupts */
+ lpc24xx_eth_enable_receive_interrupts();
+
+ /* Wait for events */
+ continue;
+ }
+
while (true) {
/* Clear receive interrupt status */
MAC_INTCLEAR = LPC24XX_ETH_INTERRUPT_RECEIVE;
@@ -497,6 +513,9 @@ static void lpc24xx_eth_receive_task( void *arg)
struct mbuf *m = mbuf_table [receive_index];
uint32_t stat = info [receive_index].status;
+ /* Remove mbuf from table */
+ mbuf_table [receive_index] = NULL;
+
if (
IS_FLAG_SET( stat, ETH_RX_STAT_LAST_FLAG)
&& ARE_FLAGS_CLEARED( stat, LPC24XX_ETH_RX_STAT_ERRORS)
@@ -585,6 +604,9 @@ static void lpc24xx_eth_receive_task( void *arg)
cleanup:
+ /* Clear task ID */
+ e->receive_task = RTEMS_ID_NONE;
+
/* Release network semaphore */
rtems_bsdnet_semaphore_release();
@@ -665,42 +687,19 @@ static void lpc24xx_eth_transmit_task( void *arg)
LPC24XX_ETH_PRINTF( "%s\n", __func__);
- /* Disable transmit interrupts */
- lpc24xx_eth_disable_transmit_interrupts();
-
- /* Disable transmitter */
- MAC_COMMAND = CLEAR_FLAG( MAC_COMMAND, ETH_CMD_TX_ENABLE);
-
- /* Clear transmit interrupts */
- MAC_INTCLEAR = LPC24XX_ETH_INTERRUPT_TRANSMIT;
-
/* Initialize descriptor table */
for (produce_index = 0; produce_index <= index_max; ++produce_index) {
desc [produce_index].start =
(uint32_t) (buf + produce_index * LPC24XX_ETH_TRANSMIT_BUFFER_SIZE);
- desc [produce_index].control = 0;
}
- /* Transmit descriptors */
- MAC_TXDESCRIPTORNUM = index_max;
- MAC_TXDESCRIPTOR = (uint32_t) desc;
- MAC_TXSTATUS = (uint32_t) status;
-
- /* Initialize indices */
- produce_index = MAC_TXPRODUCEINDEX;
- consume_index = MAC_TXCONSUMEINDEX;
-
- /* Frame buffer start */
- frame_buffer = (char *) desc [produce_index].start;
-
- /* Enable transmitter */
- MAC_COMMAND = SET_FLAG( MAC_COMMAND, ETH_CMD_TX_ENABLE);
-
/* Main event loop */
while (true) {
/* Wait for events */
sc = rtems_bsdnet_event_receive(
- LPC24XX_ETH_EVENT_TRANSMIT | LPC24XX_ETH_EVENT_TRANSMIT_START,
+ LPC24XX_ETH_EVENT_INITIALIZE
+ | LPC24XX_ETH_EVENT_START
+ | LPC24XX_ETH_EVENT_INTERRUPT,
RTEMS_EVENT_ANY | RTEMS_WAIT,
RTEMS_NO_TIMEOUT,
&events
@@ -709,6 +708,41 @@ static void lpc24xx_eth_transmit_task( void *arg)
LPC24XX_ETH_PRINTF( "tx: wake up: 0x%08" PRIx32 "\n", events);
+ /* Initialize transmitter? */
+ if (IS_FLAG_SET( events, LPC24XX_ETH_EVENT_INITIALIZE)) {
+ /* Disable transmit interrupts */
+ lpc24xx_eth_disable_transmit_interrupts();
+
+ /* Disable transmitter */
+ MAC_COMMAND = CLEAR_FLAG( MAC_COMMAND, ETH_CMD_TX_ENABLE);
+
+ /* Wait for inactive status */
+ while (IS_FLAG_SET( MAC_STATUS, ETH_STAT_TX_ACTIVE)) {
+ /* Wait */
+ }
+
+ /* Reset */
+ MAC_COMMAND = SET_FLAG( MAC_COMMAND, ETH_CMD_TX_RESET);
+
+ /* Clear transmit interrupts */
+ MAC_INTCLEAR = LPC24XX_ETH_INTERRUPT_TRANSMIT;
+
+ /* Transmit descriptors */
+ MAC_TXDESCRIPTORNUM = index_max;
+ MAC_TXDESCRIPTOR = (uint32_t) desc;
+ MAC_TXSTATUS = (uint32_t) status;
+
+ /* Initialize indices */
+ produce_index = MAC_TXPRODUCEINDEX;
+ consume_index = MAC_TXCONSUMEINDEX;
+
+ /* Frame buffer start */
+ frame_buffer = (char *) desc [produce_index].start;
+
+ /* Enable transmitter */
+ MAC_COMMAND = SET_FLAG( MAC_COMMAND, ETH_CMD_TX_ENABLE);
+ }
+
/* Free consumed fragments */
while (true) {
/* Save last known consume index */
@@ -749,9 +783,6 @@ static void lpc24xx_eth_transmit_task( void *arg)
}
}
- /* Reinitialize control field */
- desc [c].control = 0;
-
/* Next consume index */
c = lpc24xx_eth_increment( c, index_max);
}
@@ -849,6 +880,9 @@ static void lpc24xx_eth_transmit_task( void *arg)
cleanup:
+ /* Clear task ID */
+ e->transmit_task = RTEMS_ID_NONE;
+
/* Release network semaphore */
rtems_bsdnet_semaphore_release();
@@ -858,6 +892,7 @@ cleanup:
static void lpc24xx_eth_interface_init( void *arg)
{
+ rtems_status_code sc = RTEMS_SUCCESSFUL;
lpc24xx_eth_driver_entry *e = (lpc24xx_eth_driver_entry *) arg;
struct ifnet *ifp = &e->arpcom.ac_if;
@@ -865,28 +900,25 @@ static void lpc24xx_eth_interface_init( void *arg)
if (e->state == LPC24XX_ETH_INITIALIZED) {
#ifndef LPC24XX_HAS_UBOOT
- rtems_interrupt_level level;
-
- rtems_interrupt_disable( level);
-
- /* Enable power */
- PCONP = SET_FLAGS( PCONP, 0x40000000);
+ /* Enable module power */
+ lpc24xx_module_enable(
+ LPC24XX_MODULE_ETHERNET,
+ 0,
+ LPC24XX_MODULE_PCLK_DEFAULT
+ );
- /* Set PIN selects */
+ /* Module IO configuration */
#ifdef LPC24XX_ETHERNET_RMII
- PINSEL2 = SET_FLAGS( PINSEL2, 0x55555555);
+ lpc24xx_io_config( LPC24XX_MODULE_ETHERNET, 0, 0);
#else
- PINSEL2 = SET_FLAGS( PINSEL2, 0x50150105);
+ lpc24xx_io_config( LPC24XX_MODULE_ETHERNET, 0, 1);
#endif
- PINSEL3 = SET_FLAGS( PINSEL3, 0x05);
-
- rtems_interrupt_enable( level);
/* Soft reset */
/* Do soft reset */
- MAC_MAC1 = 0xcf00;
MAC_COMMAND = 0x38;
+ MAC_MAC1 = 0xcf00;
/* Initialize PHY */
/* TODO */
@@ -919,18 +951,14 @@ static void lpc24xx_eth_interface_init( void *arg)
/* Enable receiver */
MAC_MAC1 = 0x03;
#else /* LPC24XX_HAS_UBOOT */
- uint32_t reg = 0;
-
- /* TODO */
+ /* Reset receiver and transmitter */
+ MAC_COMMAND = SET_FLAGS(
+ MAC_COMMAND,
+ ETH_CMD_RX_RESET | ETH_CMD_TX_RESET | ETH_CMD_REG_RESET
+ );
/* MAC configuration */
MAC_MAC1 = 0x3;
-
- /* Disable and reset receiver and transmitter */
- reg = MAC_COMMAND;
- reg = CLEAR_FLAGS( reg, ETH_CMD_RX_ENABLE | ETH_CMD_TX_ENABLE);
- reg = SET_FLAGS( reg, ETH_CMD_RX_RESET | ETH_CMD_TX_RESET);
- MAC_COMMAND = reg;
#endif /* LPC24XX_HAS_UBOOT */
/* Start receive task */
@@ -941,6 +969,8 @@ static void lpc24xx_eth_interface_init( void *arg)
lpc24xx_eth_receive_task,
e
);
+ sc = rtems_event_send( e->receive_task, LPC24XX_ETH_EVENT_INITIALIZE);
+ RTEMS_SYSLOG_ERROR_SC( sc, "send receive initialize event");
}
/* Start transmit task */
@@ -951,6 +981,8 @@ static void lpc24xx_eth_interface_init( void *arg)
lpc24xx_eth_transmit_task,
e
);
+ sc = rtems_event_send( e->transmit_task, LPC24XX_ETH_EVENT_INITIALIZE);
+ RTEMS_SYSLOG_ERROR_SC( sc, "send transmit initialize event");
}
/* Change state */
@@ -983,6 +1015,8 @@ static void lpc24xx_eth_interface_init( void *arg)
static void lpc24xx_eth_interface_stats( const lpc24xx_eth_driver_entry *e)
{
+ rtems_bsdnet_semaphore_release();
+
printf( "received frames: %u\n", e->received_frames);
printf( "receive interrupts: %u\n", e->receive_interrupts);
printf( "transmitted frames: %u\n", e->transmitted_frames);
@@ -1002,6 +1036,8 @@ static void lpc24xx_eth_interface_stats( const lpc24xx_eth_driver_entry *e)
printf( "transmit no descriptor errors: %u\n", e->transmit_no_descriptor_errors);
printf( "transmit overflow errors: %u\n", e->transmit_overflow_errors);
printf( "transmit fatal errors: %u\n", e->transmit_fatal_errors);
+
+ rtems_bsdnet_semaphore_obtain();
}
static int lpc24xx_eth_interface_ioctl(
@@ -1051,7 +1087,7 @@ static void lpc24xx_eth_interface_start( struct ifnet *ifp)
ifp->if_flags = SET_FLAG( ifp->if_flags, IFF_OACTIVE);
- sc = rtems_event_send( e->transmit_task, LPC24XX_ETH_EVENT_TRANSMIT_START);
+ sc = rtems_event_send( e->transmit_task, LPC24XX_ETH_EVENT_START);
RTEMS_SYSLOG_ERROR_SC( sc, "send transmit start event");
}
diff --git a/c/src/lib/libbsp/arm/lpc24xx/preinstall.am b/c/src/lib/libbsp/arm/lpc24xx/preinstall.am
index 8cacac4686..fa3180102a 100644
--- a/c/src/lib/libbsp/arm/lpc24xx/preinstall.am
+++ b/c/src/lib/libbsp/arm/lpc24xx/preinstall.am
@@ -65,6 +65,10 @@ $(PROJECT_INCLUDE)/bsp/irq-info.h: ../../shared/include/irq-info.h $(PROJECT_INC
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/irq-info.h
PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/irq-info.h
+$(PROJECT_INCLUDE)/bsp/stackalloc.h: ../../shared/include/stackalloc.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
+ $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/stackalloc.h
+PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/stackalloc.h
+
$(PROJECT_INCLUDE)/bsp/tod.h: ../../shared/tod.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/tod.h
PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/tod.h
@@ -101,6 +105,18 @@ $(PROJECT_INCLUDE)/bsp/dma.h: include/dma.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/dma.h
PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/dma.h
+$(PROJECT_INCLUDE)/bsp/idle.h: include/idle.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
+ $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/idle.h
+PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/idle.h
+
+$(PROJECT_INCLUDE)/bsp/i2c.h: include/i2c.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
+ $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/i2c.h
+PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/i2c.h
+
+$(PROJECT_INCLUDE)/bsp/io.h: include/io.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
+ $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/io.h
+PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/io.h
+
$(PROJECT_INCLUDE)/tm27.h: ../../shared/include/tm27.h $(PROJECT_INCLUDE)/$(dirstamp)
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/tm27.h
PREINSTALL_FILES += $(PROJECT_INCLUDE)/tm27.h
@@ -113,10 +129,6 @@ $(PROJECT_LIB)/linkcmds.base: ../shared/startup/linkcmds.base $(PROJECT_LIB)/$(d
$(INSTALL_DATA) $< $(PROJECT_LIB)/linkcmds.base
PREINSTALL_FILES += $(PROJECT_LIB)/linkcmds.base
-$(PROJECT_LIB)/linkcmds.rom: ../shared/startup/linkcmds.rom $(PROJECT_LIB)/$(dirstamp)
- $(INSTALL_DATA) $< $(PROJECT_LIB)/linkcmds.rom
-PREINSTALL_FILES += $(PROJECT_LIB)/linkcmds.rom
-
$(PROJECT_LIB)/linkcmds.lpc2478: startup/linkcmds.lpc2478 $(PROJECT_LIB)/$(dirstamp)
$(INSTALL_DATA) $< $(PROJECT_LIB)/linkcmds.lpc2478
PREINSTALL_FILES += $(PROJECT_LIB)/linkcmds.lpc2478
diff --git a/c/src/lib/libbsp/arm/lpc24xx/rtc/rtc-config.c b/c/src/lib/libbsp/arm/lpc24xx/rtc/rtc-config.c
index 2fe7623743..3e4224d8e3 100644
--- a/c/src/lib/libbsp/arm/lpc24xx/rtc/rtc-config.c
+++ b/c/src/lib/libbsp/arm/lpc24xx/rtc/rtc-config.c
@@ -21,11 +21,17 @@
#include <libchip/rtc.h>
#include <bsp/lpc24xx.h>
+#include <bsp/io.h>
#define LPC24XX_RTC_NUMBER 1
static void lpc24xx_rtc_initialize( int minor)
{
+ rtems_interrupt_level level;
+
+ /* Enable module power */
+ lpc24xx_module_enable( LPC24XX_MODULE_RTC, 0, LPC24XX_MODULE_PCLK_DEFAULT);
+
/* Enable the RTC and use external clock */
RTC_CCR = RTC_CCR_CLKEN | RTC_CCR_CLKSRC;
diff --git a/c/src/lib/libbsp/arm/lpc24xx/startup/bspreset.c b/c/src/lib/libbsp/arm/lpc24xx/startup/bspreset.c
index 1f2ef57b8d..fb3eaa7b4b 100644
--- a/c/src/lib/libbsp/arm/lpc24xx/startup/bspreset.c
+++ b/c/src/lib/libbsp/arm/lpc24xx/startup/bspreset.c
@@ -18,10 +18,25 @@
* LICENSE in this distribution or at http://www.rtems.com/license/LICENSE.
*/
+#include <rtems.h>
+
#include <bsp/bootcard.h>
-#include <bsp/start.h>
+#include <bsp/lpc24xx.h>
void bsp_reset( void)
{
- start();
+ rtems_interrupt_level level;
+
+ rtems_interrupt_disable( level);
+
+ /* Trigger watchdog reset */
+ WDCLKSEL = 0;
+ WDTC = 0xff;
+ WDMOD = 0x3;
+ WDFEED = 0xaa;
+ WDFEED = 0x55;
+
+ while (true) {
+ /* Do nothing */
+ }
}
diff --git a/c/src/lib/libbsp/arm/lpc24xx/startup/bspstart.c b/c/src/lib/libbsp/arm/lpc24xx/startup/bspstart.c
index 50483d49d9..20f3f17fbe 100644
--- a/c/src/lib/libbsp/arm/lpc24xx/startup/bspstart.c
+++ b/c/src/lib/libbsp/arm/lpc24xx/startup/bspstart.c
@@ -23,9 +23,12 @@
#include <bsp.h>
#include <bsp/bootcard.h>
#include <bsp/dma.h>
+#include <bsp/io.h>
+#include <bsp/irq-generic.h>
#include <bsp/irq.h>
#include <bsp/linker-symbols.h>
#include <bsp/lpc24xx.h>
+#include <bsp/stackalloc.h>
#include <bsp/start.h>
#include <bsp/system-clocks.h>
@@ -38,15 +41,17 @@ static void lpc24xx_fatal_error( void)
static void lpc24xx_ram_test_32( void)
{
- volatile unsigned *out = (volatile unsigned *) bsp_ram_ext_start;
+ const unsigned *end = (const unsigned *) bsp_region_data_end;
+ unsigned *begin = (unsigned *) bsp_region_data_begin;
+ unsigned *out = begin;
- while (out < (volatile unsigned *) bsp_ram_ext_end) {
+ while (out != end) {
*out = (unsigned) out;
++out;
}
- out = (volatile unsigned *) bsp_ram_ext_start;
- while (out < (volatile unsigned *) bsp_ram_ext_end) {
+ out = begin;
+ while (out != end) {
if (*out != (unsigned) out) {
lpc24xx_fatal_error();
}
@@ -65,14 +70,11 @@ static void lpc24xx_init_emc( void)
int i = 0;
uint32_t mode = 0;
- /* Enable power */
- PCONP = SET_FLAGS( PCONP, 0x0800);
+ /* Enable module power */
+ lpc24xx_module_enable( LPC24XX_MODULE_EMC, 0, LPC24XX_MODULE_PCLK_DEFAULT);
- /* Set PIN selects */
- PINSEL5 = SET_FLAGS( PINSEL5, 0x05050555);
- PINSEL6 = SET_FLAGS( PINSEL6, 0x55555555);
- PINSEL8 = SET_FLAGS( PINSEL8, 0x55555555);
- PINSEL9 = SET_FLAGS( PINSEL9, 0x50555555);
+ /* IO configuration */
+ lpc24xx_io_config( LPC24XX_MODULE_EMC, 0, 0);
/* Enable module, normal memory map and normal power mode */
EMC_CTRL = 1;
@@ -166,14 +168,8 @@ static void lpc24xx_init_emc( void)
/* Enable buffer */
EMC_DYN_CFG0 |= 0x00080000;
- /* Static Memory 0 settings */
- EMC_STA_WAITWEN0 = 0x02;
- EMC_STA_WAITOEN0 = 0x02;
- EMC_STA_WAITRD0 = 0x1f;
- EMC_STA_WAITPAGE0 = 0x1f;
- EMC_STA_WAITWR0 = 0x1f;
- EMC_STA_WAITTURN0 = 0x0f;
- EMC_STA_CFG0 = 0x81;
+ /* Extended wait register */
+ EMC_STA_EXT_WAIT = 0;
/* Static Memory 1 settings */
EMC_STA_WAITWEN1 = 0x02;
@@ -182,25 +178,25 @@ static void lpc24xx_init_emc( void)
EMC_STA_WAITPAGE1 = 0x1f;
EMC_STA_WAITWR1 = 0x08;
EMC_STA_WAITTURN1 = 0x0f;
- EMC_STA_CFG1 = 0x80;
+ EMC_STA_CFG1 = 0x81;
/* RAM test */
lpc24xx_ram_test_32();
- #endif /* LPC24XX_EMC_MICRON */
+ #endif
}
static void lpc24xx_init_pll( void)
{
#ifndef LPC24XX_HAS_UBOOT
/* Enable main oscillator */
- SCS = SET_FLAGS( SCS, 0x20);
+ SCS = SET_FLAG( SCS, 0x20);
while (IS_FLAG_CLEARED( SCS, 0x40)) {
/* Wait */
}
/* Set PLL */
lpc24xx_set_pll( 1, 0, 11, 3);
- #endif /* LPC24XX_HAS_UBOOT */
+ #endif
}
void /* __attribute__ ((section (".entry"))) */ bsp_start_hook_0( void)
@@ -221,6 +217,19 @@ void /* __attribute__ ((section (".entry"))) */ bsp_start_hook_0( void)
PINSEL8 = 0;
PINSEL9 = 0;
PINSEL10 = 0;
+ PINSEL11 = 0;
+
+ /* Set pin modes */
+ PINMODE0 = 0;
+ PINMODE1 = 0;
+ PINMODE2 = 0;
+ PINMODE3 = 0;
+ PINMODE4 = 0;
+ PINMODE5 = 0;
+ PINMODE6 = 0;
+ PINMODE7 = 0;
+ PINMODE8 = 0;
+ PINMODE9 = 0;
/* Set periperal clocks */
PCLKSEL0 = 0;
@@ -233,11 +242,8 @@ void /* __attribute__ ((section (".entry"))) */ bsp_start_hook_0( void)
MAMCR = 0;
MAMTIM = 4;
- /* Set general purpose IO */
- IODIR0 = 0;
- IODIR1 = 0;
- IOSET0 = 0xffffffff;
- IOSET1 = 0xffffffff;
+ /* Enable fast IO for ports 0 and 1 */
+ SCS = SET_FLAG( SCS, 0x1);
/* Set fast IO */
FIO0DIR = 0;
@@ -245,51 +251,53 @@ void /* __attribute__ ((section (".entry"))) */ bsp_start_hook_0( void)
FIO2DIR = 0;
FIO3DIR = 0;
FIO4DIR = 0;
- FIO0SET = 0xffffffff;
- FIO1SET = 0xffffffff;
- FIO2SET = 0xffffffff;
- FIO3SET = 0xffffffff;
- FIO4SET = 0xffffffff;
-
- /* Initialize UART 0 */
- PCONP = SET_FLAGS( PCONP, 0x08);
- PCLKSEL0 = SET_FLAGS( PCLKSEL0, 0x40);
- PINSEL0 = SET_FLAGS( PINSEL0, 0x50);
- U0LCR = 0;
- U0IER = 0;
- U0LCR = 0x80;
- U0DLL = lpc24xx_cclk() / 16 / LPC24XX_UART_BAUD;
- U0DLM = 0;
- U0LCR = 0x03;
- U0FCR = 0x07;
+ FIO0CLR = 0xffffffff;
+ FIO1CLR = 0xffffffff;
+ FIO2CLR = 0xffffffff;
+ FIO3CLR = 0xffffffff;
+ FIO4CLR = 0xffffffff;
+
+ /* Initialize console */
+ #ifdef LPC24XX_CONFIG_CONSOLE
+ lpc24xx_module_enable( LPC24XX_MODULE_UART, 0, LPC24XX_MODULE_CCLK);
+ lpc24xx_io_config( LPC24XX_MODULE_UART, 0, LPC24XX_CONFIG_CONSOLE);
+ U0LCR = 0;
+ U0IER = 0;
+ U0LCR = 0x80;
+ U0DLL = lpc24xx_cclk() / 16 / LPC24XX_UART_BAUD;
+ U0DLM = 0;
+ U0LCR = 0x03;
+ U0FCR = 0x07;
+ #endif
/* Initialize Timer 1 */
- PCONP = SET_FLAGS( PCONP, 0x04);
- PCLKSEL0 = SET_FLAGS( PCLKSEL0, 0x10);
- #endif /* LPC24XX_HAS_UBOOT */
+ lpc24xx_module_enable( LPC24XX_MODULE_TIMER, 1, LPC24XX_MODULE_CCLK);
+ #endif
}
static void lpc24xx_copy_data( void)
{
#ifndef LPC24XX_HAS_UBOOT
- unsigned *in = bsp_section_text_end;
- unsigned *out = bsp_section_data_start;
+ const unsigned *end = (const unsigned *) bsp_section_data_end;
+ unsigned *in = (unsigned *) bsp_section_data_load_begin;
+ unsigned *out = (unsigned *) bsp_section_data_begin;
/* Copy data */
- while (out < bsp_section_data_end) {
+ while (out != end) {
*out = *in;
++out;
++in;
}
- #endif /* LPC24XX_HAS_UBOOT */
+ #endif
}
static void lpc24xx_clear_bss( void)
{
- unsigned *out = bsp_section_bss_start;
+ const unsigned *end = (const unsigned *) bsp_section_bss_end;
+ unsigned *out = (unsigned *) bsp_section_bss_begin;
/* Clear BSS */
- while (out < bsp_section_bss_end) {
+ while (out != end) {
*out = 0;
++out;
}
@@ -315,7 +323,9 @@ void bsp_start( void)
printk( "CPU clock (CCLK): %u\n", lpc24xx_cclk());
/* Exceptions */
+ /* FIXME
rtems_exception_init_mngt();
+ */
/* Interrupts */
if (bsp_interrupt_initialize() != RTEMS_SUCCESSFUL) {
@@ -326,6 +336,26 @@ void bsp_start( void)
/* DMA */
lpc24xx_dma_initialize();
+
+ /* Task stacks */
+ bsp_stack_initialize(
+ bsp_section_stack_begin,
+ (intptr_t) bsp_section_stack_size
+ );
+
+ /* UART configurations */
+ #ifdef LPC24XX_CONFIG_UART_1
+ lpc24xx_module_enable( LPC24XX_MODULE_UART, 1, LPC24XX_MODULE_CCLK);
+ lpc24xx_io_config( LPC24XX_MODULE_UART, 1, LPC24XX_CONFIG_UART_1);
+ #endif
+ #ifdef LPC24XX_CONFIG_UART_2
+ lpc24xx_module_enable( LPC24XX_MODULE_UART, 2, LPC24XX_MODULE_CCLK);
+ lpc24xx_io_config( LPC24XX_MODULE_UART, 2, LPC24XX_CONFIG_UART_2);
+ #endif
+ #ifdef LPC24XX_CONFIG_UART_3
+ lpc24xx_module_enable( LPC24XX_MODULE_UART, 3, LPC24XX_MODULE_CCLK);
+ lpc24xx_io_config( LPC24XX_MODULE_UART, 3, LPC24XX_CONFIG_UART_3);
+ #endif
}
#define ULSR_THRE 0x00000020U
diff --git a/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds b/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds
index 433bf613bb..f431bce12a 100644
--- a/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds
+++ b/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds
@@ -10,4 +10,18 @@ MEMORY {
NIRVANA : ORIGIN = 0, LENGTH = 0
}
+REGION_ALIAS ("REGION_START", RAM_EXT);
+REGION_ALIAS ("REGION_VECTOR", RAM_INT);
+REGION_ALIAS ("REGION_TEXT", RAM_EXT);
+REGION_ALIAS ("REGION_TEXT_LOAD", RAM_EXT);
+REGION_ALIAS ("REGION_RODATA", RAM_EXT);
+REGION_ALIAS ("REGION_RODATA_LOAD", RAM_EXT);
+REGION_ALIAS ("REGION_DATA", RAM_EXT);
+REGION_ALIAS ("REGION_DATA_LOAD", RAM_EXT);
+REGION_ALIAS ("REGION_FAST", RAM_INT);
+REGION_ALIAS ("REGION_FAST_LOAD", RAM_INT);
+REGION_ALIAS ("REGION_BSS", RAM_EXT);
+REGION_ALIAS ("REGION_WORK", RAM_EXT);
+REGION_ALIAS ("REGION_STACK", RAM_INT);
+
INCLUDE linkcmds.base
diff --git a/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc2478 b/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc2478
index 2edc351fb0..622205831c 100644
--- a/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc2478
+++ b/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc2478
@@ -11,4 +11,18 @@ MEMORY {
NIRVANA : ORIGIN = 0, LENGTH = 0
}
+REGION_ALIAS ("REGION_START", RAM_EXT);
+REGION_ALIAS ("REGION_VECTOR", RAM_INT);
+REGION_ALIAS ("REGION_TEXT", RAM_EXT);
+REGION_ALIAS ("REGION_TEXT_LOAD", RAM_EXT);
+REGION_ALIAS ("REGION_RODATA", RAM_EXT);
+REGION_ALIAS ("REGION_RODATA_LOAD", RAM_EXT);
+REGION_ALIAS ("REGION_DATA", RAM_EXT);
+REGION_ALIAS ("REGION_DATA_LOAD", RAM_EXT);
+REGION_ALIAS ("REGION_FAST", RAM_INT);
+REGION_ALIAS ("REGION_FAST_LOAD", RAM_INT);
+REGION_ALIAS ("REGION_BSS", RAM_EXT);
+REGION_ALIAS ("REGION_WORK", RAM_EXT);
+REGION_ALIAS ("REGION_STACK", RAM_INT);
+
INCLUDE linkcmds.base
diff --git a/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc2478_ncs b/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc2478_ncs
index 1ca2b6a3f4..03d020dd35 100644
--- a/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc2478_ncs
+++ b/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc2478_ncs
@@ -1,14 +1,29 @@
/**
* @file
*
- * LPC2478 (NCS).
+ * LPC2478 (NCS, bootloader configuration).
*/
MEMORY {
- RAM_INT (AIW) : ORIGIN = 0x40000000, LENGTH = 64k
- RAM_EXT (AIW) : ORIGIN = 0xa0400000, LENGTH = 4M
+ RAM_VEC (AIW) : ORIGIN = 0x40000000, LENGTH = 32k
+ RAM_INT (AIW) : ORIGIN = 0x40008000, LENGTH = 32k
+ RAM_EXT (AIW) : ORIGIN = 0xa0c00000, LENGTH = 4M
ROM_INT (RX) : ORIGIN = 0x00000000, LENGTH = 512k - 8k
NIRVANA : ORIGIN = 0, LENGTH = 0
}
-INCLUDE linkcmds.rom
+REGION_ALIAS ("REGION_START", ROM_INT);
+REGION_ALIAS ("REGION_VECTOR", RAM_VEC);
+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_EXT);
+REGION_ALIAS ("REGION_DATA_LOAD", ROM_INT);
+REGION_ALIAS ("REGION_FAST", RAM_INT);
+REGION_ALIAS ("REGION_FAST_LOAD", RAM_INT);
+REGION_ALIAS ("REGION_BSS", RAM_EXT);
+REGION_ALIAS ("REGION_WORK", RAM_EXT);
+REGION_ALIAS ("REGION_STACK", RAM_INT);
+
+INCLUDE linkcmds.base
diff --git a/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc2478_ncs_ram b/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc2478_ncs_ram
index bd85ec9d66..54d2d2b6b0 100644
--- a/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc2478_ncs_ram
+++ b/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc2478_ncs_ram
@@ -6,9 +6,23 @@
MEMORY {
RAM_INT (AIW) : ORIGIN = 0x40000000, LENGTH = 64k
- RAM_EXT (AIW) : ORIGIN = 0xa0000000, LENGTH = 8M
+ RAM_EXT (AIW) : ORIGIN = 0xa0000000, LENGTH = 16M
ROM_INT (RX) : ORIGIN = 0x00000000, LENGTH = 512k - 8k
NIRVANA : ORIGIN = 0, LENGTH = 0
}
+REGION_ALIAS ("REGION_START", RAM_EXT);
+REGION_ALIAS ("REGION_VECTOR", RAM_INT);
+REGION_ALIAS ("REGION_TEXT", RAM_EXT);
+REGION_ALIAS ("REGION_TEXT_LOAD", RAM_EXT);
+REGION_ALIAS ("REGION_RODATA", RAM_EXT);
+REGION_ALIAS ("REGION_RODATA_LOAD", RAM_EXT);
+REGION_ALIAS ("REGION_DATA", RAM_EXT);
+REGION_ALIAS ("REGION_DATA_LOAD", RAM_EXT);
+REGION_ALIAS ("REGION_FAST", RAM_INT);
+REGION_ALIAS ("REGION_FAST_LOAD", RAM_INT);
+REGION_ALIAS ("REGION_BSS", RAM_EXT);
+REGION_ALIAS ("REGION_WORK", RAM_EXT);
+REGION_ALIAS ("REGION_STACK", RAM_INT);
+
INCLUDE linkcmds.base