summaryrefslogtreecommitdiff
path: root/nuttx/arch/arm/src/lpc43xx/lpc43_start.c
diff options
context:
space:
mode:
authorpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2012-07-05 22:38:12 +0000
committerpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2012-07-05 22:38:12 +0000
commit6a40832bcdd0acbfa1aa6b6c93b36dfeab5f4623 (patch)
tree1eeeac080c7d4b884783b573a1a2c7597d44ec0e /nuttx/arch/arm/src/lpc43xx/lpc43_start.c
parent6410d604c730db2e581993ff8854ec7a939a89d5 (diff)
downloadpx4-nuttx-6a40832bcdd0acbfa1aa6b6c93b36dfeab5f4623.tar.gz
px4-nuttx-6a40832bcdd0acbfa1aa6b6c93b36dfeab5f4623.tar.bz2
px4-nuttx-6a40832bcdd0acbfa1aa6b6c93b36dfeab5f4623.zip
Add LPC43 clock initialization logic
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@4910 42af7a65-404d-4744-a932-0658087f49c3
Diffstat (limited to 'nuttx/arch/arm/src/lpc43xx/lpc43_start.c')
-rw-r--r--nuttx/arch/arm/src/lpc43xx/lpc43_start.c118
1 files changed, 111 insertions, 7 deletions
diff --git a/nuttx/arch/arm/src/lpc43xx/lpc43_start.c b/nuttx/arch/arm/src/lpc43xx/lpc43_start.c
index 972591019..0b917a8ea 100644
--- a/nuttx/arch/arm/src/lpc43xx/lpc43_start.c
+++ b/nuttx/arch/arm/src/lpc43xx/lpc43_start.c
@@ -33,6 +33,27 @@
* POSSIBILITY OF SUCH DAMAGE.
*
****************************************************************************/
+/*
+ * Power-Up Reset Overview
+ * -----------------------
+ *
+ * The ARM core starts executing code on reset with the program counter set
+ * to 0x0000:0000. The LPC43xx contains a shadow pointer register that
+ * allows areas of memory to be mapped to address 0x0000:0000. The default,
+ * reset value of the shadow pointer is 0x1040:0000 so that on reset code in
+ * the boot ROM is always executed first.
+ *
+ * The boot starts after reset is released. The IRC is selected as CPU clock
+ * and the Cortex-M4 starts the boot loader. By default the JTAG access to the
+ * chip is disabled at reset. The boot ROM determines the boot mode based on
+ * the OTP BOOT_SRC value or reset state pins. For flash-based parts, the part
+ * boots from internal flash by default. Otherwse, the boot ROM copies the
+ * image to internal SRAM at location 0x1000:0000, sets the ARM's shadow
+ * pointer to 0x1000:0000, and jumps to that location.
+ *
+ * However, using JTAG the executable image can be also loaded directly into
+ * and executed from SRAM.
+ */
#include <nuttx/config.h>
@@ -45,16 +66,20 @@
#include "up_arch.h"
#include "up_internal.h"
+#include "nvic.h"
-#ifdef CONFIG_ARCH_FPU
-# include "nvic.h"
-#endif
+#include "chip/lpc43_creg.h"
#include "lpc43_rgu.h"
#include "lpc43_cgu.h"
+#include "lpc43_emc.h"
#include "lpc43_lowputc.h"
/****************************************************************************
+ * Preprocessor Definitions
+ ****************************************************************************/
+
+ /****************************************************************************
* Name: showprogress
*
* Description:
@@ -73,6 +98,71 @@
****************************************************************************/
/****************************************************************************
+ * Name: lpc43_setbootrom
+ *
+ * Description:
+ * Set the shadow register to 0x1040:0000 and the VTOR to 0x0000:0000 so
+ * that any exceptions (particulary things like hard faults) that occur
+ * before we are initialized are caught by the BOOT ROM.
+ *
+ ****************************************************************************/
+
+static inline void lpc43_setbootrom(void)
+{
+ /* Set the shadow register to the beginning of the boot ROM (Only bits 12-31) */
+
+ putreg32(LPC43_ROM_BASE, LPC43_CREG_M4MEMMAP);
+
+ /* Address zero now maps to the Boot ROM. Make sure the the VTOR will
+ * use the ROM vector table at that address.
+ */
+
+ putreg32(0, NVIC_VECTAB);
+}
+
+/****************************************************************************
+ * Name: lpc43_enabuffering
+ *
+ * Description:
+ * If we are executing from external FLASH, then enable buffering.
+ *
+ ****************************************************************************/
+
+#if defined(CONFIG_BOOT_CS0FLASH) || defined(CONFIG_BOOT_CS1FLASH) || \
+ defined(CONFIG_BOOT_CS2FLASH) || defined(CONFIG_BOOT_CS3FLASH)
+static inline void lpc43_enabuffering(void)
+{
+ uint32_t regval;
+
+#ifdef CONFIG_BOOT_CS0FLASH
+ regval = getreg32(LPC43_EMC_STATCONFIG0);
+ regval |= EMC_STATCONFIG_BENA
+ putreg32(regval, LPC43_EMC_STATCONFIG0);
+#endif
+
+#ifdef CONFIG_BOOT_CS1FLASH
+ regval = getreg32(LPC43_EMC_STATCONFIG1);
+ regval |= EMC_STATCONFIG_BENA
+ putreg32(regval, LPC43_EMC_STATCONFIG1);
+#endif
+
+#ifdef CONFIG_BOOT_CS2FLASH
+ regval = getreg32(LPC43_EMC_STATCONFIG2);
+ regval |= EMC_STATCONFIG_BENA
+ putreg32(regval, LPC43_EMC_STATCONFIG2);
+#endif
+
+#ifdef CONFIG_BOOT_CS3FLASH
+ regval = getreg32(LPC43_EMC_STATCONFIG3);
+ regval |= EMC_STATCONFIG_BENA
+ putreg32(regval, LPC43_EMC_STATCONFIG3);
+#endif
+}
+#else
+# define lpc43_enabuffering()
+#endif
+
+/****************************************************************************
* Name: lpc43_fpuconfig
*
* Description:
@@ -190,15 +280,24 @@ void __start(void)
lpc43_softreset();
#endif
+ /* Make sure that any exceptions (such as hard faults) that occur before
+ * we are initialized are caught by the BOOT ROM.
+ */
+
+ lpc43_setbootrom();
+
/* Configure the CGU clocking and the console uart so that we can get
* debug output as soon as possible.
*/
lpc43_clockconfig();
- lpc43_fpuconfig();
lpc43_lowsetup();
showprogress('A');
+ /* If we are executing from external FLASH, then enable buffering */
+
+ lpc43_enabuffering();
+
/* Clear .bss. We'll do this inline (vs. calling memset) just to be
* certain that there are no issues with the state of global variables.
*/
@@ -221,17 +320,22 @@ void __start(void)
}
showprogress('C');
+ /* Initialize the FPU (if configured) */
+
+ lpc43_fpuconfig();
+ showprogress('D');
+
/* Perform early serial initialization */
#ifdef USE_EARLYSERIALINIT
up_earlyserialinit();
#endif
- showprogress('D');
+ showprogress('E');
/* Initialize onboard resources */
lpc43_boardinitialize();
- showprogress('E');
+ showprogress('F');
/* Then start NuttX */
@@ -239,7 +343,7 @@ void __start(void)
showprogress('\n');
os_start();
- /* Shoulnd't get here */
+ /* Shouldn't get here */
for(;;);
}