]> git.sur5r.net Git - freertos/blob - FreeRTOS/Demo/CORTEX_MPU_LPC54018_MCUXpresso/NXP_Code/board/board.c
Add MPU demo project for LPC54018 board.
[freertos] / FreeRTOS / Demo / CORTEX_MPU_LPC54018_MCUXpresso / NXP_Code / board / board.c
1 /*\r
2  * Copyright (c) 2016, Freescale Semiconductor, Inc.\r
3  * Copyright 2016-2018 NXP\r
4  * All rights reserved.\r
5  *\r
6  * SPDX-License-Identifier: BSD-3-Clause\r
7  */\r
8 \r
9 #include "board.h"\r
10 #include <stdint.h>\r
11 #include "clock_config.h"\r
12 #include "fsl_common.h"\r
13 #include "fsl_debug_console.h"\r
14 #include "fsl_emc.h"\r
15 #if defined(SDK_I2C_BASED_COMPONENT_USED) && SDK_I2C_BASED_COMPONENT_USED\r
16 #include "fsl_i2c.h"\r
17 #endif /* SDK_I2C_BASED_COMPONENT_USED */\r
18 #if defined BOARD_USE_CODEC\r
19 #include "fsl_wm8904.h"\r
20 #endif\r
21 /*******************************************************************************\r
22  * Definitions\r
23  ******************************************************************************/\r
24 /* The SDRAM timing. */\r
25 \r
26 #define W9812G6JB6I\r
27 \r
28 #ifdef MTL48LC8M16A2B\r
29 #define SDRAM_REFRESHPERIOD_NS (64 * 1000000 / 4096) /* 4096 rows/ 64ms */\r
30 #define SDRAM_TRP_NS (18u)\r
31 #define SDRAM_TRAS_NS (42u)\r
32 #define SDRAM_TSREX_NS (67u)\r
33 #define SDRAM_TAPR_NS (18u)\r
34 #define SDRAM_TWRDELT_NS (6u)\r
35 #define SDRAM_TRC_NS (60u)\r
36 #define SDRAM_RFC_NS (60u)\r
37 #define SDRAM_XSR_NS (67u)\r
38 #define SDRAM_RRD_NS (12u)\r
39 #define SDRAM_MRD_NCLK (2u)\r
40 #define SDRAM_RAS_NCLK (2u)\r
41 #define SDRAM_MODEREG_VALUE (0x23u)\r
42 #define SDRAM_DEV_MEMORYMAP (0x09u) /* 128Mbits (8M*16, 4banks, 12 rows, 9 columns)*/\r
43 #endif\r
44 \r
45 #ifdef W9812G6JB6I\r
46 #define SDRAM_REFRESHPERIOD_NS (64 * 1000000 / 4096) /* 4096 rows/ 64ms */\r
47 #define SDRAM_TRP_NS (20u)\r
48 #define SDRAM_TRAS_NS (42u)\r
49 #define SDRAM_TSREX_NS (72u)\r
50 #define SDRAM_TAPR_NS (18u)\r
51 #define SDRAM_TWRDELT_NS (12u)\r
52 #define SDRAM_TRC_NS (60u)\r
53 #define SDRAM_RFC_NS (60u)\r
54 #define SDRAM_XSR_NS (67u)\r
55 #define SDRAM_RRD_NS (12u)\r
56 #define SDRAM_MRD_NCLK (2u)\r
57 #define SDRAM_RAS_NCLK (2u)\r
58 #define SDRAM_MODEREG_VALUE (0x23u)\r
59 #define SDRAM_DEV_MEMORYMAP (0x09u) /* 128Mbits (8M*16, 4banks, 12 rows, 9 columns)*/\r
60 #endif\r
61 \r
62 /*******************************************************************************\r
63  * Variables\r
64  ******************************************************************************/\r
65 \r
66 /* Clock rate on the CLKIN pin */\r
67 const uint32_t ExtClockIn = BOARD_EXTCLKINRATE;\r
68 \r
69 /*******************************************************************************\r
70  * Code\r
71  ******************************************************************************/\r
72 /* Initialize debug console. */\r
73 status_t BOARD_InitDebugConsole(void)\r
74 {\r
75 #if ((SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK) || defined(SDK_DEBUGCONSOLE_UART))\r
76     status_t result;\r
77     uint8_t instance = BOARD_DEBUG_UART_INSTANCE;\r
78 \r
79 #if (defined(SERIAL_PORT_TYPE_USBCDC) && (SERIAL_PORT_TYPE_USBCDC > 0U))\r
80     if (BOARD_DEBUG_UART_TYPE == kSerialPort_UsbCdc)\r
81     {\r
82         instance = kSerialManager_UsbControllerLpcIp3511Hs0;\r
83     }\r
84 #endif\r
85 \r
86     /* attach 12 MHz clock to FLEXCOMM0 (debug console) */\r
87     CLOCK_AttachClk(BOARD_DEBUG_UART_CLK_ATTACH);\r
88     RESET_PeripheralReset(BOARD_DEBUG_UART_RST);\r
89     result = DbgConsole_Init(instance, BOARD_DEBUG_UART_BAUDRATE, BOARD_DEBUG_UART_TYPE, BOARD_DEBUG_UART_CLK_FREQ);\r
90     assert(kStatus_Success == result);\r
91     return result;\r
92 #else\r
93     return kStatus_Success;\r
94 #endif\r
95 }\r
96 \r
97 /* Initialize the external memory. */\r
98 void BOARD_InitSDRAM(void)\r
99 {\r
100     uint32_t emcFreq;\r
101     emc_basic_config_t basicConfig;\r
102     emc_dynamic_timing_config_t dynTiming;\r
103     emc_dynamic_chip_config_t dynChipConfig;\r
104 \r
105     emcFreq = CLOCK_GetEmcClkFreq();\r
106     assert(emcFreq != 0); /* Check the clock of emc */\r
107     /* Basic configuration. */\r
108     basicConfig.endian   = kEMC_LittleEndian;\r
109     basicConfig.fbClkSrc = kEMC_IntloopbackEmcclk;\r
110     /* EMC Clock = CPU FREQ/2 here can fit CPU freq from 12M ~ 180M.\r
111      * If you change the divide to 0 and EMC clock is larger than 100M\r
112      * please take refer to emc.dox to adjust EMC clock delay.\r
113      */\r
114     basicConfig.emcClkDiv = 1;\r
115     /* Dynamic memory timing configuration. */\r
116     dynTiming.readConfig            = kEMC_Cmddelay;\r
117     dynTiming.refreshPeriod_Nanosec = SDRAM_REFRESHPERIOD_NS;\r
118     dynTiming.tRp_Ns                = SDRAM_TRP_NS;\r
119     dynTiming.tRas_Ns               = SDRAM_TRAS_NS;\r
120     dynTiming.tSrex_Ns              = SDRAM_TSREX_NS;\r
121     dynTiming.tApr_Ns               = SDRAM_TAPR_NS;\r
122     dynTiming.tWr_Ns                = (1000000000 / emcFreq + SDRAM_TWRDELT_NS); /* one clk + 6ns */\r
123     dynTiming.tDal_Ns               = dynTiming.tWr_Ns + dynTiming.tRp_Ns;\r
124     dynTiming.tRc_Ns                = SDRAM_TRC_NS;\r
125     dynTiming.tRfc_Ns               = SDRAM_RFC_NS;\r
126     dynTiming.tXsr_Ns               = SDRAM_XSR_NS;\r
127     dynTiming.tRrd_Ns               = SDRAM_RRD_NS;\r
128     dynTiming.tMrd_Nclk             = SDRAM_MRD_NCLK;\r
129     /* Dynamic memory chip specific configuration: Chip 0 - W9812G6JB-6I */\r
130     dynChipConfig.chipIndex       = 0;\r
131     dynChipConfig.dynamicDevice   = kEMC_Sdram;\r
132     dynChipConfig.rAS_Nclk        = SDRAM_RAS_NCLK;\r
133     dynChipConfig.sdramModeReg    = SDRAM_MODEREG_VALUE;\r
134     dynChipConfig.sdramExtModeReg = 0; /* it has no use for normal sdram */\r
135     dynChipConfig.devAddrMap      = SDRAM_DEV_MEMORYMAP;\r
136     /* EMC Basic configuration. */\r
137     EMC_Init(EMC, &basicConfig);\r
138     /* EMC Dynamc memory configuration. */\r
139     EMC_DynamicMemInit(EMC, &dynTiming, &dynChipConfig, 1);\r
140 }\r
141 #if defined(SDK_I2C_BASED_COMPONENT_USED) && SDK_I2C_BASED_COMPONENT_USED\r
142 void BOARD_I2C_Init(I2C_Type *base, uint32_t clkSrc_Hz)\r
143 {\r
144     i2c_master_config_t i2cConfig = {0};\r
145 \r
146     I2C_MasterGetDefaultConfig(&i2cConfig);\r
147     I2C_MasterInit(base, &i2cConfig, clkSrc_Hz);\r
148 }\r
149 \r
150 status_t BOARD_I2C_Send(I2C_Type *base,\r
151                         uint8_t deviceAddress,\r
152                         uint32_t subAddress,\r
153                         uint8_t subaddressSize,\r
154                         uint8_t *txBuff,\r
155                         uint8_t txBuffSize)\r
156 {\r
157     i2c_master_transfer_t masterXfer;\r
158 \r
159     /* Prepare transfer structure. */\r
160     masterXfer.slaveAddress   = deviceAddress;\r
161     masterXfer.direction      = kI2C_Write;\r
162     masterXfer.subaddress     = subAddress;\r
163     masterXfer.subaddressSize = subaddressSize;\r
164     masterXfer.data           = txBuff;\r
165     masterXfer.dataSize       = txBuffSize;\r
166     masterXfer.flags          = kI2C_TransferDefaultFlag;\r
167 \r
168     return I2C_MasterTransferBlocking(base, &masterXfer);\r
169 }\r
170 \r
171 status_t BOARD_I2C_Receive(I2C_Type *base,\r
172                            uint8_t deviceAddress,\r
173                            uint32_t subAddress,\r
174                            uint8_t subaddressSize,\r
175                            uint8_t *rxBuff,\r
176                            uint8_t rxBuffSize)\r
177 {\r
178     i2c_master_transfer_t masterXfer;\r
179 \r
180     /* Prepare transfer structure. */\r
181     masterXfer.slaveAddress   = deviceAddress;\r
182     masterXfer.subaddress     = subAddress;\r
183     masterXfer.subaddressSize = subaddressSize;\r
184     masterXfer.data           = rxBuff;\r
185     masterXfer.dataSize       = rxBuffSize;\r
186     masterXfer.direction      = kI2C_Read;\r
187     masterXfer.flags          = kI2C_TransferDefaultFlag;\r
188 \r
189     return I2C_MasterTransferBlocking(base, &masterXfer);\r
190 }\r
191 \r
192 void BOARD_Accel_I2C_Init(void)\r
193 {\r
194     BOARD_I2C_Init(BOARD_ACCEL_I2C_BASEADDR, BOARD_ACCEL_I2C_CLOCK_FREQ);\r
195 }\r
196 \r
197 status_t BOARD_Accel_I2C_Send(uint8_t deviceAddress, uint32_t subAddress, uint8_t subaddressSize, uint32_t txBuff)\r
198 {\r
199     uint8_t data = (uint8_t)txBuff;\r
200 \r
201     return BOARD_I2C_Send(BOARD_ACCEL_I2C_BASEADDR, deviceAddress, subAddress, subaddressSize, &data, 1);\r
202 }\r
203 \r
204 status_t BOARD_Accel_I2C_Receive(\r
205     uint8_t deviceAddress, uint32_t subAddress, uint8_t subaddressSize, uint8_t *rxBuff, uint8_t rxBuffSize)\r
206 {\r
207     return BOARD_I2C_Receive(BOARD_ACCEL_I2C_BASEADDR, deviceAddress, subAddress, subaddressSize, rxBuff, rxBuffSize);\r
208 }\r
209 \r
210 void BOARD_Codec_I2C_Init(void)\r
211 {\r
212     BOARD_I2C_Init(BOARD_CODEC_I2C_BASEADDR, BOARD_CODEC_I2C_CLOCK_FREQ);\r
213 }\r
214 \r
215 status_t BOARD_Codec_I2C_Send(\r
216     uint8_t deviceAddress, uint32_t subAddress, uint8_t subAddressSize, const uint8_t *txBuff, uint8_t txBuffSize)\r
217 {\r
218     return BOARD_I2C_Send(BOARD_CODEC_I2C_BASEADDR, deviceAddress, subAddress, subAddressSize, (uint8_t *)txBuff,\r
219                           txBuffSize);\r
220 }\r
221 \r
222 status_t BOARD_Codec_I2C_Receive(\r
223     uint8_t deviceAddress, uint32_t subAddress, uint8_t subAddressSize, uint8_t *rxBuff, uint8_t rxBuffSize)\r
224 {\r
225     return BOARD_I2C_Receive(BOARD_CODEC_I2C_BASEADDR, deviceAddress, subAddress, subAddressSize, rxBuff, rxBuffSize);\r
226 }\r
227 #endif /* SDK_I2C_BASED_COMPONENT_USED */\r