board.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498
  1. /*
  2. * Copyright 2017-2018 NXP
  3. * All rights reserved.
  4. *
  5. * SPDX-License-Identifier: BSD-3-Clause
  6. */
  7. #include "fsl_common.h"
  8. #include "fsl_debug_console.h"
  9. #include "board.h"
  10. #if defined(SDK_I2C_BASED_COMPONENT_USED) && SDK_I2C_BASED_COMPONENT_USED
  11. #include "fsl_lpi2c.h"
  12. #endif /* SDK_I2C_BASED_COMPONENT_USED */
  13. #if defined BOARD_USE_CODEC
  14. #include "fsl_wm8960.h"
  15. #endif
  16. #include "fsl_iomuxc.h"
  17. /*******************************************************************************
  18. * Variables
  19. ******************************************************************************/
  20. #if defined BOARD_USE_CODEC
  21. codec_config_t boardCodecConfig = {.I2C_SendFunc = BOARD_Codec_I2C_Send,
  22. .I2C_ReceiveFunc = BOARD_Codec_I2C_Receive,
  23. .op.Init = WM8960_Init,
  24. .op.Deinit = WM8960_Deinit,
  25. .op.SetFormat = WM8960_ConfigDataFormat};
  26. #endif
  27. /*******************************************************************************
  28. * Code
  29. ******************************************************************************/
  30. /* Get debug console frequency. */
  31. uint32_t BOARD_DebugConsoleSrcFreq(void)
  32. {
  33. uint32_t freq;
  34. /* To make it simple, we assume default PLL and divider settings, and the only variable
  35. from application is use PLL3 source or OSC source */
  36. if (CLOCK_GetMux(kCLOCK_UartMux) == 0) /* PLL3 div6 80M */
  37. {
  38. freq = (CLOCK_GetPllFreq(kCLOCK_PllUsb1) / 6U) / (CLOCK_GetDiv(kCLOCK_UartDiv) + 1U);
  39. }
  40. else
  41. {
  42. freq = CLOCK_GetOscFreq() / (CLOCK_GetDiv(kCLOCK_UartDiv) + 1U);
  43. }
  44. return freq;
  45. }
  46. /* Initialize debug console. */
  47. void BOARD_InitDebugConsole(void)
  48. {
  49. uint32_t uartClkSrcFreq = BOARD_DebugConsoleSrcFreq();
  50. DbgConsole_Init(BOARD_DEBUG_UART_INSTANCE, BOARD_DEBUG_UART_BAUDRATE, BOARD_DEBUG_UART_TYPE, uartClkSrcFreq);
  51. }
  52. #if defined(SDK_I2C_BASED_COMPONENT_USED) && SDK_I2C_BASED_COMPONENT_USED
  53. void BOARD_LPI2C_Init(LPI2C_Type *base, uint32_t clkSrc_Hz)
  54. {
  55. lpi2c_master_config_t lpi2cConfig = {0};
  56. /*
  57. * lpi2cConfig.debugEnable = false;
  58. * lpi2cConfig.ignoreAck = false;
  59. * lpi2cConfig.pinConfig = kLPI2C_2PinOpenDrain;
  60. * lpi2cConfig.baudRate_Hz = 100000U;
  61. * lpi2cConfig.busIdleTimeout_ns = 0;
  62. * lpi2cConfig.pinLowTimeout_ns = 0;
  63. * lpi2cConfig.sdaGlitchFilterWidth_ns = 0;
  64. * lpi2cConfig.sclGlitchFilterWidth_ns = 0;
  65. */
  66. LPI2C_MasterGetDefaultConfig(&lpi2cConfig);
  67. LPI2C_MasterInit(base, &lpi2cConfig, clkSrc_Hz);
  68. }
  69. status_t BOARD_LPI2C_Send(LPI2C_Type *base,
  70. uint8_t deviceAddress,
  71. uint32_t subAddress,
  72. uint8_t subAddressSize,
  73. uint8_t *txBuff,
  74. uint8_t txBuffSize)
  75. {
  76. status_t reVal;
  77. /* Send master blocking data to slave */
  78. reVal = LPI2C_MasterStart(base, deviceAddress, kLPI2C_Write);
  79. if (kStatus_Success == reVal)
  80. {
  81. while (LPI2C_MasterGetStatusFlags(base) & kLPI2C_MasterNackDetectFlag)
  82. {
  83. }
  84. reVal = LPI2C_MasterSend(base, &subAddress, subAddressSize);
  85. if (reVal != kStatus_Success)
  86. {
  87. return reVal;
  88. }
  89. reVal = LPI2C_MasterSend(base, txBuff, txBuffSize);
  90. if (reVal != kStatus_Success)
  91. {
  92. return reVal;
  93. }
  94. reVal = LPI2C_MasterStop(base);
  95. if (reVal != kStatus_Success)
  96. {
  97. return reVal;
  98. }
  99. }
  100. return reVal;
  101. }
  102. status_t BOARD_LPI2C_Receive(LPI2C_Type *base,
  103. uint8_t deviceAddress,
  104. uint32_t subAddress,
  105. uint8_t subAddressSize,
  106. uint8_t *rxBuff,
  107. uint8_t rxBuffSize)
  108. {
  109. status_t reVal;
  110. reVal = LPI2C_MasterStart(base, deviceAddress, kLPI2C_Write);
  111. if (kStatus_Success == reVal)
  112. {
  113. while (LPI2C_MasterGetStatusFlags(base) & kLPI2C_MasterNackDetectFlag)
  114. {
  115. }
  116. reVal = LPI2C_MasterSend(base, &subAddress, subAddressSize);
  117. if (reVal != kStatus_Success)
  118. {
  119. return reVal;
  120. }
  121. reVal = LPI2C_MasterRepeatedStart(base, deviceAddress, kLPI2C_Read);
  122. if (reVal != kStatus_Success)
  123. {
  124. return reVal;
  125. }
  126. reVal = LPI2C_MasterReceive(base, rxBuff, rxBuffSize);
  127. if (reVal != kStatus_Success)
  128. {
  129. return reVal;
  130. }
  131. reVal = LPI2C_MasterStop(base);
  132. if (reVal != kStatus_Success)
  133. {
  134. return reVal;
  135. }
  136. }
  137. return reVal;
  138. }
  139. status_t BOARD_LPI2C_SendSCCB(LPI2C_Type *base,
  140. uint8_t deviceAddress,
  141. uint32_t subAddress,
  142. uint8_t subAddressSize,
  143. uint8_t *txBuff,
  144. uint8_t txBuffSize)
  145. {
  146. return BOARD_LPI2C_Send(base, deviceAddress, subAddress, subAddressSize, txBuff, txBuffSize);
  147. }
  148. status_t BOARD_LPI2C_ReceiveSCCB(LPI2C_Type *base,
  149. uint8_t deviceAddress,
  150. uint32_t subAddress,
  151. uint8_t subAddressSize,
  152. uint8_t *rxBuff,
  153. uint8_t rxBuffSize)
  154. {
  155. status_t reVal;
  156. reVal = LPI2C_MasterStart(base, deviceAddress, kLPI2C_Write);
  157. if (kStatus_Success == reVal)
  158. {
  159. while (LPI2C_MasterGetStatusFlags(base) & kLPI2C_MasterNackDetectFlag)
  160. {
  161. }
  162. reVal = LPI2C_MasterSend(base, &subAddress, subAddressSize);
  163. if (reVal != kStatus_Success)
  164. {
  165. return reVal;
  166. }
  167. /* SCCB does not support LPI2C repeat start, must stop then start. */
  168. reVal = LPI2C_MasterStop(base);
  169. if (reVal != kStatus_Success)
  170. {
  171. return reVal;
  172. }
  173. reVal = LPI2C_MasterStart(base, deviceAddress, kLPI2C_Read);
  174. if (reVal != kStatus_Success)
  175. {
  176. return reVal;
  177. }
  178. reVal = LPI2C_MasterReceive(base, rxBuff, rxBuffSize);
  179. if (reVal != kStatus_Success)
  180. {
  181. return reVal;
  182. }
  183. reVal = LPI2C_MasterStop(base);
  184. if (reVal != kStatus_Success)
  185. {
  186. return reVal;
  187. }
  188. }
  189. return reVal;
  190. }
  191. void BOARD_Accel_I2C_Init(void)
  192. {
  193. BOARD_LPI2C_Init(BOARD_ACCEL_I2C_BASEADDR, BOARD_ACCEL_I2C_CLOCK_FREQ);
  194. }
  195. status_t BOARD_Accel_I2C_Send(uint8_t deviceAddress, uint32_t subAddress, uint8_t subaddressSize, uint32_t txBuff)
  196. {
  197. uint8_t data = (uint8_t)txBuff;
  198. return BOARD_LPI2C_Send(BOARD_ACCEL_I2C_BASEADDR, deviceAddress, subAddress, subaddressSize, &data, 1);
  199. }
  200. status_t BOARD_Accel_I2C_Receive(
  201. uint8_t deviceAddress, uint32_t subAddress, uint8_t subaddressSize, uint8_t *rxBuff, uint8_t rxBuffSize)
  202. {
  203. return BOARD_LPI2C_Receive(BOARD_ACCEL_I2C_BASEADDR, deviceAddress, subAddress, subaddressSize, rxBuff, rxBuffSize);
  204. }
  205. void BOARD_Codec_I2C_Init(void)
  206. {
  207. BOARD_LPI2C_Init(BOARD_CODEC_I2C_BASEADDR, BOARD_CODEC_I2C_CLOCK_FREQ);
  208. }
  209. status_t BOARD_Codec_I2C_Send(
  210. uint8_t deviceAddress, uint32_t subAddress, uint8_t subAddressSize, const uint8_t *txBuff, uint8_t txBuffSize)
  211. {
  212. return BOARD_LPI2C_Send(BOARD_CODEC_I2C_BASEADDR, deviceAddress, subAddress, subAddressSize, (uint8_t *)txBuff,
  213. txBuffSize);
  214. }
  215. status_t BOARD_Codec_I2C_Receive(
  216. uint8_t deviceAddress, uint32_t subAddress, uint8_t subAddressSize, uint8_t *rxBuff, uint8_t rxBuffSize)
  217. {
  218. return BOARD_LPI2C_Receive(BOARD_CODEC_I2C_BASEADDR, deviceAddress, subAddress, subAddressSize, rxBuff, rxBuffSize);
  219. }
  220. void BOARD_Camera_I2C_Init(void)
  221. {
  222. CLOCK_SetMux(kCLOCK_Lpi2cMux, BOARD_CAMERA_I2C_CLOCK_SOURCE_SELECT);
  223. CLOCK_SetDiv(kCLOCK_Lpi2cDiv, BOARD_CAMERA_I2C_CLOCK_SOURCE_DIVIDER);
  224. BOARD_LPI2C_Init(BOARD_CAMERA_I2C_BASEADDR, BOARD_CAMERA_I2C_CLOCK_FREQ);
  225. }
  226. status_t BOARD_Camera_I2C_Send(
  227. uint8_t deviceAddress, uint32_t subAddress, uint8_t subAddressSize, const uint8_t *txBuff, uint8_t txBuffSize)
  228. {
  229. return BOARD_LPI2C_Send(BOARD_CAMERA_I2C_BASEADDR, deviceAddress, subAddress, subAddressSize, (uint8_t *)txBuff,
  230. txBuffSize);
  231. }
  232. status_t BOARD_Camera_I2C_Receive(
  233. uint8_t deviceAddress, uint32_t subAddress, uint8_t subAddressSize, uint8_t *rxBuff, uint8_t rxBuffSize)
  234. {
  235. return BOARD_LPI2C_Receive(BOARD_CAMERA_I2C_BASEADDR, deviceAddress, subAddress, subAddressSize, rxBuff,
  236. rxBuffSize);
  237. }
  238. status_t BOARD_Camera_I2C_SendSCCB(
  239. uint8_t deviceAddress, uint32_t subAddress, uint8_t subAddressSize, const uint8_t *txBuff, uint8_t txBuffSize)
  240. {
  241. return BOARD_LPI2C_SendSCCB(BOARD_CAMERA_I2C_BASEADDR, deviceAddress, subAddress, subAddressSize, (uint8_t *)txBuff,
  242. txBuffSize);
  243. }
  244. status_t BOARD_Camera_I2C_ReceiveSCCB(
  245. uint8_t deviceAddress, uint32_t subAddress, uint8_t subAddressSize, uint8_t *rxBuff, uint8_t rxBuffSize)
  246. {
  247. return BOARD_LPI2C_ReceiveSCCB(BOARD_CAMERA_I2C_BASEADDR, deviceAddress, subAddress, subAddressSize, rxBuff,
  248. rxBuffSize);
  249. }
  250. #endif /* SDK_I2C_BASED_COMPONENT_USED */
  251. void BOARD_SD_Pin_Config(uint32_t speed, uint32_t strength)
  252. {
  253. IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_B0_00_USDHC1_CMD,
  254. IOMUXC_SW_PAD_CTL_PAD_SPEED(speed) | IOMUXC_SW_PAD_CTL_PAD_SRE_MASK |
  255. IOMUXC_SW_PAD_CTL_PAD_PKE_MASK | IOMUXC_SW_PAD_CTL_PAD_PUE_MASK |
  256. IOMUXC_SW_PAD_CTL_PAD_HYS_MASK | IOMUXC_SW_PAD_CTL_PAD_PUS(1) |
  257. IOMUXC_SW_PAD_CTL_PAD_DSE(strength));
  258. IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_B0_01_USDHC1_CLK,
  259. IOMUXC_SW_PAD_CTL_PAD_SPEED(speed) | IOMUXC_SW_PAD_CTL_PAD_SRE_MASK |
  260. IOMUXC_SW_PAD_CTL_PAD_HYS_MASK | IOMUXC_SW_PAD_CTL_PAD_PUS(0) |
  261. IOMUXC_SW_PAD_CTL_PAD_DSE(strength));
  262. IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_B0_02_USDHC1_DATA0,
  263. IOMUXC_SW_PAD_CTL_PAD_SPEED(speed) | IOMUXC_SW_PAD_CTL_PAD_SRE_MASK |
  264. IOMUXC_SW_PAD_CTL_PAD_PKE_MASK | IOMUXC_SW_PAD_CTL_PAD_PUE_MASK |
  265. IOMUXC_SW_PAD_CTL_PAD_HYS_MASK | IOMUXC_SW_PAD_CTL_PAD_PUS(1) |
  266. IOMUXC_SW_PAD_CTL_PAD_DSE(strength));
  267. IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_B0_03_USDHC1_DATA1,
  268. IOMUXC_SW_PAD_CTL_PAD_SPEED(speed) | IOMUXC_SW_PAD_CTL_PAD_SRE_MASK |
  269. IOMUXC_SW_PAD_CTL_PAD_PKE_MASK | IOMUXC_SW_PAD_CTL_PAD_PUE_MASK |
  270. IOMUXC_SW_PAD_CTL_PAD_HYS_MASK | IOMUXC_SW_PAD_CTL_PAD_PUS(1) |
  271. IOMUXC_SW_PAD_CTL_PAD_DSE(strength));
  272. IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_B0_04_USDHC1_DATA2,
  273. IOMUXC_SW_PAD_CTL_PAD_SPEED(speed) | IOMUXC_SW_PAD_CTL_PAD_SRE_MASK |
  274. IOMUXC_SW_PAD_CTL_PAD_PKE_MASK | IOMUXC_SW_PAD_CTL_PAD_PUE_MASK |
  275. IOMUXC_SW_PAD_CTL_PAD_HYS_MASK | IOMUXC_SW_PAD_CTL_PAD_PUS(1) |
  276. IOMUXC_SW_PAD_CTL_PAD_DSE(strength));
  277. IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_B0_05_USDHC1_DATA3,
  278. IOMUXC_SW_PAD_CTL_PAD_SPEED(speed) | IOMUXC_SW_PAD_CTL_PAD_SRE_MASK |
  279. IOMUXC_SW_PAD_CTL_PAD_PKE_MASK | IOMUXC_SW_PAD_CTL_PAD_PUE_MASK |
  280. IOMUXC_SW_PAD_CTL_PAD_HYS_MASK | IOMUXC_SW_PAD_CTL_PAD_PUS(1) |
  281. IOMUXC_SW_PAD_CTL_PAD_DSE(strength));
  282. \
  283. }
  284. void BOARD_MMC_Pin_Config(uint32_t speed, uint32_t strength)
  285. {
  286. IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_B1_05_USDHC2_CMD,
  287. IOMUXC_SW_PAD_CTL_PAD_SPEED(speed) | IOMUXC_SW_PAD_CTL_PAD_SRE_MASK |
  288. IOMUXC_SW_PAD_CTL_PAD_PKE_MASK | IOMUXC_SW_PAD_CTL_PAD_PUE_MASK |
  289. IOMUXC_SW_PAD_CTL_PAD_HYS_MASK | IOMUXC_SW_PAD_CTL_PAD_PUS(1) |
  290. IOMUXC_SW_PAD_CTL_PAD_DSE(strength));
  291. IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_B1_04_USDHC2_CLK,
  292. IOMUXC_SW_PAD_CTL_PAD_SPEED(speed) | IOMUXC_SW_PAD_CTL_PAD_SRE_MASK |
  293. IOMUXC_SW_PAD_CTL_PAD_HYS_MASK | IOMUXC_SW_PAD_CTL_PAD_PUS(0) |
  294. IOMUXC_SW_PAD_CTL_PAD_DSE(strength));
  295. IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_B1_03_USDHC2_DATA0,
  296. IOMUXC_SW_PAD_CTL_PAD_SPEED(speed) | IOMUXC_SW_PAD_CTL_PAD_SRE_MASK |
  297. IOMUXC_SW_PAD_CTL_PAD_PKE_MASK | IOMUXC_SW_PAD_CTL_PAD_PUE_MASK |
  298. IOMUXC_SW_PAD_CTL_PAD_HYS_MASK | IOMUXC_SW_PAD_CTL_PAD_PUS(1) |
  299. IOMUXC_SW_PAD_CTL_PAD_DSE(strength));
  300. IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_B1_02_USDHC2_DATA1,
  301. IOMUXC_SW_PAD_CTL_PAD_SPEED(speed) | IOMUXC_SW_PAD_CTL_PAD_SRE_MASK |
  302. IOMUXC_SW_PAD_CTL_PAD_PKE_MASK | IOMUXC_SW_PAD_CTL_PAD_PUE_MASK |
  303. IOMUXC_SW_PAD_CTL_PAD_HYS_MASK | IOMUXC_SW_PAD_CTL_PAD_PUS(1) |
  304. IOMUXC_SW_PAD_CTL_PAD_DSE(strength));
  305. IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_B1_01_USDHC2_DATA2,
  306. IOMUXC_SW_PAD_CTL_PAD_SPEED(speed) | IOMUXC_SW_PAD_CTL_PAD_SRE_MASK |
  307. IOMUXC_SW_PAD_CTL_PAD_PKE_MASK | IOMUXC_SW_PAD_CTL_PAD_PUE_MASK |
  308. IOMUXC_SW_PAD_CTL_PAD_HYS_MASK | IOMUXC_SW_PAD_CTL_PAD_PUS(1) |
  309. IOMUXC_SW_PAD_CTL_PAD_DSE(strength));
  310. IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_B1_00_USDHC2_DATA3,
  311. IOMUXC_SW_PAD_CTL_PAD_SPEED(speed) | IOMUXC_SW_PAD_CTL_PAD_SRE_MASK |
  312. IOMUXC_SW_PAD_CTL_PAD_PKE_MASK | IOMUXC_SW_PAD_CTL_PAD_PUE_MASK |
  313. IOMUXC_SW_PAD_CTL_PAD_HYS_MASK | IOMUXC_SW_PAD_CTL_PAD_PUS(1) |
  314. IOMUXC_SW_PAD_CTL_PAD_DSE(strength));
  315. IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_B1_08_USDHC2_DATA4,
  316. IOMUXC_SW_PAD_CTL_PAD_SPEED(speed) | IOMUXC_SW_PAD_CTL_PAD_SRE_MASK |
  317. IOMUXC_SW_PAD_CTL_PAD_PKE_MASK | IOMUXC_SW_PAD_CTL_PAD_PUE_MASK |
  318. IOMUXC_SW_PAD_CTL_PAD_HYS_MASK | IOMUXC_SW_PAD_CTL_PAD_PUS(1) |
  319. IOMUXC_SW_PAD_CTL_PAD_DSE(strength));
  320. IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_B1_09_USDHC2_DATA5,
  321. IOMUXC_SW_PAD_CTL_PAD_SPEED(speed) | IOMUXC_SW_PAD_CTL_PAD_SRE_MASK |
  322. IOMUXC_SW_PAD_CTL_PAD_PKE_MASK | IOMUXC_SW_PAD_CTL_PAD_PUE_MASK |
  323. IOMUXC_SW_PAD_CTL_PAD_HYS_MASK | IOMUXC_SW_PAD_CTL_PAD_PUS(1) |
  324. IOMUXC_SW_PAD_CTL_PAD_DSE(strength));
  325. IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_B1_10_USDHC2_DATA6,
  326. IOMUXC_SW_PAD_CTL_PAD_SPEED(speed) | IOMUXC_SW_PAD_CTL_PAD_SRE_MASK |
  327. IOMUXC_SW_PAD_CTL_PAD_PKE_MASK | IOMUXC_SW_PAD_CTL_PAD_PUE_MASK |
  328. IOMUXC_SW_PAD_CTL_PAD_HYS_MASK | IOMUXC_SW_PAD_CTL_PAD_PUS(1) |
  329. IOMUXC_SW_PAD_CTL_PAD_DSE(strength));
  330. IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_B1_11_USDHC2_DATA7,
  331. IOMUXC_SW_PAD_CTL_PAD_SPEED(speed) | IOMUXC_SW_PAD_CTL_PAD_SRE_MASK |
  332. IOMUXC_SW_PAD_CTL_PAD_PKE_MASK | IOMUXC_SW_PAD_CTL_PAD_PUE_MASK |
  333. IOMUXC_SW_PAD_CTL_PAD_HYS_MASK | IOMUXC_SW_PAD_CTL_PAD_PUS(1) |
  334. IOMUXC_SW_PAD_CTL_PAD_DSE(strength));
  335. \
  336. }
  337. /* MPU configuration. */
  338. void BOARD_ConfigMPU(void)
  339. {
  340. /* Disable I cache and D cache */
  341. if (SCB_CCR_IC_Msk == (SCB_CCR_IC_Msk & SCB->CCR))
  342. {
  343. SCB_DisableICache();
  344. }
  345. if (SCB_CCR_DC_Msk == (SCB_CCR_DC_Msk & SCB->CCR))
  346. {
  347. SCB_DisableDCache();
  348. }
  349. /* Disable MPU */
  350. ARM_MPU_Disable();
  351. /* MPU configure:
  352. * Use ARM_MPU_RASR(DisableExec, AccessPermission, TypeExtField, IsShareable, IsCacheable, IsBufferable,
  353. * SubRegionDisable, Size)
  354. * API in core_cm7.h.
  355. * param DisableExec Instruction access (XN) disable bit,0=instruction fetches enabled, 1=instruction fetches
  356. * disabled.
  357. * param AccessPermission Data access permissions, allows you to configure read/write access for User and
  358. * Privileged mode.
  359. * Use MACROS defined in core_cm7.h:
  360. * ARM_MPU_AP_NONE/ARM_MPU_AP_PRIV/ARM_MPU_AP_URO/ARM_MPU_AP_FULL/ARM_MPU_AP_PRO/ARM_MPU_AP_RO
  361. * Combine TypeExtField/IsShareable/IsCacheable/IsBufferable to configure MPU memory access attributes.
  362. * TypeExtField IsShareable IsCacheable IsBufferable Memory Attribtue Shareability Cache
  363. * 0 x 0 0 Strongly Ordered shareable
  364. * 0 x 0 1 Device shareable
  365. * 0 0 1 0 Normal not shareable Outer and inner write
  366. * through no write allocate
  367. * 0 0 1 1 Normal not shareable Outer and inner write
  368. * back no write allocate
  369. * 0 1 1 0 Normal shareable Outer and inner write
  370. * through no write allocate
  371. * 0 1 1 1 Normal shareable Outer and inner write
  372. * back no write allocate
  373. * 1 0 0 0 Normal not shareable outer and inner
  374. * noncache
  375. * 1 1 0 0 Normal shareable outer and inner
  376. * noncache
  377. * 1 0 1 1 Normal not shareable outer and inner write
  378. * back write/read acllocate
  379. * 1 1 1 1 Normal shareable outer and inner write
  380. * back write/read acllocate
  381. * 2 x 0 0 Device not shareable
  382. * Above are normal use settings, if your want to see more details or want to config different inner/outter cache
  383. * policy.
  384. * please refer to Table 4-55 /4-56 in arm cortex-M7 generic user guide <dui0646b_cortex_m7_dgug.pdf>
  385. * param SubRegionDisable Sub-region disable field. 0=sub-region is enabled, 1=sub-region is disabled.
  386. * param Size Region size of the region to be configured. use ARM_MPU_REGION_SIZE_xxx MACRO in
  387. * core_cm7.h.
  388. */
  389. /* Region 0 setting: Memory with Device type, not shareable, non-cacheable. */
  390. MPU->RBAR = ARM_MPU_RBAR(0, 0xC0000000U);
  391. MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_512MB);
  392. /* Region 1 setting: Memory with Device type, not shareable, non-cacheable. */
  393. MPU->RBAR = ARM_MPU_RBAR(1, 0x80000000U);
  394. MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_1GB);
  395. /* Region 2 setting */
  396. #if defined(XIP_EXTERNAL_FLASH) && (XIP_EXTERNAL_FLASH == 1)
  397. /* Setting Memory with Normal type, not shareable, outer/inner write back. */
  398. MPU->RBAR = ARM_MPU_RBAR(2, 0x60000000U);
  399. MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_RO, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_64MB);
  400. #else
  401. /* Setting Memory with Device type, not shareable, non-cacheable. */
  402. MPU->RBAR = ARM_MPU_RBAR(2, 0x60000000U);
  403. MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_RO, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_64MB);
  404. #endif
  405. /* Region 3 setting: Memory with Device type, not shareable, non-cacheable. */
  406. MPU->RBAR = ARM_MPU_RBAR(3, 0x00000000U);
  407. MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_1GB);
  408. /* Region 4 setting: Memory with Normal type, not shareable, outer/inner write back */
  409. MPU->RBAR = ARM_MPU_RBAR(4, 0x00000000U);
  410. MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_128KB);
  411. /* Region 5 setting: Memory with Normal type, not shareable, outer/inner write back */
  412. MPU->RBAR = ARM_MPU_RBAR(5, 0x20000000U);
  413. MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_128KB);
  414. /* Region 6 setting: Memory with Normal type, not shareable, outer/inner write back */
  415. MPU->RBAR = ARM_MPU_RBAR(6, 0x20200000U);
  416. MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_256KB);
  417. /* The define sets the cacheable memory to shareable,
  418. * this suggestion is referred from chapter 2.2.1 Memory regions,
  419. * types and attributes in Cortex-M7 Devices, Generic User Guide */
  420. #if defined(SDRAM_IS_SHAREABLE)
  421. /* Region 7 setting: Memory with Normal type, not shareable, outer/inner write back */
  422. MPU->RBAR = ARM_MPU_RBAR(7, 0x80000000U);
  423. MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 1, 1, 1, 0, ARM_MPU_REGION_SIZE_32MB);
  424. #else
  425. /* Region 7 setting: Memory with Normal type, not shareable, outer/inner write back */
  426. MPU->RBAR = ARM_MPU_RBAR(7, 0x80000000U);
  427. MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_32MB);
  428. #endif
  429. /* Region 8 setting, set last 2MB of SDRAM can't be accessed by cache, glocal variables which are not expected to be
  430. * accessed by cache can be put here */
  431. /* Memory with Normal type, not shareable, non-cacheable */
  432. MPU->RBAR = ARM_MPU_RBAR(8, 0x81E00000U);
  433. MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 1, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_2MB);
  434. /* Enable MPU */
  435. ARM_MPU_Enable(MPU_CTRL_PRIVDEFENA_Msk);
  436. /* Enable I cache and D cache */
  437. SCB_EnableDCache();
  438. SCB_EnableICache();
  439. }