summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/powerpc
diff options
context:
space:
mode:
authorThomas Doerfler <Thomas.Doerfler@embedded-brains.de>2010-04-07 06:44:41 +0000
committerThomas Doerfler <Thomas.Doerfler@embedded-brains.de>2010-04-07 06:44:41 +0000
commit08013e8612a80079dac6d4c3f800fbd1438847ac (patch)
treefeb049daa72f878a65976fd42cfd787e58778e8e /c/src/lib/libbsp/powerpc
parentRegenerate. (diff)
downloadrtems-08013e8612a80079dac6d4c3f800fbd1438847ac.tar.bz2
fixed to support GW_LCFM
Diffstat (limited to 'c/src/lib/libbsp/powerpc')
-rw-r--r--c/src/lib/libbsp/powerpc/mpc55xxevb/ChangeLog11
-rw-r--r--c/src/lib/libbsp/powerpc/mpc55xxevb/Makefile.am3
-rw-r--r--c/src/lib/libbsp/powerpc/mpc55xxevb/clock/clock-config.c2
-rw-r--r--c/src/lib/libbsp/powerpc/mpc55xxevb/configure.ac43
-rw-r--r--c/src/lib/libbsp/powerpc/mpc55xxevb/make/custom/gwlcfm.cfg4
-rw-r--r--c/src/lib/libbsp/powerpc/mpc55xxevb/make/custom/mpc5566evb.cfg4
-rw-r--r--c/src/lib/libbsp/powerpc/mpc55xxevb/make/custom/mpc55xx.inc (renamed from c/src/lib/libbsp/powerpc/mpc55xxevb/make/custom/mpc55xx.cfg)2
-rw-r--r--c/src/lib/libbsp/powerpc/mpc55xxevb/preinstall.am16
-rw-r--r--c/src/lib/libbsp/powerpc/mpc55xxevb/startup/bspgetworkarea.c20
-rw-r--r--c/src/lib/libbsp/powerpc/mpc55xxevb/startup/bspstart.c121
-rw-r--r--c/src/lib/libbsp/powerpc/mpc55xxevb/startup/linkcmds279
-rw-r--r--c/src/lib/libbsp/powerpc/mpc55xxevb/startup/linkcmds.base284
-rw-r--r--c/src/lib/libbsp/powerpc/mpc55xxevb/startup/linkcmds.gwlcfm31
-rw-r--r--c/src/lib/libbsp/powerpc/mpc55xxevb/startup/linkcmds.memory21
-rw-r--r--c/src/lib/libbsp/powerpc/mpc55xxevb/startup/linkcmds.mpc5566evb31
-rw-r--r--c/src/lib/libbsp/powerpc/mpc55xxevb/startup/start.S17
16 files changed, 534 insertions, 355 deletions
diff --git a/c/src/lib/libbsp/powerpc/mpc55xxevb/ChangeLog b/c/src/lib/libbsp/powerpc/mpc55xxevb/ChangeLog
index f09455cc65..52b8cadf7a 100644
--- a/c/src/lib/libbsp/powerpc/mpc55xxevb/ChangeLog
+++ b/c/src/lib/libbsp/powerpc/mpc55xxevb/ChangeLog
@@ -1,3 +1,14 @@
+2010-04-07 Thomas Doerfler <Thomas.Doerfler@embedded-brains.de>
+ * Makefile.am, configure.ac, preinstall.am, clock/clock-config.c,
+ make/custom/gwlcfm.cfg, make/custom/mpc5566evb.cfg,
+ startup/bspgetworkarea.c, startup/bspstart.c, startup/linkcmds,
+ startup/start.S: fix GW_LCFM support
+ * make/custom/mpc55xx.cfg, startup/linkcmds.memory: removed to get
+ better structure
+ * make/custom/mpc55xx.inc, startup/linkcmds.base,
+ startup/linkcmds.gwlcfm, startup/linkcmds.mpc5566evb: added to
+ have better structure
+
2010-03-27 Thomas Doerfler <Thomas.Doerfler@embedded-brains.de>
* network/smsc9218i.c tests/tests.c: Removed warnings
diff --git a/c/src/lib/libbsp/powerpc/mpc55xxevb/Makefile.am b/c/src/lib/libbsp/powerpc/mpc55xxevb/Makefile.am
index a099f01d8f..4e01e9c132 100644
--- a/c/src/lib/libbsp/powerpc/mpc55xxevb/Makefile.am
+++ b/c/src/lib/libbsp/powerpc/mpc55xxevb/Makefile.am
@@ -23,7 +23,8 @@ libbspstart_a_SOURCES += ../shared/start/rtems_crti.S
project_lib_DATA += rtems_crti.$(OBJEXT)
# Link commands
-dist_project_lib_DATA += startup/linkcmds startup/linkcmds.memory
+dist_project_lib_DATA += startup/linkcmds.gwlcfm startup/linkcmds.mpc5566evb \
+ startup/linkcmds.base
noinst_LIBRARIES += libbsp.a
libbsp_a_SOURCES =
diff --git a/c/src/lib/libbsp/powerpc/mpc55xxevb/clock/clock-config.c b/c/src/lib/libbsp/powerpc/mpc55xxevb/clock/clock-config.c
index a968a3e5ef..34dd07a888 100644
--- a/c/src/lib/libbsp/powerpc/mpc55xxevb/clock/clock-config.c
+++ b/c/src/lib/libbsp/powerpc/mpc55xxevb/clock/clock-config.c
@@ -103,7 +103,7 @@ static void mpc55xx_clock_initialize( void)
regs->ALTCADR.R = 0;
/* Set control register */
- ccr.B.MODE = MPC55XX_EMIOS_MODE_MC_UP_INT_CLK;
+ ccr.B.MODE = MPC55XX_EMIOS_MODE_MCB_UP_INT_CLK;
ccr.B.UCPREN = 1;
ccr.B.FEN = 1;
ccr.B.FREN = 1;
diff --git a/c/src/lib/libbsp/powerpc/mpc55xxevb/configure.ac b/c/src/lib/libbsp/powerpc/mpc55xxevb/configure.ac
index 303367629d..69275112c1 100644
--- a/c/src/lib/libbsp/powerpc/mpc55xxevb/configure.ac
+++ b/c/src/lib/libbsp/powerpc/mpc55xxevb/configure.ac
@@ -23,23 +23,37 @@ RTEMS_PROG_CCAS
RTEMS_CHECK_NETWORKING
AM_CONDITIONAL(HAS_NETWORKING,test "$HAS_NETWORKING" = "yes")
+RTEMS_BSPOPTS_SET([DATA_CACHE_ENABLE],[gwlcfm],[0])
+RTEMS_BSPOPTS_SET([DATA_CACHE_ENABLE],[mpc5566evb],[1])
+RTEMS_BSPOPTS_SET([DATA_CACHE_ENABLE],[*],[1])
+RTEMS_BSPOPTS_HELP([DATA_CACHE_ENABLE],
+[If defined, the data cache will be enabled after address translation
+ is turned on.])
+
+RTEMS_BSPOPTS_SET([INSTRUCTION_CACHE_ENABLE],[gwlcfm],[0])
+RTEMS_BSPOPTS_SET([INSTRUCTION_CACHE_ENABLE],[mpc5566evb],[1])
+RTEMS_BSPOPTS_SET([INSTRUCTION_CACHE_ENABLE],[*],[1])
+RTEMS_BSPOPTS_HELP([INSTRUCTION_CACHE_ENABLE],
+[If defined, the instruction cache will be enabled after address translation
+ is turned on.])
+
RTEMS_BSPOPTS_SET([UARTS_USE_TERMIOS],[*],[0])
RTEMS_BSPOPTS_HELP([UARTS_USE_TERMIOS],
[Define to 1 if you want termios support for every port.
Termios support is independent of the choice of UART I/O mode.])
-RTEMS_BSPOPTS_SET([CONSOLE_MINOR],[GWLCFM],[MPC55XX_ESCI_A_MINOR])
+RTEMS_BSPOPTS_SET([CONSOLE_MINOR],[gwlcfm],[MPC55XX_ESCI_A_MINOR])
RTEMS_BSPOPTS_SET([CONSOLE_MINOR],[*] ,[MPC55XX_ESCI_A_MINOR])
RTEMS_BSPOPTS_HELP([CONSOLE_MINOR],
[Must be defined to be one of MPC55XX_ESCI_A_MINOR or MPC55XX_ESCI_B_MINOR. Determines which
device will be registered as /dev/console.])
-RTEMS_BSPOPTS_SET([UARTS_IO_MODE],[GWLCFM],[1])
+RTEMS_BSPOPTS_SET([UARTS_IO_MODE],[gwlcfm],[1])
RTEMS_BSPOPTS_SET([UARTS_IO_MODE],[*] ,[0])
RTEMS_BSPOPTS_HELP([UARTS_IO_MODE],
[Define to 1 if you want interrupt-driven I/O for the SCI ports.])
-RTEMS_BSPOPTS_SET([PRINTK_MINOR],[GWLCFM],[MPC55XX_ESCI_A_MINOR])
+RTEMS_BSPOPTS_SET([PRINTK_MINOR],[gwlcfm],[MPC55XX_ESCI_A_MINOR])
RTEMS_BSPOPTS_SET([PRINTK_MINOR],[*] ,[MPC55XX_ESCI_B_MINOR])
RTEMS_BSPOPTS_HELP([PRINTK_MINOR],
[Must be defined to be one of MPC55XX_ESCI_A_MINOR or MPC55XX_ESCI_B_MINOR. Determines which
@@ -47,33 +61,42 @@ RTEMS_BSPOPTS_HELP([PRINTK_MINOR],
I/O. Don't open the printk port from RTEMS unless also using polled I/O
for the SCI ports.])
-RTEMS_BSPOPTS_SET([MPC55XX_FMPLL_REF_CLOCK],[GWLCFM],[40000000])
+RTEMS_BSPOPTS_SET([MPC55XX_FMPLL_REF_CLOCK],[gwlcfm],[40000000])
RTEMS_BSPOPTS_SET([MPC55XX_FMPLL_REF_CLOCK],[*] ,[8000000])
RTEMS_BSPOPTS_HELP([MPC55XX_FMPLL_REF_CLOCK],
[Must be defined to be the external reference clock (in Hz)
for clock generation])
-RTEMS_BSPOPTS_SET([MPC55XX_FMPLL_CLK_OUT],[GWLCFM],[66000000])
+RTEMS_BSPOPTS_SET([MPC55XX_FMPLL_CLK_OUT],[gwlcfm],[66000000])
RTEMS_BSPOPTS_SET([MPC55XX_FMPLL_CLK_OUT],[*] ,[128000000])
-RTEMS_BSPOPTS_HELP([MPC55XX_FMPLL_REF_CLOCK],
+RTEMS_BSPOPTS_HELP([MPC55XX_FMPLL_CLK_OUT],
[Must be defined to be the PLL output clock (in Hz) for clock generation])
-RTEMS_BSPOPTS_SET([MPC55XX_FMPLL_PREDIV],[GWLCFM],[10])
+RTEMS_BSPOPTS_SET([MPC55XX_FMPLL_PREDIV],[gwlcfm],[10])
RTEMS_BSPOPTS_SET([MPC55XX_FMPLL_PREDIV],[*] ,[1])
RTEMS_BSPOPTS_HELP([MPC55XX_FMPLL_PREDIV],
[Must be defined to be the PLL predivider factor for clock generation])
-RTEMS_BSPOPTS_SET([MPC55XX_FMPLL_MFD],[GWLCFM],[99])
+RTEMS_BSPOPTS_SET([MPC55XX_FMPLL_MFD],[gwlcfm],[99])
RTEMS_BSPOPTS_SET([MPC55XX_FMPLL_MFD],[*] ,[12])
RTEMS_BSPOPTS_HELP([MPC55XX_FMPLL_MFD],
[Must be defined to be the PLL multiplication factor for clock generation])
+RTEMS_BSPOPTS_SET([MPC55XX_EMIOS_PRESCALER],[gwlcfm],[66])
+RTEMS_BSPOPTS_SET([MPC55XX_EMIOS_PRESCALER],[*] ,[0])
+RTEMS_BSPOPTS_HELP([MPC55XX_EMIOS_PRESCALER],
+[Must be defined to set the EMIOS prescaler])
+
+RTEMS_BSPOPTS_SET([MPC55XX_CHIP_DERIVATE],[mpc5566evb],[5566])
+RTEMS_BSPOPTS_SET([MPC55XX_CHIP_DERIVATE],[gwlcfm] ,[5516])
RTEMS_BSPOPTS_SET([MPC55XX_CHIP_DERIVATE],[*] ,[5554])
-RTEMS_BSPOPTS_SET([MPC55XX_CHIP_DERIVATE],[MPC5566EVB],[5566])
-RTEMS_BSPOPTS_SET([MPC55XX_CHIP_DERIVATE],[GWLCFM] ,[5516])
RTEMS_BSPOPTS_HELP([MPC55XX_CHIP_DERIVATE],
[specifies the chip derivate in use (e.g. 5554 for MPC5554)])
+RTEMS_BSPOPTS_SET([BOARD_GWLCFM],[gwlcfm],[1])
+RTEMS_BSPOPTS_HELP([BOARD_GWLCFM],
+[If defined, use custom settings of for the GW_LCFM board])
+
AC_CONFIG_FILES([Makefile
include/bspopts.h])
diff --git a/c/src/lib/libbsp/powerpc/mpc55xxevb/make/custom/gwlcfm.cfg b/c/src/lib/libbsp/powerpc/mpc55xxevb/make/custom/gwlcfm.cfg
index 084d1e772e..1b564425e1 100644
--- a/c/src/lib/libbsp/powerpc/mpc55xxevb/make/custom/gwlcfm.cfg
+++ b/c/src/lib/libbsp/powerpc/mpc55xxevb/make/custom/gwlcfm.cfg
@@ -7,4 +7,6 @@
# @brief configuration file for the GWLCFM MPC5516 board
#
-include $(RTEMS_ROOT)/make/custom/mpc55xx.cfg
+RTEMS_LINKCMDS=linkcmds.gwlcfm
+
+include $(RTEMS_ROOT)/make/custom/mpc55xx.inc
diff --git a/c/src/lib/libbsp/powerpc/mpc55xxevb/make/custom/mpc5566evb.cfg b/c/src/lib/libbsp/powerpc/mpc55xxevb/make/custom/mpc5566evb.cfg
index 1272791f24..19f887a374 100644
--- a/c/src/lib/libbsp/powerpc/mpc55xxevb/make/custom/mpc5566evb.cfg
+++ b/c/src/lib/libbsp/powerpc/mpc55xxevb/make/custom/mpc5566evb.cfg
@@ -7,4 +7,6 @@
# @brief Configuration file for MPC5566 evaluation board.
#
-include $(RTEMS_ROOT)/make/custom/mpc55xx.cfg
+RTEMS_LINKCMDS=linkcmds.mpc5566evb
+
+include $(RTEMS_ROOT)/make/custom/mpc55xx.inc
diff --git a/c/src/lib/libbsp/powerpc/mpc55xxevb/make/custom/mpc55xx.cfg b/c/src/lib/libbsp/powerpc/mpc55xxevb/make/custom/mpc55xx.inc
index faf493431f..225995c7e4 100644
--- a/c/src/lib/libbsp/powerpc/mpc55xxevb/make/custom/mpc55xx.cfg
+++ b/c/src/lib/libbsp/powerpc/mpc55xxevb/make/custom/mpc55xx.inc
@@ -18,3 +18,5 @@ CPU_CFLAGS = -mcpu=8540 -meabi -msdata -fno-common -msoft-float \
-D__ppc_generic -mstrict-align
CFLAGS_OPTIMIZE_V = -O2 -g -fno-keep-inline-functions
+
+LDFLAGS += -qnolinkcmds -T $(RTEMS_LINKCMDS)
diff --git a/c/src/lib/libbsp/powerpc/mpc55xxevb/preinstall.am b/c/src/lib/libbsp/powerpc/mpc55xxevb/preinstall.am
index 4b20c47566..c5b15b6943 100644
--- a/c/src/lib/libbsp/powerpc/mpc55xxevb/preinstall.am
+++ b/c/src/lib/libbsp/powerpc/mpc55xxevb/preinstall.am
@@ -49,13 +49,17 @@ $(PROJECT_LIB)/rtems_crti.$(OBJEXT): rtems_crti.$(OBJEXT) $(PROJECT_LIB)/$(dirst
$(INSTALL_DATA) $< $(PROJECT_LIB)/rtems_crti.$(OBJEXT)
TMPINSTALL_FILES += $(PROJECT_LIB)/rtems_crti.$(OBJEXT)
-$(PROJECT_LIB)/linkcmds: startup/linkcmds $(PROJECT_LIB)/$(dirstamp)
- $(INSTALL_DATA) $< $(PROJECT_LIB)/linkcmds
-PREINSTALL_FILES += $(PROJECT_LIB)/linkcmds
+$(PROJECT_LIB)/linkcmds.gwlcfm: startup/linkcmds.gwlcfm $(PROJECT_LIB)/$(dirstamp)
+ $(INSTALL_DATA) $< $(PROJECT_LIB)/linkcmds.gwlcfm
+PREINSTALL_FILES += $(PROJECT_LIB)/linkcmds.gwlcfm
-$(PROJECT_LIB)/linkcmds.memory: startup/linkcmds.memory $(PROJECT_LIB)/$(dirstamp)
- $(INSTALL_DATA) $< $(PROJECT_LIB)/linkcmds.memory
-PREINSTALL_FILES += $(PROJECT_LIB)/linkcmds.memory
+$(PROJECT_LIB)/linkcmds.mpc5566evb: startup/linkcmds.mpc5566evb $(PROJECT_LIB)/$(dirstamp)
+ $(INSTALL_DATA) $< $(PROJECT_LIB)/linkcmds.mpc5566evb
+PREINSTALL_FILES += $(PROJECT_LIB)/linkcmds.mpc5566evb
+
+$(PROJECT_LIB)/linkcmds.base: startup/linkcmds.base $(PROJECT_LIB)/$(dirstamp)
+ $(INSTALL_DATA) $< $(PROJECT_LIB)/linkcmds.base
+PREINSTALL_FILES += $(PROJECT_LIB)/linkcmds.base
$(PROJECT_INCLUDE)/bsp.h: include/bsp.h $(PROJECT_INCLUDE)/$(dirstamp)
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp.h
diff --git a/c/src/lib/libbsp/powerpc/mpc55xxevb/startup/bspgetworkarea.c b/c/src/lib/libbsp/powerpc/mpc55xxevb/startup/bspgetworkarea.c
index 3d7aba56dd..f7d2eca157 100644
--- a/c/src/lib/libbsp/powerpc/mpc55xxevb/startup/bspgetworkarea.c
+++ b/c/src/lib/libbsp/powerpc/mpc55xxevb/startup/bspgetworkarea.c
@@ -25,11 +25,9 @@
#define MPC55XX_INTERRUPT_STACK_SIZE 0x1000
/* Symbols defined in linker command file */
-LINKER_SYMBOL(bsp_ram_start);
-LINKER_SYMBOL(bsp_ram_end);
-LINKER_SYMBOL(bsp_external_ram_start);
-LINKER_SYMBOL(bsp_external_ram_size);
-LINKER_SYMBOL(bsp_section_bss_end);
+LINKER_SYMBOL(bsp_workspace_start);
+LINKER_SYMBOL(bsp_workspace_end);
+LINKER_SYMBOL(bsp_external_ram_end);
void bsp_get_work_area(
void **work_area_start,
@@ -38,9 +36,11 @@ void bsp_get_work_area(
uintptr_t *heap_size
)
{
- *work_area_start = bsp_section_bss_end;
- *work_area_size = bsp_ram_end - 2 *
- MPC55XX_INTERRUPT_STACK_SIZE - bsp_section_bss_end;
- *heap_start = bsp_external_ram_start;
- *heap_size = (uintptr_t) bsp_external_ram_size;
+ size_t free_ram_size;
+ *work_area_start = bsp_workspace_start;
+
+ free_ram_size = (uint8_t *)bsp_external_ram_end - (uint8_t *)*work_area_start;
+ *work_area_size = (free_ram_size / 2);
+ *heap_start = (void *)((uint8_t *)*work_area_start + *work_area_size);
+ *heap_size = (free_ram_size / 2);
}
diff --git a/c/src/lib/libbsp/powerpc/mpc55xxevb/startup/bspstart.c b/c/src/lib/libbsp/powerpc/mpc55xxevb/startup/bspstart.c
index 76cb8fef2e..4835c93ddf 100644
--- a/c/src/lib/libbsp/powerpc/mpc55xxevb/startup/bspstart.c
+++ b/c/src/lib/libbsp/powerpc/mpc55xxevb/startup/bspstart.c
@@ -159,7 +159,7 @@ const struct fmpll_syncr_vals_t {
#endif /* ((MPC55XX_CHIP_DERIVATE>=5510) && (MPC55XX_CHIP_DERIVATE<=5517)) */
-#if defined(GWLCFM)
+#if defined(BOARD_GWLCFM)
static const mpc55xx_siu_pcr_entry_t siu_pcr_list[] = {
{ 0,16,{.B.PA = 1, .B.WPE = 0}}, /* PA[ 0..15] analog input */
{ 16, 4,{.B.PA = 0,.B.OBE = 1,.B.WPE = 0}}, /* PB[ 0.. 4] LED/CAN_STBN out */
@@ -195,15 +195,19 @@ static const mpc55xx_siu_pcr_entry_t siu_pcr_list[] = {
{ 58, 4,{.B.PA = 0,.B.OBE = 1,.B.WPE = 0}}, /* PD[10..13] LS_CAN_EN/LED out*/
{ 62, 4,{.B.PA = 0,.B.IBE = 1,.B.WPE = 0}}, /* PD[14..15] USB_FLGA/B in */
- { 64, 3,{.B.PA = 3,.B.IBE = 1,.B.WPE = 0}}, /* PE[ 0.. 2] MLBCLK/SI/DI in */
- { 67, 2,{.B.PA = 3,.B.OBE = 1,.B.WPE = 0}}, /* PE[ 3.. 4] MLBSO/DO out*/
- { 69, 1,{.B.PA = 3,.B.IBE = 1,.B.WPE = 0}}, /* PE[ 5.. 5] MLBSLOT in */
- { 70, 1,{.B.PA = 1,.B.OBE = 1,.B.WPE = 0}}, /* PE[ 6.. 6] CLKOUT out*/
- { 80, 1,{.B.PA = 1,.B.OBE = 1,.B.WPE = 0}}, /* PF[ 0.. 0] RD_WR out*/
- { 81, 1,{.B.PA = 0,.B.IBE = 1,.B.WPE = 0}}, /* PF[ 1.. 1] (nc) in */
- { 82,14,{.B.PA = 1,.B.OBE = 1,.B.WPE = 0}}, /* PF[ 2..14] ADDR/CS/... out*/
- { 96,16,{.B.PA = 1,.B.IBE = 1,.B.OBE = 1,.B.WPE = 0}},
- /* PG[ 0..15] AD16..31 in/out*/
+ { 64, 3,{.B.PA = 3,.B.SRC = 1,.B.WPE = 0}}, /* PE[ 0.. 2] MLBCLK/SI/DI in */
+ { 67, 2,{.B.PA = 3,.B.SRC = 1,.B.WPE = 0}}, /* PE[ 3.. 4] MLBSO/DO out*/
+ { 69, 1,{.B.PA = 3,.B.SRC = 1,.B.WPE = 0}}, /* PE[ 5.. 5] MLBSLOT in */
+ { 70, 1,{.B.PA = 1,.B.SRC = 3,.B.WPE = 0}}, /* PE[ 6.. 6] CLKOUT out*/
+
+ { 80, 1,{.B.PA = 1,.B.SRC = 1,.B.WPE = 0}}, /* PF[ 0.. 0] RD_WR out*/
+ { 81, 1,{.B.PA = 0,.B.SRC = 0,.B.WPE = 0}}, /* PF[ 1.. 1] (nc) in */
+ { 82, 8,{.B.PA = 2,.B.SRC = 1,.B.WPE = 0}}, /* PF[ 2..11] ADDR[8..15] out*/
+ { 90, 2,{.B.PA = 1,.B.SRC = 1,.B.WPE = 0}}, /* PF[ 2..11] CS[0..1] out*/
+ { 92, 1,{.B.PA = 3,.B.SRC = 3,.B.WPE = 0}}, /* PF[ 12] ALE out*/
+ { 93, 3,{.B.PA = 1,.B.SRC = 1,.B.WPE = 0}}, /* PF[13..15] OE/WE out*/
+
+ { 96,16,{.B.PA = 1,.B.SRC = 1,.B.WPE = 0}}, /* PG[ 0..15] AD16..31 in/out*/
{112, 3,{.B.PA = 0,.B.OBE = 1,.B.WPE = 0}}, /* PH[ 0.. 2] LED_EXT1-3. out*/
{115, 1,{.B.PA = 3,.B.OBE = 1,.B.WPE = 0}}, /* PH[ 3.. 3] CS2_ETH out*/
@@ -228,7 +232,7 @@ static const mpc55xx_siu_pcr_entry_t siu_pcr_list[] = {
{0,0}
};
-#endif /* GWLCFM */
+#endif /* BOARD_GWLCFM */
static void mpc55xx_ebi_init(void)
{
@@ -240,6 +244,71 @@ static void mpc55xx_ebi_init(void)
*/
mpc55xx_siu_pcr_init(&SIU,
siu_pcr_list);
+
+#if defined(BOARD_GWLCFM)
+ /*
+ * init EBI for Muxed AD bus
+ */
+ EBI.MCR.B.DBM = 1;
+ EBI.MCR.B.ADMUX = 1; /* use multiplexed bus */
+ EBI.MCR.B.D16_32 = 1; /* use lower AD bus */
+
+ SIU.ECCR.B.EBDF = 3; /* use CLK/4 as bus clock */
+
+ /* External SRAM (16 bit, 2 wait states, 512kB, no burst) */
+
+ cs.BR.B.BA = 0;
+ cs.BR.B.PS = 1;
+ cs.BR.B.AD_MUX = 1;
+ cs.BR.B.WEBS = 1;
+ cs.BR.B.TBDIP = 0;
+ cs.BR.B.BI = 1;
+ cs.BR.B.V = 1;
+
+ cs.OR.B.AM = 0x1fff0;
+ cs.OR.B.SCY = 0;
+ cs.OR.B.BSCY = 0;
+
+ EBI.CS [0] = cs;
+
+ /* External Ethernet Controller (3 wait states, 64kB) */
+
+ mmu.MAS0.B.ESEL = 5;
+ mmu.MAS1.B.VALID = 1;
+ mmu.MAS1.B.IPROT = 1;
+ mmu.MAS1.B.TSIZ = 1;
+ mmu.MAS2.B.EPN = 0x3fff8;
+ mmu.MAS2.B.I = 1;
+ mmu.MAS2.B.G = 1;
+ mmu.MAS3.B.RPN = 0x3fff8;
+ mmu.MAS3.B.UW = 1;
+ mmu.MAS3.B.SW = 1;
+ mmu.MAS3.B.UR = 1;
+ mmu.MAS3.B.SR = 1;
+
+ PPC_SET_SPECIAL_PURPOSE_REGISTER( FREESCALE_EIS_MAS0, mmu.MAS0.R);
+ PPC_SET_SPECIAL_PURPOSE_REGISTER( FREESCALE_EIS_MAS1, mmu.MAS1.R);
+ PPC_SET_SPECIAL_PURPOSE_REGISTER( FREESCALE_EIS_MAS2, mmu.MAS2.R);
+ PPC_SET_SPECIAL_PURPOSE_REGISTER( FREESCALE_EIS_MAS3, mmu.MAS3.R);
+
+ asm volatile ("tlbwe");
+
+ cs.BR.B.BA = 0x7fff;
+ cs.BR.B.PS = 1;
+ cs.BR.B.BL = 0;
+ cs.BR.B.AD_MUX = 1;
+ cs.BR.B.WEBS = 0;
+ cs.BR.B.TBDIP = 0;
+ cs.BR.B.BI = 1;
+ cs.BR.B.V = 1;
+
+ cs.OR.B.AM = 0x1ffff;
+ cs.OR.B.SCY = 1;
+ cs.OR.B.BSCY = 0;
+
+ EBI.CS [3] = cs;
+#else /* defined(BOARD_GWLCFM) */
+
/* External SRAM (2 wait states, 512kB, 4 word burst) */
cs.BR.B.BA = 0;
@@ -291,11 +360,18 @@ static void mpc55xx_ebi_init(void)
cs.OR.B.BSCY = 0;
EBI.CS [3] = cs;
+#endif /* defined(BOARD_GWLCFM) */
}
/**
* @brief Start BSP.
*/
+LINKER_SYMBOL(bsp_section_bss_start);
+LINKER_SYMBOL(bsp_section_bss_end);
+LINKER_SYMBOL(bsp_section_sbss_start);
+LINKER_SYMBOL(bsp_section_sbss_end);
+LINKER_SYMBOL(bsp_section_vector_start);
+
void bsp_start(void)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
@@ -305,6 +381,20 @@ void bsp_start(void)
uintptr_t interrupt_stack_start = (uintptr_t)bsp_ram_end - 2 * MPC55XX_INTERRUPT_STACK_SIZE;
uint32_t interrupt_stack_size = MPC55XX_INTERRUPT_STACK_SIZE;
+
+ /* Initialize External Bus Interface */
+ mpc55xx_ebi_init();
+
+ /*
+ * make sure BSS/SBSS is cleared
+ */
+ memset(bsp_section_bss_start,0,
+ bsp_section_bss_end-bsp_section_bss_start);
+ memset(bsp_section_sbss_start,0,
+ bsp_section_sbss_end-bsp_section_sbss_start);
+
+ ppc_exc_vector_base = bsp_section_vector_start;
+
RTEMS_DEBUG_PRINT( "BSP start ...\n");
RTEMS_DEBUG_PRINT( "System clock : %i\n", mpc55xx_get_system_clock());
@@ -326,8 +416,10 @@ void bsp_start(void)
/* Time reference value */
bsp_clicks_per_usec = bsp_clock_speed / 1000000;
- /* Initialize External Bus Interface */
- mpc55xx_ebi_init();
+ /*
+ * determine clock speed
+ */
+ bsp_clock_speed = mpc55xx_get_system_clock();
/* Initialize exceptions */
RTEMS_DEBUG_PRINT( "Initialize exceptions ...\n");
@@ -354,9 +446,8 @@ void bsp_start(void)
/* Initialize eMIOS */
mpc55xx_emios_initialize( 1);
- return;
+ mpc55xx_emios_set_global_prescaler(MPC55XX_EMIOS_PRESCALER);
- /* TODO */
/*
* Enable instruction and data caches. Do not force writethrough mode.
*/
diff --git a/c/src/lib/libbsp/powerpc/mpc55xxevb/startup/linkcmds b/c/src/lib/libbsp/powerpc/mpc55xxevb/startup/linkcmds
index c9109d2c1f..5c2161deba 100644
--- a/c/src/lib/libbsp/powerpc/mpc55xxevb/startup/linkcmds
+++ b/c/src/lib/libbsp/powerpc/mpc55xxevb/startup/linkcmds
@@ -1,278 +1 @@
-/**
- * @file
- *
- * Derived from internal linker script of GNU ld (GNU Binutils) 2.18 for elf32ppc emulation.
- */
-
-OUTPUT_FORMAT("elf32-powerpc", "elf32-powerpc", "elf32-powerpc")
-OUTPUT_ARCH(powerpc)
-ENTRY(start)
-
-INCLUDE linkcmds.memory
-
-SECTIONS
-{
- .text : {
- /*
- * BSP: Start of text section
- */
- bsp_section_text_start = .;
-
- /*
- * BSP: System startup entry
- */
- KEEP (*(.entry))
-
- /*
- * BSP: Moved into .text from .init
- */
- KEEP (*(.init))
-
- *(.text .stub .text.* .gnu.linkonce.t.*)
- KEEP (*(.text.*personality*))
- /* .gnu.warning sections are handled specially by elf32.em. */
- *(.gnu.warning)
- *(.glink)
-
- /*
- * BSP: Special FreeBSD sysctl sections
- */
- . = ALIGN (16);
- __start_set_sysctl_set = .;
- *(set_sysctl_*);
- __stop_set_sysctl_set = ABSOLUTE(.);
- *(set_domain_*);
- *(set_pseudo_*);
-
- /*
- * BSP: Moved into .text from .*
- */
- *(.rodata .rodata.* .gnu.linkonce.r.*)
- *(.rodata1)
- *(.interp)
- *(.note.gnu.build-id)
- *(.hash)
- *(.gnu.hash)
- *(.dynsym)
- *(.dynstr)
- *(.gnu.version)
- *(.gnu.version_d)
- *(.gnu.version_r)
- *(.eh_frame_hdr)
-
- /*
- * BSP: Magic PPC stuff
- */
- *(.PPC.*)
-
- /*
- * BSP: Required by cpukit/score/src/threadhandler.c
- */
- PROVIDE (_fini = .);
-
- /*
- * BSP: Moved into .text from .fini
- */
- KEEP (*(.fini))
-
- . = ALIGN (bsp_section_align);
-
- PROVIDE (__etext = .);
- PROVIDE (_etext = .);
- PROVIDE (etext = .);
- } > ROM =0
-
- .sdata2 : {
- PROVIDE (_SDA2_BASE_ = 32768);
-
- *(.sdata2 .sdata2.* .gnu.linkonce.s2.*)
-
- . = ALIGN (bsp_section_align);
- } > ROM =0
-
- .sbss2 : {
- *(.sbss2 .sbss2.* .gnu.linkonce.sb2.*)
-
- . = ALIGN (bsp_section_align);
-
- /*
- * BSP: End of text section
- */
- bsp_section_text_end = .;
- } > ROM =0
-
- .data : AT (bsp_section_text_end) {
- /*
- * BSP: Start of data section
- */
- bsp_section_data_start = .;
-
- /*
- * BSP: Reserve space for exception handler
- */
- . = . + 0x180;
-
- /*
- * BSP: Moved into .data from .ctors
- */
- /* gcc uses crtbegin.o to find the start of
- the constructors, so we make sure it is
- first. Because this is a wildcard, it
- doesn't matter if the user does not
- actually link against crtbegin.o; the
- linker won't look for a file to match a
- wildcard. The wildcard also means that it
- doesn't matter which directory crtbegin.o
- is in. */
- KEEP (*crtbegin.o(.ctors))
- KEEP (*crtbegin?.o(.ctors))
- /* We don't want to include the .ctor section from
- the crtend.o file until after the sorted ctors.
- The .ctor section from the crtend file contains the
- end of ctors marker and it must be last */
- KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors))
- KEEP (*(SORT(.ctors.*)))
- KEEP (*(.ctors))
-
- /*
- * BSP: Moved into .data from .dtors
- */
- KEEP (*crtbegin.o(.dtors))
- KEEP (*crtbegin?.o(.dtors))
- KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors))
- KEEP (*(SORT(.dtors.*)))
- KEEP (*(.dtors))
-
- /*
- * BSP: Moved into .data from .*
- */
- *(.tdata .tdata.* .gnu.linkonce.td.*)
- *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon)
- *(.data1)
- KEEP (*(.eh_frame))
- *(.gcc_except_table .gcc_except_table.*)
- KEEP (*(.jcr))
- *(.data.rel.ro.local* .gnu.linkonce.d.rel.ro.local.*) *(.data.rel.ro* .gnu.linkonce.d.rel.ro.*)
- *(.fixup)
- *(.got1)
- *(.got2)
- *(.dynamic)
- *(.got)
- *(.plt)
- PROVIDE_HIDDEN (__preinit_array_start = .);
- KEEP (*(.preinit_array))
- PROVIDE_HIDDEN (__preinit_array_end = .);
- PROVIDE_HIDDEN (__init_array_start = .);
- KEEP (*(SORT(.init_array.*)))
- KEEP (*(.init_array))
- PROVIDE_HIDDEN (__init_array_end = .);
- PROVIDE_HIDDEN (__fini_array_start = .);
- KEEP (*(.fini_array))
- KEEP (*(SORT(.fini_array.*)))
- PROVIDE_HIDDEN (__fini_array_end = .);
-
- *(.data .data.* .gnu.linkonce.d.*)
- KEEP (*(.gnu.linkonce.d.*personality*))
- SORT(CONSTRUCTORS)
-
- . = ALIGN (bsp_section_align);
- } > RAM
-
- .sdata : {
- PROVIDE (_SDA_BASE_ = 32768);
- *(.sdata .sdata.* .gnu.linkonce.s.*)
-
- . = ALIGN (bsp_section_align);
-
- _edata = .;
- PROVIDE (edata = .);
-
- /*
- * BSP: End of data section
- */
- bsp_section_data_end = .;
- } > RAM
-
- .sbss : {
- /*
- * BSP: Start of bss section
- */
- bsp_section_bss_start = .;
-
- __bss_start = .;
-
- PROVIDE (__sbss_start = .); PROVIDE (___sbss_start = .);
- *(.scommon)
- *(.dynsbss)
- *(.sbss .sbss.* .gnu.linkonce.sb.*)
- PROVIDE (__sbss_end = .); PROVIDE (___sbss_end = .);
-
- . = ALIGN (bsp_section_align);
- } > RAM
-
- .bss : {
- *(COMMON)
- *(.dynbss)
- *(.bss .bss.* .gnu.linkonce.b.*)
-
- . = ALIGN (bsp_section_align);
-
- __end = .;
- _end = .;
- PROVIDE (end = .);
-
- /*
- * BSP: End of bss section
- */
- bsp_section_bss_end = .;
- } > RAM
-
- /* Stabs debugging sections. */
- .stab 0 : { *(.stab) }
- .stabstr 0 : { *(.stabstr) }
- .stab.excl 0 : { *(.stab.excl) }
- .stab.exclstr 0 : { *(.stab.exclstr) }
- .stab.index 0 : { *(.stab.index) }
- .stab.indexstr 0 : { *(.stab.indexstr) }
- .comment 0 : { *(.comment) }
- /* DWARF debug sections.
- Symbols in the DWARF debugging sections are relative to the beginning
- of the section so we begin them at 0. */
- /* DWARF 1 */
- .debug 0 : { *(.debug) }
- .line 0 : { *(.line) }
- /* GNU DWARF 1 extensions */
- .debug_srcinfo 0 : { *(.debug_srcinfo) }
- .debug_sfnames 0 : { *(.debug_sfnames) }
- /* DWARF 1.1 and DWARF 2 */
- .debug_aranges 0 : { *(.debug_aranges) }
- .debug_pubnames 0 : { *(.debug_pubnames) }
- /* DWARF 2 */
- .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) }
- .debug_abbrev 0 : { *(.debug_abbrev) }
- .debug_line 0 : { *(.debug_line) }
- .debug_frame 0 : { *(.debug_frame) }
- .debug_str 0 : { *(.debug_str) }
- .debug_loc 0 : { *(.debug_loc) }
- .debug_macinfo 0 : { *(.debug_macinfo) }
- /* SGI/MIPS DWARF 2 extensions */
- .debug_weaknames 0 : { *(.debug_weaknames) }
- .debug_funcnames 0 : { *(.debug_funcnames) }
- .debug_typenames 0 : { *(.debug_typenames) }
- .debug_varnames 0 : { *(.debug_varnames) }
- /* DWARF 3 */
- .debug_pubtypes 0 : { *(.debug_pubtypes) }
- .debug_ranges 0 : { *(.debug_ranges) }
- .gnu.attributes 0 : { KEEP (*(.gnu.attributes)) }
-
- /DISCARD/ : {
- *(.note.GNU-stack) *(.gnu_debuglink)
- }
-
- /*
- * BSP: Catch all unknown sections
- */
- .nirvana : {
- *(*)
- } > NIRVANA
-}
+include linkcmds.mpc55xxevb
diff --git a/c/src/lib/libbsp/powerpc/mpc55xxevb/startup/linkcmds.base b/c/src/lib/libbsp/powerpc/mpc55xxevb/startup/linkcmds.base
new file mode 100644
index 0000000000..0d82d43449
--- /dev/null
+++ b/c/src/lib/libbsp/powerpc/mpc55xxevb/startup/linkcmds.base
@@ -0,0 +1,284 @@
+/**
+ * @file
+ *
+ * Derived from internal linker script of GNU ld (GNU Binutils) 2.18 for elf32ppc emulation.
+ */
+
+OUTPUT_FORMAT("elf32-powerpc", "elf32-powerpc", "elf32-powerpc")
+OUTPUT_ARCH(powerpc)
+ENTRY(start)
+
+SECTIONS
+{
+ .text : {
+ /*
+ * BSP: Start of text section
+ */
+ bsp_section_text_start = .;
+
+ /*
+ * BSP: System startup entry
+ */
+ KEEP (*(.entry))
+
+ /*
+ * BSP: Moved into .text from .init
+ */
+ KEEP (*(.init))
+
+ *(.text .stub .text.* .gnu.linkonce.t.*)
+ KEEP (*(.text.*personality*))
+ /* .gnu.warning sections are handled specially by elf32.em. */
+ *(.gnu.warning)
+ *(.glink)
+
+ /*
+ * BSP: Special FreeBSD sysctl sections
+ */
+ . = ALIGN (16);
+ __start_set_sysctl_set = .;
+ *(set_sysctl_*);
+ __stop_set_sysctl_set = ABSOLUTE(.);
+ *(set_domain_*);
+ *(set_pseudo_*);
+
+ /*
+ * BSP: Moved into .text from .*
+ */
+ *(.rodata .rodata.* .gnu.linkonce.r.*)
+ *(.rodata1)
+ *(.interp)
+ *(.note.gnu.build-id)
+ *(.hash)
+ *(.gnu.hash)
+ *(.dynsym)
+ *(.dynstr)
+ *(.gnu.version)
+ *(.gnu.version_d)
+ *(.gnu.version_r)
+ *(.eh_frame_hdr)
+
+ /*
+ * BSP: Magic PPC stuff
+ */
+ *(.PPC.*)
+
+ /*
+ * BSP: Required by cpukit/score/src/threadhandler.c
+ */
+ PROVIDE (_fini = .);
+
+ /*
+ * BSP: Moved into .text from .fini
+ */
+ KEEP (*(.fini))
+
+ . = ALIGN (bsp_section_align);
+
+ PROVIDE (__etext = .);
+ PROVIDE (_etext = .);
+ PROVIDE (etext = .);
+ } > REGION_TEXT =0
+
+ .sdata2 : {
+ PROVIDE (_SDA2_BASE_ = 32768);
+
+ *(.sdata2 .sdata2.* .gnu.linkonce.s2.*)
+
+ . = ALIGN (bsp_section_align);
+ /*
+ * BSP: End of text section
+ */
+ bsp_section_text_end = .;
+ } > REGION_TEXT =0
+
+ .vectors : {
+ . = ALIGN (bsp_section_align);
+ bsp_section_vector_start = .;
+ /*
+ * BSP: Reserve space for exception handler
+ */
+ . = . + 0x180;
+ . = ALIGN (bsp_section_align);
+ } > REGION_VECTORS
+
+ .data : AT (bsp_section_text_end) {
+ /*
+ * BSP: Start of data section
+ */
+ bsp_section_data_start = .;
+
+
+ /*
+ * BSP: Moved into .data from .ctors
+ */
+ /* gcc uses crtbegin.o to find the start of
+ the constructors, so we make sure it is
+ first. Because this is a wildcard, it
+ doesn't matter if the user does not
+ actually link against crtbegin.o; the
+ linker won't look for a file to match a
+ wildcard. The wildcard also means that it
+ doesn't matter which directory crtbegin.o
+ is in. */
+ KEEP (*crtbegin.o(.ctors))
+ KEEP (*crtbegin?.o(.ctors))
+ /* We don't want to include the .ctor section from
+ the crtend.o file until after the sorted ctors.
+ The .ctor section from the crtend file contains the
+ end of ctors marker and it must be last */
+ KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors))
+ KEEP (*(SORT(.ctors.*)))
+ KEEP (*(.ctors))
+
+ /*
+ * BSP: Moved into .data from .dtors
+ */
+ KEEP (*crtbegin.o(.dtors))
+ KEEP (*crtbegin?.o(.dtors))
+ KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors))
+ KEEP (*(SORT(.dtors.*)))
+ KEEP (*(.dtors))
+
+ /*
+ * BSP: Moved into .data from .*
+ */
+ *(.tdata .tdata.* .gnu.linkonce.td.*)
+ *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon)
+ *(.data1)
+ KEEP (*(.eh_frame))
+ *(.gcc_except_table .gcc_except_table.*)
+ KEEP (*(.jcr))
+ *(.data.rel.ro.local* .gnu.linkonce.d.rel.ro.local.*) *(.data.rel.ro* .gnu.linkonce.d.rel.ro.*)
+ *(.fixup)
+ *(.got1)
+ *(.got2)
+ *(.dynamic)
+ *(.got)
+ *(.plt)
+ PROVIDE_HIDDEN (__preinit_array_start = .);
+ KEEP (*(.preinit_array))
+ PROVIDE_HIDDEN (__preinit_array_end = .);
+ PROVIDE_HIDDEN (__init_array_start = .);
+ KEEP (*(SORT(.init_array.*)))
+ KEEP (*(.init_array))
+ PROVIDE_HIDDEN (__init_array_end = .);
+ PROVIDE_HIDDEN (__fini_array_start = .);
+ KEEP (*(.fini_array))
+ KEEP (*(SORT(.fini_array.*)))
+ PROVIDE_HIDDEN (__fini_array_end = .);
+
+ *(.data .data.* .gnu.linkonce.d.*)
+ KEEP (*(.gnu.linkonce.d.*personality*))
+ SORT(CONSTRUCTORS)
+
+ . = ALIGN (bsp_section_align);
+ } > REGION_DATA
+
+ .sdata : {
+ PROVIDE (_SDA_BASE_ = 32768);
+ *(.sdata .sdata.* .gnu.linkonce.s.*)
+
+ . = ALIGN (bsp_section_align);
+
+ _edata = .;
+ PROVIDE (edata = .);
+
+ /*
+ * BSP: End of data section
+ */
+ bsp_section_data_end = .;
+ } > REGION_DATA
+
+ .sbss : {
+ /*
+ * BSP: Start of bss section
+ */
+ bsp_section_sbss_start = .;
+
+ __bss_start = .;
+
+ PROVIDE (__sbss_start = .); PROVIDE (___sbss_start = .);
+ *(.scommon)
+ *(.dynsbss)
+ *(.sbss .sbss.* .gnu.linkonce.sb.*)
+ PROVIDE (__sbss_end = .); PROVIDE (___sbss_end = .);
+
+ . = ALIGN (bsp_section_align);
+ bsp_section_sbss_end = .;
+ } > REGION_DATA
+
+ .sbss2 : {
+ bsp_section_bss_start = .;
+ *(.sbss2 .sbss2.* .gnu.linkonce.sb2.*)
+
+ . = ALIGN (bsp_section_align);
+
+ } > REGION_BSS
+
+ .bss : {
+ *(COMMON)
+ *(.dynbss)
+ *(.bss .bss.* .gnu.linkonce.b.*)
+
+ . = ALIGN (bsp_section_align);
+
+ __end = .;
+ _end = .;
+ PROVIDE (end = .);
+
+ /*
+ * BSP: End of bss section
+ */
+ bsp_section_bss_end = .;
+ } > REGION_BSS
+
+ /* Stabs debugging sections. */
+ .stab 0 : { *(.stab) }
+ .stabstr 0 : { *(.stabstr) }
+ .stab.excl 0 : { *(.stab.excl) }
+ .stab.exclstr 0 : { *(.stab.exclstr) }
+ .stab.index 0 : { *(.stab.index) }
+ .stab.indexstr 0 : { *(.stab.indexstr) }
+ .comment 0 : { *(.comment) }
+ /* DWARF debug sections.
+ Symbols in the DWARF debugging sections are relative to the beginning
+ of the section so we begin them at 0. */
+ /* DWARF 1 */
+ .debug 0 : { *(.debug) }
+ .line 0 : { *(.line) }
+ /* GNU DWARF 1 extensions */
+ .debug_srcinfo 0 : { *(.debug_srcinfo) }
+ .debug_sfnames 0 : { *(.debug_sfnames) }
+ /* DWARF 1.1 and DWARF 2 */
+ .debug_aranges 0 : { *(.debug_aranges) }
+ .debug_pubnames 0 : { *(.debug_pubnames) }
+ /* DWARF 2 */
+ .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) }
+ .debug_abbrev 0 : { *(.debug_abbrev) }
+ .debug_line 0 : { *(.debug_line) }
+ .debug_frame 0 : { *(.debug_frame) }
+ .debug_str 0 : { *(.debug_str) }
+ .debug_loc 0 : { *(.debug_loc) }
+ .debug_macinfo 0 : { *(.debug_macinfo) }
+ /* SGI/MIPS DWARF 2 extensions */
+ .debug_weaknames 0 : { *(.debug_weaknames) }
+ .debug_funcnames 0 : { *(.debug_funcnames) }
+ .debug_typenames 0 : { *(.debug_typenames) }
+ .debug_varnames 0 : { *(.debug_varnames) }
+ /* DWARF 3 */
+ .debug_pubtypes 0 : { *(.debug_pubtypes) }
+ .debug_ranges 0 : { *(.debug_ranges) }
+ .gnu.attributes 0 : { KEEP (*(.gnu.attributes)) }
+
+ /DISCARD/ : {
+ *(.note.GNU-stack) *(.gnu_debuglink)
+ }
+
+ /*
+ * BSP: Catch all unknown sections
+ */
+ .nirvana : {
+ *(*)
+ } > NIRVANA
+}
diff --git a/c/src/lib/libbsp/powerpc/mpc55xxevb/startup/linkcmds.gwlcfm b/c/src/lib/libbsp/powerpc/mpc55xxevb/startup/linkcmds.gwlcfm
new file mode 100644
index 0000000000..6553e1aa84
--- /dev/null
+++ b/c/src/lib/libbsp/powerpc/mpc55xxevb/startup/linkcmds.gwlcfm
@@ -0,0 +1,31 @@
+MEMORY
+{
+ ROM (RX) : ORIGIN = 0x0, LENGTH = 1536M
+ RAM (AIW) : ORIGIN = 0x40000000, LENGTH = 80K
+ RAM_EXT : ORIGIN = 0x20000000, LENGTH = 512K
+ NIRVANA : ORIGIN = 0x0, LENGTH = 0
+}
+
+bsp_ram_start = ORIGIN (RAM);
+bsp_ram_end = ORIGIN (RAM) + LENGTH (RAM);
+bsp_ram_size = LENGTH (RAM);
+
+bsp_rom_start = ORIGIN (ROM);
+bsp_rom_end = ORIGIN (ROM) + LENGTH (ROM);
+bsp_rom_size = LENGTH (ROM);
+
+bsp_external_ram_start = ORIGIN (RAM_EXT);
+bsp_external_ram_end = ORIGIN (RAM_EXT) + LENGTH (RAM_EXT);
+bsp_external_ram_size = LENGTH (RAM_EXT);
+
+bsp_section_align = 32;
+
+REGION_ALIAS ("REGION_TEXT", ROM);
+REGION_ALIAS ("REGION_VECTORS", RAM);
+REGION_ALIAS ("REGION_DATA", RAM);
+REGION_ALIAS ("REGION_BSS", RAM_EXT);
+
+INCLUDE linkcmds.base
+
+bsp_workspace_start = bsp_section_bss_end;
+
diff --git a/c/src/lib/libbsp/powerpc/mpc55xxevb/startup/linkcmds.memory b/c/src/lib/libbsp/powerpc/mpc55xxevb/startup/linkcmds.memory
deleted file mode 100644
index 344195c897..0000000000
--- a/c/src/lib/libbsp/powerpc/mpc55xxevb/startup/linkcmds.memory
+++ /dev/null
@@ -1,21 +0,0 @@
-MEMORY
-{
- ROM (RX) : ORIGIN = 0x0, LENGTH = 3M
- RAM (AIW) : ORIGIN = 0x40000000, LENGTH = 128K
- EXT_RAM : ORIGIN = 0x20000000, LENGTH = 512K
- NIRVANA : ORIGIN = 0x0, LENGTH = 0
-}
-
-bsp_ram_start = ORIGIN (RAM);
-bsp_ram_end = ORIGIN (RAM) + LENGTH (RAM);
-bsp_ram_size = LENGTH (RAM);
-
-bsp_rom_start = ORIGIN (ROM);
-bsp_rom_end = ORIGIN (ROM) + LENGTH (ROM);
-bsp_rom_size = LENGTH (ROM);
-
-bsp_external_ram_start = ORIGIN (EXT_RAM);
-bsp_external_ram_end = ORIGIN (EXT_RAM) + LENGTH (EXT_RAM);
-bsp_external_ram_size = LENGTH (EXT_RAM);
-
-bsp_section_align = 32;
diff --git a/c/src/lib/libbsp/powerpc/mpc55xxevb/startup/linkcmds.mpc5566evb b/c/src/lib/libbsp/powerpc/mpc55xxevb/startup/linkcmds.mpc5566evb
new file mode 100644
index 0000000000..a3acf2f6d6
--- /dev/null
+++ b/c/src/lib/libbsp/powerpc/mpc55xxevb/startup/linkcmds.mpc5566evb
@@ -0,0 +1,31 @@
+MEMORY
+{
+ ROM (RX) : ORIGIN = 0x0, LENGTH = 3M
+ RAM (AIW) : ORIGIN = 0x40000000, LENGTH = 128K
+ RAM_EXT : ORIGIN = 0x20000000, LENGTH = 512K
+ NIRVANA : ORIGIN = 0x0, LENGTH = 0
+}
+
+bsp_ram_start = ORIGIN (RAM);
+bsp_ram_end = ORIGIN (RAM) + LENGTH (RAM);
+bsp_ram_size = LENGTH (RAM);
+
+bsp_rom_start = ORIGIN (ROM);
+bsp_rom_end = ORIGIN (ROM) + LENGTH (ROM);
+bsp_rom_size = LENGTH (ROM);
+
+bsp_external_ram_start = ORIGIN (RAM_EXT);
+bsp_external_ram_end = ORIGIN (RAM_EXT) + LENGTH (RAM_EXT);
+bsp_external_ram_size = LENGTH (RAM_EXT);
+
+bsp_section_align = 32;
+
+REGION_ALIAS ("REGION_TEXT", ROM);
+REGION_ALIAS ("REGION_VECTORS", RAM);
+REGION_ALIAS ("REGION_DATA", RAM);
+REGION_ALIAS ("REGION_BSS", RAM_EXT);
+
+INCLUDE linkcmds.base
+
+bsp_workspace_start = bsp_section_bss_end;
+
diff --git a/c/src/lib/libbsp/powerpc/mpc55xxevb/startup/start.S b/c/src/lib/libbsp/powerpc/mpc55xxevb/startup/start.S
index 67efea8a99..9e6bf84093 100644
--- a/c/src/lib/libbsp/powerpc/mpc55xxevb/startup/start.S
+++ b/c/src/lib/libbsp/powerpc/mpc55xxevb/startup/start.S
@@ -26,7 +26,8 @@
#include <libcpu/powerpc-utility.h>
#include <mpc55xx/reg-defs.h>
-
+#include <bspopts.h>
+
.section ".entry", "ax"
PUBLIC_VAR (start)
.globl fmpll_syncr_vals
@@ -82,8 +83,10 @@ start:
/* Config internal flash */
bl SYM (mpc55xx_flash_config)
+#if DATA_CACHE_ENABLE || INSTRUCTION_CACHE_ENABLE
/* FIXME: Config cache */
bl config_cache
+#endif /* DATA_CACHE_ENABLE || INSTRUCTION_CACHE_ENABLE */
/*
* TODO, FIXME: Enable cache in the MMU for the SRAM
@@ -127,11 +130,11 @@ start:
LA r4, bsp_ram_end
/* Assert: Proper alignment of destination start */
- andi. r6, r3, 0x37
+ andi. r6, r3, 0x3f
bne twiddle
/* Assert: Proper alignment of destination end */
- andi. r6, r4, 0x37
+ andi. r6, r4, 0x3f
bne twiddle
/* Data size = destination end - destination start */
@@ -181,14 +184,6 @@ start:
/*
* Prepare high level initialization
*/
- LA r3, bsp_ram_start
- LA r4, ppc_exc_vector_base
- stw r3, 0(r4)
-
- /* Set global BSP clock speed variable */
- bl SYM (mpc55xx_get_system_clock)
- LA r4, bsp_clock_speed
- stw r3, 0(r4)
/* Create NULL */
li r0, 0