ISSDK  1.8
IoT Sensing Software Development Kit
board.c
Go to the documentation of this file.
1 /*
2  * Copyright 2018 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 #include "fsl_iomuxc.h"
18 
19 /*******************************************************************************
20  * Variables
21  ******************************************************************************/
22 #if defined BOARD_USE_CODEC
23 codec_config_t boardCodecConfig = {.I2C_SendFunc = BOARD_Codec_I2C_Send,
24  .I2C_ReceiveFunc = BOARD_Codec_I2C_Receive,
25  .op.Init = WM8960_Init,
26  .op.Deinit = WM8960_Deinit,
27  .op.SetFormat = WM8960_ConfigDataFormat};
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  {
67  SCB_DisableICache();
68  }
69  if (SCB_CCR_DC_Msk == (SCB_CCR_DC_Msk & SCB->CCR))
70  {
71  SCB_DisableDCache();
72  }
73 
74  /* Disable MPU */
75  ARM_MPU_Disable();
76 
77  /* Region 0 setting */
78  MPU->RBAR = ARM_MPU_RBAR(0, 0xC0000000U);
79  MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_512MB);
80 
81  /* Region 1 setting */
82  MPU->RBAR = ARM_MPU_RBAR(1, 0x80000000U);
83  MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_1GB);
84 
85 /* Region 2 setting */
86 #if defined(XIP_EXTERNAL_FLASH) && (XIP_EXTERNAL_FLASH == 1)
87  MPU->RBAR = ARM_MPU_RBAR(2, 0x60000000U);
88  MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_RO, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_8MB);
89 #else
90  MPU->RBAR = ARM_MPU_RBAR(2, 0x60000000U);
91  MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_RO, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_8MB);
92 #endif
93 
94  /* Region 3 setting */
95  MPU->RBAR = ARM_MPU_RBAR(3, 0x00000000U);
96  MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_1GB);
97 
98  /* Region 4 setting */
99  MPU->RBAR = ARM_MPU_RBAR(4, 0x00000000U);
100  MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_64KB);
101 
102  /* Region 5 setting */
103  MPU->RBAR = ARM_MPU_RBAR(5, 0x20000000U);
104  MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_64KB);
105 
106  /* Region 6 setting */
107  MPU->RBAR = ARM_MPU_RBAR(6, 0x20200000U);
108  MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_128KB);
109 
110  /* Enable MPU */
111  ARM_MPU_Enable(MPU_CTRL_PRIVDEFENA_Msk);
112 
113  /* Enable I cache and D cache */
114  SCB_EnableDCache();
115  SCB_EnableICache();
116 }
117 
118 #if defined(SDK_I2C_BASED_COMPONENT_USED) && SDK_I2C_BASED_COMPONENT_USED
119 void BOARD_LPI2C_Init(LPI2C_Type *base, uint32_t clkSrc_Hz)
120 {
121  lpi2c_master_config_t lpi2cConfig = {0};
122 
123  /*
124  * lpi2cConfig.debugEnable = false;
125  * lpi2cConfig.ignoreAck = false;
126  * lpi2cConfig.pinConfig = kLPI2C_2PinOpenDrain;
127  * lpi2cConfig.baudRate_Hz = 100000U;
128  * lpi2cConfig.busIdleTimeout_ns = 0;
129  * lpi2cConfig.pinLowTimeout_ns = 0;
130  * lpi2cConfig.sdaGlitchFilterWidth_ns = 0;
131  * lpi2cConfig.sclGlitchFilterWidth_ns = 0;
132  */
133  LPI2C_MasterGetDefaultConfig(&lpi2cConfig);
134  LPI2C_MasterInit(base, &lpi2cConfig, clkSrc_Hz);
135 }
136 
137 status_t BOARD_LPI2C_Send(LPI2C_Type *base,
138  uint8_t deviceAddress,
139  uint32_t subAddress,
140  uint8_t subAddressSize,
141  uint8_t *txBuff,
142  uint8_t txBuffSize)
143 {
144  status_t reVal;
145 
146  /* Send master blocking data to slave */
147  reVal = LPI2C_MasterStart(base, deviceAddress, kLPI2C_Write);
148  if (kStatus_Success == reVal)
149  {
150  while (LPI2C_MasterGetStatusFlags(base) & kLPI2C_MasterNackDetectFlag)
151  {
152  }
153 
154  reVal = LPI2C_MasterSend(base, &subAddress, subAddressSize);
155  if (reVal != kStatus_Success)
156  {
157  return reVal;
158  }
159 
160  reVal = LPI2C_MasterSend(base, txBuff, txBuffSize);
161  if (reVal != kStatus_Success)
162  {
163  return reVal;
164  }
165 
166  reVal = LPI2C_MasterStop(base);
167  if (reVal != kStatus_Success)
168  {
169  return reVal;
170  }
171  }
172 
173  return reVal;
174 }
175 
176 status_t BOARD_LPI2C_Receive(LPI2C_Type *base,
177  uint8_t deviceAddress,
178  uint32_t subAddress,
179  uint8_t subAddressSize,
180  uint8_t *rxBuff,
181  uint8_t rxBuffSize)
182 {
183  status_t reVal;
184 
185  reVal = LPI2C_MasterStart(base, deviceAddress, kLPI2C_Write);
186  if (kStatus_Success == reVal)
187  {
188  while (LPI2C_MasterGetStatusFlags(base) & kLPI2C_MasterNackDetectFlag)
189  {
190  }
191 
192  reVal = LPI2C_MasterSend(base, &subAddress, subAddressSize);
193  if (reVal != kStatus_Success)
194  {
195  return reVal;
196  }
197 
198  reVal = LPI2C_MasterRepeatedStart(base, deviceAddress, kLPI2C_Read);
199  if (reVal != kStatus_Success)
200  {
201  return reVal;
202  }
203 
204  reVal = LPI2C_MasterReceive(base, rxBuff, rxBuffSize);
205  if (reVal != kStatus_Success)
206  {
207  return reVal;
208  }
209 
210  reVal = LPI2C_MasterStop(base);
211  if (reVal != kStatus_Success)
212  {
213  return reVal;
214  }
215  }
216  return reVal;
217 }
218 
219 void BOARD_Accel_I2C_Init(void)
220 {
222 }
223 
224 status_t BOARD_Accel_I2C_Send(uint8_t deviceAddress, uint32_t subAddress, uint8_t subaddressSize, uint32_t txBuff)
225 {
226  uint8_t data = (uint8_t)txBuff;
227 
228  return BOARD_LPI2C_Send(BOARD_ACCEL_I2C_BASEADDR, deviceAddress, subAddress, subaddressSize, &data, 1);
229 }
230 
231 status_t BOARD_Accel_I2C_Receive(
232  uint8_t deviceAddress, uint32_t subAddress, uint8_t subaddressSize, uint8_t *rxBuff, uint8_t rxBuffSize)
233 {
234  return BOARD_LPI2C_Receive(BOARD_ACCEL_I2C_BASEADDR, deviceAddress, subAddress, subaddressSize, rxBuff, rxBuffSize);
235 }
236 
237 void BOARD_Codec_I2C_Init(void)
238 {
240 }
241 
242 status_t BOARD_Codec_I2C_Send(
243  uint8_t deviceAddress, uint32_t subAddress, uint8_t subAddressSize, const uint8_t *txBuff, uint8_t txBuffSize)
244 {
245  return BOARD_LPI2C_Send(BOARD_CODEC_I2C_BASEADDR, deviceAddress, subAddress, subAddressSize, (uint8_t *)txBuff,
246  txBuffSize);
247 }
248 
249 status_t BOARD_Codec_I2C_Receive(
250  uint8_t deviceAddress, uint32_t subAddress, uint8_t subAddressSize, uint8_t *rxBuff, uint8_t rxBuffSize)
251 {
252  return BOARD_LPI2C_Receive(BOARD_CODEC_I2C_BASEADDR, deviceAddress, subAddress, subAddressSize, rxBuff, rxBuffSize);
253 }
254 #endif /* SDK_I2C_BASED_COMPONENT_USED */
#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_INSTANCE
Definition: board.h:26
#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