forked from Imagelibrary/rtems
ARM bsp maintenance
This commit is contained in:
@@ -1,3 +1,15 @@
|
|||||||
|
2009-07-15 Sebastian Huber <sebastian.huber@embedded-brains.de>
|
||||||
|
|
||||||
|
* shared/irq/irq_asm.S, shared/startup/linkcmds.rom: Removed files.
|
||||||
|
* Makefile.am: Removed references to deleted file
|
||||||
|
'shared/irq/irq_asm.S'.
|
||||||
|
* shared/irq/irq_init.c: Do not install fast interrupt handler.
|
||||||
|
Changed interrupt handler.
|
||||||
|
* shared/abort/simple_abort.c: Fixed inline assembler statement.
|
||||||
|
* shared/include/linker-symbols.h: Renamed sections. New symbols.
|
||||||
|
* shared/start/start.S: Added THUMB support. Update for linker symbol
|
||||||
|
changes.
|
||||||
|
|
||||||
2009-06-04 Xi Yang <hiyangxi@gmail.com>
|
2009-06-04 Xi Yang <hiyangxi@gmail.com>
|
||||||
|
|
||||||
* acinclude.m4: New Gumstix BSP.
|
* acinclude.m4: New Gumstix BSP.
|
||||||
|
|||||||
@@ -17,7 +17,6 @@ EXTRA_DIST += shared/comm/console.c
|
|||||||
EXTRA_DIST += shared/comm/uart.c
|
EXTRA_DIST += shared/comm/uart.c
|
||||||
|
|
||||||
# irq
|
# irq
|
||||||
EXTRA_DIST += shared/irq/irq_asm.S
|
|
||||||
EXTRA_DIST += shared/irq/irq_init.c
|
EXTRA_DIST += shared/irq/irq_init.c
|
||||||
|
|
||||||
# abort
|
# abort
|
||||||
|
|||||||
@@ -4,6 +4,13 @@
|
|||||||
RTEMS_BSP_BOOTCARD_OPTIONS. Add RTEMS_BSP_CLEANUP_OPTIONS so all BSPs
|
RTEMS_BSP_BOOTCARD_OPTIONS. Add RTEMS_BSP_CLEANUP_OPTIONS so all BSPs
|
||||||
have the same options.
|
have the same options.
|
||||||
|
|
||||||
|
2009-07-15 Sebastian Huber <sebastian.huber@embedded-brains.de>
|
||||||
|
|
||||||
|
* Makefile.am: Removed references to deleted file
|
||||||
|
'../shared/irq/irq_asm.S'.
|
||||||
|
* irq/bsp_irq_asm.S: Renamed ExecuteITHandler() into
|
||||||
|
bsp_interrupt_dispatch().
|
||||||
|
|
||||||
2009-07-12 Xi Yang <hiyangxi@gmail.com>
|
2009-07-12 Xi Yang <hiyangxi@gmail.com>
|
||||||
|
|
||||||
* configure.ac, clock/clockdrv.c, startup/bspreset.c: Adjust clock
|
* configure.ac, clock/clockdrv.c, startup/bspreset.c: Adjust clock
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ include_HEADERS += irq/irq.h
|
|||||||
# irq
|
# irq
|
||||||
libbsp_a_SOURCES += irq/irq.c irq/bsp_irq_init.c \
|
libbsp_a_SOURCES += irq/irq.c irq/bsp_irq_init.c \
|
||||||
../../arm/shared/irq/irq_init.c irq/bsp_irq_asm.S \
|
../../arm/shared/irq/irq_init.c irq/bsp_irq_asm.S \
|
||||||
../../arm/shared/irq/irq_asm.S irq/irq.h
|
irq/irq.h
|
||||||
|
|
||||||
if HAS_NETWORKING
|
if HAS_NETWORKING
|
||||||
network_CPPFLAGS = -D__INSIDE_RTEMS_BSD_TCPIP_STACK__
|
network_CPPFLAGS = -D__INSIDE_RTEMS_BSD_TCPIP_STACK__
|
||||||
|
|||||||
@@ -22,8 +22,8 @@
|
|||||||
* Function to obtain, execute an IT handler and acknowledge the IT
|
* Function to obtain, execute an IT handler and acknowledge the IT
|
||||||
*/
|
*/
|
||||||
|
|
||||||
.globl ExecuteITHandler
|
.globl bsp_interrupt_dispatch
|
||||||
ExecuteITHandler :
|
bsp_interrupt_dispatch :
|
||||||
/*
|
/*
|
||||||
* Look at interrupt status register to determine source.
|
* Look at interrupt status register to determine source.
|
||||||
* From source, determine offset into expanded vector table
|
* From source, determine offset into expanded vector table
|
||||||
|
|||||||
@@ -4,6 +4,14 @@
|
|||||||
RTEMS_BSP_BOOTCARD_OPTIONS. Add RTEMS_BSP_CLEANUP_OPTIONS so all BSPs
|
RTEMS_BSP_BOOTCARD_OPTIONS. Add RTEMS_BSP_CLEANUP_OPTIONS so all BSPs
|
||||||
have the same options.
|
have the same options.
|
||||||
|
|
||||||
|
2009-07-15 Sebastian Huber <sebastian.huber@embedded-brains.de>
|
||||||
|
|
||||||
|
* startup/cpu.c, startup/cpu_asm.S: Removed files.
|
||||||
|
* Makefile.am: Removed references to deleted files 'startup/cpu.c' and
|
||||||
|
'startup/cpu_asm.S'.
|
||||||
|
* irq/irq_asm.S, irq/bsp_irq_asm.S: Renamed ExecuteITHandler() into
|
||||||
|
bsp_interrupt_dispatch().
|
||||||
|
|
||||||
2009-05-08 Joel Sherrill <joel.sherrill@oarcorp.com>
|
2009-05-08 Joel Sherrill <joel.sherrill@oarcorp.com>
|
||||||
|
|
||||||
* startup/bspgetworkarea.c: Switch from ssize_t to uintptr_t for
|
* startup/bspgetworkarea.c: Switch from ssize_t to uintptr_t for
|
||||||
|
|||||||
@@ -33,20 +33,13 @@ dist_project_lib_DATA += startup/linkcmds
|
|||||||
noinst_LIBRARIES += libbsp.a
|
noinst_LIBRARIES += libbsp.a
|
||||||
libbsp_a_SOURCES =
|
libbsp_a_SOURCES =
|
||||||
|
|
||||||
# some objects have to be forced together to ensure they are ALWAYS
|
|
||||||
# the ones linked into the application executable. Every application
|
|
||||||
# needs startup/bspstart.c, so we will force in the others
|
|
||||||
noinst_PROGRAMS += gbaoverrides.rel
|
|
||||||
gbaoverrides_rel_SOURCES = startup/bspstart.c startup/cpu.c startup/cpu_asm.S
|
|
||||||
gbaoverrides_rel_CPPFLAGS = $(AM_CPPFLAGS)
|
|
||||||
gbaoverrides_rel_LDFLAGS = $(RTEMS_RELLDFLAGS)
|
|
||||||
|
|
||||||
# startup
|
# startup
|
||||||
libbsp_a_SOURCES += ../../shared/bsplibc.c ../../shared/bsppost.c \
|
libbsp_a_SOURCES += ../../shared/bsplibc.c ../../shared/bsppost.c \
|
||||||
startup/bspgetworkarea.c ../../shared/bsppretaskinghook.c \
|
startup/bspgetworkarea.c ../../shared/bsppretaskinghook.c \
|
||||||
../../shared/bsppredriverhook.c ../../shared/bspclean.c \
|
../../shared/bsppredriverhook.c ../../shared/bspclean.c \
|
||||||
startup/bspreset.c ../../shared/bootcard.c ../../shared/sbrk.c \
|
startup/bspreset.c ../../shared/bootcard.c ../../shared/sbrk.c \
|
||||||
../../shared/gnatinstallhandler.c
|
../../shared/gnatinstallhandler.c \
|
||||||
|
startup/bspstart.c
|
||||||
# clock
|
# clock
|
||||||
libbsp_a_SOURCES += clock/clockdrv.c ../../../shared/clockdrv_shell.h
|
libbsp_a_SOURCES += clock/clockdrv.c ../../../shared/clockdrv_shell.h
|
||||||
# console
|
# console
|
||||||
@@ -60,7 +53,5 @@ include_HEADERS += irq/irq.h
|
|||||||
libbsp_a_SOURCES += irq/irq.c irq/bsp_irq_init.c irq/irq_init.c \
|
libbsp_a_SOURCES += irq/irq.c irq/bsp_irq_init.c irq/irq_init.c \
|
||||||
irq/bsp_irq_asm.S irq/irq_asm.S
|
irq/bsp_irq_asm.S irq/irq_asm.S
|
||||||
|
|
||||||
libbsp_a_LIBADD = gbaoverrides.rel
|
|
||||||
|
|
||||||
include $(srcdir)/preinstall.am
|
include $(srcdir)/preinstall.am
|
||||||
include $(top_srcdir)/../../../../automake/local.am
|
include $(top_srcdir)/../../../../automake/local.am
|
||||||
|
|||||||
@@ -23,7 +23,7 @@
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Execute interrupt handler
|
* Execute interrupt handler
|
||||||
* function void ExecuteITHandler(void)
|
* function void bsp_interrupt_dispatch(void)
|
||||||
*
|
*
|
||||||
* Look at interrupt status register to determine source.
|
* Look at interrupt status register to determine source.
|
||||||
* From source, determine offset into expanded vector table
|
* From source, determine offset into expanded vector table
|
||||||
@@ -34,7 +34,7 @@
|
|||||||
.align
|
.align
|
||||||
/* .section .iwram */
|
/* .section .iwram */
|
||||||
|
|
||||||
PUBLIC_ARM_FUNCTION(ExecuteITHandler)
|
PUBLIC_ARM_FUNCTION(bsp_interrupt_dispatch)
|
||||||
ldr r1, =GBA_REG_IE_ADDR
|
ldr r1, =GBA_REG_IE_ADDR
|
||||||
ldrh r1, [r1]
|
ldrh r1, [r1]
|
||||||
ldr r2, =GBA_REG_IF_ADDR
|
ldr r2, =GBA_REG_IF_ADDR
|
||||||
@@ -174,6 +174,6 @@ IRQ_NoInterrupt:
|
|||||||
/* return to the "main" interrupt handler */
|
/* return to the "main" interrupt handler */
|
||||||
mov pc, lr
|
mov pc, lr
|
||||||
|
|
||||||
LABEL_END(ExecuteITHandler)
|
LABEL_END(bsp_interrupt_dispatch)
|
||||||
/* @endcond */
|
/* @endcond */
|
||||||
|
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ PUBLIC_ARM_FUNCTION(_ISR_Handler)
|
|||||||
str r1, [r0]
|
str r1, [r0]
|
||||||
|
|
||||||
/* BSP specific function to INT handler */
|
/* BSP specific function to INT handler */
|
||||||
bl ExecuteITHandler
|
bl bsp_interrupt_dispatch
|
||||||
|
|
||||||
/* one less nest level */
|
/* one less nest level */
|
||||||
ldr r0, =_ISR_Nest_level
|
ldr r0, =_ISR_Nest_level
|
||||||
|
|||||||
@@ -4,6 +4,18 @@
|
|||||||
RTEMS_BSP_BOOTCARD_OPTIONS. Add RTEMS_BSP_CLEANUP_OPTIONS so all BSPs
|
RTEMS_BSP_BOOTCARD_OPTIONS. Add RTEMS_BSP_CLEANUP_OPTIONS so all BSPs
|
||||||
have the same options.
|
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>
|
2009-02-27 Sebastian Huber <sebastian.huber@embedded-brains.de>
|
||||||
|
|
||||||
* README: Added NCS.
|
* README: Added NCS.
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ include_bsp_HEADERS =
|
|||||||
include_bsp_HEADERS += ../../shared/include/utility.h
|
include_bsp_HEADERS += ../../shared/include/utility.h
|
||||||
include_bsp_HEADERS += ../../shared/include/irq-generic.h
|
include_bsp_HEADERS += ../../shared/include/irq-generic.h
|
||||||
include_bsp_HEADERS += ../../shared/include/irq-info.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/tod.h
|
||||||
include_bsp_HEADERS += ../shared/include/linker-symbols.h
|
include_bsp_HEADERS += ../shared/include/linker-symbols.h
|
||||||
include_bsp_HEADERS += ../shared/include/start.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/system-clocks.h
|
||||||
include_bsp_HEADERS += include/ssp.h
|
include_bsp_HEADERS += include/ssp.h
|
||||||
include_bsp_HEADERS += include/dma.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
|
include_HEADERS += ../../shared/include/tm27.h
|
||||||
|
|
||||||
@@ -53,7 +57,6 @@ libbspstart_a_SOURCES = ../shared/start/start.S
|
|||||||
project_lib_DATA = start.$(OBJEXT)
|
project_lib_DATA = start.$(OBJEXT)
|
||||||
|
|
||||||
dist_project_lib_DATA += ../shared/startup/linkcmds.base \
|
dist_project_lib_DATA += ../shared/startup/linkcmds.base \
|
||||||
../shared/startup/linkcmds.rom \
|
|
||||||
startup/linkcmds.lpc2478 \
|
startup/linkcmds.lpc2478 \
|
||||||
startup/linkcmds.lpc2478_ncs \
|
startup/linkcmds.lpc2478_ncs \
|
||||||
startup/linkcmds.lpc2478_ncs_ram
|
startup/linkcmds.lpc2478_ncs_ram
|
||||||
@@ -76,6 +79,7 @@ libbsp_a_SOURCES += ../../shared/bootcard.c \
|
|||||||
../../shared/bsppretaskinghook.c \
|
../../shared/bsppretaskinghook.c \
|
||||||
../../shared/gnatinstallhandler.c \
|
../../shared/gnatinstallhandler.c \
|
||||||
../../shared/sbrk.c \
|
../../shared/sbrk.c \
|
||||||
|
../../shared/src/stackalloc.c \
|
||||||
../shared/abort/simple_abort.c
|
../shared/abort/simple_abort.c
|
||||||
|
|
||||||
# Startup
|
# Startup
|
||||||
@@ -87,7 +91,6 @@ libbsp_a_SOURCES += ../../shared/src/irq-generic.c \
|
|||||||
../../shared/src/irq-legacy.c \
|
../../shared/src/irq-legacy.c \
|
||||||
../../shared/src/irq-info.c \
|
../../shared/src/irq-info.c \
|
||||||
../../shared/src/irq-shell.c \
|
../../shared/src/irq-shell.c \
|
||||||
../shared/irq/irq_asm.S \
|
|
||||||
irq/irq.c
|
irq/irq.c
|
||||||
|
|
||||||
# Console
|
# Console
|
||||||
@@ -106,11 +109,16 @@ libbsp_a_SOURCES += ../../shared/timerstub.c
|
|||||||
|
|
||||||
# Misc
|
# Misc
|
||||||
libbsp_a_SOURCES += misc/system-clocks.c \
|
libbsp_a_SOURCES += misc/system-clocks.c \
|
||||||
misc/dma.c
|
misc/dma.c \
|
||||||
|
misc/idle.c \
|
||||||
|
misc/io.c
|
||||||
|
|
||||||
# SSP
|
# SSP
|
||||||
libbsp_a_SOURCES += ssp/ssp.c
|
libbsp_a_SOURCES += ssp/ssp.c
|
||||||
|
|
||||||
|
# I2C
|
||||||
|
libbsp_a_SOURCES += i2c/i2c.c
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
# Network #
|
# Network #
|
||||||
###############################################################################
|
###############################################################################
|
||||||
|
|||||||
@@ -2,6 +2,8 @@
|
|||||||
# $Id$
|
# $Id$
|
||||||
#
|
#
|
||||||
|
|
||||||
|
Note: A Binutils version with REGION_ALIAS feature is required to link the BSP.
|
||||||
|
|
||||||
Development Board: QVGA Base Board from Embedded Artists
|
Development Board: QVGA Base Board from Embedded Artists
|
||||||
|
|
||||||
http://www.embeddedartists.com/products/uclinux/oem_lpc2478.php
|
http://www.embeddedartists.com/products/uclinux/oem_lpc2478.php
|
||||||
@@ -13,6 +15,7 @@ Drivers:
|
|||||||
o RTC
|
o RTC
|
||||||
o SSP (SPI mode): This driver is in active development. Use with care.
|
o SSP (SPI mode): This driver is in active development. Use with care.
|
||||||
o Network
|
o Network
|
||||||
|
o I2C
|
||||||
|
|
||||||
Howto setup QVGA Base Board?
|
Howto setup QVGA Base Board?
|
||||||
|
|
||||||
|
|||||||
@@ -25,6 +25,7 @@
|
|||||||
#include <bsp.h>
|
#include <bsp.h>
|
||||||
#include <bsp/lpc24xx.h>
|
#include <bsp/lpc24xx.h>
|
||||||
#include <bsp/irq.h>
|
#include <bsp/irq.h>
|
||||||
|
#include <bsp/io.h>
|
||||||
#include <bsp/system-clocks.h>
|
#include <bsp/system-clocks.h>
|
||||||
|
|
||||||
/* This is defined in ../../../shared/clockdrv_shell.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 interval = ((uint64_t) lpc24xx_cclk()
|
||||||
* (uint64_t) rtems_configuration_get_microseconds_per_tick()) / 1000000;
|
* (uint64_t) rtems_configuration_get_microseconds_per_tick()) / 1000000;
|
||||||
|
|
||||||
/* Set timer pclk to cclk */
|
/* Enable module power */
|
||||||
rtems_interrupt_disable( level);
|
lpc24xx_module_enable( LPC24XX_MODULE_TIMER, 0, LPC24XX_MODULE_CCLK);
|
||||||
PCONP = SET_FLAGS( PCONP, 0x02);
|
|
||||||
PCLKSEL0 = SET_FLAGS( PCLKSEL0, 0x04);
|
|
||||||
rtems_interrupt_enable( level);
|
|
||||||
|
|
||||||
/* Reset timer */
|
/* Reset timer */
|
||||||
T0TCR = TCR_RST;
|
T0TCR = TCR_RST;
|
||||||
|
|||||||
@@ -24,27 +24,48 @@ RTEMS_CHECK_NETWORKING
|
|||||||
AM_CONDITIONAL(HAS_NETWORKING,test "$HAS_NETWORKING" = "yes")
|
AM_CONDITIONAL(HAS_NETWORKING,test "$HAS_NETWORKING" = "yes")
|
||||||
|
|
||||||
RTEMS_BSPOPTS_SET([LPC24XX_OSCILLATOR_MAIN],[*],[12000000U])
|
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_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_HELP([LPC24XX_CCLK],[CPU clock in Hz])
|
||||||
|
|
||||||
RTEMS_BSPOPTS_SET([LPC24XX_UART_BAUD],[*],[115200])
|
RTEMS_BSPOPTS_SET([LPC24XX_UART_BAUD],[*],[115200U])
|
||||||
RTEMS_BSPOPTS_HELP([LPC24XX_UART_BAUD],[Baud for UARTs])
|
RTEMS_BSPOPTS_HELP([LPC24XX_UART_BAUD],[baud for UARTs])
|
||||||
|
|
||||||
RTEMS_BSPOPTS_SET([LPC24XX_HAS_UBOOT],[lpc2478],[1])
|
RTEMS_BSPOPTS_SET([LPC24XX_HAS_UBOOT],[lpc2478],[1])
|
||||||
RTEMS_BSPOPTS_SET([LPC24XX_HAS_UBOOT],[lpc2478_ncs_ram],[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],[1])
|
||||||
RTEMS_BSPOPTS_SET([LPC24XX_ETHERNET_RMII],[lpc2478_ncs_ram],[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_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_BOOTCARD_OPTIONS
|
||||||
RTEMS_BSP_CLEANUP_OPTIONS(0, 0)
|
RTEMS_BSP_CLEANUP_OPTIONS(0, 0)
|
||||||
|
|||||||
@@ -25,8 +25,6 @@
|
|||||||
#include <bsp/lpc24xx.h>
|
#include <bsp/lpc24xx.h>
|
||||||
#include <bsp/irq.h>
|
#include <bsp/irq.h>
|
||||||
|
|
||||||
#define LPC24XX_UART_NUMBER 1
|
|
||||||
|
|
||||||
static uint8_t lpc24xx_uart_register( uint32_t addr, uint8_t i)
|
static uint8_t lpc24xx_uart_register( uint32_t addr, uint8_t i)
|
||||||
{
|
{
|
||||||
volatile uint32_t *reg = (volatile uint32_t *) addr;
|
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;
|
reg [i] = val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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
|
||||||
|
};
|
||||||
|
|
||||||
|
#define LPC24XX_UART_NUMBER \
|
||||||
|
(sizeof( Console_Port_Tbl) / sizeof( Console_Port_Tbl [0]))
|
||||||
|
|
||||||
unsigned long Console_Port_Count = LPC24XX_UART_NUMBER;
|
unsigned long Console_Port_Count = LPC24XX_UART_NUMBER;
|
||||||
|
|
||||||
rtems_device_minor_number Console_Port_Minor = 0;
|
console_data Console_Port_Data [LPC24XX_UART_NUMBER];
|
||||||
|
|
||||||
console_data Console_Port_Data [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
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|||||||
@@ -7,8 +7,8 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2008
|
* Copyright (c) 2008, 2009
|
||||||
* Embedded Brains GmbH
|
* embedded brains GmbH
|
||||||
* Obere Lagerstr. 30
|
* Obere Lagerstr. 30
|
||||||
* D-82178 Puchheim
|
* D-82178 Puchheim
|
||||||
* Germany
|
* Germany
|
||||||
@@ -21,19 +21,19 @@
|
|||||||
#ifndef LIBBSP_ARM_LPC24XX_DMA_H
|
#ifndef LIBBSP_ARM_LPC24XX_DMA_H
|
||||||
#define LIBBSP_ARM_LPC24XX_DMA_H
|
#define LIBBSP_ARM_LPC24XX_DMA_H
|
||||||
|
|
||||||
#include <stdbool.h>
|
#include <rtems.h>
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif /* __cplusplus */
|
#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
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -66,6 +66,9 @@
|
|||||||
#define LPC24XX_IRQ_I2C_2 30
|
#define LPC24XX_IRQ_I2C_2 30
|
||||||
#define LPC24XX_IRQ_I2S 31
|
#define LPC24XX_IRQ_I2S 31
|
||||||
|
|
||||||
|
#define LPC24XX_IRQ_PRIORITY_VALUE_MIN 0
|
||||||
|
#define LPC24XX_IRQ_PRIORITY_VALUE_MAX 15
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Minimum vector number.
|
* @brief Minimum vector number.
|
||||||
*/
|
*/
|
||||||
@@ -76,6 +79,12 @@
|
|||||||
*/
|
*/
|
||||||
#define BSP_INTERRUPT_VECTOR_MAX LPC24XX_IRQ_I2S
|
#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 */
|
#endif /* ASM */
|
||||||
|
|||||||
@@ -38,7 +38,7 @@
|
|||||||
#define VICProtection (*(volatile uint32_t *) (VIC_BASE_ADDR + 0x020))
|
#define VICProtection (*(volatile uint32_t *) (VIC_BASE_ADDR + 0x020))
|
||||||
#define VICSWPrioMask (*(volatile uint32_t *) (VIC_BASE_ADDR + 0x024))
|
#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 VICVectAddr0 (*(volatile uint32_t *) (VIC_BASE_ADDR + 0x100))
|
||||||
#define VICVectAddr1 (*(volatile uint32_t *) (VIC_BASE_ADDR + 0x104))
|
#define VICVectAddr1 (*(volatile uint32_t *) (VIC_BASE_ADDR + 0x104))
|
||||||
#define VICVectAddr2 (*(volatile uint32_t *) (VIC_BASE_ADDR + 0x108))
|
#define VICVectAddr2 (*(volatile uint32_t *) (VIC_BASE_ADDR + 0x108))
|
||||||
@@ -72,8 +72,7 @@
|
|||||||
#define VICVectAddr30 (*(volatile uint32_t *) (VIC_BASE_ADDR + 0x178))
|
#define VICVectAddr30 (*(volatile uint32_t *) (VIC_BASE_ADDR + 0x178))
|
||||||
#define VICVectAddr31 (*(volatile uint32_t *) (VIC_BASE_ADDR + 0x17C))
|
#define VICVectAddr31 (*(volatile uint32_t *) (VIC_BASE_ADDR + 0x17C))
|
||||||
|
|
||||||
#define VICVectPriorityBase ((uint32_t *) (VIC_BASE_ADDR + 0x200))
|
#define VICVectPriorityBase ((volatile uint32_t *) (VIC_BASE_ADDR + 0x200))
|
||||||
#define VICVectPriority( i) (*((volatile uint32_t *) (VIC_BASE_ADDR + 0x200) + (i)))
|
|
||||||
#define VICVectPriority0 (*(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 VICVectPriority1 (*(volatile uint32_t *) (VIC_BASE_ADDR + 0x204))
|
||||||
#define VICVectPriority2 (*(volatile uint32_t *) (VIC_BASE_ADDR + 0x208))
|
#define VICVectPriority2 (*(volatile uint32_t *) (VIC_BASE_ADDR + 0x208))
|
||||||
@@ -123,6 +122,7 @@
|
|||||||
#define PINSEL8 (*(volatile uint32_t *) (PINSEL_BASE_ADDR + 0x20))
|
#define PINSEL8 (*(volatile uint32_t *) (PINSEL_BASE_ADDR + 0x20))
|
||||||
#define PINSEL9 (*(volatile uint32_t *) (PINSEL_BASE_ADDR + 0x24))
|
#define PINSEL9 (*(volatile uint32_t *) (PINSEL_BASE_ADDR + 0x24))
|
||||||
#define PINSEL10 (*(volatile uint32_t *) (PINSEL_BASE_ADDR + 0x28))
|
#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 PINMODE0 (*(volatile uint32_t *) (PINSEL_BASE_ADDR + 0x40))
|
||||||
#define PINMODE1 (*(volatile uint32_t *) (PINSEL_BASE_ADDR + 0x44))
|
#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 AD0CR (*(volatile uint32_t *) (AD0_BASE_ADDR + 0x00))
|
||||||
#define AD0GDR (*(volatile uint32_t *) (AD0_BASE_ADDR + 0x04))
|
#define AD0GDR (*(volatile uint32_t *) (AD0_BASE_ADDR + 0x04))
|
||||||
#define AD0INTEN (*(volatile uint32_t *) (AD0_BASE_ADDR + 0x0C))
|
#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 AD0DR0 (*(volatile uint32_t *) (AD0_BASE_ADDR + 0x10))
|
||||||
#define AD0DR1 (*(volatile uint32_t *) (AD0_BASE_ADDR + 0x14))
|
#define AD0DR1 (*(volatile uint32_t *) (AD0_BASE_ADDR + 0x14))
|
||||||
#define AD0DR2 (*(volatile uint32_t *) (AD0_BASE_ADDR + 0x18))
|
#define AD0DR2 (*(volatile uint32_t *) (AD0_BASE_ADDR + 0x18))
|
||||||
@@ -1121,64 +1122,38 @@ Reset, and Code Security/Debugging */
|
|||||||
#define MAC_POWERDOWN (*(volatile uint32_t *) (MAC_BASE_ADDR + 0xFF4)) /* Power-down reg */
|
#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) */
|
#define MAC_MODULEID (*(volatile uint32_t *) (MAC_BASE_ADDR + 0xFFC)) /* Module ID reg (RO) */
|
||||||
|
|
||||||
|
/* 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))
|
||||||
|
|
||||||
/* Register Fields */
|
/* 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
|
|
||||||
|
|
||||||
#define PCONP_PCI2C2 0x04000000U
|
|
||||||
|
|
||||||
#define PCONP_PCI2S 0x08000000U
|
|
||||||
|
|
||||||
#define PCONP_PCSDC 0x10000000U
|
|
||||||
|
|
||||||
#define PCONP_PCGPDMA 0x20000000U
|
|
||||||
|
|
||||||
#define PCONP_PCENET 0x40000000U
|
|
||||||
|
|
||||||
#define PCONP_PCUSB 0x80000000U
|
|
||||||
|
|
||||||
/* CLKSRCSEL */
|
/* CLKSRCSEL */
|
||||||
|
|
||||||
#define CLKSRCSEL_CLKSRC_MASK 0x00000003U
|
#define CLKSRCSEL_CLKSRC_MASK 0x00000003U
|
||||||
@@ -2022,6 +1997,12 @@ typedef struct {
|
|||||||
|
|
||||||
#define ETH_CMD_FULL_DUPLEX 0x00000400U
|
#define ETH_CMD_FULL_DUPLEX 0x00000400U
|
||||||
|
|
||||||
|
/* ETH_STAT */
|
||||||
|
|
||||||
|
#define ETH_STAT_RX_ACTIVE 0x00000001U
|
||||||
|
|
||||||
|
#define ETH_STAT_TX_ACTIVE 0x00000002U
|
||||||
|
|
||||||
/* AHBCFG */
|
/* AHBCFG */
|
||||||
|
|
||||||
#define AHBCFG_SCHEDULER_UNIFORM 0x00000001U
|
#define AHBCFG_SCHEDULER_UNIFORM 0x00000001U
|
||||||
@@ -2106,4 +2087,43 @@ typedef struct {
|
|||||||
|
|
||||||
#define EMC_DYN_CTRL_CMD_NOP 0x00000180U
|
#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 */
|
#endif /* LIBBSP_ARM_LPC24XX_LPC24XX_H */
|
||||||
|
|||||||
@@ -27,6 +27,8 @@ extern "C" {
|
|||||||
|
|
||||||
void lpc24xx_micro_seconds_delay( unsigned us);
|
void lpc24xx_micro_seconds_delay( unsigned us);
|
||||||
|
|
||||||
|
unsigned lpc24xx_pllclk( void);
|
||||||
|
|
||||||
unsigned lpc24xx_cclk( void);
|
unsigned lpc24xx_cclk( void);
|
||||||
|
|
||||||
void lpc24xx_set_pll( unsigned clksrc, unsigned nsel, unsigned msel, unsigned cclksel);
|
void lpc24xx_set_pll( unsigned clksrc, unsigned nsel, unsigned msel, unsigned cclksel);
|
||||||
|
|||||||
@@ -7,8 +7,8 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2008
|
* Copyright (c) 2008, 2009
|
||||||
* Embedded Brains GmbH
|
* embedded brains GmbH
|
||||||
* Obere Lagerstr. 30
|
* Obere Lagerstr. 30
|
||||||
* D-82178 Puchheim
|
* D-82178 Puchheim
|
||||||
* Germany
|
* Germany
|
||||||
@@ -23,32 +23,70 @@
|
|||||||
#include <bsp/irq-generic.h>
|
#include <bsp/irq-generic.h>
|
||||||
#include <bsp/lpc24xx.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 */
|
/* Read current vector number */
|
||||||
rtems_vector_number vector = VICVectAddr;
|
rtems_vector_number vector = VICVectAddr;
|
||||||
|
|
||||||
/* Acknowledge interrupt */
|
/* Enable interrupts in program status register */
|
||||||
VICVectAddr = 0;
|
uint32_t psr = arm_status_irq_enable();
|
||||||
|
|
||||||
/* Dispatch interrupt handlers */
|
/* Dispatch interrupt handlers */
|
||||||
bsp_interrupt_handler_dispatch( vector);
|
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)
|
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;
|
return RTEMS_SUCCESSFUL;
|
||||||
}
|
}
|
||||||
|
|
||||||
rtems_status_code bsp_interrupt_vector_disable( rtems_vector_number vector)
|
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;
|
return RTEMS_SUCCESSFUL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* FIXME */
|
||||||
|
void arm_exc_interrupt( void);
|
||||||
|
|
||||||
rtems_status_code bsp_interrupt_facility_initialize( void)
|
rtems_status_code bsp_interrupt_facility_initialize( void)
|
||||||
{
|
{
|
||||||
volatile uint32_t *addr = VICVectAddrBase;
|
volatile uint32_t *addr = VICVectAddrBase;
|
||||||
@@ -79,12 +117,12 @@ rtems_status_code bsp_interrupt_facility_initialize( void)
|
|||||||
VICVectAddr = 0;
|
VICVectAddr = 0;
|
||||||
|
|
||||||
/* Install the IRQ exception handler */
|
/* 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;
|
return RTEMS_SUCCESSFUL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void bsp_interrupt_handler_default( rtems_vector_number vector)
|
void bsp_interrupt_handler_default( rtems_vector_number vector)
|
||||||
{
|
{
|
||||||
printk( "Spurious interrupt: %u\n", vector);
|
printk( "spurious interrupt: %u\n", vector);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,8 +7,8 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2008
|
* Copyright (c) 2008, 2009
|
||||||
* Embedded Brains GmbH
|
* embedded brains GmbH
|
||||||
* Obere Lagerstr. 30
|
* Obere Lagerstr. 30
|
||||||
* D-82178 Puchheim
|
* D-82178 Puchheim
|
||||||
* Germany
|
* Germany
|
||||||
@@ -22,6 +22,7 @@
|
|||||||
|
|
||||||
#include <bsp/lpc24xx.h>
|
#include <bsp/lpc24xx.h>
|
||||||
#include <bsp/dma.h>
|
#include <bsp/dma.h>
|
||||||
|
#include <bsp/io.h>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Table that indicates if a channel is currently occupied.
|
* @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.
|
* @brief Initializes the general purpose DMA.
|
||||||
*/
|
*/
|
||||||
void lpc24xx_dma_initialize( void)
|
void lpc24xx_dma_initialize(void)
|
||||||
{
|
{
|
||||||
rtems_interrupt_level level;
|
rtems_interrupt_level level;
|
||||||
|
|
||||||
/* Enable power */
|
/* Enable module power */
|
||||||
rtems_interrupt_disable( level);
|
lpc24xx_module_enable(LPC24XX_MODULE_GPDMA, 0, LPC24XX_MODULE_PCLK_DEFAULT);
|
||||||
PCONP = SET_FLAG( PCONP, PCONP_PCGPDMA);
|
|
||||||
rtems_interrupt_enable( level);
|
|
||||||
|
|
||||||
/* Disable module */
|
/* Disable module */
|
||||||
GPDMA_CONFIG = 0;
|
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
|
* @retval RTEMS_SUCCESSFUL Successful operation.
|
||||||
* be used.
|
* @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;
|
if (channel < GPDMA_CH_NUMBER) {
|
||||||
bool occupation = true;
|
rtems_interrupt_level level;
|
||||||
|
bool occupation = true;
|
||||||
|
|
||||||
if (channel > GPDMA_CH_NUMBER) {
|
rtems_interrupt_disable(level);
|
||||||
channel = GPDMA_CH_NUMBER - 1;
|
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
|
* @brief Releases the channel @a channel.
|
||||||
* with lpc24xx_dma_channel_obtain() previously.
|
|
||||||
*
|
*
|
||||||
* If the channel number @a channel is out of range the last valid channel will
|
* You must have obtained this channel with lpc24xx_dma_channel_obtain()
|
||||||
* be used.
|
* 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) {
|
if (channel < GPDMA_CH_NUMBER) {
|
||||||
channel = GPDMA_CH_NUMBER - 1;
|
lpc24xx_dma_channel_occupation [channel] = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
lpc24xx_dma_channel_occupation [channel] = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Disables the channel @a channel.
|
* @brief Disables the channel @a channel.
|
||||||
*
|
*
|
||||||
* If @a force is false the channel will be halted and disabled when the
|
* 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
|
* channel is inactive.
|
||||||
* last valid channel will be used.
|
*
|
||||||
|
* 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;
|
uint32_t cfg = ch->cfg;
|
||||||
|
|
||||||
if (!force) {
|
if (!force) {
|
||||||
/* Halt */
|
/* Halt */
|
||||||
ch->cfg = SET_FLAG( cfg, GPDMA_CH_CFG_HALT);
|
ch->cfg = SET_FLAG(cfg, GPDMA_CH_CFG_HALT);
|
||||||
|
|
||||||
/* Wait for inactive */
|
/* Wait for inactive */
|
||||||
do {
|
do {
|
||||||
cfg = ch->cfg;
|
cfg = ch->cfg;
|
||||||
} while (IS_FLAG_SET( cfg, GPDMA_CH_CFG_ACTIVE));
|
} while (IS_FLAG_SET(cfg, GPDMA_CH_CFG_ACTIVE));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Disable */
|
/* Disable */
|
||||||
ch->cfg = CLEAR_FLAG( cfg, GPDMA_CH_CFG_EN);
|
ch->cfg = CLEAR_FLAG(cfg, GPDMA_CH_CFG_EN);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 clksrc = GET_CLKSRCSEL_CLKSRC( CLKSRCSEL);
|
||||||
unsigned pllinclk = 0;
|
unsigned pllinclk = 0;
|
||||||
unsigned pllclk = 0;
|
unsigned pllclk = 0;
|
||||||
unsigned cclk = 0;
|
|
||||||
|
|
||||||
/* Get PLL input frequency */
|
/* Get PLL input frequency */
|
||||||
switch (clksrc) {
|
switch (clksrc) {
|
||||||
@@ -105,8 +104,21 @@ unsigned lpc24xx_cclk( void)
|
|||||||
pllclk = pllinclk;
|
pllclk = pllinclk;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get CPU clock frequency */
|
return pllclk;
|
||||||
cclk = pllclk / (GET_CCLKCFG_CCLKSEL( CCLKCFG) + 1);
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @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;
|
return cclk;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -43,6 +43,7 @@
|
|||||||
#include <bsp.h>
|
#include <bsp.h>
|
||||||
#include <bsp/lpc24xx.h>
|
#include <bsp/lpc24xx.h>
|
||||||
#include <bsp/irq.h>
|
#include <bsp/irq.h>
|
||||||
|
#include <bsp/io.h>
|
||||||
#include <bsp/utility.h>
|
#include <bsp/utility.h>
|
||||||
|
|
||||||
#include <rtems/status-checks.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_STATUS_START \
|
||||||
+ LPC24XX_ETH_TRANSMIT_UNIT_NUMBER * ETH_TRANSMIT_STATUS_SIZE)
|
+ 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_INTERRUPT 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_INTERRUPT_RECEIVE \
|
#define LPC24XX_ETH_INTERRUPT_RECEIVE \
|
||||||
(ETH_INT_RX_ERROR | ETH_INT_RX_FINISHED | ETH_INT_RX_DONE)
|
(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 \
|
#define LPC24XX_ETH_RX_STAT_ERRORS \
|
||||||
(ETH_RX_STAT_CRC_ERROR \
|
(ETH_RX_STAT_CRC_ERROR \
|
||||||
@@ -272,13 +268,10 @@ static void lpc24xx_eth_interrupt_handler(
|
|||||||
|
|
||||||
/* Check receive interrupts */
|
/* Check receive interrupts */
|
||||||
if (IS_FLAG_SET( is, ETH_INT_RX_OVERRUN)) {
|
if (IS_FLAG_SET( is, ETH_INT_RX_OVERRUN)) {
|
||||||
re = LPC24XX_ETH_EVENT_RECEIVE_ERROR;
|
re = LPC24XX_ETH_EVENT_INITIALIZE;
|
||||||
++e->receive_fatal_errors;
|
++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)) {
|
} 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);
|
ie = SET_FLAGS( ie, LPC24XX_ETH_INTERRUPT_RECEIVE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -290,13 +283,10 @@ static void lpc24xx_eth_interrupt_handler(
|
|||||||
|
|
||||||
/* Check transmit interrupts */
|
/* Check transmit interrupts */
|
||||||
if (IS_FLAG_SET( is, ETH_INT_TX_UNDERRUN)) {
|
if (IS_FLAG_SET( is, ETH_INT_TX_UNDERRUN)) {
|
||||||
te = LPC24XX_ETH_EVENT_TRANSMIT_ERROR;
|
te = LPC24XX_ETH_EVENT_INITIALIZE;
|
||||||
++e->transmit_fatal_errors;
|
++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)) {
|
} 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);
|
ie = SET_FLAGS( ie, LPC24XX_ETH_INTERRUPT_TRANSMIT);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -379,7 +369,7 @@ static bool lpc24xx_eth_add_new_mbuf(
|
|||||||
struct ifnet *ifp,
|
struct ifnet *ifp,
|
||||||
volatile lpc24xx_eth_transfer_descriptor *desc,
|
volatile lpc24xx_eth_transfer_descriptor *desc,
|
||||||
struct mbuf **mbuf_table,
|
struct mbuf **mbuf_table,
|
||||||
unsigned i,
|
uint32_t i,
|
||||||
bool wait
|
bool wait
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
@@ -416,67 +406,20 @@ static void lpc24xx_eth_receive_task( void *arg)
|
|||||||
LPC24XX_ETH_RECEIVE_INFO_START;
|
LPC24XX_ETH_RECEIVE_INFO_START;
|
||||||
struct mbuf **const mbuf_table =
|
struct mbuf **const mbuf_table =
|
||||||
(struct mbuf **) LPC24XX_ETH_RECEIVE_MBUF_START;
|
(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 produce_index = 0;
|
||||||
uint32_t consume_index = 0;
|
uint32_t consume_index = 0;
|
||||||
uint32_t receive_index = 0;
|
uint32_t receive_index = 0;
|
||||||
|
|
||||||
LPC24XX_ETH_PRINTF( "%s\n", __func__);
|
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 */
|
/* Main event loop */
|
||||||
while (true) {
|
while (true) {
|
||||||
bool wait_for_mbuf = false;
|
bool wait_for_mbuf = false;
|
||||||
|
|
||||||
/* Wait for events */
|
/* Wait for events */
|
||||||
sc = rtems_bsdnet_event_receive(
|
sc = rtems_bsdnet_event_receive(
|
||||||
LPC24XX_ETH_EVENT_RECEIVE,
|
LPC24XX_ETH_EVENT_INITIALIZE | LPC24XX_ETH_EVENT_INTERRUPT,
|
||||||
RTEMS_EVENT_ANY | RTEMS_WAIT,
|
RTEMS_EVENT_ANY | RTEMS_WAIT,
|
||||||
RTEMS_NO_TIMEOUT,
|
RTEMS_NO_TIMEOUT,
|
||||||
&events
|
&events
|
||||||
@@ -485,6 +428,79 @@ static void lpc24xx_eth_receive_task( void *arg)
|
|||||||
|
|
||||||
LPC24XX_ETH_PRINTF( "rx: wake up: 0x%08" PRIx32 "\n", events);
|
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) {
|
while (true) {
|
||||||
/* Clear receive interrupt status */
|
/* Clear receive interrupt status */
|
||||||
MAC_INTCLEAR = LPC24XX_ETH_INTERRUPT_RECEIVE;
|
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];
|
struct mbuf *m = mbuf_table [receive_index];
|
||||||
uint32_t stat = info [receive_index].status;
|
uint32_t stat = info [receive_index].status;
|
||||||
|
|
||||||
|
/* Remove mbuf from table */
|
||||||
|
mbuf_table [receive_index] = NULL;
|
||||||
|
|
||||||
if (
|
if (
|
||||||
IS_FLAG_SET( stat, ETH_RX_STAT_LAST_FLAG)
|
IS_FLAG_SET( stat, ETH_RX_STAT_LAST_FLAG)
|
||||||
&& ARE_FLAGS_CLEARED( stat, LPC24XX_ETH_RX_STAT_ERRORS)
|
&& ARE_FLAGS_CLEARED( stat, LPC24XX_ETH_RX_STAT_ERRORS)
|
||||||
@@ -585,6 +604,9 @@ static void lpc24xx_eth_receive_task( void *arg)
|
|||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
|
|
||||||
|
/* Clear task ID */
|
||||||
|
e->receive_task = RTEMS_ID_NONE;
|
||||||
|
|
||||||
/* Release network semaphore */
|
/* Release network semaphore */
|
||||||
rtems_bsdnet_semaphore_release();
|
rtems_bsdnet_semaphore_release();
|
||||||
|
|
||||||
@@ -665,42 +687,19 @@ static void lpc24xx_eth_transmit_task( void *arg)
|
|||||||
|
|
||||||
LPC24XX_ETH_PRINTF( "%s\n", __func__);
|
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 */
|
/* Initialize descriptor table */
|
||||||
for (produce_index = 0; produce_index <= index_max; ++produce_index) {
|
for (produce_index = 0; produce_index <= index_max; ++produce_index) {
|
||||||
desc [produce_index].start =
|
desc [produce_index].start =
|
||||||
(uint32_t) (buf + produce_index * LPC24XX_ETH_TRANSMIT_BUFFER_SIZE);
|
(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 */
|
/* Main event loop */
|
||||||
while (true) {
|
while (true) {
|
||||||
/* Wait for events */
|
/* Wait for events */
|
||||||
sc = rtems_bsdnet_event_receive(
|
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_EVENT_ANY | RTEMS_WAIT,
|
||||||
RTEMS_NO_TIMEOUT,
|
RTEMS_NO_TIMEOUT,
|
||||||
&events
|
&events
|
||||||
@@ -709,6 +708,41 @@ static void lpc24xx_eth_transmit_task( void *arg)
|
|||||||
|
|
||||||
LPC24XX_ETH_PRINTF( "tx: wake up: 0x%08" PRIx32 "\n", events);
|
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 */
|
/* Free consumed fragments */
|
||||||
while (true) {
|
while (true) {
|
||||||
/* Save last known consume index */
|
/* 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 */
|
/* Next consume index */
|
||||||
c = lpc24xx_eth_increment( c, index_max);
|
c = lpc24xx_eth_increment( c, index_max);
|
||||||
}
|
}
|
||||||
@@ -849,6 +880,9 @@ static void lpc24xx_eth_transmit_task( void *arg)
|
|||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
|
|
||||||
|
/* Clear task ID */
|
||||||
|
e->transmit_task = RTEMS_ID_NONE;
|
||||||
|
|
||||||
/* Release network semaphore */
|
/* Release network semaphore */
|
||||||
rtems_bsdnet_semaphore_release();
|
rtems_bsdnet_semaphore_release();
|
||||||
|
|
||||||
@@ -858,6 +892,7 @@ cleanup:
|
|||||||
|
|
||||||
static void lpc24xx_eth_interface_init( void *arg)
|
static void lpc24xx_eth_interface_init( void *arg)
|
||||||
{
|
{
|
||||||
|
rtems_status_code sc = RTEMS_SUCCESSFUL;
|
||||||
lpc24xx_eth_driver_entry *e = (lpc24xx_eth_driver_entry *) arg;
|
lpc24xx_eth_driver_entry *e = (lpc24xx_eth_driver_entry *) arg;
|
||||||
struct ifnet *ifp = &e->arpcom.ac_if;
|
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) {
|
if (e->state == LPC24XX_ETH_INITIALIZED) {
|
||||||
#ifndef LPC24XX_HAS_UBOOT
|
#ifndef LPC24XX_HAS_UBOOT
|
||||||
rtems_interrupt_level level;
|
/* Enable module power */
|
||||||
|
lpc24xx_module_enable(
|
||||||
|
LPC24XX_MODULE_ETHERNET,
|
||||||
|
0,
|
||||||
|
LPC24XX_MODULE_PCLK_DEFAULT
|
||||||
|
);
|
||||||
|
|
||||||
rtems_interrupt_disable( level);
|
/* Module IO configuration */
|
||||||
|
|
||||||
/* Enable power */
|
|
||||||
PCONP = SET_FLAGS( PCONP, 0x40000000);
|
|
||||||
|
|
||||||
/* Set PIN selects */
|
|
||||||
#ifdef LPC24XX_ETHERNET_RMII
|
#ifdef LPC24XX_ETHERNET_RMII
|
||||||
PINSEL2 = SET_FLAGS( PINSEL2, 0x55555555);
|
lpc24xx_io_config( LPC24XX_MODULE_ETHERNET, 0, 0);
|
||||||
#else
|
#else
|
||||||
PINSEL2 = SET_FLAGS( PINSEL2, 0x50150105);
|
lpc24xx_io_config( LPC24XX_MODULE_ETHERNET, 0, 1);
|
||||||
#endif
|
#endif
|
||||||
PINSEL3 = SET_FLAGS( PINSEL3, 0x05);
|
|
||||||
|
|
||||||
rtems_interrupt_enable( level);
|
|
||||||
|
|
||||||
/* Soft reset */
|
/* Soft reset */
|
||||||
|
|
||||||
/* Do soft reset */
|
/* Do soft reset */
|
||||||
MAC_MAC1 = 0xcf00;
|
|
||||||
MAC_COMMAND = 0x38;
|
MAC_COMMAND = 0x38;
|
||||||
|
MAC_MAC1 = 0xcf00;
|
||||||
|
|
||||||
/* Initialize PHY */
|
/* Initialize PHY */
|
||||||
/* TODO */
|
/* TODO */
|
||||||
@@ -919,18 +951,14 @@ static void lpc24xx_eth_interface_init( void *arg)
|
|||||||
/* Enable receiver */
|
/* Enable receiver */
|
||||||
MAC_MAC1 = 0x03;
|
MAC_MAC1 = 0x03;
|
||||||
#else /* LPC24XX_HAS_UBOOT */
|
#else /* LPC24XX_HAS_UBOOT */
|
||||||
uint32_t reg = 0;
|
/* Reset receiver and transmitter */
|
||||||
|
MAC_COMMAND = SET_FLAGS(
|
||||||
/* TODO */
|
MAC_COMMAND,
|
||||||
|
ETH_CMD_RX_RESET | ETH_CMD_TX_RESET | ETH_CMD_REG_RESET
|
||||||
|
);
|
||||||
|
|
||||||
/* MAC configuration */
|
/* MAC configuration */
|
||||||
MAC_MAC1 = 0x3;
|
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 */
|
#endif /* LPC24XX_HAS_UBOOT */
|
||||||
|
|
||||||
/* Start receive task */
|
/* Start receive task */
|
||||||
@@ -941,6 +969,8 @@ static void lpc24xx_eth_interface_init( void *arg)
|
|||||||
lpc24xx_eth_receive_task,
|
lpc24xx_eth_receive_task,
|
||||||
e
|
e
|
||||||
);
|
);
|
||||||
|
sc = rtems_event_send( e->receive_task, LPC24XX_ETH_EVENT_INITIALIZE);
|
||||||
|
RTEMS_SYSLOG_ERROR_SC( sc, "send receive initialize event");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Start transmit task */
|
/* Start transmit task */
|
||||||
@@ -951,6 +981,8 @@ static void lpc24xx_eth_interface_init( void *arg)
|
|||||||
lpc24xx_eth_transmit_task,
|
lpc24xx_eth_transmit_task,
|
||||||
e
|
e
|
||||||
);
|
);
|
||||||
|
sc = rtems_event_send( e->transmit_task, LPC24XX_ETH_EVENT_INITIALIZE);
|
||||||
|
RTEMS_SYSLOG_ERROR_SC( sc, "send transmit initialize event");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Change state */
|
/* 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)
|
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( "received frames: %u\n", e->received_frames);
|
||||||
printf( "receive interrupts: %u\n", e->receive_interrupts);
|
printf( "receive interrupts: %u\n", e->receive_interrupts);
|
||||||
printf( "transmitted frames: %u\n", e->transmitted_frames);
|
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 no descriptor errors: %u\n", e->transmit_no_descriptor_errors);
|
||||||
printf( "transmit overflow errors: %u\n", e->transmit_overflow_errors);
|
printf( "transmit overflow errors: %u\n", e->transmit_overflow_errors);
|
||||||
printf( "transmit fatal errors: %u\n", e->transmit_fatal_errors);
|
printf( "transmit fatal errors: %u\n", e->transmit_fatal_errors);
|
||||||
|
|
||||||
|
rtems_bsdnet_semaphore_obtain();
|
||||||
}
|
}
|
||||||
|
|
||||||
static int lpc24xx_eth_interface_ioctl(
|
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);
|
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");
|
RTEMS_SYSLOG_ERROR_SC( sc, "send transmit start event");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/irq-info.h
|
||||||
PREINSTALL_FILES += $(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)
|
$(PROJECT_INCLUDE)/bsp/tod.h: ../../shared/tod.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
|
||||||
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/tod.h
|
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/tod.h
|
||||||
PREINSTALL_FILES += $(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
|
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/dma.h
|
||||||
PREINSTALL_FILES += $(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)
|
$(PROJECT_INCLUDE)/tm27.h: ../../shared/include/tm27.h $(PROJECT_INCLUDE)/$(dirstamp)
|
||||||
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/tm27.h
|
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/tm27.h
|
||||||
PREINSTALL_FILES += $(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
|
$(INSTALL_DATA) $< $(PROJECT_LIB)/linkcmds.base
|
||||||
PREINSTALL_FILES += $(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)
|
$(PROJECT_LIB)/linkcmds.lpc2478: startup/linkcmds.lpc2478 $(PROJECT_LIB)/$(dirstamp)
|
||||||
$(INSTALL_DATA) $< $(PROJECT_LIB)/linkcmds.lpc2478
|
$(INSTALL_DATA) $< $(PROJECT_LIB)/linkcmds.lpc2478
|
||||||
PREINSTALL_FILES += $(PROJECT_LIB)/linkcmds.lpc2478
|
PREINSTALL_FILES += $(PROJECT_LIB)/linkcmds.lpc2478
|
||||||
|
|||||||
@@ -21,11 +21,17 @@
|
|||||||
#include <libchip/rtc.h>
|
#include <libchip/rtc.h>
|
||||||
|
|
||||||
#include <bsp/lpc24xx.h>
|
#include <bsp/lpc24xx.h>
|
||||||
|
#include <bsp/io.h>
|
||||||
|
|
||||||
#define LPC24XX_RTC_NUMBER 1
|
#define LPC24XX_RTC_NUMBER 1
|
||||||
|
|
||||||
static void lpc24xx_rtc_initialize( int minor)
|
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 */
|
/* Enable the RTC and use external clock */
|
||||||
RTC_CCR = RTC_CCR_CLKEN | RTC_CCR_CLKSRC;
|
RTC_CCR = RTC_CCR_CLKEN | RTC_CCR_CLKSRC;
|
||||||
|
|
||||||
|
|||||||
@@ -18,10 +18,25 @@
|
|||||||
* LICENSE in this distribution or at http://www.rtems.com/license/LICENSE.
|
* LICENSE in this distribution or at http://www.rtems.com/license/LICENSE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <rtems.h>
|
||||||
|
|
||||||
#include <bsp/bootcard.h>
|
#include <bsp/bootcard.h>
|
||||||
#include <bsp/start.h>
|
#include <bsp/lpc24xx.h>
|
||||||
|
|
||||||
void bsp_reset( void)
|
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 */
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,9 +23,12 @@
|
|||||||
#include <bsp.h>
|
#include <bsp.h>
|
||||||
#include <bsp/bootcard.h>
|
#include <bsp/bootcard.h>
|
||||||
#include <bsp/dma.h>
|
#include <bsp/dma.h>
|
||||||
|
#include <bsp/io.h>
|
||||||
|
#include <bsp/irq-generic.h>
|
||||||
#include <bsp/irq.h>
|
#include <bsp/irq.h>
|
||||||
#include <bsp/linker-symbols.h>
|
#include <bsp/linker-symbols.h>
|
||||||
#include <bsp/lpc24xx.h>
|
#include <bsp/lpc24xx.h>
|
||||||
|
#include <bsp/stackalloc.h>
|
||||||
#include <bsp/start.h>
|
#include <bsp/start.h>
|
||||||
#include <bsp/system-clocks.h>
|
#include <bsp/system-clocks.h>
|
||||||
|
|
||||||
@@ -38,15 +41,17 @@ static void lpc24xx_fatal_error( void)
|
|||||||
|
|
||||||
static void lpc24xx_ram_test_32( 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 = (unsigned) out;
|
||||||
++out;
|
++out;
|
||||||
}
|
}
|
||||||
|
|
||||||
out = (volatile unsigned *) bsp_ram_ext_start;
|
out = begin;
|
||||||
while (out < (volatile unsigned *) bsp_ram_ext_end) {
|
while (out != end) {
|
||||||
if (*out != (unsigned) out) {
|
if (*out != (unsigned) out) {
|
||||||
lpc24xx_fatal_error();
|
lpc24xx_fatal_error();
|
||||||
}
|
}
|
||||||
@@ -65,14 +70,11 @@ static void lpc24xx_init_emc( void)
|
|||||||
int i = 0;
|
int i = 0;
|
||||||
uint32_t mode = 0;
|
uint32_t mode = 0;
|
||||||
|
|
||||||
/* Enable power */
|
/* Enable module power */
|
||||||
PCONP = SET_FLAGS( PCONP, 0x0800);
|
lpc24xx_module_enable( LPC24XX_MODULE_EMC, 0, LPC24XX_MODULE_PCLK_DEFAULT);
|
||||||
|
|
||||||
/* Set PIN selects */
|
/* IO configuration */
|
||||||
PINSEL5 = SET_FLAGS( PINSEL5, 0x05050555);
|
lpc24xx_io_config( LPC24XX_MODULE_EMC, 0, 0);
|
||||||
PINSEL6 = SET_FLAGS( PINSEL6, 0x55555555);
|
|
||||||
PINSEL8 = SET_FLAGS( PINSEL8, 0x55555555);
|
|
||||||
PINSEL9 = SET_FLAGS( PINSEL9, 0x50555555);
|
|
||||||
|
|
||||||
/* Enable module, normal memory map and normal power mode */
|
/* Enable module, normal memory map and normal power mode */
|
||||||
EMC_CTRL = 1;
|
EMC_CTRL = 1;
|
||||||
@@ -166,14 +168,8 @@ static void lpc24xx_init_emc( void)
|
|||||||
/* Enable buffer */
|
/* Enable buffer */
|
||||||
EMC_DYN_CFG0 |= 0x00080000;
|
EMC_DYN_CFG0 |= 0x00080000;
|
||||||
|
|
||||||
/* Static Memory 0 settings */
|
/* Extended wait register */
|
||||||
EMC_STA_WAITWEN0 = 0x02;
|
EMC_STA_EXT_WAIT = 0;
|
||||||
EMC_STA_WAITOEN0 = 0x02;
|
|
||||||
EMC_STA_WAITRD0 = 0x1f;
|
|
||||||
EMC_STA_WAITPAGE0 = 0x1f;
|
|
||||||
EMC_STA_WAITWR0 = 0x1f;
|
|
||||||
EMC_STA_WAITTURN0 = 0x0f;
|
|
||||||
EMC_STA_CFG0 = 0x81;
|
|
||||||
|
|
||||||
/* Static Memory 1 settings */
|
/* Static Memory 1 settings */
|
||||||
EMC_STA_WAITWEN1 = 0x02;
|
EMC_STA_WAITWEN1 = 0x02;
|
||||||
@@ -182,25 +178,25 @@ static void lpc24xx_init_emc( void)
|
|||||||
EMC_STA_WAITPAGE1 = 0x1f;
|
EMC_STA_WAITPAGE1 = 0x1f;
|
||||||
EMC_STA_WAITWR1 = 0x08;
|
EMC_STA_WAITWR1 = 0x08;
|
||||||
EMC_STA_WAITTURN1 = 0x0f;
|
EMC_STA_WAITTURN1 = 0x0f;
|
||||||
EMC_STA_CFG1 = 0x80;
|
EMC_STA_CFG1 = 0x81;
|
||||||
|
|
||||||
/* RAM test */
|
/* RAM test */
|
||||||
lpc24xx_ram_test_32();
|
lpc24xx_ram_test_32();
|
||||||
#endif /* LPC24XX_EMC_MICRON */
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static void lpc24xx_init_pll( void)
|
static void lpc24xx_init_pll( void)
|
||||||
{
|
{
|
||||||
#ifndef LPC24XX_HAS_UBOOT
|
#ifndef LPC24XX_HAS_UBOOT
|
||||||
/* Enable main oscillator */
|
/* Enable main oscillator */
|
||||||
SCS = SET_FLAGS( SCS, 0x20);
|
SCS = SET_FLAG( SCS, 0x20);
|
||||||
while (IS_FLAG_CLEARED( SCS, 0x40)) {
|
while (IS_FLAG_CLEARED( SCS, 0x40)) {
|
||||||
/* Wait */
|
/* Wait */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set PLL */
|
/* Set PLL */
|
||||||
lpc24xx_set_pll( 1, 0, 11, 3);
|
lpc24xx_set_pll( 1, 0, 11, 3);
|
||||||
#endif /* LPC24XX_HAS_UBOOT */
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void /* __attribute__ ((section (".entry"))) */ bsp_start_hook_0( void)
|
void /* __attribute__ ((section (".entry"))) */ bsp_start_hook_0( void)
|
||||||
@@ -221,6 +217,19 @@ void /* __attribute__ ((section (".entry"))) */ bsp_start_hook_0( void)
|
|||||||
PINSEL8 = 0;
|
PINSEL8 = 0;
|
||||||
PINSEL9 = 0;
|
PINSEL9 = 0;
|
||||||
PINSEL10 = 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 */
|
/* Set periperal clocks */
|
||||||
PCLKSEL0 = 0;
|
PCLKSEL0 = 0;
|
||||||
@@ -233,11 +242,8 @@ void /* __attribute__ ((section (".entry"))) */ bsp_start_hook_0( void)
|
|||||||
MAMCR = 0;
|
MAMCR = 0;
|
||||||
MAMTIM = 4;
|
MAMTIM = 4;
|
||||||
|
|
||||||
/* Set general purpose IO */
|
/* Enable fast IO for ports 0 and 1 */
|
||||||
IODIR0 = 0;
|
SCS = SET_FLAG( SCS, 0x1);
|
||||||
IODIR1 = 0;
|
|
||||||
IOSET0 = 0xffffffff;
|
|
||||||
IOSET1 = 0xffffffff;
|
|
||||||
|
|
||||||
/* Set fast IO */
|
/* Set fast IO */
|
||||||
FIO0DIR = 0;
|
FIO0DIR = 0;
|
||||||
@@ -245,51 +251,53 @@ void /* __attribute__ ((section (".entry"))) */ bsp_start_hook_0( void)
|
|||||||
FIO2DIR = 0;
|
FIO2DIR = 0;
|
||||||
FIO3DIR = 0;
|
FIO3DIR = 0;
|
||||||
FIO4DIR = 0;
|
FIO4DIR = 0;
|
||||||
FIO0SET = 0xffffffff;
|
FIO0CLR = 0xffffffff;
|
||||||
FIO1SET = 0xffffffff;
|
FIO1CLR = 0xffffffff;
|
||||||
FIO2SET = 0xffffffff;
|
FIO2CLR = 0xffffffff;
|
||||||
FIO3SET = 0xffffffff;
|
FIO3CLR = 0xffffffff;
|
||||||
FIO4SET = 0xffffffff;
|
FIO4CLR = 0xffffffff;
|
||||||
|
|
||||||
/* Initialize UART 0 */
|
/* Initialize console */
|
||||||
PCONP = SET_FLAGS( PCONP, 0x08);
|
#ifdef LPC24XX_CONFIG_CONSOLE
|
||||||
PCLKSEL0 = SET_FLAGS( PCLKSEL0, 0x40);
|
lpc24xx_module_enable( LPC24XX_MODULE_UART, 0, LPC24XX_MODULE_CCLK);
|
||||||
PINSEL0 = SET_FLAGS( PINSEL0, 0x50);
|
lpc24xx_io_config( LPC24XX_MODULE_UART, 0, LPC24XX_CONFIG_CONSOLE);
|
||||||
U0LCR = 0;
|
U0LCR = 0;
|
||||||
U0IER = 0;
|
U0IER = 0;
|
||||||
U0LCR = 0x80;
|
U0LCR = 0x80;
|
||||||
U0DLL = lpc24xx_cclk() / 16 / LPC24XX_UART_BAUD;
|
U0DLL = lpc24xx_cclk() / 16 / LPC24XX_UART_BAUD;
|
||||||
U0DLM = 0;
|
U0DLM = 0;
|
||||||
U0LCR = 0x03;
|
U0LCR = 0x03;
|
||||||
U0FCR = 0x07;
|
U0FCR = 0x07;
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Initialize Timer 1 */
|
/* Initialize Timer 1 */
|
||||||
PCONP = SET_FLAGS( PCONP, 0x04);
|
lpc24xx_module_enable( LPC24XX_MODULE_TIMER, 1, LPC24XX_MODULE_CCLK);
|
||||||
PCLKSEL0 = SET_FLAGS( PCLKSEL0, 0x10);
|
#endif
|
||||||
#endif /* LPC24XX_HAS_UBOOT */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void lpc24xx_copy_data( void)
|
static void lpc24xx_copy_data( void)
|
||||||
{
|
{
|
||||||
#ifndef LPC24XX_HAS_UBOOT
|
#ifndef LPC24XX_HAS_UBOOT
|
||||||
unsigned *in = bsp_section_text_end;
|
const unsigned *end = (const unsigned *) bsp_section_data_end;
|
||||||
unsigned *out = bsp_section_data_start;
|
unsigned *in = (unsigned *) bsp_section_data_load_begin;
|
||||||
|
unsigned *out = (unsigned *) bsp_section_data_begin;
|
||||||
|
|
||||||
/* Copy data */
|
/* Copy data */
|
||||||
while (out < bsp_section_data_end) {
|
while (out != end) {
|
||||||
*out = *in;
|
*out = *in;
|
||||||
++out;
|
++out;
|
||||||
++in;
|
++in;
|
||||||
}
|
}
|
||||||
#endif /* LPC24XX_HAS_UBOOT */
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static void lpc24xx_clear_bss( void)
|
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 */
|
/* Clear BSS */
|
||||||
while (out < bsp_section_bss_end) {
|
while (out != end) {
|
||||||
*out = 0;
|
*out = 0;
|
||||||
++out;
|
++out;
|
||||||
}
|
}
|
||||||
@@ -315,7 +323,9 @@ void bsp_start( void)
|
|||||||
printk( "CPU clock (CCLK): %u\n", lpc24xx_cclk());
|
printk( "CPU clock (CCLK): %u\n", lpc24xx_cclk());
|
||||||
|
|
||||||
/* Exceptions */
|
/* Exceptions */
|
||||||
|
/* FIXME
|
||||||
rtems_exception_init_mngt();
|
rtems_exception_init_mngt();
|
||||||
|
*/
|
||||||
|
|
||||||
/* Interrupts */
|
/* Interrupts */
|
||||||
if (bsp_interrupt_initialize() != RTEMS_SUCCESSFUL) {
|
if (bsp_interrupt_initialize() != RTEMS_SUCCESSFUL) {
|
||||||
@@ -326,6 +336,26 @@ void bsp_start( void)
|
|||||||
|
|
||||||
/* DMA */
|
/* DMA */
|
||||||
lpc24xx_dma_initialize();
|
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
|
#define ULSR_THRE 0x00000020U
|
||||||
|
|||||||
@@ -10,4 +10,18 @@ MEMORY {
|
|||||||
NIRVANA : ORIGIN = 0, LENGTH = 0
|
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
|
INCLUDE linkcmds.base
|
||||||
|
|||||||
@@ -11,4 +11,18 @@ MEMORY {
|
|||||||
NIRVANA : ORIGIN = 0, LENGTH = 0
|
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
|
INCLUDE linkcmds.base
|
||||||
|
|||||||
@@ -1,14 +1,29 @@
|
|||||||
/**
|
/**
|
||||||
* @file
|
* @file
|
||||||
*
|
*
|
||||||
* LPC2478 (NCS).
|
* LPC2478 (NCS, bootloader configuration).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
MEMORY {
|
MEMORY {
|
||||||
RAM_INT (AIW) : ORIGIN = 0x40000000, LENGTH = 64k
|
RAM_VEC (AIW) : ORIGIN = 0x40000000, LENGTH = 32k
|
||||||
RAM_EXT (AIW) : ORIGIN = 0xa0400000, LENGTH = 4M
|
RAM_INT (AIW) : ORIGIN = 0x40008000, LENGTH = 32k
|
||||||
|
RAM_EXT (AIW) : ORIGIN = 0xa0c00000, LENGTH = 4M
|
||||||
ROM_INT (RX) : ORIGIN = 0x00000000, LENGTH = 512k - 8k
|
ROM_INT (RX) : ORIGIN = 0x00000000, LENGTH = 512k - 8k
|
||||||
NIRVANA : ORIGIN = 0, LENGTH = 0
|
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
|
||||||
|
|||||||
@@ -6,9 +6,23 @@
|
|||||||
|
|
||||||
MEMORY {
|
MEMORY {
|
||||||
RAM_INT (AIW) : ORIGIN = 0x40000000, LENGTH = 64k
|
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
|
ROM_INT (RX) : ORIGIN = 0x00000000, LENGTH = 512k - 8k
|
||||||
NIRVANA : ORIGIN = 0, LENGTH = 0
|
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
|
INCLUDE linkcmds.base
|
||||||
|
|||||||
@@ -4,6 +4,10 @@
|
|||||||
RTEMS_BSP_BOOTCARD_OPTIONS. Add RTEMS_BSP_CLEANUP_OPTIONS so all BSPs
|
RTEMS_BSP_BOOTCARD_OPTIONS. Add RTEMS_BSP_CLEANUP_OPTIONS so all BSPs
|
||||||
have the same options.
|
have the same options.
|
||||||
|
|
||||||
|
2009-07-15 Sebastian Huber <sebastian.huber@embedded-brains.de>
|
||||||
|
|
||||||
|
* startup/bspstart.c: Removed variable declaration.
|
||||||
|
|
||||||
2009-05-08 Joel Sherrill <joel.sherrill@oarcorp.com>
|
2009-05-08 Joel Sherrill <joel.sherrill@oarcorp.com>
|
||||||
|
|
||||||
* startup/bspgetworkarea.c: Switch from ssize_t to uintptr_t for
|
* startup/bspgetworkarea.c: Switch from ssize_t to uintptr_t for
|
||||||
|
|||||||
@@ -15,11 +15,6 @@
|
|||||||
#include <bsp/bootcard.h>
|
#include <bsp/bootcard.h>
|
||||||
#include <nds.h>
|
#include <nds.h>
|
||||||
|
|
||||||
/*
|
|
||||||
* This definition comes from ARM cpu code.
|
|
||||||
*/
|
|
||||||
extern unsigned int arm_cpu_mode;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* start the platform.
|
* start the platform.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -64,25 +64,20 @@ void _print_full_context(uint32_t spsr)
|
|||||||
mode=_print_full_context_mode2txt[(spsr&0x1f)-0x10];
|
mode=_print_full_context_mode2txt[(spsr&0x1f)-0x10];
|
||||||
if(!mode) mode="unknown";
|
if(!mode) mode="unknown";
|
||||||
|
|
||||||
#if defined(__thumb__)
|
asm volatile (
|
||||||
asm volatile (" .code 16 \n" \
|
THUMB_TO_ARM
|
||||||
"adr %[tmp], arm_code \n" \
|
"mrs %[cpsr], cpsr\n"
|
||||||
"bx %[tmp] \n" \
|
"orr %[tmp], %[spsr], #0xc0\n"
|
||||||
"nop \n" \
|
"msr cpsr_c, %[tmp]\n"
|
||||||
".code 32 \n" \
|
"mov %[prev_sp], sp\n"
|
||||||
"arm_code: \n" \
|
"mov %[prev_lr], lr\n"
|
||||||
: [tmp]"=&r" (tmp) );
|
"msr cpsr_c, %[cpsr]\n"
|
||||||
#endif
|
ARM_TO_THUMB
|
||||||
asm volatile (" MRS %[cpsr], cpsr \n"
|
: [prev_sp] "=&r" (prev_sp), [prev_lr] "=&r" (prev_lr),
|
||||||
" ORR %[tmp], %[spsr], #0xc0 \n"
|
[cpsr] "=&r" (cpsr), [tmp] "=&r" (tmp)
|
||||||
" MSR cpsr_c, %[tmp] \n"
|
: [spsr] "r" (spsr)
|
||||||
" MOV %[prev_sp], sp \n"
|
: "cc"
|
||||||
" MOV %[prev_lr], lr \n"
|
);
|
||||||
" MSR cpsr_c, %[cpsr] \n"
|
|
||||||
: [prev_sp] "=&r" (prev_sp), [prev_lr] "=&r" (prev_lr),
|
|
||||||
[cpsr] "=&r" (cpsr), [tmp] "=&r" (tmp)
|
|
||||||
: [spsr] "r" (spsr)
|
|
||||||
: "cc");
|
|
||||||
|
|
||||||
printk(
|
printk(
|
||||||
"Previous sp=0x%08x lr=0x%08x and actual cpsr=%08x\n",
|
"Previous sp=0x%08x lr=0x%08x and actual cpsr=%08x\n",
|
||||||
|
|||||||
@@ -5,76 +5,93 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2008
|
* Copyright (c) 2008, 2009
|
||||||
* Embedded Brains GmbH
|
* embedded brains GmbH
|
||||||
* Obere Lagerstr. 30
|
* Obere Lagerstr. 30
|
||||||
* D-82178 Puchheim
|
* D-82178 Puchheim
|
||||||
* Germany
|
* Germany
|
||||||
* rtems@embedded-brains.de
|
* <rtems@embedded-brains.de>
|
||||||
*
|
*
|
||||||
* The license and distribution terms for this file may be found in the file
|
* The license and distribution terms for this file may be
|
||||||
* LICENSE in this distribution or at http://www.rtems.com/license/LICENSE.
|
* found in the file LICENSE in this distribution or at
|
||||||
|
* http://www.rtems.com/license/LICENSE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef LIBBSP_ARM_SHARED_LINKER_SYMBOLS_H
|
#ifndef LIBBSP_ARM_SHARED_LINKER_SYMBOLS_H
|
||||||
#define LIBBSP_ARM_SHARED_LINKER_SYMBOLS_H
|
#define LIBBSP_ARM_SHARED_LINKER_SYMBOLS_H
|
||||||
|
|
||||||
#ifndef ASM
|
#ifndef ASM
|
||||||
#define LINKER_SYMBOL( sym) extern char sym [];
|
#define LINKER_SYMBOL(sym) extern char sym [];
|
||||||
#else
|
#else
|
||||||
#define LINKER_SYMBOL( sym) .extern sym
|
#define LINKER_SYMBOL(sym) .extern sym
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
LINKER_SYMBOL( bsp_stack_irq_size)
|
LINKER_SYMBOL(bsp_region_text_begin)
|
||||||
LINKER_SYMBOL( bsp_stack_irq_start)
|
LINKER_SYMBOL(bsp_region_text_end)
|
||||||
|
LINKER_SYMBOL(bsp_region_text_size)
|
||||||
|
|
||||||
LINKER_SYMBOL( bsp_stack_irq_size)
|
LINKER_SYMBOL(bsp_region_data_begin)
|
||||||
LINKER_SYMBOL( bsp_stack_fiq_start)
|
LINKER_SYMBOL(bsp_region_data_end)
|
||||||
|
LINKER_SYMBOL(bsp_region_data_size)
|
||||||
|
|
||||||
LINKER_SYMBOL( bsp_stack_abt_size)
|
LINKER_SYMBOL(bsp_stack_irq_begin)
|
||||||
LINKER_SYMBOL( bsp_stack_abt_start)
|
LINKER_SYMBOL(bsp_stack_irq_end)
|
||||||
|
LINKER_SYMBOL(bsp_stack_irq_size)
|
||||||
|
|
||||||
LINKER_SYMBOL( bsp_stack_undef_size)
|
LINKER_SYMBOL(bsp_stack_fiq_begin)
|
||||||
LINKER_SYMBOL( bsp_stack_undef_start)
|
LINKER_SYMBOL(bsp_stack_fiq_end)
|
||||||
|
LINKER_SYMBOL(bsp_stack_irq_size)
|
||||||
|
|
||||||
LINKER_SYMBOL( bsp_stack_svc_size)
|
LINKER_SYMBOL(bsp_stack_abt_begin)
|
||||||
LINKER_SYMBOL( bsp_stack_svc_start)
|
LINKER_SYMBOL(bsp_stack_abt_end)
|
||||||
|
LINKER_SYMBOL(bsp_stack_abt_size)
|
||||||
|
|
||||||
LINKER_SYMBOL( bsp_ram_int_start)
|
LINKER_SYMBOL(bsp_stack_undef_begin)
|
||||||
LINKER_SYMBOL( bsp_ram_int_end)
|
LINKER_SYMBOL(bsp_stack_undef_end)
|
||||||
LINKER_SYMBOL( bsp_ram_int_size)
|
LINKER_SYMBOL(bsp_stack_undef_size)
|
||||||
|
|
||||||
LINKER_SYMBOL( bsp_ram_ext_start)
|
LINKER_SYMBOL(bsp_stack_svc_begin)
|
||||||
LINKER_SYMBOL( bsp_ram_ext_load_start)
|
LINKER_SYMBOL(bsp_stack_svc_end)
|
||||||
LINKER_SYMBOL( bsp_ram_ext_end)
|
LINKER_SYMBOL(bsp_stack_svc_size)
|
||||||
LINKER_SYMBOL( bsp_ram_ext_size)
|
|
||||||
|
|
||||||
LINKER_SYMBOL( bsp_rom_start)
|
LINKER_SYMBOL(bsp_section_start_begin)
|
||||||
LINKER_SYMBOL( bsp_rom_end)
|
LINKER_SYMBOL(bsp_section_start_end)
|
||||||
LINKER_SYMBOL( bsp_rom_size)
|
LINKER_SYMBOL(bsp_section_start_size)
|
||||||
|
|
||||||
LINKER_SYMBOL( bsp_section_vector_start)
|
LINKER_SYMBOL(bsp_section_vector_begin)
|
||||||
LINKER_SYMBOL( bsp_section_vector_end)
|
LINKER_SYMBOL(bsp_section_vector_end)
|
||||||
LINKER_SYMBOL( bsp_section_vector_size)
|
LINKER_SYMBOL(bsp_section_vector_size)
|
||||||
|
|
||||||
LINKER_SYMBOL( bsp_section_text_start)
|
LINKER_SYMBOL(bsp_section_text_begin)
|
||||||
LINKER_SYMBOL( bsp_section_text_end)
|
LINKER_SYMBOL(bsp_section_text_end)
|
||||||
LINKER_SYMBOL( bsp_section_text_size)
|
LINKER_SYMBOL(bsp_section_text_size)
|
||||||
|
LINKER_SYMBOL(bsp_section_text_load_begin)
|
||||||
|
|
||||||
LINKER_SYMBOL( bsp_section_data_start)
|
LINKER_SYMBOL(bsp_section_rodata_begin)
|
||||||
LINKER_SYMBOL( bsp_section_data_end)
|
LINKER_SYMBOL(bsp_section_rodata_end)
|
||||||
LINKER_SYMBOL( bsp_section_data_size)
|
LINKER_SYMBOL(bsp_section_rodata_size)
|
||||||
|
LINKER_SYMBOL(bsp_section_rodata_load_begin)
|
||||||
|
|
||||||
LINKER_SYMBOL( bsp_section_bss_start)
|
LINKER_SYMBOL(bsp_section_data_begin)
|
||||||
LINKER_SYMBOL( bsp_section_bss_end)
|
LINKER_SYMBOL(bsp_section_data_end)
|
||||||
LINKER_SYMBOL( bsp_section_bss_size)
|
LINKER_SYMBOL(bsp_section_data_size)
|
||||||
|
LINKER_SYMBOL(bsp_section_data_load_begin)
|
||||||
|
|
||||||
LINKER_SYMBOL( bsp_section_stack_start)
|
LINKER_SYMBOL(bsp_section_fast_begin)
|
||||||
LINKER_SYMBOL( bsp_section_stack_end)
|
LINKER_SYMBOL(bsp_section_fast_end)
|
||||||
LINKER_SYMBOL( bsp_section_stack_size)
|
LINKER_SYMBOL(bsp_section_fast_size)
|
||||||
|
LINKER_SYMBOL(bsp_section_fast_load_begin)
|
||||||
|
|
||||||
LINKER_SYMBOL( bsp_section_work_area_start)
|
LINKER_SYMBOL(bsp_section_bss_begin)
|
||||||
LINKER_SYMBOL( bsp_section_work_area_end)
|
LINKER_SYMBOL(bsp_section_bss_end)
|
||||||
LINKER_SYMBOL( bsp_section_work_area_size)
|
LINKER_SYMBOL(bsp_section_bss_size)
|
||||||
|
|
||||||
|
LINKER_SYMBOL(bsp_section_work_begin)
|
||||||
|
LINKER_SYMBOL(bsp_section_work_end)
|
||||||
|
LINKER_SYMBOL(bsp_section_work_size)
|
||||||
|
|
||||||
|
LINKER_SYMBOL(bsp_section_stack_begin)
|
||||||
|
LINKER_SYMBOL(bsp_section_stack_end)
|
||||||
|
LINKER_SYMBOL(bsp_section_stack_size)
|
||||||
|
|
||||||
#endif /* LIBBSP_ARM_SHARED_LINKER_SYMBOLS_H */
|
#endif /* LIBBSP_ARM_SHARED_LINKER_SYMBOLS_H */
|
||||||
|
|||||||
@@ -17,11 +17,6 @@
|
|||||||
#include <bsp.h>
|
#include <bsp.h>
|
||||||
#include <rtems/bspIo.h>
|
#include <rtems/bspIo.h>
|
||||||
|
|
||||||
/*
|
|
||||||
* default int vector
|
|
||||||
*/
|
|
||||||
extern void _ISR_Handler(void);
|
|
||||||
|
|
||||||
void default_int_handler(void)
|
void default_int_handler(void)
|
||||||
{
|
{
|
||||||
printk("raw_idt_notify has been called \n");
|
printk("raw_idt_notify has been called \n");
|
||||||
@@ -33,9 +28,8 @@ void rtems_irq_mngt_init(void)
|
|||||||
|
|
||||||
rtems_interrupt_disable(level);
|
rtems_interrupt_disable(level);
|
||||||
|
|
||||||
/* First, connect the ISR_Handler for IRQ and FIQ interrupts */
|
/* First, connect the ISR_Handler for IRQ interrupts */
|
||||||
_CPU_ISR_install_vector(ARM_EXCEPTION_IRQ, _ISR_Handler, NULL);
|
_CPU_ISR_install_vector(ARM_EXCEPTION_IRQ, arm_exc_interrupt, NULL);
|
||||||
_CPU_ISR_install_vector(ARM_EXCEPTION_FIQ, _ISR_Handler, NULL);
|
|
||||||
|
|
||||||
/* Initialize the INT at the BSP level */
|
/* Initialize the INT at the BSP level */
|
||||||
BSP_rtems_irq_mngt_init();
|
BSP_rtems_irq_mngt_init();
|
||||||
|
|||||||
@@ -16,11 +16,6 @@
|
|||||||
* LICENSE in this distribution or at http://www.rtems.com/license/LICENSE.
|
* LICENSE in this distribution or at http://www.rtems.com/license/LICENSE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#warning Call to boot_card has changed and needs checking.
|
|
||||||
#warning The call is "void boot_card(const char* cmdline);"
|
|
||||||
#warning You need to pass a NULL.
|
|
||||||
#warning Please check and remove these warnings.
|
|
||||||
|
|
||||||
#include <bsp/linker-symbols.h>
|
#include <bsp/linker-symbols.h>
|
||||||
#include <bsp/start.h>
|
#include <bsp/start.h>
|
||||||
|
|
||||||
@@ -47,7 +42,8 @@
|
|||||||
.equ PSR_F, 0x40
|
.equ PSR_F, 0x40
|
||||||
.equ PSR_T, 0x20
|
.equ PSR_T, 0x20
|
||||||
|
|
||||||
.section ".entry"
|
.arm
|
||||||
|
.section ".bsp_start", "x"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This is the exception vector table and the pointers to the default
|
* This is the exception vector table and the pointers to the default
|
||||||
@@ -120,49 +116,49 @@ start:
|
|||||||
/* Enter IRQ mode and set up the IRQ stack pointer */
|
/* Enter IRQ mode and set up the IRQ stack pointer */
|
||||||
mov r0, #(PSR_MODE_IRQ | PSR_I | PSR_F)
|
mov r0, #(PSR_MODE_IRQ | PSR_I | PSR_F)
|
||||||
msr cpsr, r0
|
msr cpsr, r0
|
||||||
ldr r1, =bsp_stack_irq_size
|
ldr sp, =bsp_stack_irq_end
|
||||||
ldr sp, =bsp_stack_irq_start
|
|
||||||
add sp, sp, r1
|
|
||||||
|
|
||||||
/* Enter FIQ mode and set up the FIQ stack pointer */
|
/* Enter FIQ mode and set up the FIQ stack pointer */
|
||||||
mov r0, #(PSR_MODE_FIQ | PSR_I | PSR_F)
|
mov r0, #(PSR_MODE_FIQ | PSR_I | PSR_F)
|
||||||
msr cpsr, r0
|
msr cpsr, r0
|
||||||
ldr r1, =bsp_stack_fiq_size
|
ldr sp, =bsp_stack_fiq_end
|
||||||
ldr sp, =bsp_stack_fiq_start
|
|
||||||
add sp, sp, r1
|
|
||||||
|
|
||||||
/* Enter ABT mode and set up the ABT stack pointer */
|
/* Enter ABT mode and set up the ABT stack pointer */
|
||||||
mov r0, #(PSR_MODE_ABT | PSR_I | PSR_F)
|
mov r0, #(PSR_MODE_ABT | PSR_I | PSR_F)
|
||||||
msr cpsr, r0
|
msr cpsr, r0
|
||||||
ldr r1, =bsp_stack_abt_size
|
ldr sp, =bsp_stack_abt_end
|
||||||
ldr sp, =bsp_stack_abt_start
|
|
||||||
add sp, sp, r1
|
|
||||||
|
|
||||||
/* Enter UNDEF mode and set up the UNDEF stack pointer */
|
/* Enter UNDEF mode and set up the UNDEF stack pointer */
|
||||||
mov r0, #(PSR_MODE_UNDEF | PSR_I | PSR_F)
|
mov r0, #(PSR_MODE_UNDEF | PSR_I | PSR_F)
|
||||||
msr cpsr, r0
|
msr cpsr, r0
|
||||||
ldr r1, =bsp_stack_undef_size
|
ldr sp, =bsp_stack_undef_end
|
||||||
ldr sp, =bsp_stack_undef_start
|
|
||||||
add sp, sp, r1
|
|
||||||
|
|
||||||
/* Enter SVC mode and set up the SVC stack pointer */
|
/* Enter SVC mode and set up the SVC stack pointer */
|
||||||
mov r0, #(PSR_MODE_SVC | PSR_I | PSR_F)
|
mov r0, #(PSR_MODE_SVC | PSR_I | PSR_F)
|
||||||
msr cpsr, r0
|
msr cpsr, r0
|
||||||
ldr r1, =bsp_stack_svc_size
|
ldr sp, =bsp_stack_svc_end
|
||||||
ldr sp, =bsp_stack_svc_start
|
|
||||||
add sp, sp, r1
|
|
||||||
|
|
||||||
/* Stay in SVC mode */
|
/* Stay in SVC mode */
|
||||||
|
|
||||||
/* Brach to start hook 0 */
|
/* Brach to start hook 0 */
|
||||||
|
#ifdef __thumb__
|
||||||
|
ldr r3, =bsp_start_hook_0
|
||||||
|
mov lr, pc
|
||||||
|
bx r3
|
||||||
|
.thumb
|
||||||
|
bx pc
|
||||||
|
nop
|
||||||
|
.arm
|
||||||
|
#else
|
||||||
bl bsp_start_hook_0
|
bl bsp_start_hook_0
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Initialize the exception vectors. This includes the exceptions
|
* Initialize the exception vectors. This includes the exceptions
|
||||||
* vectors and the pointers to the default exception handlers.
|
* vectors and the pointers to the default exception handlers.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ldr r0, =bsp_section_vector_start
|
ldr r0, =bsp_section_vector_begin
|
||||||
adr r1, vector_block
|
adr r1, vector_block
|
||||||
ldmia r1!, {r2-r9}
|
ldmia r1!, {r2-r9}
|
||||||
stmia r0!, {r2-r9}
|
stmia r0!, {r2-r9}
|
||||||
@@ -170,14 +166,45 @@ start:
|
|||||||
stmia r0!, {r2-r9}
|
stmia r0!, {r2-r9}
|
||||||
|
|
||||||
/* Brach to start hook 1 */
|
/* Brach to start hook 1 */
|
||||||
|
#ifdef __thumb__
|
||||||
|
ldr r3, =bsp_start_hook_1
|
||||||
|
mov lr, pc
|
||||||
|
bx r3
|
||||||
|
.thumb
|
||||||
|
bx pc
|
||||||
|
nop
|
||||||
|
.arm
|
||||||
|
#else
|
||||||
bl bsp_start_hook_1
|
bl bsp_start_hook_1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* Brach to boot card */
|
/* Brach to boot card */
|
||||||
|
mov r0, #0
|
||||||
|
#ifdef __thumb__
|
||||||
|
ldr r3, =boot_card
|
||||||
|
mov lr, pc
|
||||||
|
bx r3
|
||||||
|
.thumb
|
||||||
|
bx pc
|
||||||
|
nop
|
||||||
|
.arm
|
||||||
|
#else
|
||||||
bl boot_card
|
bl boot_card
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Branch to reset function */
|
/* Branch to reset function */
|
||||||
|
#ifdef __thumb__
|
||||||
|
ldr r3, =bsp_reset
|
||||||
|
mov lr, pc
|
||||||
|
bx r3
|
||||||
|
.thumb
|
||||||
|
bx pc
|
||||||
|
nop
|
||||||
|
.arm
|
||||||
|
#else
|
||||||
bl bsp_reset
|
bl bsp_reset
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Spin forever */
|
/* Spin forever */
|
||||||
|
|
||||||
|
|||||||
@@ -1,47 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @file
|
* @file
|
||||||
*
|
*
|
||||||
* @brief Linker command base file for configuration with internal and external
|
* @brief Linker command base file.
|
||||||
* RAM and optional ROM load.
|
|
||||||
*
|
|
||||||
* You need to add a linker command file to your board support package that
|
|
||||||
* includes this file at the end and provides the following definitions.
|
|
||||||
*
|
|
||||||
* Compulsory are the memory regions RAM_INT, RAM_EXT and NIRVANA.
|
|
||||||
* <pre>
|
|
||||||
* MEMORY {
|
|
||||||
* RAM_INT (AIW) : ORIGIN = 0x40000000, LENGTH = 64k
|
|
||||||
* RAM_EXT (AIW) : ORIGIN = 0xa0000000, LENGTH = 32M
|
|
||||||
* NIRVANA : ORIGIN = 0, LENGTH = 0
|
|
||||||
* }
|
|
||||||
* </pre>
|
|
||||||
*
|
|
||||||
* You may optionally provide ROM start and size values.
|
|
||||||
* <pre>
|
|
||||||
* bsp_rom_start = 0x80000000;
|
|
||||||
* bsp_rom_size = 0x01000000;
|
|
||||||
* </pre>
|
|
||||||
*
|
|
||||||
* Optionally you can enable the load to ROM. It is enabled then
|
|
||||||
* bsp_enable_rom_load is defined. The value is arbitrary.
|
|
||||||
* <pre>
|
|
||||||
* bsp_enable_rom_load = 1;
|
|
||||||
* </pre>
|
|
||||||
*
|
|
||||||
* Include the linker command base file. This file has to be installed in the
|
|
||||||
* same directory than your linker command file.
|
|
||||||
* <pre>
|
|
||||||
* INCLUDE linkcmds.base
|
|
||||||
* </pre>
|
|
||||||
*
|
|
||||||
* You may define optionally values for the following sizes:
|
|
||||||
* - bsp_ram_int_size
|
|
||||||
* - bsp_ram_ext_size
|
|
||||||
* - bsp_stack_abt_size
|
|
||||||
* - bsp_stack_fiq_size
|
|
||||||
* - bsp_stack_irq_size
|
|
||||||
* - bsp_stack_svc_size
|
|
||||||
* - bsp_stack_undef_size
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -62,51 +22,68 @@ OUTPUT_ARCH (arm)
|
|||||||
|
|
||||||
ENTRY (start)
|
ENTRY (start)
|
||||||
|
|
||||||
/*
|
|
||||||
* BSP: Symbols that may be defined externally. The minimum alignment
|
|
||||||
* requirement for regions is bsp_section_align.
|
|
||||||
*/
|
|
||||||
bsp_ram_int_size = DEFINED (bsp_ram_int_size) ? bsp_ram_int_size : LENGTH (RAM_INT);
|
|
||||||
|
|
||||||
bsp_ram_ext_size = DEFINED (bsp_ram_ext_size) ? bsp_ram_ext_size : LENGTH (RAM_EXT);
|
|
||||||
|
|
||||||
bsp_rom_start = DEFINED (bsp_rom_start) ? bsp_rom_start : 0;
|
|
||||||
|
|
||||||
bsp_rom_size = DEFINED (bsp_rom_size) ? bsp_rom_size : 0;
|
|
||||||
|
|
||||||
bsp_ram_ext_load_start = DEFINED (bsp_enable_rom_load) ? bsp_rom_start : bsp_ram_ext_start;
|
|
||||||
|
|
||||||
bsp_stack_abt_size = DEFINED (bsp_stack_abt_size) ? bsp_stack_abt_size : 128;
|
|
||||||
|
|
||||||
bsp_stack_fiq_size = DEFINED (bsp_stack_fiq_size) ? bsp_stack_fiq_size : 128;
|
|
||||||
|
|
||||||
bsp_stack_irq_size = DEFINED (bsp_stack_irq_size) ? bsp_stack_irq_size : 256;
|
|
||||||
|
|
||||||
bsp_stack_svc_size = DEFINED (bsp_stack_svc_size) ? bsp_stack_svc_size : 256;
|
|
||||||
|
|
||||||
bsp_stack_undef_size = DEFINED (bsp_stack_undef_size) ? bsp_stack_undef_size : 128;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* BSP: Global symbols
|
* BSP: Global symbols
|
||||||
*/
|
*/
|
||||||
bsp_ram_int_start = ORIGIN (RAM_INT);
|
|
||||||
bsp_ram_int_end = bsp_ram_int_start + bsp_ram_int_size;
|
|
||||||
|
|
||||||
bsp_ram_ext_start = ORIGIN (RAM_EXT);
|
bsp_section_align = 32;
|
||||||
bsp_ram_ext_end = bsp_ram_ext_start + bsp_ram_ext_size;
|
|
||||||
|
|
||||||
bsp_rom_end = bsp_rom_start + bsp_rom_size;
|
bsp_stack_align = 4;
|
||||||
|
|
||||||
bsp_section_align = 16;
|
bsp_region_text_begin = ORIGIN (REGION_TEXT);
|
||||||
|
bsp_region_text_size = LENGTH (REGION_TEXT);
|
||||||
|
bsp_region_text_end = bsp_region_text_begin + bsp_region_text_size;
|
||||||
|
|
||||||
bsp_stack_align = 16;
|
bsp_region_data_begin = ORIGIN (REGION_DATA);
|
||||||
|
bsp_region_data_size = LENGTH (REGION_DATA);
|
||||||
|
bsp_region_data_end = bsp_region_data_begin + bsp_region_data_size;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* BSP: Symbols that may be defined externally
|
||||||
|
*/
|
||||||
|
|
||||||
|
bsp_stack_abt_size = DEFINED (bsp_stack_abt_size) ? bsp_stack_abt_size : 128;
|
||||||
|
bsp_stack_abt_size = ALIGN (bsp_stack_abt_size, bsp_stack_align);
|
||||||
|
|
||||||
|
bsp_stack_fiq_size = DEFINED (bsp_stack_fiq_size) ? bsp_stack_fiq_size : 128;
|
||||||
|
bsp_stack_fiq_size = ALIGN (bsp_stack_fiq_size, bsp_stack_align);
|
||||||
|
|
||||||
|
bsp_stack_irq_size = DEFINED (bsp_stack_irq_size) ? bsp_stack_irq_size : 512;
|
||||||
|
bsp_stack_irq_size = ALIGN (bsp_stack_irq_size, bsp_stack_align);
|
||||||
|
|
||||||
|
bsp_stack_svc_size = DEFINED (bsp_stack_svc_size) ? bsp_stack_svc_size : 512;
|
||||||
|
bsp_stack_svc_size = ALIGN (bsp_stack_svc_size, bsp_stack_align);
|
||||||
|
|
||||||
|
bsp_stack_undef_size = DEFINED (bsp_stack_undef_size) ? bsp_stack_undef_size : 128;
|
||||||
|
bsp_stack_undef_size = ALIGN (bsp_stack_undef_size, bsp_stack_align);
|
||||||
|
|
||||||
SECTIONS {
|
SECTIONS {
|
||||||
|
.start : {
|
||||||
|
/*
|
||||||
|
* BSP: Begin of start section
|
||||||
|
*/
|
||||||
|
bsp_section_start_begin = .;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* BSP: System startup entry
|
||||||
|
*/
|
||||||
|
KEEP (*(.bsp_start))
|
||||||
|
|
||||||
|
. = ALIGN (bsp_section_align);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* BSP: End of start section
|
||||||
|
*/
|
||||||
|
bsp_section_start_end = .;
|
||||||
|
} > REGION_START AT > REGION_START
|
||||||
|
|
||||||
|
bsp_section_start_size = bsp_section_start_end - bsp_section_start_begin;
|
||||||
|
|
||||||
.vector : {
|
.vector : {
|
||||||
/*
|
/*
|
||||||
* BSP: Start of vector section
|
* BSP: Begin of vector section
|
||||||
*/
|
*/
|
||||||
bsp_section_vector_start = .;
|
bsp_section_vector_begin = .;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* BSP: Reserve space for the the exception vector table and
|
* BSP: Reserve space for the the exception vector table and
|
||||||
@@ -114,26 +91,57 @@ SECTIONS {
|
|||||||
*/
|
*/
|
||||||
. = . + 64;
|
. = . + 64;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* BSP: Reserve space for mode stacks
|
||||||
|
*/
|
||||||
|
|
||||||
|
. = ALIGN (bsp_stack_align);
|
||||||
|
|
||||||
|
bsp_stack_abt_begin = .;
|
||||||
|
. = . + bsp_stack_abt_size;
|
||||||
|
bsp_stack_abt_end = .;
|
||||||
|
|
||||||
|
bsp_stack_fiq_begin = .;
|
||||||
|
. = . + bsp_stack_fiq_size;
|
||||||
|
bsp_stack_fiq_end = .;
|
||||||
|
|
||||||
|
bsp_stack_irq_begin = .;
|
||||||
|
. = . + bsp_stack_irq_size;
|
||||||
|
bsp_stack_irq_end = .;
|
||||||
|
|
||||||
|
bsp_stack_svc_begin = .;
|
||||||
|
. = . + bsp_stack_svc_size;
|
||||||
|
bsp_stack_svc_end = .;
|
||||||
|
|
||||||
|
bsp_stack_undef_begin = .;
|
||||||
|
. = . + bsp_stack_undef_size;
|
||||||
|
bsp_stack_undef_end = .;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* BSP: Special vector data
|
||||||
|
*/
|
||||||
|
*(.bsp_vector)
|
||||||
|
|
||||||
. = ALIGN (bsp_section_align);
|
. = ALIGN (bsp_section_align);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* BSP: End of vector section
|
* BSP: End of vector section
|
||||||
*/
|
*/
|
||||||
bsp_section_vector_end = .;
|
bsp_section_vector_end = .;
|
||||||
} > RAM_INT
|
} > REGION_VECTOR AT > REGION_VECTOR
|
||||||
|
|
||||||
bsp_section_vector_size = bsp_section_vector_end - bsp_section_vector_start;
|
bsp_section_vector_size = bsp_section_vector_end - bsp_section_vector_begin;
|
||||||
|
|
||||||
.text : AT (bsp_ram_ext_load_start) {
|
.text : {
|
||||||
/*
|
/*
|
||||||
* BSP: Start of text section
|
* BSP: Begin of text section
|
||||||
*/
|
*/
|
||||||
bsp_section_text_start = .;
|
bsp_section_text_begin = .;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* BSP: System startup entry
|
* BSP: System startup entry
|
||||||
*/
|
*/
|
||||||
KEEP (*(.entry))
|
KEEP (*(.bsp_start))
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* BSP: Moved into .text from .init
|
* BSP: Moved into .text from .init
|
||||||
@@ -166,8 +174,6 @@ SECTIONS {
|
|||||||
/*
|
/*
|
||||||
* BSP: Moved into .text from .*
|
* BSP: Moved into .text from .*
|
||||||
*/
|
*/
|
||||||
*(.rodata .rodata.* .gnu.linkonce.r.*)
|
|
||||||
*(.rodata1)
|
|
||||||
*(.eh_frame_hdr)
|
*(.eh_frame_hdr)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -186,15 +192,45 @@ SECTIONS {
|
|||||||
* BSP: End of text section
|
* BSP: End of text section
|
||||||
*/
|
*/
|
||||||
bsp_section_text_end = .;
|
bsp_section_text_end = .;
|
||||||
} > RAM_EXT
|
} > REGION_TEXT AT > REGION_TEXT_LOAD
|
||||||
|
|
||||||
bsp_section_text_size = bsp_section_text_end - bsp_section_text_start;
|
bsp_section_text_size = bsp_section_text_end - bsp_section_text_begin;
|
||||||
|
|
||||||
|
bsp_section_text_load_begin = LOADADDR (.text);
|
||||||
|
|
||||||
|
.rodata : {
|
||||||
|
/*
|
||||||
|
* BSP: Begin of rodata section
|
||||||
|
*/
|
||||||
|
bsp_section_rodata_begin = .;
|
||||||
|
|
||||||
|
__start_set_modmetadata_set = .;
|
||||||
|
*(set_modmetadata_set);
|
||||||
|
__stop_set_modmetadata_set = .;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* BSP: Moved into .rodata from .*
|
||||||
|
*/
|
||||||
|
*(.rodata .rodata.* .gnu.linkonce.r.*)
|
||||||
|
*(.rodata1)
|
||||||
|
|
||||||
|
. = ALIGN (bsp_section_align);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* BSP: End of rodata section
|
||||||
|
*/
|
||||||
|
bsp_section_rodata_end = .;
|
||||||
|
} > REGION_RODATA AT > REGION_RODATA_LOAD
|
||||||
|
|
||||||
|
bsp_section_rodata_size = bsp_section_rodata_end - bsp_section_rodata_begin;
|
||||||
|
|
||||||
|
bsp_section_rodata_load_begin = LOADADDR (.rodata);
|
||||||
|
|
||||||
.data : {
|
.data : {
|
||||||
/*
|
/*
|
||||||
* BSP: Start of data section
|
* BSP: Begin of data section
|
||||||
*/
|
*/
|
||||||
bsp_section_data_start = .;
|
bsp_section_data_begin = .;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* BSP: Moved into .data from .ctors
|
* BSP: Moved into .data from .ctors
|
||||||
@@ -245,15 +281,31 @@ SECTIONS {
|
|||||||
* BSP: End of data section
|
* BSP: End of data section
|
||||||
*/
|
*/
|
||||||
bsp_section_data_end = .;
|
bsp_section_data_end = .;
|
||||||
} > RAM_EXT
|
} > REGION_DATA AT > REGION_DATA_LOAD
|
||||||
|
|
||||||
bsp_section_data_size = bsp_section_data_end - bsp_section_data_start;
|
bsp_section_data_size = bsp_section_data_end - bsp_section_data_begin;
|
||||||
|
|
||||||
|
bsp_section_data_load_begin = LOADADDR (.data);
|
||||||
|
|
||||||
|
.fast : {
|
||||||
|
bsp_section_fast_begin = .;
|
||||||
|
|
||||||
|
*(.fast)
|
||||||
|
|
||||||
|
. = ALIGN (bsp_section_align);
|
||||||
|
|
||||||
|
bsp_section_fast_end = .;
|
||||||
|
} > REGION_FAST AT > REGION_FAST_LOAD
|
||||||
|
|
||||||
|
bsp_section_fast_size = bsp_section_fast_end - bsp_section_fast_begin;
|
||||||
|
|
||||||
|
bsp_section_fast_load_begin = LOADADDR (.fast);
|
||||||
|
|
||||||
.bss : {
|
.bss : {
|
||||||
/*
|
/*
|
||||||
* BSP: Start of bss section
|
* BSP: Begin of bss section
|
||||||
*/
|
*/
|
||||||
bsp_section_bss_start = .;
|
bsp_section_bss_begin = .;
|
||||||
|
|
||||||
*(COMMON)
|
*(COMMON)
|
||||||
*(.dynbss)
|
*(.dynbss)
|
||||||
@@ -265,73 +317,53 @@ SECTIONS {
|
|||||||
* BSP: End of bss section
|
* BSP: End of bss section
|
||||||
*/
|
*/
|
||||||
bsp_section_bss_end = .;
|
bsp_section_bss_end = .;
|
||||||
} > RAM_EXT
|
} > REGION_BSS AT > REGION_BSS
|
||||||
|
|
||||||
bsp_section_bss_size = bsp_section_bss_end - bsp_section_bss_start;
|
bsp_section_bss_size = bsp_section_bss_end - bsp_section_bss_begin;
|
||||||
|
|
||||||
|
.work : {
|
||||||
|
/*
|
||||||
|
* BSP: Begin of work section. The work section will occupy
|
||||||
|
* the remaining REGION_WORK region and contains the RTEMS work
|
||||||
|
* space and heap.
|
||||||
|
*/
|
||||||
|
bsp_section_work_begin = .;
|
||||||
|
|
||||||
|
. += ORIGIN (REGION_WORK) + LENGTH (REGION_WORK) - ABSOLUTE (.);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* BSP: End of work section
|
||||||
|
*/
|
||||||
|
bsp_section_work_end = .;
|
||||||
|
} > REGION_WORK AT > REGION_WORK
|
||||||
|
|
||||||
|
bsp_section_work_size = bsp_section_work_end - bsp_section_work_begin;
|
||||||
|
|
||||||
.stack : {
|
.stack : {
|
||||||
/*
|
/*
|
||||||
* BSP: Start of stack section
|
* BSP: Begin of stack section. The stack section will occupy
|
||||||
|
* the remaining REGION_STACK region and may contain the task
|
||||||
|
* stacks. Depending on the region distribution this section
|
||||||
|
* may be of zero size.
|
||||||
*/
|
*/
|
||||||
bsp_section_stack_start = .;
|
bsp_section_stack_begin = .;
|
||||||
|
|
||||||
. = ALIGN (bsp_stack_align);
|
. += ORIGIN (REGION_STACK) + LENGTH (REGION_STACK) - ABSOLUTE (.);
|
||||||
bsp_stack_abt_start = .;
|
|
||||||
. = . + bsp_stack_abt_size;
|
|
||||||
|
|
||||||
. = ALIGN (bsp_stack_align);
|
|
||||||
bsp_stack_fiq_start = .;
|
|
||||||
. = . + bsp_stack_fiq_size;
|
|
||||||
|
|
||||||
. = ALIGN (bsp_stack_align);
|
|
||||||
bsp_stack_irq_start = .;
|
|
||||||
. = . + bsp_stack_irq_size;
|
|
||||||
|
|
||||||
. = ALIGN (bsp_stack_align);
|
|
||||||
bsp_stack_svc_start = .;
|
|
||||||
. = . + bsp_stack_svc_size;
|
|
||||||
|
|
||||||
. = ALIGN (bsp_stack_align);
|
|
||||||
bsp_stack_undef_start = .;
|
|
||||||
. = . + bsp_stack_undef_size;
|
|
||||||
|
|
||||||
. = ALIGN (bsp_section_align);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* BSP: End of stack section
|
* BSP: End of stack section
|
||||||
*/
|
*/
|
||||||
bsp_section_stack_end = .;
|
bsp_section_stack_end = .;
|
||||||
} > RAM_INT
|
} > REGION_STACK AT > REGION_STACK
|
||||||
|
|
||||||
bsp_section_stack_size = bsp_section_stack_end - bsp_section_stack_start;
|
bsp_section_stack_size = bsp_section_stack_end - bsp_section_stack_begin;
|
||||||
|
|
||||||
.work_area : {
|
|
||||||
/*
|
|
||||||
* BSP: Start of work area. The work area will occupy the remaining
|
|
||||||
* RAM_EXT region and contains the RTEMS work space and heap. We cannot
|
|
||||||
* assign the region end directly since this leads to a region full
|
|
||||||
* warning.
|
|
||||||
*/
|
|
||||||
bsp_section_work_area_start = .;
|
|
||||||
|
|
||||||
. = bsp_ram_ext_end - 4;
|
|
||||||
|
|
||||||
. = ALIGN (bsp_section_align);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* BSP: End of work area
|
|
||||||
*/
|
|
||||||
bsp_section_work_area_end = .;
|
|
||||||
} > RAM_EXT
|
|
||||||
|
|
||||||
bsp_section_work_area_size = bsp_section_work_area_end - bsp_section_work_area_start;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* BSP: External symbols (FIXME)
|
* BSP: External symbols (FIXME)
|
||||||
*/
|
*/
|
||||||
RamBase = bsp_ram_ext_start;
|
RamBase = ORIGIN (REGION_WORK);
|
||||||
RamSize = bsp_ram_ext_size;
|
RamSize = LENGTH (REGION_WORK);
|
||||||
WorkAreaBase = bsp_section_work_area_start;
|
WorkAreaBase = bsp_section_work_begin;
|
||||||
HeapSize = 0;
|
HeapSize = 0;
|
||||||
|
|
||||||
/* Stabs debugging sections. */
|
/* Stabs debugging sections. */
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
|
2009-05-27 Sebastian Huber <sebastian.huber@embedded-brains.de>
|
||||||
|
|
||||||
|
* include/stackalloc.h, src/stackalloc.c: New files.
|
||||||
|
|
||||||
2009-07-06 Joel Sherrill <joel.sherrill@oarcorp.com>
|
2009-07-06 Joel Sherrill <joel.sherrill@oarcorp.com>
|
||||||
|
|
||||||
* setvec.c: Add CVS Id.
|
* setvec.c: Add CVS Id.
|
||||||
|
|||||||
Reference in New Issue
Block a user