summaryrefslogtreecommitdiff
path: root/nuttx/arch/arm/src/lpc2378/lpc23xx_pllsetup.c
diff options
context:
space:
mode:
Diffstat (limited to 'nuttx/arch/arm/src/lpc2378/lpc23xx_pllsetup.c')
-rwxr-xr-xnuttx/arch/arm/src/lpc2378/lpc23xx_pllsetup.c238
1 files changed, 238 insertions, 0 deletions
diff --git a/nuttx/arch/arm/src/lpc2378/lpc23xx_pllsetup.c b/nuttx/arch/arm/src/lpc2378/lpc23xx_pllsetup.c
new file mode 100755
index 000000000..d7a08b50f
--- /dev/null
+++ b/nuttx/arch/arm/src/lpc2378/lpc23xx_pllsetup.c
@@ -0,0 +1,238 @@
+/****************************************************************************
+ * arch/arm/src/lpc2378/lpc23xx_irq.c
+ *
+ * Copyright (C) 2010 Rommel Marcelo. All rights reserved.
+ * Author: Rommel Marcelo
+ *
+ * This file is part of the NuttX RTOS:
+ *
+ * Copyright (C) 2010 Gregory Nutt. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ * 3. Neither the name NuttX nor the names of its contributors may be
+ * used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ ****************************************************************************/
+
+/* This file holds the NuttX start logic that runs when the LPC2378
+ * is reset. This logic must be located at address 0x0000:0000 in
+ * flash but may be linked to run at different locations based on
+ * the selected mode:
+ *
+ * default: Executes from 0x0000:0000. In non-default modes, the
+ * MEMAP register is set override the settings of the CPU configuration
+ * pins.
+ *
+ * CONFIG_EXTMEM_MODE: Code executes from external memory starting at
+ * address 0x8000:0000.
+ *
+ * CONFIG_RAM_MODE: Code executes from on-chip RAM at address
+ * 0x4000:0000.
+ *
+ * Starupt Code must be linked to run at the correct address
+ * corresponding to the selected mode.
+ */
+
+/***********************************************************************
+ * Included Files
+ **********************************************************************/
+
+#include <nuttx/config.h>
+#include <arch/board/board.h>
+#include <sys/types.h>
+
+#include "arm.h"
+#include "up_arch.h"
+#include "internal.h"
+#include "lpc23xx_pinsel.h"
+#include "lpc23xx_scb.h"
+
+extern void IO_Init(void);
+/***********************************************************************
+ * Definitions
+ **********************************************************************/
+#if ((FOSC < 32000) || (FOSC > 50000000))
+# error Fosc out of range (32KHz-50MHz)
+# error correct and recompile
+#endif
+
+#if ((CCLK < 10000000) || (CCLK > 72000000))
+# error cclk out of range (10MHz-72MHz)
+# error correct PLL MULTIPLIER and recompile
+#endif
+
+#if ((FCCO < 275000000) || (FCCO > 550000000))
+# error Fcco out of range (275MHz-550MHz)
+# error internal algorithm error
+#endif
+
+/* Phase Locked Loop (PLL) initialization values
+ *
+ * Bit 0:14 MSEL: PLL Multiplier "M" Value
+ * CCLK = 57 600 000 Hz
+ * Bit 16:23 NSEL: PLL Divider "N" Value
+ * Fcco = (2 * M * F_in) / N
+ * 275MHz <= Fcco <= 550MHz
+ *
+ * PLL clock sources:
+ * Internal RC 0 default on reset
+ * Main Oscillator 1
+ * RTC 2
+ */
+#ifdef CONFIG_PLL_CLKSRC
+# if ( (CONFIG_PLL_CLKSRC < 0) || (CONFIG_PLL_CLKSRC > 2) )
+# error "PLL clock source not valid, check configuration "
+# endif
+#else
+# error "PLL clock source not defined, check configuration file"
+#endif
+
+/* PLL provides CCLK and must always be configured */
+#define PLL ( PLL_M | (PLL_N << 16) )
+
+/* Memory Accelerator Module (MAM) initialization values
+ *
+ * MAM Control Register
+ * Bit 0:1 Mode
+ * 0 = Disabled
+ * 1 = Partially Enabled
+ * 2 = Fully Enabled
+ * MAM Timing Register
+ * Bit 0:2 Fetch Cycles
+ * 0 = Reserved
+ * 1 = 1 CCLK
+ * 2 = 2 CCLK
+ * 3 = 3 CCLK
+ * 4 = 4 CCLK
+ * 5 = 5 CCLK
+ * 6 = 6 CCLK
+ * 7 = 7 CCLK
+ */
+/* LPC2378 Rev. '-' errata MAM may not work if fully enabled */
+#ifdef CONFIG_MAM_SETUP
+# ifndef CONFIG_MAMCR_VALUE /* Can be selected from config file */
+# define CONFIG_MAMCR_VALUE (MAMCR_PART)
+# endif
+
+# ifndef CONFIG_MAMTIM_VALUE /* Can be selected from config file */
+# define CONFIG_MAMTIM_VALUE (0x00000003)
+# endif
+#endif
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+
+/****************************************************************************
+ * Name: up_scbpllfeed
+ ****************************************************************************/
+static inline void up_scbpllfeed(void)
+{
+ SCB_PLLFEED = 0xAA;
+ SCB_PLLFEED = 0x55;
+}
+
+/****************************************************************************
+ * Name: ConfigurePLL
+ ****************************************************************************/
+void ConfigurePLL ( void )
+{
+ uint32_t MSel, NSel;
+
+ /* LPC2378 Rev.'-' errata Enable the Ethernet block to enable 16k EnetRAM */
+ SCB_PCONP |= PCENET;
+
+ /* Vectors are remapped to Flash */
+ SCB_MEMMAP = MEMMAP2FLASH;
+
+ /* Enable PLL, disconnected */
+ if(SCB_PLLSTAT & (1 << 25))
+ {
+ SCB_PLLCON = 0x01;
+ up_scbpllfeed();
+ }
+
+ /* Disable PLL, disconnected */
+ SCB_PLLCON = 0;
+ up_scbpllfeed();
+
+ /* Enable main OSC */
+ SCB_SCS |= 0x20;
+
+ /* Wait until main OSC is usable */
+ while( !(SCB_SCS & 0x40) );
+
+
+ /* select main OSC, 12MHz, as the PLL clock source */
+ SCB_CLKSRCSEL = CONFIG_PLL_CLKSRC;
+
+ /* Reconfigure PLL */
+ SCB_PLLCFG = PLL;
+ up_scbpllfeed();
+
+
+ /* Enable PLL */
+ SCB_PLLCON = 0x01;
+ up_scbpllfeed();
+
+ /* Set clock divider */
+ SCB_CCLKCFG = CCLK_DIV;
+
+
+#ifdef CONFIG_USBDEV
+ /* usbclk = 288 MHz/6 = 48 MHz */
+ SCB_USBCLKCFG = USBCLK_DIV;
+ /* Turn On USB PCLK */
+ SCB_PCONP |= PCUSB;
+#endif
+
+ /* Wait for PLL to lock */
+ while( ( SCB_PLLSTAT & (1 << 26) ) == 0);
+
+ MSel = SCB_PLLSTAT & 0x00007FFF;
+ NSel = ( SCB_PLLSTAT & 0x00FF0000 ) >> 16;
+ while( (MSel != PLL_M) && (NSel != PLL_N) );
+
+ /* Enable and connect */
+ SCB_PLLCON = 0x03;
+ up_scbpllfeed();
+
+ /* Check connect bit status */
+ while( ( SCB_PLLSTAT & ( 1 << 25 ) ) == 0 );
+
+ /* Set memory accelerater module*/
+ SCB_MAMCR = 0;
+ SCB_MAMTIM = CONFIG_MAMTIM_VALUE;
+ SCB_MAMCR = CONFIG_MAMCR_VALUE;
+
+ /* Enable FastIO on P0:P1 */
+ SCB_SCS |= 0x01;
+
+ IO_Init();
+
+ return;
+}