ISSDK  1.8
IoT Sensing Software Development Kit
board.c
Go to the documentation of this file.
1 /*
2  * Copyright 2017 NXP
3  * All rights reserved.
4  *
5  * SPDX-License-Identifier: BSD-3-Clause
6  */
7 
8 #include "fsl_common.h"
9 #include "fsl_debug_console.h"
10 #include "board.h"
11 #if defined(SDK_I2C_BASED_COMPONENT_USED) && SDK_I2C_BASED_COMPONENT_USED
12 #include "fsl_lpi2c.h"
13 #endif /* SDK_I2C_BASED_COMPONENT_USED */
14 #if defined BOARD_USE_CODEC
15 #include "fsl_wm8960.h"
16 #endif
17 /*******************************************************************************
18  * Variables
19  ******************************************************************************/
20 #if defined BOARD_USE_CODEC
21 codec_config_t boardCodecConfig = {
22  .I2C_SendFunc = BOARD_Codec_I2C_Send,
23  .I2C_ReceiveFunc = BOARD_Codec_I2C_Receive,
24  .op.Init = WM8960_Init,
25  .op.Deinit = WM8960_Deinit,
26  .op.SetFormat = WM8960_ConfigDataFormat
27 };
28 #endif
29 
30 /*******************************************************************************
31  * Code
32  ******************************************************************************/
33 
34 /* Get debug console frequency. */
36 {
37  uint32_t freq;
38 
39  /* To make it simple, we assume default PLL and divider settings, and the only variable
40  from application is use PLL3 source or OSC source */
41  if (CLOCK_GetMux(kCLOCK_UartMux) == 0) /* PLL3 div6 80M */
42  {
43  freq = (CLOCK_GetPllFreq(kCLOCK_PllUsb1) / 6U) / (CLOCK_GetDiv(kCLOCK_UartDiv) + 1U);
44  }
45  else
46  {
47  freq = CLOCK_GetOscFreq() / (CLOCK_GetDiv(kCLOCK_UartDiv) + 1U);
48  }
49 
50  return freq;
51 }
52 
53 /* Initialize debug console. */
55 {
56  uint32_t uartClkSrcFreq = BOARD_DebugConsoleSrcFreq();
57 
59 }
60 
61 /* MPU configuration. */
62 void BOARD_ConfigMPU(void)
63 {
64  /* Disable I cache and D cache */
65  if (SCB_CCR_IC_Msk == (SCB_CCR_IC_Msk & SCB->CCR)) {
66  SCB_DisableICache();
67  }
68  if (SCB_CCR_DC_Msk == (SCB_CCR_DC_Msk & SCB->CCR)) {
69  SCB_DisableDCache();
70  }
71 
72  /* Disable MPU */
73  ARM_MPU_Disable();
74 
75  /* Region 0 setting */
76  MPU->RBAR = ARM_MPU_RBAR(0, 0xC0000000U);
77  MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_512MB);
78 
79  /* Region 1 setting */
80  MPU->RBAR = ARM_MPU_RBAR(1, 0x80000000U);
81  MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_1GB);
82 
83  /* Region 2 setting */
84 #if defined(XIP_EXTERNAL_FLASH)
85  MPU->RBAR = ARM_MPU_RBAR(2, 0x60000000U);
86  MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_512MB);
87 #else
88  MPU->RBAR = ARM_MPU_RBAR(2, 0x60000000U);
89  MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_512MB);
90 #endif
91 
92  /* Region 3 setting */
93  MPU->RBAR = ARM_MPU_RBAR(3, 0x00000000U);
94  MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_1GB);
95 
96  /* Region 4 setting */
97  MPU->RBAR = ARM_MPU_RBAR(4, 0x00000000U);
98  MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_128KB);
99 
100  /* Region 5 setting */
101  MPU->RBAR = ARM_MPU_RBAR(5, 0x20000000U);
102  MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_128KB);
103 
104  /* Region 6 setting */
105  MPU->RBAR = ARM_MPU_RBAR(6, 0x20200000U);
106  MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_256KB);
107 
108  /* The define sets the cacheable memory to shareable,
109  * this suggestion is referred from chapter 2.2.1 Memory regions,
110  * types and attributes in Cortex-M7 Devices, Generic User Guide */
111 #if defined(SDRAM_IS_SHAREABLE)
112  /* Region 7 setting, set whole SDRAM can be accessed by cache */
113  MPU->RBAR = ARM_MPU_RBAR(7, 0x80000000U);
114  MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 1, 1, 1, 0, ARM_MPU_REGION_SIZE_32MB);
115 #else
116  /* Region 7 setting, set whole SDRAM can be accessed by cache */
117  MPU->RBAR = ARM_MPU_RBAR(7, 0x80000000U);
118  MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_32MB);
119 #endif
120 
121  /* Region 8 setting, set last 2MB of SDRAM can't be accessed by cache, glocal variables which are not expected to be accessed by cache can be put here */
122  MPU->RBAR = ARM_MPU_RBAR(8, 0x81E00000U);
123  MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 1, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_2MB);
124 
125  /* Enable MPU */
126  ARM_MPU_Enable(MPU_CTRL_PRIVDEFENA_Msk);
127 
128  /* Enable I cache and D cache */
129  SCB_EnableDCache();
130  SCB_EnableICache();
131 }
132 
133 #if defined(SDK_I2C_BASED_COMPONENT_USED) && SDK_I2C_BASED_COMPONENT_USED
134 void BOARD_LPI2C_Init(LPI2C_Type *base, uint32_t clkSrc_Hz)
135 {
136  lpi2c_master_config_t lpi2cConfig = {0};
137 
138  /*
139  * lpi2cConfig.debugEnable = false;
140  * lpi2cConfig.ignoreAck = false;
141  * lpi2cConfig.pinConfig = kLPI2C_2PinOpenDrain;
142  * lpi2cConfig.baudRate_Hz = 100000U;
143  * lpi2cConfig.busIdleTimeout_ns = 0;
144  * lpi2cConfig.pinLowTimeout_ns = 0;
145  * lpi2cConfig.sdaGlitchFilterWidth_ns = 0;
146  * lpi2cConfig.sclGlitchFilterWidth_ns = 0;
147  */
148  LPI2C_MasterGetDefaultConfig(&lpi2cConfig);
149  LPI2C_MasterInit(base, &lpi2cConfig, clkSrc_Hz);
150 }
151 
152 status_t BOARD_LPI2C_Send(LPI2C_Type *base, uint8_t deviceAddress, uint32_t subAddress,
153  uint8_t subAddressSize, uint8_t *txBuff, uint8_t txBuffSize)
154 {
155  status_t reVal;
156 
157  /* Send master blocking data to slave */
158  reVal = LPI2C_MasterStart(base, deviceAddress, kLPI2C_Write);
159  if (kStatus_Success == reVal)
160  {
161  while (LPI2C_MasterGetStatusFlags(base) & kLPI2C_MasterNackDetectFlag)
162  {
163  }
164 
165  reVal = LPI2C_MasterSend(base, &subAddress, subAddressSize);
166  if (reVal != kStatus_Success)
167  {
168  return reVal;
169  }
170 
171  reVal = LPI2C_MasterSend(base, txBuff, txBuffSize);
172  if (reVal != kStatus_Success)
173  {
174  return reVal;
175  }
176 
177  reVal = LPI2C_MasterStop(base);
178  if (reVal != kStatus_Success)
179  {
180  return reVal;
181  }
182  }
183 
184  return reVal;
185 }
186 
187 status_t BOARD_LPI2C_Receive(LPI2C_Type *base, uint8_t deviceAddress, uint32_t subAddress,
188  uint8_t subAddressSize, uint8_t *rxBuff, uint8_t rxBuffSize)
189 {
190  status_t reVal;
191 
192  reVal = LPI2C_MasterStart(base, deviceAddress, kLPI2C_Write);
193  if (kStatus_Success == reVal)
194  {
195  while (LPI2C_MasterGetStatusFlags(base) & kLPI2C_MasterNackDetectFlag)
196  {
197  }
198 
199  reVal = LPI2C_MasterSend(base, &subAddress, subAddressSize);
200  if (reVal != kStatus_Success)
201  {
202  return reVal;
203  }
204 
205  reVal = LPI2C_MasterRepeatedStart(base, deviceAddress, kLPI2C_Read);
206  if (reVal != kStatus_Success)
207  {
208  return reVal;
209  }
210 
211  reVal = LPI2C_MasterReceive(base, rxBuff, rxBuffSize);
212  if (reVal != kStatus_Success)
213  {
214  return reVal;
215  }
216 
217  reVal = LPI2C_MasterStop(base);
218  if (reVal != kStatus_Success)
219  {
220  return reVal;
221  }
222  }
223  return reVal;
224 }
225 
226 void BOARD_Accel_I2C_Init(void)
227 {
229 }
230 
231 status_t BOARD_Accel_I2C_Send(uint8_t deviceAddress, uint32_t subAddress, uint8_t subaddressSize, uint32_t txBuff)
232 {
233  uint8_t data = (uint8_t)txBuff;
234 
235  return BOARD_LPI2C_Send(BOARD_ACCEL_I2C_BASEADDR, deviceAddress, subAddress,
236  subaddressSize, &data, 1);
237 }
238 
239 status_t BOARD_Accel_I2C_Receive(uint8_t deviceAddress, uint32_t subAddress, uint8_t subaddressSize,
240  uint8_t *rxBuff, uint8_t rxBuffSize)
241 {
242  return BOARD_LPI2C_Receive(BOARD_ACCEL_I2C_BASEADDR, deviceAddress, subAddress,
243  subaddressSize, rxBuff, rxBuffSize);
244 }
245 
246 void BOARD_Codec_I2C_Init(void)
247 {
249 }
250 
251 status_t BOARD_Codec_I2C_Send(
252  uint8_t deviceAddress, uint32_t subAddress, uint8_t subAddressSize, const uint8_t *txBuff, uint8_t txBuffSize)
253 {
254  return BOARD_LPI2C_Send(BOARD_CODEC_I2C_BASEADDR, deviceAddress, subAddress, subAddressSize, (uint8_t *)txBuff,
255  txBuffSize);
256 }
257 
258 status_t BOARD_Codec_I2C_Receive(
259  uint8_t deviceAddress, uint32_t subAddress, uint8_t subAddressSize, uint8_t *rxBuff, uint8_t rxBuffSize)
260 {
261  return BOARD_LPI2C_Receive(BOARD_CODEC_I2C_BASEADDR, deviceAddress, subAddress, subAddressSize, rxBuff,
262  rxBuffSize);
263 }
264 #endif /* SDK_I2C_BASED_COMPONENT_USED */
265 
#define BOARD_ACCEL_I2C_CLOCK_FREQ
Definition: board.h:35
#define BOARD_CODEC_I2C_CLOCK_FREQ
Definition: board.h:56
uint32_t BOARD_DebugConsoleSrcFreq(void)
Definition: board.c:25
#define BOARD_DEBUG_UART_BAUDRATE
Definition: board.h:31
#define BOARD_ACCEL_I2C_BASEADDR
Definition: board.h:129
uint8_t data[FXLS8962_DATA_SIZE]
#define BOARD_DEBUG_UART_BASEADDR
Definition: board.h:24
#define BOARD_CODEC_I2C_BASEADDR
Definition: board.h:55
void BOARD_ConfigMPU(void)
Definition: board.c:52
void BOARD_InitDebugConsole(void)
Definition: board.c:15
#define BOARD_DEBUG_UART_TYPE
Definition: board.h:23