Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * Copyright(C) NXP Semiconductors, 2012
- * All rights reserved.
- *
- * Software that is described herein is for illustrative purposes only
- * which provides customers with programming information regarding the
- * LPC products. This software is supplied "AS IS" without any warranties of
- * any kind, and NXP Semiconductors and its licensor disclaim any and
- * all warranties, express or implied, including all implied warranties of
- * merchantability, fitness for a particular purpose and non-infringement of
- * intellectual property rights. NXP Semiconductors assumes no responsibility
- * or liability for the use of the software, conveys no license or rights under any
- * patent, copyright, mask work right, or any other intellectual property rights in
- * or to any products. NXP Semiconductors reserves the right to make changes
- * in the software without notification. NXP Semiconductors also makes no
- * representation or warranty that such application will be suitable for the
- * specified use without further testing or modification.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation is hereby granted, under NXP Semiconductors' and its
- * licensor's relevant copyrights in the software, without fee, provided that it
- * is used in conjunction with NXP Semiconductors microcontrollers. This
- * copyright, permission, and disclaimer notice must appear in all copies of
- * this code.
- */
- #include "board.h"
- /* The System initialization code is called prior to the application and
- initializes the board for run-time operation. */
- /*****************************************************************************
- * Private types/enumerations/variables
- ****************************************************************************/
- /* Structure for initial base clock states */
- struct CLK_BASE_STATES {
- CHIP_CGU_BASE_CLK_T clk; /* Base clock */
- CHIP_CGU_CLKIN_T clkin; /* Base clock source, see UM for allowable souorces per base clock */
- bool autoblock_enab;/* Set to true to enable autoblocking on frequency change */
- bool powerdn; /* Set to true if the base clock is initially powered down */
- };
- /* Initial base clock states are mostly on */
- STATIC const struct CLK_BASE_STATES InitClkStates[] = {
- {CLK_BASE_PHY_TX, CLKIN_ENET_TX, true, false},
- #if defined(USE_RMII)
- {CLK_BASE_PHY_RX, CLKIN_ENET_TX, true, false},
- #else
- {CLK_BASE_PHY_RX, CLKIN_ENET_RX, true, false},
- #endif
- /* Clocks derived from dividers */
- {CLK_BASE_LCD, CLKIN_IDIVC, true, false},
- {CLK_BASE_USB1, CLKIN_IDIVD, true, true}
- };
- /* SPIFI high speed pin mode setup */
- STATIC const PINMUX_GRP_T spifipinmuxing[] = {
- {0x3, 3, (SCU_PINIO_FAST | SCU_MODE_FUNC3)}, /* SPIFI CLK */
- {0x3, 4, (SCU_PINIO_FAST | SCU_MODE_FUNC3)}, /* SPIFI D3 */
- {0x3, 5, (SCU_PINIO_FAST | SCU_MODE_FUNC3)}, /* SPIFI D2 */
- {0x3, 6, (SCU_PINIO_FAST | SCU_MODE_FUNC3)}, /* SPIFI D1 */
- {0x3, 7, (SCU_PINIO_FAST | SCU_MODE_FUNC3)}, /* SPIFI D0 */
- {0x3, 8, (SCU_PINIO_FAST | SCU_MODE_FUNC3)} /* SPIFI CS/SSEL */
- };
- STATIC const PINMUX_GRP_T pinmuxing[] = {
- /* RMII pin group */
- #ifdef explorer_init
- {0x1, 15,
- (SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_FUNC3)},
- {0x0, 0,
- (SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_FUNC2)},
- {0x1, 16,
- (SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_FUNC7)},
- {0x0, 1, (SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_INACT | SCU_MODE_ZIF_DIS | SCU_MODE_FUNC6)},
- {0x1, 19,
- (SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_FUNC0)},
- {0x1, 18, (SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_INACT | SCU_MODE_ZIF_DIS | SCU_MODE_FUNC3)},
- {0x1, 20, (SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_INACT | SCU_MODE_ZIF_DIS | SCU_MODE_FUNC3)},
- {0x1, 17,
- (SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_FUNC3)},
- {0x2, 0, (SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_INACT | SCU_MODE_ZIF_DIS | SCU_MODE_FUNC7)},
- /* Board LEDs */
- {0x2, 11, (SCU_MODE_INBUFF_EN | SCU_MODE_PULLDOWN | SCU_MODE_FUNC0)},
- {0x2, 12, (SCU_MODE_INBUFF_EN | SCU_MODE_PULLDOWN | SCU_MODE_FUNC0)},
- /* I2S */
- {0x3, 0, (SCU_PINIO_FAST | SCU_MODE_FUNC2)},
- {0x6, 0, (SCU_PINIO_FAST | SCU_MODE_FUNC4)},
- {0x7, 2, (SCU_PINIO_FAST | SCU_MODE_FUNC2)},
- {0x6, 2, (SCU_PINIO_FAST | SCU_MODE_FUNC3)},
- {0x7, 1, (SCU_PINIO_FAST | SCU_MODE_FUNC2)},
- {0x6, 1, (SCU_PINIO_FAST | SCU_MODE_FUNC3)},
- /* GENERAL GPIO PINS - ODT */
- {0x1, 15, (SCU_MODE_INBUFF_EN | SCU_MODE_PULLUP | SCU_MODE_FUNC0)}, /* GPIO0[2] */
- {0x2, 0, (SCU_MODE_INBUFF_EN | SCU_MODE_PULLUP | SCU_MODE_FUNC0)}, /* GPIO5[0]*/
- {0x2, 11, (SCU_MODE_INBUFF_EN | SCU_MODE_PULLUP | SCU_MODE_FUNC0)}, /* GPIO1[11]*/
- {0x1, 6, (SCU_MODE_INBUFF_EN | SCU_MODE_PULLUP | SCU_MODE_FUNC0)}, /* GPIO1[9]*/
- {0x2, 7, (SCU_MODE_INBUFF_EN | SCU_MODE_PULLUP | SCU_MODE_FUNC0)}, /* GPIO0[7]*/
- {0x2, 10, (SCU_MODE_INBUFF_EN | SCU_MODE_PULLUP | SCU_MODE_FUNC0)}, /* GPIO0[14]*/
- {0x1, 0, (SCU_MODE_INBUFF_EN | SCU_MODE_PULLUP | SCU_MODE_FUNC0)}, /* GPIO0[4]*/
- {0x2, 2, (SCU_MODE_INBUFF_EN | SCU_MODE_PULLUP | SCU_MODE_FUNC0)}, /* GPIO5[2]*/
- {0x2, 5, (SCU_MODE_INBUFF_EN | SCU_MODE_PULLUP | SCU_MODE_FUNC0)}, /* GPIO5[5]*/
- {0x0, 16, (SCU_MODE_INBUFF_EN | SCU_MODE_PULLUP | SCU_MODE_FUNC0)}, /* GPIO0[3]*/
- {0x2, 13, (SCU_MODE_INBUFF_EN | SCU_MODE_PULLUP | SCU_MODE_FUNC0)}, /* GPIO1[13]*/
- {0x2, 12, (SCU_MODE_INBUFF_EN | SCU_MODE_PULLUP | SCU_MODE_FUNC0)}, /* GPIO1[12]*/
- {0x1, 8, (SCU_MODE_INBUFF_EN | SCU_MODE_PULLUP | SCU_MODE_FUNC0)}, /* GPIO1[1]*/
- {0x6, 11, (SCU_MODE_INBUFF_EN | SCU_MODE_PULLUP | SCU_MODE_FUNC0)}, /* GPIO3[7]*/
- {0x6, 9, (SCU_MODE_INBUFF_EN | SCU_MODE_PULLUP | SCU_MODE_FUNC0)}, /* GPIO3[5]*/
- {0x2, 9, (SCU_MODE_INBUFF_EN | SCU_MODE_PULLUP | SCU_MODE_FUNC0)}, /* GPIO1[10]*/
- {0x0, 1, (SCU_MODE_INBUFF_EN | SCU_MODE_PULLUP | SCU_MODE_FUNC0)}, /* GPIO0[1]*/
- {0x2, 1, (SCU_MODE_INBUFF_EN | SCU_MODE_PULLUP | SCU_MODE_FUNC0)}, /* GPIO5[1]*/
- {0x1, 13, (SCU_MODE_PULLDOWN | SCU_MODE_FUNC1)}, /* P1_13 : UART1_TXD */
- {0x1, 14, (SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_FUNC1)}, /* P1_14 : UART1_RX */
- #endif
- {0x2, 3, (SCU_MODE_PULLDOWN | SCU_MODE_FUNC1)}, /* P2_3 : UART3_TXD */
- {0x2, 4, (SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_FUNC1)}, /* P2_4 : UART3_RX */
- /* Board LEDs */
- {0x8, 2, (SCU_MODE_INBUFF_EN | SCU_MODE_PULLDOWN | SCU_MODE_FUNC0)},
- {0x8, 3, (SCU_MODE_INBUFF_EN | SCU_MODE_PULLDOWN | SCU_MODE_FUNC0)},
- {0x8, 4, (SCU_MODE_INBUFF_EN | SCU_MODE_PULLDOWN | SCU_MODE_FUNC0)},
- {0x8, 5, (SCU_MODE_INBUFF_EN | SCU_MODE_PULLDOWN | SCU_MODE_FUNC0)},
- {0x8, 6, (SCU_MODE_INBUFF_EN | SCU_MODE_PULLDOWN | SCU_MODE_FUNC0)},
- {0x8, 7, (SCU_MODE_INBUFF_EN | SCU_MODE_PULLDOWN | SCU_MODE_FUNC0)},
- //input
- {0xC, 9, (SCU_MODE_INBUFF_EN | SCU_MODE_PULLUP | SCU_MODE_FUNC4)},
- /* External data lines D0 .. D31 */
- {0x1, 7,(SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC3)},
- {0x1, 8,(SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC3)},
- {0x1, 9,(SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC3)},
- {0x1, 10,(SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC3)},
- {0x1, 11,(SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC3)},
- {0x1, 12,(SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC3)},
- {0x1, 13,(SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC3)},
- {0x1, 14,(SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC3)},
- {0x5, 4,(SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC2)},
- {0x5, 5,(SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC2)},
- {0x5, 6,(SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC2)},
- {0x5, 7,(SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC2)},
- {0x5, 0,(SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC2)},
- {0x5, 1,(SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC2)},
- {0x5, 2,(SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC2)},
- {0x5, 3,(SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC2)},
- {0xD, 2,(SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC2)},
- {0xD, 3,(SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC2)},
- {0xD, 4,(SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC2)},
- {0xD, 5,(SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC2)},
- {0xD, 6,(SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC2)},
- {0xD, 7,(SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC2)},
- {0xD, 8,(SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC2)},
- {0xD, 9,(SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC2)},
- {0xE, 5,(SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC3)},
- {0xE, 6,(SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC3)},
- {0xE, 7,(SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC3)},
- {0xE, 8,(SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC3)},
- {0xE, 9,(SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC3)},
- {0xE, 10,(SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC3)},
- {0xE, 11,(SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC3)},
- {0xE, 12,(SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC3)},
- /* Address lines A0 .. A23 */
- {0x2, 9,(SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC3)},
- {0x2, 10,(SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC3)},
- {0x2, 11,(SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC3)},
- {0x2, 12,(SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC3)},
- {0x2, 13,(SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC3)},
- {0x1, 0,(SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC2)},
- {0x1, 1,(SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC2)},
- {0x1, 2,(SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC2)},
- {0x2, 8,(SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC3)},
- {0x2, 7,(SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC3)},
- {0x2, 6,(SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC2)},
- {0x2, 2,(SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC2)},
- {0x2, 1,(SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC2)},
- {0x2, 0,(SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC2)},
- {0x6, 8,(SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC1)},
- {0x6, 7,(SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC1)},
- {0xD, 16,(SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC2)},
- {0xD, 15,(SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC2)},
- {0xE, 0,(SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC3)},
- {0xE, 1,(SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC3)},
- {0xE, 2,(SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC3)},
- {0xE, 3,(SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC3)},
- {0xE, 4,(SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC3)},
- {0xA, 4,(SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC3)},
- /* EMC control signals */
- {0x1, 4,(SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC3)}, //Byte Lane select signal 0
- {0x6, 6,(SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC1)}, //Byte Lane select signal 1
- {0xD, 13,(SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC2)},//Byte Lane select signal 2
- {0xD, 10,(SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC2)},//Byte Lane select signal 3
- {0x6, 9,(SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC3)}, //EMC_DYCS0
- {0x1, 6,(SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC3)},
- {0x6, 4,(SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC3)}, //EMC_CAS
- {0x6, 5,(SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC3)}, //EMC_RAS
- {0x6, 11,(SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC3)}, //EMC_CKEOUT0
- {0x6, 12,(SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC3)}, //EMC_DQMOUT0
- {0x6, 10,(SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC3)}, //EMC_DQMOUT1
- {0xD, 0,(SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC2)}, //EMC_DQMOUT2
- {0xE, 13,(SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC3)}, //EMC_DQMOUT3
- {0x1, 3, (SCU_PINIO_FAST | SCU_MODE_FUNC3)}, //EMC OE
- {0x1, 4, (SCU_PINIO_FAST | SCU_MODE_FUNC3)}, //EMC_BLS0
- {0x6, 6, (SCU_PINIO_FAST | SCU_MODE_FUNC1)}, //EMC_BLS1
- {0x1, 5, (SCU_PINIO_FAST | SCU_MODE_FUNC3)}, //EMC_CS0
- {0x1, 6, (SCU_PINIO_FAST | SCU_MODE_FUNC3)} //EMC_WE
- };
- /*****************************************************************************
- * Public types/enumerations/variables
- ****************************************************************************/
- /*****************************************************************************
- * Private functions
- ****************************************************************************/
- /*****************************************************************************
- * Public functions
- ****************************************************************************/
- /* Sets up system pin muxing */
- void Board_SetupMuxing(void)
- {
- /* Setup system level pin muxing (and External Memory Controller)*/
- Chip_SCU_SetPinMuxing(pinmuxing, sizeof(pinmuxing) / sizeof(PINMUX_GRP_T));
- /* SPIFI pin setup is done prior to setting up system clocking */
- Chip_SCU_SetPinMuxing(spifipinmuxing, sizeof(spifipinmuxing) / sizeof(PINMUX_GRP_T));
- }
- /* Set up and initialize clocking prior to call to main */
- void Board_SetupClocking(void)
- {
- unsigned int i;
- Chip_SetupCoreClock(CLKIN_CRYSTAL, MAX_CLOCK_FREQ, true);
- /* Reset and enable 32Khz oscillator */
- LPC_CREG->CREG0 &= ~((1 << 3) | (1 << 2));
- LPC_CREG->CREG0 |= (1 << 1) | (1 << 0);
- /* Setup a divider E for main PLL clock switch SPIFI clock to that divider.
- Divide rate is based on CPU speed and speed of SPI FLASH part. */
- #if (MAX_CLOCK_FREQ > 180000000)
- Chip_Clock_SetDivider(CLK_IDIV_E, CLKIN_MAINPLL, 5);
- #else
- Chip_Clock_SetDivider(CLK_IDIV_E, CLKIN_MAINPLL, 4);
- #endif
- Chip_Clock_SetBaseClock(CLK_BASE_SPIFI, CLKIN_IDIVE, true, false);
- /* Setup system base clocks and initial states. This won't enable and
- disable individual clocks, but sets up the base clock sources for
- each individual peripheral clock. */
- for (i = 0; i < (sizeof(InitClkStates) / sizeof(InitClkStates[0])); i++) {
- Chip_Clock_SetBaseClock(InitClkStates[i].clk, InitClkStates[i].clkin,
- InitClkStates[i].autoblock_enab, InitClkStates[i].powerdn);
- }
- }
- /**EMC*/
- /* Keil SDRAM timing and chip Config */
- STATIC const IP_EMC_DYN_CONFIG_T AS4C2M32SA_config =
- {
- //EMCCLK=102mhz => 1 clk = 9.8 ns
- EMC_NANOSECOND(80), /*!< Refresh period*/
- 0x1, /*!< Clock*/
- EMC_NANOSECOND(18), /*!< (tRP) Precharge Command Period */ //Datablad: min 18 ns
- EMC_NANOSECOND(42), /*!< (tRAS) Active to Precharge Command Period */ //Datablad: min 42 ns
- EMC_NANOSECOND(70), /*!< (tSREX) Self Refresh Exit Time */ // ?
- EMC_CLOCK(0x01), /*!< (tAPR) Last Data Out to Active Time */ // ?
- EMC_CLOCK(0x05), /*!< (tDAL) Data In to Active Command Time */ // tRP + tWR = 18ns + 2 clk
- EMC_NANOSECOND(12), /*!< (tWR) Write Recovery Time */ //Datablad: min 2 clockcycles no max
- EMC_NANOSECOND(60), /*!< (tRC) Active to Active Command Period */ //Datablad: min 60 ns
- EMC_NANOSECOND(60), /*!< (tRFC) Auto-refresh Period */ //Datablad: min 60 ns
- EMC_NANOSECOND(70), /*!< (tXSR) Exit Selt Refresh */ //Datablad: min 60+1.5 ns
- EMC_NANOSECOND(12), /*!< (tRRD) Active Bank A to Active Bank B Time */ //Datablad: min 12 ns
- EMC_CLOCK(0x02), /*!< (tMRD) Load Mode register command to Active Command */ //Datablad min 2 clockcycles
- {
- {
- EMC_ADDRESS_DYCS0, /* DYCS0 for SDRAM - BaseAddress 0x28000000*/
- 3, /* RAS */
- EMC_DYN_MODE_WBMODE_PROGRAMMED | //Mode Register value
- EMC_DYN_MODE_OPMODE_STANDARD |
- EMC_DYN_MODE_CAS_3 |
- EMC_DYN_MODE_BURST_TYPE_SEQUENTIAL |
- EMC_DYN_MODE_BURST_LEN_4,
- EMC_DYN_CONFIG_DATA_BUS_32 | //Dynamic Configuration value
- EMC_DYN_CONFIG_LPSDRAM |
- EMC_DYN_CONFIG_2Mx32_4BANKS_11ROWS_8COLS |
- EMC_DYN_CONFIG_MD_SDRAM
- },
- {0, 0, 0, 0}, //DYCS1
- {0, 0, 0, 0}, //DYCS2
- {0, 0, 0, 0} //DYSC3
- }
- };
- STATIC const IP_EMC_STATIC_CONFIG_T S29GL64N90_config = {
- 0,
- EMC_STATIC_CONFIG_MEM_WIDTH_32 |
- EMC_STATIC_CONFIG_CS_POL_ACTIVE_LOW |
- EMC_STATIC_CONFIG_BLS_HIGH /* |
- EMC_CONFIG_BUFFER_ENABLE*/,
- EMC_NANOSECOND(0),
- EMC_NANOSECOND(65),
- EMC_NANOSECOND(90),
- EMC_NANOSECOND(90),
- EMC_NANOSECOND(35),
- EMC_CLOCK(4)
- };
- /* EMC clock delay */
- #define CLK0_DELAY 16 //(?)
- /* Setup external memories */
- void Board_SetupExtMemory(void)
- {
- // LPC_EMC->DYNAMICCONFIG0 |= (0 << 19); //disable buffers
- // LPC_EMC->STATICCONFIG0 |= (0 << 19); //disable buffers
- // /* Setup EMC Delays */
- // /* Move all clock delays together */
- // LPC_SCU->EMCDELAYCLK = ((CLK0_DELAY) | (CLK0_DELAY << 4) | (CLK0_DELAY << 8) | (CLK0_DELAY << 12));
- //
- // /* Setup EMC Clock Divider for divide by 2 - this is done in both the CCU (clocking)
- // and CREG. For frequencies over 120MHz, a divider of 2 must be used. For frequencies
- // less than 120MHz, a divider of 1 or 2 is ok. */
- // Chip_Clock_EnableOpts(CLK_MX_EMC_DIV, true, true, 2); // BASE_M4_CLK / 2
- // LPC_CREG->CREG6 |= (1 << 16);
- // /* Enable EMC clock */
- // Chip_Clock_Enable(CLK_MX_EMC);
- // /* Init EMC Controller -Enable-LE mode */
- // Chip_EMC_Init(1, 0, 0);
- // /* Init EMC Dynamic Controller */
- // Chip_EMC_Dynamic_Init((IP_EMC_DYN_CONFIG_T *) &AS4C2M32SA_config);
- // /* Init EMC Static Controller CS0 */
- // Chip_EMC_Static_Init((IP_EMC_STATIC_CONFIG_T *) &S29GL64N90_config);
- //
- // //LPC_EMC->DYNAMICCONFIG0 = 0x5300; // BRC mapping
- // //LPC_EMC->DYNAMICCONFIG0 = 0x4300; // RBC mapping
- // LPC_EMC->DYNAMICCONFIG0 |= (1 << 19); //enable buffers
- // /* Enable Buffer for External Flash */
- // LPC_EMC->STATICCONFIG0 |= 1 << 19;
- uint32_t *pConfig;
- /**Step 1: Enable EMC clocking, select SDRAM type, and select SDRAM slew rates*/
- //Set CREG6 control register for EMC_CLK_SEL (bit # 16) = 1 => EMC_CLK_DIV divided by 2.
- //pConfig=(volatile uint32_t *)0x4004312C;
- //*pConfig |= 1 << 16; //CONFIRMED 0x00000001
- //Set CCU1 branch clock configuration register. Clock divider value (bit 5:7) 0x1 (divided by 2)
- pConfig=(volatile uint32_t *)0x40051478;
- //*pConfig |= 0x1 << 5; //UNCONFIRMED BUT ASSUMED
- *pConfig|=0x21;
- *pConfig=(1 << 2) | (1 << 1) | 1;
- LPC_SCU->EMCDELAYCLK = 0x00005555;
- /* Set Address mapping for MT48LC16M16 cascaded as 32-bit memory: */
- /* 256Mbit(16Mb x 4 x 4 banks), row len = 13, column len = 10 */
- /* bit[14] = 1 bit]11:9] = 100 bit[8:7] = 01 */
- // LPC_EMC->DYNAMICCONFIG0 = (1 << 14) | /* AM[14] = 1 */
- //
- // (0 << 12) | /* AM[12] = 0 */
- //
- // (4 << 9) | /* AM[11:9] = 4 */
- //
- // (1 << 7) ; /* AM[8:7] = 1 */
- pConfig=(volatile uint32_t *)0x40005100; //Dynamic Memory Configuration Register
- *pConfig |= 0x6 << 7; //AM0 Address mapping bit 7:12 //CONFIRMED 0x00000300
- *pConfig |= 0x1 << 14; //AM1 Address mapping bit 14
- LPC_EMC->DYNAMICRASCAS0 = 0x00000303; /* Latency: RAS 3, CAS 3 CCLK cyc.*/
- LPC_EMC->DYNAMICREADCONFIG = 0x00000001; /* Command delayed by 1/2 CCLK */
- LPC_EMC->DYNAMICRP = 4;
- LPC_EMC->DYNAMICRAS = 7;
- LPC_EMC->DYNAMICSREX = 9;
- LPC_EMC->DYNAMICAPR = 1;
- LPC_EMC->DYNAMICDAL = 7;
- LPC_EMC->DYNAMICWR = 4;
- LPC_EMC->DYNAMICRC = 9;
- LPC_EMC->DYNAMICRFC = 9;
- LPC_EMC->DYNAMICXSR = 9;
- LPC_EMC->DYNAMICRRD = 4;
- LPC_EMC->DYNAMICMRD = 2;
- WaitState(10000);
- LPC_EMC->DYNAMICCONTROL = 0x00000183; /* Issue NOP command */
- WaitState(10000);
- LPC_EMC->DYNAMICCONTROL = 0x00000103; /* Issue PALL command */
- WaitState(10000);
- LPC_EMC->DYNAMICCONTROL = 0x00000183; /* Issue NOP command */
- WaitState(10000);
- LPC_EMC->DYNAMICREFRESH = 2; //EMC_NANOSEC( 200, SystemCoreClock, div) / 16 + 1;
- WaitState(10000);
- LPC_EMC->DYNAMICREFRESH = 110; //EMC_NANOSEC(15625, SystemCoreClock, div) / 16 + 1;
- WaitState(10000);
- LPC_EMC->DYNAMICCONTROL = 0x00000083; /* Issue MODE command */
- /* Mode register: Burst Length: 4, Burst Type: Sequential, CAS Latency: 3 */
- uint32_t ConfigRead;
- //ConfigRead=*((volatile uint32_t *)(0x28000000|0x32<<12)); //DYSC0 Base Address + MODE << OFFSET
- ConfigRead=*((volatile uint32_t *)(0x28032000)); //DYSC0 Base Address + MODE << OFFSET
- // Follow with at least 2 NOPS
- LPC_EMC->DYNAMICCONTROL |= (0x3<<7);
- LPC_EMC->DYNAMICCONTROL |= (0x3<<7);
- LPC_EMC->DYNAMICCONTROL = 0x00000003; /* Issue NORMAL command */
- LPC_EMC->DYNAMICCONFIG0 |= (1 << 19); /* Enable buffer */
- LPC_EMC->STATICCONFIG0 |= (1 << 19) ; /* Enable buffer */
- }
- #define EMC_B_ENABLE (1 << 19)
- #define EMC_ENABLE (1 << 0)
- #define EMC_CE_ENABLE (1 << 0)
- #define EMC_CS_ENABLE (1 << 1)
- #define EMC_CLOCK_DELAYED_STRATEGY (0 << 0)
- #define EMC_COMMAND_DELAYED_STRATEGY (1 << 0)
- #define EMC_COMMAND_DELAYED_STRATEGY2 (2 << 0)
- #define EMC_COMMAND_DELAYED_STRATEGY3 (3 << 0)
- #define EMC_INIT(i) ((i) << 7)
- #define EMC_NORMAL (0)
- #define EMC_MODE (1)
- #define EMC_PRECHARGE_ALL (2)
- #define EMC_NOP (3)
- void emc_WaitUS(volatile uint32_t us)
- {
- us *= (SystemCoreClock / 1000000) / 3;
- while(us--);
- }
- void vEMC_InitSRDRAM(uint32_t u32BaseAddr, uint32_t u32Width, uint32_t u32Size, uint32_t u32DataBus, uint32_t u32ColAddrBits)
- {
- if(u32DataBus == 0) // burst size 8, CAS3
- {
- *((volatile uint32_t *)(u32BaseAddr | ((3UL | (3UL << 4)) << (u32ColAddrBits + 2 + 1))));
- }
- else // 32-bit, burst size 4, CAS3
- {
- *((volatile uint32_t *)(u32BaseAddr | ((2UL | (3UL << 4)) << (u32ColAddrBits + 2 + 2)))); //
- }
- LPC_EMC->DYNAMICCONTROL = 0; // EMC_CE_ENABLE | EMC_CS_ENABLE;
- LPC_EMC->DYNAMICCONFIG0 = ((u32Width << 7) | (u32Size << 9)/* | (1UL << 12)*/ | (u32DataBus << 14)) | EMC_B_ENABLE;
- LPC_EMC->DYNAMICCONFIG1 = ((u32Width << 7) | (u32Size << 9)/* | (1UL << 12)*/ | (u32DataBus << 14)) | EMC_B_ENABLE;
- LPC_EMC->DYNAMICCONFIG2 = ((u32Width << 7) | (u32Size << 9)/* | (1UL << 12)*/ | (u32DataBus << 14)) | EMC_B_ENABLE;
- LPC_EMC->DYNAMICCONFIG3 = ((u32Width << 7) | (u32Size << 9)/* | (1UL << 12)*/ | (u32DataBus << 14)) | EMC_B_ENABLE;
- }
- void MyEMCConfig()
- {
- /**
- * @brief Configure clock pin function (pins SFSCLKx)
- * @param clknum : Clock pin number, should be: 0..3
- * @param mode : OR'ed values or type SCU_MODE_*
- * @param func : Pin function, value of type SCU_MODE_FUNC0 to SCU_MODE_FUNC7
- * @return Nothing
- */
- uint32_t WaitN=10000;
- uint32_t *pConfig; //Register pointer
- /**Enable EMC clocking*/
- Chip_SCU_ClockPinMuxSet(0,SCU_MODE_FUNC0); //CLK0 pad N5 set to EMC_CLOCK 0
- pConfig=(volatile uint32_t *)0x40086C00;
- *pConfig|=(0x1<<6);
- pConfig=(volatile uint32_t *)0x40086C04;
- *pConfig|=(0x1<<6);
- pConfig=(volatile uint32_t *)0x40086C08;
- *pConfig|=(0x1<<6);
- pConfig=(volatile uint32_t *)0x40086C0C;
- *pConfig|=(0x1<<6);
- //Set CREG6 control register for EMC_CLK_SEL (bit # 16) = 1 => EMC_CLK_DIV divided by 2.
- LPC_CREG->CREG6 |= 1 << 16;
- //Set CCU1 branch clock configuration register. Clock divider value (bit 5:7) 0x1 (divided by 2)
- pConfig=(volatile uint32_t *)0x40051478;
- *pConfig|=0x23; //bit 0,1 and 5 is 1
- //Configure EMCCLKDELAY for frequencies above 95 Mhz
- pConfig=(volatile uint32_t *)0x40086D00; //EMC clock delay register
- *pConfig |= 0x7FFF; //~ 3.5 ns delay. Page 429
- /**Enable the EMC interface and set EMC endian-ness*/
- pConfig=(volatile uint32_t *)0x40005000; //EMC Control register
- *pConfig |= 0x1; //Enable EMC and set normal memory map
- pConfig=(volatile uint32_t *)0x40005008; //EMC Configuration register
- *pConfig |= 0x0; //Bit 0: Endianess. 0 for little-endian (POR value)
- /**Set a long period for the dynamic refresh rate*/
- pConfig=(volatile uint32_t *)0x40005024; //Dynamic Memory Refresh Timer Register
- *pConfig |= 0x7FF; //Long refresh period
- /**Setup address mapping*/
- pConfig=(volatile uint32_t *)0x40005100; //Dynamic Memory Configuration Register
- *pConfig |= 0x6 << 7; //AM0 Address mapping bit 7:12
- *pConfig |= 0x1 << 14; //AM1 Address mapping bit 14
- WaitState(WaitN); //Empty for-loop for WaitN iterations
- //Ends up 0x4300 => RBC mapping as expected
- /**Setup RAS and CAS latencies*/
- pConfig=(volatile uint32_t *)0x40005104; //Dynamic Memory RAS & CAS Delay registers
- *pConfig |= 0x3; //RAS 3 bit 0:1
- *pConfig |= 0x3 << 8; //CAS 3 bit 8:9
- WaitState(WaitN); //Empty for-loop for WaitN iterations
- /**Setup the SDRAM command and read strategy*/
- pConfig=(volatile uint32_t *)0x40005028; //Dynamic Memory Read Configuration register
- *pConfig |= 0x1; //0x1 for SDRAM operation
- /**Setup interface timing*/
- LPC_EMC->DYNAMICRP = 4;
- LPC_EMC->DYNAMICRAS = 7;
- LPC_EMC->DYNAMICSREX = 9;
- LPC_EMC->DYNAMICAPR = 1;
- LPC_EMC->DYNAMICDAL = 7;
- LPC_EMC->DYNAMICWR = 4;
- LPC_EMC->DYNAMICRC = 9;
- LPC_EMC->DYNAMICRFC = 9;
- LPC_EMC->DYNAMICXSR = 9;
- LPC_EMC->DYNAMICRRD = 4;
- LPC_EMC->DYNAMICMRD = 2;
- /**Enable SDRAM clocks and clock enables and issues NOPs for 200 us*/
- pConfig=(volatile uint32_t *)0x40005020; //Dynamic Control Register
- *pConfig |= 0x1; //Clock enable
- *pConfig |= 0x1 << 1; //Clock Control enable
- pConfig=(volatile uint32_t *)0x40005000; //EMC Control register
- *pConfig |= 0x3 <<7; //NOP
- WaitState(WaitN);
- /**Step 13: Issue precharge-all command*/
- pConfig=(volatile uint32_t *)0x40005020; //Dynamic Control Register
- *pConfig |= 0x1; //Clock enable
- *pConfig |= 0x1 << 1; //Clock Control enable
- pConfig=(volatile uint32_t *)0x40005024; //Dynamic Memory Refresh Timer Register
- *pConfig = 0x001; //Short refresh period
- pConfig=(volatile uint32_t *)0x40005020; //EMC Control register
- *pConfig |= 0x2 <<7; //PALL
- WaitState(WaitN);
- /**Set normal dynamic refresh timing*/
- pConfig=(volatile uint32_t *)0x40005024; //Dynamic Memory Refresh Timer Register
- *pConfig |= 0x64; //0x64 EMC_CLK cycles => ~ 15.6 us
- /**Issue mode word*/
- uint32_t ConfigRead;
- //ConfigRead=*((volatile uint32_t *)(0x28000000|0x32<<12)); //DYSC0 Base Address + MODE << OFFSET
- ConfigRead=*((volatile uint32_t *)(0x28032000)); //DYSC0 Base Address + MODE << OFFSET
- pConfig=(volatile uint32_t *)0x40005000; //EMC Control register
- *pConfig |= 0x3 <<7; //NOP
- WaitState(WaitN);
- *pConfig |= 0x3 <<7; //NOP
- WaitState(WaitN);
- /**Enter normal operational mode*/
- pConfig=(volatile uint32_t *)0x40005020; //Dynamic Control Register
- //*pConfig |= 0x00 << 7; //Normal mode (bit 7:8)
- //*pConfig |= 0x0 << 2; //Self-refresh normal
- *pConfig = 0x00; //Clear
- *pConfig = 0x7; //CE, CS, SR
- /** Enable buffer*/
- pConfig=(volatile uint32_t *)0x40005100; //Dynamic Memory Configuration Register
- *pConfig |= 0x1 << 19;
- }
- void WaitState(uint16_t cnt)
- {
- uint16_t i,x;
- for(i=0; i<cnt; i++)
- {
- x++;
- }
- }
- /* Set up and initialize hardware prior to call to main */
- void Board_SystemInit(void)
- {
- /* Setup system clocking and memory. This is done early to allow the
- application and tools to clear memory and use scatter loading to
- external memory. */
- Board_SetupMuxing();
- Board_SetupClocking();
- MyEMCConfig();
- //Board_SetupExtMemory();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement