| LPCOpen Platform v1.03 LPCOpen Platform for NXP LPC Microcontrollers

- Main Page
- Modules
- Data Structures
- Files
- Related Pages

- File List
- Globals

All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
board_ngx_xplorer_18304330.c
Go to the documentation of this file.
1 /*
2 * Copyright(C) NXP Semiconductors, 2012
3 * All rights reserved.
4 *
5 * Software that is described herein is for illustrative purposes only
6 * which provides customers with programming information regarding the
7 * LPC products. This software is supplied "AS IS" without any warranties of
8 * any kind, and NXP Semiconductors and its licensor disclaim any and
9 * all warranties, express or implied, including all implied warranties of
10 * merchantability, fitness for a particular purpose and non-infringement of
11 * intellectual property rights. NXP Semiconductors assumes no responsibility
12 * or liability for the use of the software, conveys no license or rights under any
13 * patent, copyright, mask work right, or any other intellectual property rights in
14 * or to any products. NXP Semiconductors reserves the right to make changes
15 * in the software without notification. NXP Semiconductors also makes no
16 * representation or warranty that such application will be suitable for the
17 * specified use without further testing or modification.
18 *
19 * Permission to use, copy, modify, and distribute this software and its
20 * documentation is hereby granted, under NXP Semiconductors' and its
21 * licensor's relevant copyrights in the software, without fee, provided that it
22 * is used in conjunction with NXP Semiconductors microcontrollers. This
23 * copyright, permission, and disclaimer notice must appear in all copies of
24 * this code.
25 */
26
27 #include "board.h"
28 #include "string.h"
29
30 #include "lpc_phy_smsc87x0.c"
31 #include "retarget.c"
32
37 void Board_UART_Init(LPC_USART_T *pUART)
38 {
39 if (pUART == LPC_USART0) {
40 Chip_SCU_PinMuxSet(0x6, 4, (SCU_MODE_MODE_REPEATER | SCU_MODE_FUNC2)); /* P6.5 : UART0_TXD */
41 Chip_SCU_PinMuxSet(0x6, 5, (SCU_MODE_MODE_PULLUP | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_FUNC2));/* P6.4 : UART0_RXD */
42 }
43 else if (pUART == LPC_UART1) {
44 Chip_SCU_PinMuxSet(0x1, 13, (SCU_MODE_MODE_REPEATER | SCU_MODE_FUNC2)); /* P1.13 : UART1_TXD */
45 Chip_SCU_PinMuxSet(0x1, 14, (SCU_MODE_MODE_PULLUP | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_FUNC2)); /* P1.14 : UART1_RX */
46 }
47 }
48
49 /* Initialize debug output via UART for board */
50 void Board_Debug_Init(void)
51 {
52 #if defined(DEBUG_UART)
53 Board_UART_Init(DEBUG_UART);
54
55 Chip_UART_Init(DEBUG_UART);
56 Chip_UART_SetBaud(DEBUG_UART, 115200);
57 Chip_UART_ConfigData(DEBUG_UART, UART_DATABIT_8, UART_PARITY_NONE, UART_STOPBIT_1);
58
59 /* Enable UART Transmit */
60 Chip_UART_TxCmd(DEBUG_UART, ENABLE);
61 #endif
62 }
63
64 /* Sends a character on the UART */
65 void Board_UARTPutChar(char ch)
66 {
67 #if defined(DEBUG_UART)
68 while (Chip_UART_SendByte(DEBUG_UART, (uint8_t) ch) == ERROR) {}
69 #endif
70 }
71
72 /* Gets a character from the UART, returns EOF if no character is ready */
73 int Board_UARTGetChar(void)
74 {
75 #if defined(DEBUG_UART)
76 uint8_t data;
77
78 if (Chip_UART_ReceiveByte(DEBUG_UART, &data) == SUCCESS) {
79 return (int) data;
80 }
81 #endif
82 return EOF;
83 }
84
85 /* Outputs a string on the debug UART */
86 void Board_UARTPutSTR(char *str)
87 {
88 #if defined(DEBUG_UART)
89 while (*str != '\0') {
90 Board_UARTPutChar(*str++);
91 }
92 #endif
93 }
94
95 static void Board_LED_Init()
96 {
97 /* P2.12 : LED D2 as output */
98 Chip_GPIO_WriteDirBit(LPC_GPIO_PORT, 1, 12, true);
99
100 /* P2.11 : LED D3 as output */
101 Chip_GPIO_WriteDirBit(LPC_GPIO_PORT, 1, 11, true);
102
103 /* Set initial states to off (true to disable) */
104 Chip_GPIO_WritePortBit(LPC_GPIO_PORT, 1, 12, (bool) true);
105 Chip_GPIO_WritePortBit(LPC_GPIO_PORT, 1, 11, (bool) true);
106 }
107
108 void Board_LED_Set(uint8_t LEDNumber, bool On)
109 {
110 if (LEDNumber == 0) {
111 Chip_GPIO_WritePortBit(LPC_GPIO_PORT, 1, 12, (bool) !On);
112 }
113 else if (LEDNumber == 1) {
114 Chip_GPIO_WritePortBit(LPC_GPIO_PORT, 1, 11, (bool) !On);
115 }
116 }
117
118 bool Board_LED_Test(uint8_t LEDNumber)
119 {
120 if (LEDNumber == 0) {
121 return (bool) !Chip_GPIO_ReadPortBit(LPC_GPIO_PORT, 1, 12);
122 }
123 else if (LEDNumber == 1) {
124 return (bool) !Chip_GPIO_ReadPortBit(LPC_GPIO_PORT, 1, 11);
125 }
126
127 return false;
128 }
129
130 void Board_Buttons_Init(void) // FIXME not functional ATM
131 {
132 Chip_SCU_PinMuxSet(0x2, 7, (SCU_MODE_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_FUNC0)); // P2_7 as GPIO0[7]
133 Chip_GPIO_WriteDirBit(LPC_GPIO_PORT, BUTTONS_BUTTON1_GPIO_PORT_NUM, (1 << BUTTONS_BUTTON1_GPIO_BIT_NUM), false); // input
134 }
135
136 uint32_t Buttons_GetStatus(void)
137 {
138 uint8_t ret = NO_BUTTON_PRESSED;
139 if (Chip_GPIO_ReadPortBit(LPC_GPIO_PORT, BUTTONS_BUTTON1_GPIO_PORT_NUM, BUTTONS_BUTTON1_GPIO_BIT_NUM) == 0) {
140 ret |= BUTTONS_BUTTON1;
141 }
142 return ret;
143 }
144
145 void Board_Joystick_Init(void)
146 {}
147
148 uint8_t Joystick_GetStatus(void)
149 {
150 return NO_BUTTON_PRESSED;
151 }
152
154 uint32_t SystemCoreClock;
155
156 /* Update system core clock rate, should be called if the system has
157 a clock rate change */
158 void SystemCoreClockUpdate(void)
159 {
160 /* CPU core speed */
161 SystemCoreClock = Chip_Clock_GetRate(CLK_MX_MXCORE);
162 }
163
164 /* Returns the MAC address assigned to this board */
165 void Board_ENET_GetMacADDR(uint8_t *mcaddr)
166 {
167 uint8_t boardmac[] = {0x00, 0x60, 0x37, 0x12, 0x34, 0x56};
168
169 memcpy(mcaddr, boardmac, 6);
170 }
171
172 /* Set up and initialize all required blocks and functions related to the
173 board hardware */
174 void Board_Init(void)
175 {
176 /* Sets up DEBUG UART */
177 DEBUGINIT();
178
179 /* Updates SystemCoreClock global var with current clock speed */
180 SystemCoreClockUpdate();
181
182 /* Initializes GPIO */
183 Chip_GPIO_Init(LPC_GPIO_PORT);
184
185 /* Setup GPIOs for USB demos */
186 Chip_SCU_PinMuxSet(0x2, 6, (SCU_MODE_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_FUNC4)); /* P2_6 USB1_PWR_EN, USB1 VBus function */
187 Chip_SCU_PinMuxSet(0x2, 5, (SCU_MODE_MODE_PULLUP | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_FUNC2)); /* P2_5 USB1_VBUS, MUST CONFIGURE THIS SIGNAL FOR USB1 NORMAL OPERATION */
188 Chip_SCU_PinMuxSet(0x1, 7, (SCU_MODE_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_FUNC4)); /* P1_7 USB0_PWR_EN, USB0 VBus function Xplorer */
189 Chip_GPIO_WriteDirBit(LPC_GPIO_PORT, 5, 6, true); /* GPIO5[6] = USB1_PWR_EN */
190 Chip_GPIO_WritePortBit(LPC_GPIO_PORT, 5, 6, true); /* GPIO5[6] output high */
191
192 /* Initialize LEDs */
193 Board_LED_Init();
194 }
195
196 void Board_I2C_Init(I2C_ID_T id)
197 {
198 if (id == I2C1) {
199 /* Configure pin function for I2C1*/
200 Chip_SCU_PinMuxSet(0x2, 3, (SCU_MODE_ZIF_DIS | SCU_MODE_INBUFF_EN | SCU_MODE_FUNC1)); /* P2.3 : I2C1_SDA */
201 Chip_SCU_PinMuxSet(0x2, 4, (SCU_MODE_ZIF_DIS | SCU_MODE_INBUFF_EN | SCU_MODE_FUNC1)); /* P2.4 : I2C1_SCL */
202 }
203 else {
204 Chip_SCU_I2C0PinConfig(I2C0_STANDARD_FAST_MODE);
205 }
206 }
207
208 #ifndef CORE_M0
209 /* PIN0 Interrupt not available in M0 core */
210 void GPIO0_IRQHandler(void)
211 {
212 static bool On;
213
214 if (Chip_GPIO_IntGetStatus(LPC_GPIO_PIN_INT, 0, 0, 0)) {
215 Chip_GPIO_IntClear(LPC_GPIO_PIN_INT, 0, 0);
216 On = (bool) !On;
217 Board_LED_Set(1, On);
218 }
219 }
220
221 void Board_GPIO_Int_Init()
222 {
223 Chip_SCU_PinMuxSet(0xF, 9, (SCU_MODE_MODE_PULLUP | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_FUNC0)); /* PF.9 : POTI button */
224 Chip_GPIO_WriteDirBit(LPC_GPIO_PORT, 7, 23, false); /* PF.9 -> GPIO7[23] : input */
225 Chip_SCU_GPIOIntPinSel(0, 7, 23);
226 Chip_GPIO_IntCmd(LPC_GPIO_PIN_INT, 0, 0, GPIOPININT_FALLING_EDGE); /* Configure GPIO0[7] to interrupt pin (SW2 switch) */
227
228 NVIC_EnableIRQ(PIN_INT0_IRQn); /* enable GPIO interrupt 0 */
229 }
230
231 #endif
232
233 void Board_SDMMC_Init(void)
234 {
235 Chip_SCU_PinMuxSet(0x1, 9, (SCU_PINIO_FAST | SCU_MODE_FUNC7)); /* P1.9 connected to SDIO_D0 */
236 Chip_SCU_PinMuxSet(0x1, 10, (SCU_PINIO_FAST | SCU_MODE_FUNC7)); /* P1.10 connected to SDIO_D1 */
237 Chip_SCU_PinMuxSet(0x1, 11, (SCU_PINIO_FAST | SCU_MODE_FUNC7)); /* P1.11 connected to SDIO_D2 */
238 Chip_SCU_PinMuxSet(0x1, 12, (SCU_PINIO_FAST | SCU_MODE_FUNC7)); /* P1.12 connected to SDIO_D3 */
239
240 Chip_SCU_ClockPinMuxSet(2, (SCU_MODE_MODE_PULLUP | SCU_MODE_INBUFF_EN | SCU_MODE_FUNC4)); /* CLK2 connected to SDIO_CLK */
241 Chip_SCU_PinMuxSet(0x1, 6, (SCU_PINIO_FAST | SCU_MODE_FUNC7)); /* P1.6 connected to SDIO_CMD */
242 }
243
244 void Board_SSP_Init(LPC_SSP_T *pSSP)
245 {
246 if (pSSP == LPC_SSP1) {
247 /* Set up clock and power for SSP1 module */
248 /* Configure SSP1 pins*/
249 /* SCLK comes out pin CLK0 */
250 Chip_SCU_ClockPinMuxSet(0, (SCU_PINIO_FAST | SCU_MODE_FUNC6)); /* CLK0 connected to CLK SCU_MODE_FUNC6=SSP1 CLK1 */
251 Chip_SCU_PinMuxSet(0x1, 5, (SCU_PINIO_FAST | SCU_MODE_FUNC5)); /* P1.5 connected to nCS SCU_MODE_FUNC5=SSP1 SSEL1 */
252 Chip_SCU_PinMuxSet(0x1, 3, (SCU_MODE_MODE_PULLUP | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_FUNC5));/* P1.3 connected to SO SCU_MODE_FUNC5=SSP1 MISO1 */
253 Chip_SCU_PinMuxSet(0x1, 4, (SCU_MODE_MODE_PULLUP | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_FUNC5));/* P1.4 connected to nSI SCU_MODE_FUNC5=SSP1 MOSI1 */
254 }
255 else {
256 return;
257 }
258 }
259
260 static void delay(uint32_t i) {
261 while (i--) {}
262 }
263
264 /* Initialize Audio Codec */
265 static Status Board_Audio_CodecInit(int micIn)
266 {
267 /* Reset UDA1380 on board NGX Xplorer */
268 Chip_SCU_PinMuxSet(0x2, 10, (SCU_MODE_MODE_INACT | SCU_MODE_FUNC0));
269 Chip_GPIO_WriteDirBit(LPC_GPIO_PORT, 0, 14, true);
270 Chip_GPIO_WritePortBit(LPC_GPIO_PORT, 0, 14, true);
271 // delay 1us
272 delay(100000);
273 Chip_GPIO_WritePortBit(LPC_GPIO_PORT, 0, 14, false);
274 delay(100000);
275
276 if (!UDA1380_Init(UDA1380_MIC_IN_LR & - (micIn != 0))) {
277 return ERROR;
278 }
279
280 return SUCCESS;
281 }
282
283 /* Board Audio initialization */
284 void Board_Audio_Init(LPC_I2S_T *pI2S, int micIn)
285 {
286 Chip_I2S_Audio_Format_T I2S_Config;
287
288 I2S_Config.SampleRate = 48000;
289 I2S_Config.ChannelNumber = 2; /* 1 is mono, 2 is stereo */
290 I2S_Config.WordWidth = 16; /* 8, 16 or 32 bits */
291 Chip_I2S_Init(pI2S);
292 Chip_I2S_Config(pI2S, I2S_TX_MODE, &I2S_Config);
293
294 /* Init UDA1380 CODEC */
295 while (Board_Audio_CodecInit(micIn) != SUCCESS) {}
296 }
297
298 /* FIXME Should we remove this function? */
299 void Serial_CreateStream(void *Stream)
300 {}
301