|
| 1 | +#include "board.h" |
| 2 | + |
| 3 | +#include <stdint.h> |
| 4 | + |
| 5 | +/* System configuration variables used by chip driver */ |
| 6 | +const uint32_t ExtRateIn = 0; |
| 7 | +const uint32_t OscRateIn = 12000000; |
| 8 | + |
| 9 | +/* Structure for initial base clock states */ |
| 10 | +struct CLK_BASE_STATES { |
| 11 | + CHIP_CGU_BASE_CLK_T clk; /* Base clock */ |
| 12 | + CHIP_CGU_CLKIN_T clkin; /* Base clock source, see UM for allowable souorces per base clock */ |
| 13 | + bool autoblock_enab;/* Set to true to enable autoblocking on frequency change */ |
| 14 | + bool powerdn; /* Set to true if the base clock is initially powered down */ |
| 15 | +}; |
| 16 | + |
| 17 | +/* Initial base clock states are mostly on */ |
| 18 | +STATIC const struct CLK_BASE_STATES InitClkStates[] = { |
| 19 | + {CLK_BASE_PHY_TX, CLKIN_ENET_TX, true, false}, |
| 20 | +#if defined(USE_RMII) |
| 21 | + {CLK_BASE_PHY_RX, CLKIN_ENET_TX, true, false}, |
| 22 | +#else |
| 23 | + {CLK_BASE_PHY_RX, CLKIN_ENET_RX, true, false}, |
| 24 | +#endif |
| 25 | + |
| 26 | + /* Clocks derived from dividers */ |
| 27 | + {CLK_BASE_LCD, CLKIN_IDIVC, true, false}, |
| 28 | + {CLK_BASE_USB1, CLKIN_IDIVD, true, true} |
| 29 | +}; |
| 30 | + |
| 31 | +/* SPIFI high speed pin mode setup */ |
| 32 | +STATIC const PINMUX_GRP_T spifipinmuxing[] = { |
| 33 | + {0x3, 3, (SCU_PINIO_FAST | SCU_MODE_FUNC3)}, /* SPIFI CLK */ |
| 34 | + {0x3, 4, (SCU_PINIO_FAST | SCU_MODE_FUNC3)}, /* SPIFI D3 */ |
| 35 | + {0x3, 5, (SCU_PINIO_FAST | SCU_MODE_FUNC3)}, /* SPIFI D2 */ |
| 36 | + {0x3, 6, (SCU_PINIO_FAST | SCU_MODE_FUNC3)}, /* SPIFI D1 */ |
| 37 | + {0x3, 7, (SCU_PINIO_FAST | SCU_MODE_FUNC3)}, /* SPIFI D0 */ |
| 38 | + {0x3, 8, (SCU_PINIO_FAST | SCU_MODE_FUNC3)} /* SPIFI CS/SSEL */ |
| 39 | +}; |
| 40 | + |
| 41 | +STATIC const PINMUX_GRP_T pinmuxing[] = { |
| 42 | + /* RMII pin group */ |
| 43 | + {0x1, 15, (SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_FUNC3)}, |
| 44 | + {0x0, 0, (SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_FUNC2)}, |
| 45 | + {0x1, 16, (SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_FUNC7)}, |
| 46 | + {0x0, 1, (SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_INACT | SCU_MODE_ZIF_DIS | SCU_MODE_FUNC6)}, |
| 47 | + {0x1, 19, (SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_FUNC0)}, |
| 48 | + {0x1, 18, (SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_INACT | SCU_MODE_ZIF_DIS | SCU_MODE_FUNC3)}, |
| 49 | + {0x1, 20, (SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_INACT | SCU_MODE_ZIF_DIS | SCU_MODE_FUNC3)}, |
| 50 | + {0x1, 17, (SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_FUNC3)}, |
| 51 | + {0x2, 0, (SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_INACT | SCU_MODE_ZIF_DIS | SCU_MODE_FUNC7)}, |
| 52 | + /* Board LEDs */ |
| 53 | + {0x2, 11, (SCU_MODE_INBUFF_EN | SCU_MODE_PULLDOWN | SCU_MODE_FUNC0)}, |
| 54 | + {0x2, 12, (SCU_MODE_INBUFF_EN | SCU_MODE_PULLDOWN | SCU_MODE_FUNC0)}, |
| 55 | + /* I2S */ |
| 56 | + {0x3, 0, (SCU_PINIO_FAST | SCU_MODE_FUNC2)}, |
| 57 | + {0x6, 0, (SCU_PINIO_FAST | SCU_MODE_FUNC4)}, |
| 58 | + {0x7, 2, (SCU_PINIO_FAST | SCU_MODE_FUNC2)}, |
| 59 | + {0x6, 2, (SCU_PINIO_FAST | SCU_MODE_FUNC3)}, |
| 60 | + {0x7, 1, (SCU_PINIO_FAST | SCU_MODE_FUNC2)}, |
| 61 | + {0x6, 1, (SCU_PINIO_FAST | SCU_MODE_FUNC3)}, |
| 62 | +}; |
| 63 | + |
| 64 | +void Board_UART_Init(LPC_USART_T *pUART) |
| 65 | +{ |
| 66 | + Chip_SCU_PinMuxSet(0x2, 10, (SCU_MODE_PULLDOWN | SCU_MODE_FUNC2)); /* P2.10 : UART2_TXD */ |
| 67 | + Chip_SCU_PinMuxSet(0x2, 11, (SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_FUNC2)); /* P2.11 : UART2_RX */ |
| 68 | +} |
| 69 | + |
| 70 | +/* Initialize debug output via UART for board */ |
| 71 | +void Board_Debug_Init(void) |
| 72 | +{ |
| 73 | + Board_UART_Init(CONSOLE_UART); |
| 74 | + |
| 75 | + Chip_UART_Init(CONSOLE_UART); |
| 76 | + Chip_UART_SetBaudFDR(CONSOLE_UART, 115200); |
| 77 | + Chip_UART_ConfigData(CONSOLE_UART, UART_LCR_WLEN8 | UART_LCR_SBS_1BIT | UART_LCR_PARITY_DIS); |
| 78 | + /* Enable UART Transmit */ |
| 79 | + Chip_UART_TXEnable(CONSOLE_UART); |
| 80 | +} |
| 81 | + |
| 82 | +/* Set up and initialize all required blocks and functions related to the |
| 83 | + board hardware */ |
| 84 | +void Board_Init(void) |
| 85 | +{ |
| 86 | + /* Sets up DEBUG UART */ |
| 87 | + Board_Debug_Init(); |
| 88 | + |
| 89 | + /* Initializes GPIO */ |
| 90 | + Chip_GPIO_Init(LPC_GPIO_PORT); |
| 91 | +} |
| 92 | + |
| 93 | +/* Sets up system pin muxing */ |
| 94 | +void Board_SetupMuxing(void) |
| 95 | +{ |
| 96 | + /* Setup system level pin muxing */ |
| 97 | + Chip_SCU_SetPinMuxing(pinmuxing, sizeof(pinmuxing) / sizeof(PINMUX_GRP_T)); |
| 98 | + |
| 99 | + /* SPIFI pin setup is done prior to setting up system clocking */ |
| 100 | + Chip_SCU_SetPinMuxing(spifipinmuxing, sizeof(spifipinmuxing) / sizeof(PINMUX_GRP_T)); |
| 101 | +} |
| 102 | + |
| 103 | +/* Set up and initialize clocking prior to call to main */ |
| 104 | +void Board_SetupClocking(void) |
| 105 | +{ |
| 106 | + int i; |
| 107 | + |
| 108 | + Chip_SetupCoreClock(CLKIN_CRYSTAL, MAX_CLOCK_FREQ, true); |
| 109 | + |
| 110 | + /* Reset and enable 32Khz oscillator */ |
| 111 | + LPC_CREG->CREG0 &= ~((1 << 3) | (1 << 2)); |
| 112 | + LPC_CREG->CREG0 |= (1 << 1) | (1 << 0); |
| 113 | + |
| 114 | + /* Setup a divider E for main PLL clock switch SPIFI clock to that divider. |
| 115 | + Divide rate is based on CPU speed and speed of SPI FLASH part. */ |
| 116 | +#if (MAX_CLOCK_FREQ > 180000000) |
| 117 | + Chip_Clock_SetDivider(CLK_IDIV_E, CLKIN_MAINPLL, 5); |
| 118 | +#else |
| 119 | + Chip_Clock_SetDivider(CLK_IDIV_E, CLKIN_MAINPLL, 4); |
| 120 | +#endif |
| 121 | + Chip_Clock_SetBaseClock(CLK_BASE_SPIFI, CLKIN_IDIVE, true, false); |
| 122 | + |
| 123 | + /* Setup system base clocks and initial states. This won't enable and |
| 124 | + disable individual clocks, but sets up the base clock sources for |
| 125 | + each individual peripheral clock. */ |
| 126 | + for (i = 0; i < (sizeof(InitClkStates) / sizeof(InitClkStates[0])); i++) { |
| 127 | + Chip_Clock_SetBaseClock(InitClkStates[i].clk, InitClkStates[i].clkin, |
| 128 | + InitClkStates[i].autoblock_enab, InitClkStates[i].powerdn); |
| 129 | + } |
| 130 | +} |
| 131 | + |
| 132 | +/* Set up and initialize hardware prior to call to main */ |
| 133 | +void Board_SystemInit(void) |
| 134 | +{ |
| 135 | + /* Setup system clocking and memory. This is done early to allow the |
| 136 | + application and tools to clear memory and use scatter loading to |
| 137 | + external memory. */ |
| 138 | + fpuInit(); |
| 139 | + Board_SetupMuxing(); |
| 140 | + Board_SetupClocking(); |
| 141 | +} |
0 commit comments