summaryrefslogtreecommitdiffstats
path: root/c
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2011-08-30 13:58:05 +0000
committerSebastian Huber <sebastian.huber@embedded-brains.de>2011-08-30 13:58:05 +0000
commit54a4fe5fa936681fd07c8ac6734b53c5ee369f00 (patch)
tree23ed53ba362483535bfeb927ebc21489fda7f4e6 /c
parent2011-08-30 Peter Dufault <dufault@hda.com> (diff)
downloadrtems-54a4fe5fa936681fd07c8ac6734b53c5ee369f00.tar.bz2
2011-08-30 Peter Dufault <dufault@hda.com>
* make/custom/phycore_mpc5554.cfg, startup/linkcmds.phycore_mpc5554, network/if_smc.c: New files. * Makefile.am, preinstall.am: Reflect changes above. * configure.ac: Add support for the Phytec PhyCORE MPC5554. Includes: - HAS_SMC91111 to indicate a BSP has that neworking. - SMC91111_ENADDR_IS_SETUP so that it skips code to set up the MAC address. - MPC55XX_CLOCK_EMIOS_CHANNEL to permit one to set which eMIOS channel to use for the clock. - MPC55XX_BOOTFLAGS: Skips two words above the RCHW in the startup for use in skpping over the MMU setup. Required for debugging via a cheap emulator where code is loaded into RAM and then mapped in as flash. - BOARD_PHYCORE_MPC5554 If defined, use custom settings for the Phytec PhyCORE MPC5554 SOM. * clock/clock-config.c: Modify so that the EMIOS channel used for the clock can be selected at configuration time. For MPC5544 only: - Conditionally skip access to a register that faults if accessed on the MPC5554 - Do not set the control register mode as was done for GW_LCFM support, it breaks interrupts. * make/custom/mpc55xx.inc: Make it possible to override the soft-float to set the type of floating point BSP will use. * startup/start.S: Add support for the "boot flags", two long-words that I manipulate with the debugger to skip over MMU setup. Use an external for the start of external SRAM instead of the hardwired number 0x20000000. Disable write access to the internal flash.
Diffstat (limited to 'c')
-rw-r--r--c/src/lib/libbsp/powerpc/mpc55xxevb/ChangeLog30
-rw-r--r--c/src/lib/libbsp/powerpc/mpc55xxevb/Makefile.am9
-rw-r--r--c/src/lib/libbsp/powerpc/mpc55xxevb/clock/clock-config.c13
-rw-r--r--c/src/lib/libbsp/powerpc/mpc55xxevb/configure.ac21
-rw-r--r--c/src/lib/libbsp/powerpc/mpc55xxevb/make/custom/mpc55xx.inc4
-rw-r--r--c/src/lib/libbsp/powerpc/mpc55xxevb/make/custom/phycore_mpc5554.cfg16
-rw-r--r--c/src/lib/libbsp/powerpc/mpc55xxevb/network/if_smc.c167
-rw-r--r--c/src/lib/libbsp/powerpc/mpc55xxevb/preinstall.am4
-rw-r--r--c/src/lib/libbsp/powerpc/mpc55xxevb/startup/linkcmds.phycore_mpc555439
-rw-r--r--c/src/lib/libbsp/powerpc/mpc55xxevb/startup/start.S46
10 files changed, 340 insertions, 9 deletions
diff --git a/c/src/lib/libbsp/powerpc/mpc55xxevb/ChangeLog b/c/src/lib/libbsp/powerpc/mpc55xxevb/ChangeLog
index 213f00ec9e..e9ea31c72a 100644
--- a/c/src/lib/libbsp/powerpc/mpc55xxevb/ChangeLog
+++ b/c/src/lib/libbsp/powerpc/mpc55xxevb/ChangeLog
@@ -1,3 +1,33 @@
+2011-08-30 Peter Dufault <dufault@hda.com>
+
+ * make/custom/phycore_mpc5554.cfg, startup/linkcmds.phycore_mpc5554,
+ network/if_smc.c: New files.
+ * Makefile.am, preinstall.am: Reflect changes above.
+ * configure.ac: Add support for the Phytec PhyCORE MPC5554. Includes:
+ - HAS_SMC91111 to indicate a BSP has that neworking.
+ - SMC91111_ENADDR_IS_SETUP so that it skips code to set up the MAC
+ address.
+ - MPC55XX_CLOCK_EMIOS_CHANNEL to permit one to set which eMIOS
+ channel to use for the clock.
+ - MPC55XX_BOOTFLAGS: Skips two words above the RCHW in the startup
+ for use in skpping over the MMU setup. Required for debugging via a
+ cheap emulator where code is loaded into RAM and then mapped in as
+ flash.
+ - BOARD_PHYCORE_MPC5554 If defined, use custom settings for the
+ Phytec PhyCORE MPC5554 SOM.
+ * clock/clock-config.c: Modify so that the EMIOS channel used for the
+ clock can be selected at configuration time. For MPC5544 only:
+ - Conditionally skip access to a register that faults if accessed on
+ the MPC5554
+ - Do not set the control register mode as was done for GW_LCFM
+ support, it breaks interrupts.
+ * make/custom/mpc55xx.inc: Make it possible to override the soft-float
+ to set the type of floating point BSP will use.
+ * startup/start.S: Add support for the "boot flags", two long-words
+ that I manipulate with the debugger to skip over MMU setup. Use an
+ external for the start of external SRAM instead of the hardwired
+ number 0x20000000. Disable write access to the internal flash.
+
2011-08-30 Sebastian Huber <sebastian.huber@embedded-brains.de>
* include/bsp.h: Define BSP_FEATURE_IRQ_EXTENSION.
diff --git a/c/src/lib/libbsp/powerpc/mpc55xxevb/Makefile.am b/c/src/lib/libbsp/powerpc/mpc55xxevb/Makefile.am
index e449ad9528..bf6b2eaabb 100644
--- a/c/src/lib/libbsp/powerpc/mpc55xxevb/Makefile.am
+++ b/c/src/lib/libbsp/powerpc/mpc55xxevb/Makefile.am
@@ -24,8 +24,11 @@ project_lib_DATA += rtems_crti.$(OBJEXT)
# Link commands
project_lib_DATA += startup/linkcmds
-dist_project_lib_DATA += startup/linkcmds.gwlcfm startup/linkcmds.mpc5566evb \
- startup/linkcmds.base
+dist_project_lib_DATA += \
+ startup/linkcmds.gwlcfm \
+ startup/linkcmds.phycore_mpc5554 \
+ startup/linkcmds.mpc5566evb \
+ startup/linkcmds.base
noinst_LIBRARIES += libbsp.a
libbsp_a_SOURCES =
@@ -71,7 +74,7 @@ libbsp_a_SOURCES += i2c/i2c_init.c \
# Network
if HAS_NETWORKING
-libbsp_a_SOURCES += network/smsc9218i.c
+libbsp_a_SOURCES += network/smsc9218i.c network/if_smc.c
endif
# BSP library
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 641bb12047..b3dc3bddab 100644
--- a/c/src/lib/libbsp/powerpc/mpc55xxevb/clock/clock-config.c
+++ b/c/src/lib/libbsp/powerpc/mpc55xxevb/clock/clock-config.c
@@ -31,8 +31,6 @@
#include <rtems/status-checks.h>
-#define MPC55XX_CLOCK_EMIOS_CHANNEL (MPC55XX_EMIOS_CHANNEL_NUMBER - 1)
-
/* This is defined in clockdrv_shell.h */
rtems_isr Clock_isr( rtems_vector_number vector);
@@ -104,10 +102,21 @@ static void mpc55xx_clock_initialize( void)
/* Set unused registers */
regs->CBDR.R = 0;
regs->CCNTR.R = 0;
+#if MPC55XX_CHIP_TYPE != 5554
+ /* This is reserved on the MPC5554.
+ */
regs->ALTCADR.R = 0;
+#endif
/* Set control register */
+ /* The mode change, made by Thomas for GW_LCFM support, breaks interrupts
+ * on the MPC5554.
+ */
+#if MPC55XX_CHIP_TYPE == 5554
+ ccr.B.MODE = MPC55XX_EMIOS_MODE_MC_UP_INT_CLK;
+#else
ccr.B.MODE = MPC55XX_EMIOS_MODE_MCB_UP_INT_CLK;
+#endif
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 049ab7ff4a..337ef6cd87 100644
--- a/c/src/lib/libbsp/powerpc/mpc55xxevb/configure.ac
+++ b/c/src/lib/libbsp/powerpc/mpc55xxevb/configure.ac
@@ -50,6 +50,7 @@ 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],[phytec_mpc5554],[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
@@ -83,12 +84,28 @@ RTEMS_BSPOPTS_SET([MPC55XX_EMIOS_PRESCALER],[*] ,[1])
RTEMS_BSPOPTS_HELP([MPC55XX_EMIOS_PRESCALER],
[Must be defined to set the EMIOS prescaler])
+RTEMS_BSPOPTS_SET([HAS_SMC91111],[phycore_mpc5554],[1])
+RTEMS_BSPOPTS_HELP([HAS_SMC91111],
+[If defined the board has the SMC91111 networking chip.])
+
+RTEMS_BSPOPTS_SET([SMC91111_ENADDR_IS_SETUP],[phycore_mpc5554],[1])
+RTEMS_BSPOPTS_HELP([SMC91111_ENADDR_IS_SETUP],
+[If defined the SMC91111 chip has the ethernet address loaded at reset.])
+
+RTEMS_BSPOPTS_SET([MPC55XX_CLOCK_EMIOS_CHANNEL],[*],[(MPC55XX_EMIOS_CHANNEL_NUMBER-1)])
+RTEMS_BSPOPTS_HELP([MPC55XX_CLOCK_EMIOS_CHANNEL],
+[Define to the eMIOS channel to use for the BSP clock.
+ The default is the last channel.])
+
RTEMS_BSPOPTS_SET([MPC55XX_CHIP_TYPE],[mpc5566evb],[5566])
RTEMS_BSPOPTS_SET([MPC55XX_CHIP_TYPE],[gwlcfm] ,[5516])
RTEMS_BSPOPTS_SET([MPC55XX_CHIP_TYPE],[*] ,[5554])
RTEMS_BSPOPTS_HELP([MPC55XX_CHIP_TYPE],
[specifies the chip type in use (e.g. 5554 for MPC5554)])
+RTEMS_BSPOPTS_HELP([MPC55XX_BOOTFLAGS],
+[If defined, builds in bootflags above the RCHW for setup in a debugger to avoid startup MMU setup])
+
RTEMS_BSPOPTS_SET([BOARD_GWLCFM],[gwlcfm],[1])
RTEMS_BSPOPTS_HELP([BOARD_GWLCFM],
[If defined, use custom settings of for the GW_LCFM board])
@@ -98,6 +115,10 @@ RTEMS_BSPOPTS_HELP([RTEMS_BSP_I2C_EEPROM_DEVICE_NAME],[EEPROM name for LibI2C])
RTEMS_BSPOPTS_SET([RTEMS_BSP_I2C_EEPROM_DEVICE_PATH],[gwlcfm],['"/dev/i2c1.eeprom"'])
RTEMS_BSPOPTS_HELP([RTEMS_BSP_I2C_EEPROM_DEVICE_PATH],[EEPROM device file path])
+RTEMS_BSPOPTS_SET([BOARD_PHYCORE_MPC5554],[phycore_mpc5554],[1])
+RTEMS_BSPOPTS_HELP([BOARD_PHYCORE_MPC5554],
+[If defined, use custom settings for the Phytec PhyCORE MPC5554 SOM])
+
AC_CONFIG_FILES([Makefile
include/bspopts.h])
diff --git a/c/src/lib/libbsp/powerpc/mpc55xxevb/make/custom/mpc55xx.inc b/c/src/lib/libbsp/powerpc/mpc55xxevb/make/custom/mpc55xx.inc
index faf493431f..fa469fad23 100644
--- a/c/src/lib/libbsp/powerpc/mpc55xxevb/make/custom/mpc55xx.inc
+++ b/c/src/lib/libbsp/powerpc/mpc55xxevb/make/custom/mpc55xx.inc
@@ -13,8 +13,10 @@ RTEMS_CPU = powerpc
RTEMS_CPU_MODEL = mpc55xx
+CPU_CFLAGS_FLOAT?=-msoft-float
+
# FIXME
-CPU_CFLAGS = -mcpu=8540 -meabi -msdata -fno-common -msoft-float \
+CPU_CFLAGS = -mcpu=8540 -meabi -msdata -fno-common $(CPU_CFLAGS_FLOAT) \
-D__ppc_generic -mstrict-align
CFLAGS_OPTIMIZE_V = -O2 -g -fno-keep-inline-functions
diff --git a/c/src/lib/libbsp/powerpc/mpc55xxevb/make/custom/phycore_mpc5554.cfg b/c/src/lib/libbsp/powerpc/mpc55xxevb/make/custom/phycore_mpc5554.cfg
new file mode 100644
index 0000000000..37fd6d2a56
--- /dev/null
+++ b/c/src/lib/libbsp/powerpc/mpc55xxevb/make/custom/phycore_mpc5554.cfg
@@ -0,0 +1,16 @@
+##
+#
+# @file
+#
+# @ingroup mpc55xx_config
+#
+# @brief configuration file for the Phytec PhyCORE MPC5554
+#
+
+RTEMS_LINKCMDS=linkcmds.phycore_mpc5554
+
+ifeq ($(PPC_USE_SPE),1)
+CPU_CFLAGS_FLOAT=-mfloat-gprs=single -mspe
+endif
+
+include $(RTEMS_ROOT)/make/custom/mpc55xx.inc
diff --git a/c/src/lib/libbsp/powerpc/mpc55xxevb/network/if_smc.c b/c/src/lib/libbsp/powerpc/mpc55xxevb/network/if_smc.c
new file mode 100644
index 0000000000..c16dcda022
--- /dev/null
+++ b/c/src/lib/libbsp/powerpc/mpc55xxevb/network/if_smc.c
@@ -0,0 +1,167 @@
+/*
+ * $Id$
+ */
+
+#include <mpc55xx/mpc55xx.h>
+#include <mpc55xx/regs.h>
+
+#include <rtems.h>
+
+#include <bsp.h>
+
+#include <bsp/irq.h>
+#include <rtems/bspIo.h>
+#include <libcpu/powerpc-utility.h>
+
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <rtems/error.h>
+#include <rtems/rtems_bsdnet.h>
+#include <rtems/irq-extension.h>
+
+#include <sys/param.h>
+#include <sys/mbuf.h>
+
+#include <sys/socket.h>
+#include <sys/sockio.h>
+#include <net/if.h>
+#include <netinet/in.h>
+#include <netinet/if_ether.h>
+
+#include <libchip/smc91111exp.h>
+
+
+
+/* The SMC91111 on the MPC5554SOM is IRQ2.
+ */
+#define SMC91111_BASE_ADDR (void*)0x22000300
+#define SMC91111_BASE_IRQ MPC55XX_IRQ_SIU_EXTERNAL_2
+#define SMC91111_BASE_PIO 4
+
+extern rtems_isr lan91cxx_interrupt_handler(rtems_vector_number v);
+
+static const union SIU_EISR_tag clear_eisr_2 = {.B.EIF2 = 1};
+
+static void rtems_smc91111_interrupt_wrapper(rtems_vector_number v, void *arg)
+{
+ /* Clear external interrupt status */
+
+ SIU.EISR = clear_eisr_2;
+
+ lan91cxx_interrupt_handler(v);
+
+}
+
+scmv91111_configuration_t mpc5554_scmv91111_configuration = {
+ SMC91111_BASE_ADDR, /* base address */
+ SMC91111_BASE_IRQ, /* vector number */
+ SMC91111_BASE_PIO, /* XXX: What's this? */
+ 100, /* 100b */
+ 1, /* fulldx */
+ 1, /* autoneg */
+ "SMC91111",
+ RTEMS_INTERRUPT_UNIQUE,
+ rtems_smc91111_interrupt_wrapper,
+ (void *)0
+};
+
+int _rtems_smc91111_driver_attach(
+ struct rtems_bsdnet_ifconfig *config,
+ scmv91111_configuration_t *scm_config
+);
+
+/*
+ * Attach an SMC91111 driver to the system
+ */
+int rtems_smc91111_driver_attach_mpc5554(struct rtems_bsdnet_ifconfig *config)
+{
+ /* Configure IRQ2 (GPIO pin 211) is set up properly:
+ * Secondary, Alternate, Input.
+ */
+ static const union SIU_PCR_tag irq_input_pcr = {
+ .B.PA = 2, /* Alternate function 1 */
+ .B.OBE = 0,
+ .B.IBE = 1, /* Input Buffer Enable */
+ .B.DSC = 0,
+ .B.ODE = 0,
+ .B.HYS = 1,
+ .B.SRC = 3, /* Maximum slew rate */
+ .B.WPE = 0, /* Disable weak pullup/pulldown */
+ .B.WPS = 1 /* Specify weak pullup? But it isn't enabled! */
+ };
+
+ union SIU_ORER_tag orer = MPC55XX_ZERO_FLAGS;
+ union SIU_DIRER_tag direr = MPC55XX_ZERO_FLAGS;
+ union SIU_IREER_tag ireer = MPC55XX_ZERO_FLAGS;
+ union SIU_IFEER_tag ifeer = MPC55XX_ZERO_FLAGS;
+ union SIU_IDFR_tag idfr = MPC55XX_ZERO_FLAGS;
+ union SIU_DIRSR_tag dirsr = MPC55XX_ZERO_FLAGS;
+ rtems_interrupt_level level;
+
+#define MPC55XX_EBI_CS_2_BR 0x22000003
+#define MPC55XX_EBI_CS_2_OR 0xff000010
+#if MPC55XX_EBI_CS_2_BR
+ static const union SIU_PCR_tag primary_50pf_weak_pullup = { /* 0x4c3 */
+ .B.PA = 1,
+ .B.DSC = 3,
+ .B.WPE = 1,
+ .B.WPS = 1
+ };
+ EBI.CS[2].BR.R = MPC55XX_EBI_CS_2_BR;
+ EBI.CS[2].OR.R = MPC55XX_EBI_CS_2_OR;
+ SIU.PCR[2] = primary_50pf_weak_pullup;
+#endif
+
+ SIU.PCR[211] = irq_input_pcr;
+
+ /* XXX These should be using bit set and bit clear instructions */
+
+ /* DMA/Interrupt Request Select */
+ rtems_interrupt_disable(level);
+ dirsr.R = SIU.DIRSR.R;
+ dirsr.B.DIRS2 = 0; /* Select interrupt not DMA */
+ SIU.DIRSR.R = dirsr.R;
+ rtems_interrupt_enable(level);
+
+ /* Overrun Request Enable */
+ rtems_interrupt_disable(level);
+ orer.R = SIU.ORER.R;
+ orer.B.ORE2 = 0; /* Disable overruns. */
+ SIU.ORER.R = orer.R;
+ rtems_interrupt_enable(level);
+
+ /* IRQ Rising-Edge Enable */
+ rtems_interrupt_disable(level);
+ ireer.R = SIU.IREER.R;
+ ireer.B.IREE2 = 1; /* Enable rising edge. */
+ SIU.IREER.R = ireer.R;
+ rtems_interrupt_enable(level);
+
+ /* IRQ Falling-Edge Enable */
+ rtems_interrupt_disable(level);
+ ifeer.R = SIU.IFEER.R;
+ ifeer.B.IFEE2 = 0; /* Disable falling edge. */
+ SIU.IFEER.R = ifeer.R;
+ rtems_interrupt_enable(level);
+
+ /* IRQ Digital Filter */
+ rtems_interrupt_disable(level);
+ idfr.R = SIU.IDFR.R;
+ idfr.B.DFL = 0; /* Minimal digital filter. */
+ SIU.IDFR.R = idfr.R;
+ rtems_interrupt_enable(level);
+
+ /* Clear external interrupt status */
+ SIU.EISR = clear_eisr_2;
+
+ /* DMA/Interrupt Request Enable */
+ rtems_interrupt_disable(level);
+ direr.R = SIU.DIRER.R;
+ direr.B.EIRE2 = 1; /* Enable. */
+ SIU.DIRER.R = direr.R;
+ rtems_interrupt_enable(level);
+
+ return _rtems_smc91111_driver_attach(config,&mpc5554_scmv91111_configuration);
+};
diff --git a/c/src/lib/libbsp/powerpc/mpc55xxevb/preinstall.am b/c/src/lib/libbsp/powerpc/mpc55xxevb/preinstall.am
index a0c45b245c..18fb061a21 100644
--- a/c/src/lib/libbsp/powerpc/mpc55xxevb/preinstall.am
+++ b/c/src/lib/libbsp/powerpc/mpc55xxevb/preinstall.am
@@ -57,6 +57,10 @@ $(PROJECT_LIB)/linkcmds.gwlcfm: startup/linkcmds.gwlcfm $(PROJECT_LIB)/$(dirstam
$(INSTALL_DATA) $< $(PROJECT_LIB)/linkcmds.gwlcfm
PREINSTALL_FILES += $(PROJECT_LIB)/linkcmds.gwlcfm
+$(PROJECT_LIB)/linkcmds.phycore_mpc5554: startup/linkcmds.phycore_mpc5554 $(PROJECT_LIB)/$(dirstamp)
+ $(INSTALL_DATA) $< $(PROJECT_LIB)/linkcmds.phycore_mpc5554
+PREINSTALL_FILES += $(PROJECT_LIB)/linkcmds.phycore_mpc5554
+
$(PROJECT_LIB)/linkcmds.mpc5566evb: startup/linkcmds.mpc5566evb $(PROJECT_LIB)/$(dirstamp)
$(INSTALL_DATA) $< $(PROJECT_LIB)/linkcmds.mpc5566evb
PREINSTALL_FILES += $(PROJECT_LIB)/linkcmds.mpc5566evb
diff --git a/c/src/lib/libbsp/powerpc/mpc55xxevb/startup/linkcmds.phycore_mpc5554 b/c/src/lib/libbsp/powerpc/mpc55xxevb/startup/linkcmds.phycore_mpc5554
new file mode 100644
index 0000000000..2c83736c9d
--- /dev/null
+++ b/c/src/lib/libbsp/powerpc/mpc55xxevb/startup/linkcmds.phycore_mpc5554
@@ -0,0 +1,39 @@
+/*
+ * Debug RAM is the top 4MB of external RAM and is swapped with the
+ * FLASH for development.
+ */
+MEMORY
+{
+ ROM (RX) : ORIGIN = 0x00000000, LENGTH = 2M
+ RAM (AIW) : ORIGIN = 0x40000000, LENGTH = 64K
+ RAM_EXT (AIW) : ORIGIN = 0x21000000, LENGTH = 4M
+ DEBUG_RAM (AIW): ORIGIN = 0x21400000, LENGTH = 4M
+ NIRVANA : ORIGIN = 0x00000000, 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_debug_ram_start = ORIGIN (DEBUG_RAM);
+bsp_debug_ram_end = ORIGIN (DEBUG_RAM) + LENGTH (DEBUG_RAM);
+bsp_debug_ram_size = LENGTH (DEBUG_RAM);
+
+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 ffc36c1b07..1e26ebd1b2 100644
--- a/c/src/lib/libbsp/powerpc/mpc55xxevb/startup/start.S
+++ b/c/src/lib/libbsp/powerpc/mpc55xxevb/startup/start.S
@@ -29,6 +29,10 @@
#include <bspopts.h>
.section ".bsp_start_text", "ax"
+#ifdef MPC55XX_BOOTFLAGS
+PUBLIC_VAR (mpc55xx_bootflag_0)
+PUBLIC_VAR (mpc55xx_bootflag_1)
+#endif
PUBLIC_VAR (start)
.globl fmpll_syncr_vals
bam_rchw:
@@ -39,8 +43,27 @@ bam_rchw:
/* BAM: RCHW */
.int 0x005a0000
- /* BAM: Address of start instruction */
- .int 0x8
+#ifdef MPC55XX_BOOTFLAGS
+ /* BAM: Address of start instruction
+ * We skip over the next two boot flag words to the next
+ * 64-bit aligned start address. It is 64-bit aligned
+ * to play well with FLASH programming.
+ * These boot flags can be set by debuggers and emulators to
+ * customize boot.
+ * Currently bit0 of bootflag_0 means to "skip setting up the MMU",
+ * allowing external MMU setup in a debugger before branching
+ * to 0x10. This can be used e.g., to map FLASH into RAM.
+ */
+ .int 0x00000010 /* Start address is 0x10. */
+
+mpc55xx_bootflag_0:
+ .int 0xffffffff
+mpc55xx_bootflag_1:
+ .int 0xffffffff
+
+#else
+ .int 0x00000008 /* Start address is 0x08. */
+#endif
/*
* Enable time base
@@ -97,6 +120,8 @@ start:
.equ MAS2, 626
.equ MAS3, 627
+/* Read back MMU TLB1 entry 3 (internal SRAM) and enable the cache.
+ */
LWI r3, 0x10030000
mtspr MAS0, r3
tlbre
@@ -110,17 +135,32 @@ start:
* TODO, FIXME: Set MMU for the external SRAM
*/
+/* Read back MMU TLB1 entry 2 (external SRAM) and set the
+ * logical address to the external RAM start.
+ */
LWI r3, 0x10020000
mtspr MAS0, r3
tlbre
LWI r4, 0xfff
mfspr r3, MAS3
and r3, r3, r4
- LWI r4, 0x20000000
+ LA r4, bsp_external_ram_start
or r3, r3, r4
mtspr MAS3, r3
tlbwe
+/* Read back MMU TLB1 entry 1 (internal flash) and disable
+ * write access.
+ */
+ LWI r3, 0x10010000
+ mtspr MAS0, r3
+ tlbre
+ LWI r4, ~0x0000000C
+ mfspr r3, MAS3
+ and r3, r3, r4
+ mtspr MAS3, r3
+ tlbwe
+
/*
* Zero RAM (needed to get proper ECC)
*/