2 * Copyright 2017-2019 NXP
\r
3 * All rights reserved.
\r
5 * SPDX-License-Identifier: BSD-3-Clause
\r
8 /***********************************************************************************************************************
\r
9 * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file
\r
10 * will be overwritten if the respective MCUXpresso Config Tools is used to update this file.
\r
11 **********************************************************************************************************************/
\r
13 /* clang-format off */
\r
14 /* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************
\r
18 package_id: LPC55S69JBD100
\r
20 processor_version: 0.2.6
\r
21 * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/
\r
22 /* clang-format on */
\r
24 #include "fsl_common.h"
\r
25 #include "tzm_config.h"
\r
27 //********************************************************************
\r
28 //*** Definitions ****************************************************
\r
29 //********************************************************************
\r
30 /* SAU region boundaries */
\r
31 #define REGION_0_BASE 0
\r
32 #define REGION_0_END 0x0FFFFFFFU
\r
33 #define REGION_1_BASE 0x20000000U
\r
34 #define REGION_1_END 0xFFFFFFFFU
\r
35 #define REGION_2_BASE 0x1000FE00U
\r
36 #define REGION_2_END 0x1000FFFFU
\r
38 /* clang-format off */
\r
39 /* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************
\r
43 - relative_region: {memory: PROGRAM_FLASH, security: s_priv, start: '0x00000000', size: '0x00010000'}
\r
44 - relative_region: {memory: PROGRAM_FLASH, security: ns_user, start: '0x00010000', size: '0x00090000'}
\r
45 - relative_region: {memory: BootROM, security: ns_user, start: '0x00000000', size: '0x00020000'}
\r
46 - relative_region: {memory: SRAMX, security: ns_user, start: '0x00000000', size: '0x00008000'}
\r
47 - relative_region: {memory: SRAM0, security: s_priv, start: '0x00000000', size: '0x00008000'}
\r
48 - relative_region: {memory: SRAM0, security: ns_user, start: '0x00008000', size: '0x00008000'}
\r
49 - relative_region: {memory: SRAM1, security: ns_user, start: '0x00000000', size: '0x00010000'}
\r
50 - relative_region: {memory: SRAM2, security: ns_user, start: '0x00000000', size: '0x00010000'}
\r
51 - relative_region: {memory: SRAM3, security: ns_user, start: '0x00000000', size: '0x00010000'}
\r
52 - relative_region: {memory: SRAM4, security: ns_user, start: '0x00000000', size: '0x00004000'}
\r
53 - relative_region: {memory: USB_RAM, security: ns_user, start: '0x00000000', size: '0x00004000'}
\r
55 - ns_user: {id: HASH, id: MCM33C, id: MCM33S, id: PQ, id: SDIO, id: SDMA0, id: SDMA1, id: USBFSD, id: USBFSH}
\r
57 - ns_user: {id: ADC0, id: AHB_SECURE_CTRL, id: ANACTRL, id: CASPER, id: CRC_ENGINE, id: CTIMER0, id: CTIMER1, id: CTIMER2, id: CTIMER3, id: CTIMER4, id: DBGMAILBOX,
\r
58 id: DMA0, id: DMA1, id: FLASH, id: FLEXCOMM1, id: FLEXCOMM2, id: FLEXCOMM3, id: FLEXCOMM4, id: FLEXCOMM5, id: FLEXCOMM6, id: FLEXCOMM7, id: GINT0, id: GINT1,
\r
59 id: GPIO, id: HASHCRYPT, id: INPUTMUX, id: MAILBOX, id: MRT0, id: OSTIMER, id: PINT, id: PLU, id: PMC, id: POWERQUAD, id: PRINCE, id: PUF, id: RNG, id: RTC,
\r
60 id: SCT0, id: SDIF, id: SECGPIO, id: SECPINT, id: SPI8, id: SYSCTL, id: USB0, id: USBFSH, id: USBHSD, id: USBHSH, id: USBPHY, id: UTICK0, id: WWDT}
\r
61 - s_priv: {id: FLEXCOMM0, id: IOCON, id: SYSCON}
\r
64 - Non-masked: {id: acmp_capt_irq, id: adc_irq, id: casper_irq, id: ctimer0_irq, id: ctimer1_irq, id: ctimer2_irq, id: ctimer3_irq, id: ctimer4_irq, id: flexcomm0_irq,
\r
65 id: flexcomm1_irq, id: flexcomm2_irq, id: flexcomm3_irq, id: flexcomm4_irq, id: flexcomm5_irq, id: flexcomm6_irq, id: flexcomm7_irq, id: global_irq0, id: global_irq1,
\r
66 id: lspi_hs_irq, id: mailbox_irq, id: mrt_irq, id: os_event_irq, id: pin_int4, id: pin_int5, id: pin_int6, id: pin_int7, id: pin_irq0, id: pin_irq1, id: pin_irq2,
\r
67 id: pin_irq3, id: plu_irq, id: pq_irq, id: qddkey_irq, id: rtc_irq, id: sct_irq, id: sdio_irq, id: sdma0_irq, id: sdma1_irq, id: sec_hypervisor_call_irq,
\r
68 id: sec_int0, id: sec_int1, id: sec_vio_irq, id: sha_irq, id: sys_irq, id: usb0_irq, id: usb0_needclk_irq, id: usb1_irq, id: usb1_needclk_irq, id: usb1_utmi_irq,
\r
71 - Secure: {id: acmp_capt_irq, id: adc_irq, id: casper_irq, id: ctimer0_irq, id: ctimer1_irq, id: ctimer2_irq, id: ctimer3_irq, id: ctimer4_irq, id: flexcomm0_irq,
\r
72 id: flexcomm1_irq, id: flexcomm2_irq, id: flexcomm3_irq, id: flexcomm4_irq, id: flexcomm5_irq, id: flexcomm6_irq, id: flexcomm7_irq, id: global_irq0, id: global_irq1,
\r
73 id: lspi_hs_irq, id: mailbox_irq, id: mrt_irq, id: os_event_irq, id: pin_int4, id: pin_int5, id: pin_int6, id: pin_int7, id: pin_irq0, id: pin_irq1, id: pin_irq2,
\r
74 id: pin_irq3, id: plu_irq, id: pq_irq, id: qddkey_irq, id: rtc_irq, id: sct_irq, id: sdio_irq, id: sdma0_irq, id: sdma1_irq, id: sec_hypervisor_call_irq,
\r
75 id: sec_int0, id: sec_int1, id: sec_vio_irq, id: sha_irq, id: sys_irq, id: usb0_irq, id: usb0_needclk_irq, id: usb1_irq, id: usb1_needclk_irq, id: usb1_utmi_irq,
\r
79 - Non-masked: {id: '0', id: '1', id: '10', id: '11', id: '12', id: '13', id: '14', id: '15', id: '16', id: '17', id: '18', id: '19', id: '2', id: '20', id: '21',
\r
80 id: '22', id: '23', id: '24', id: '25', id: '26', id: '27', id: '28', id: '29', id: '3', id: '30', id: '31', id: '4', id: '5', id: '6', id: '7', id: '8',
\r
83 - Non-masked: {id: '0', id: '1', id: '10', id: '11', id: '12', id: '13', id: '14', id: '15', id: '16', id: '17', id: '18', id: '19', id: '2', id: '20', id: '21',
\r
84 id: '22', id: '23', id: '24', id: '25', id: '26', id: '27', id: '28', id: '29', id: '3', id: '30', id: '31', id: '4', id: '5', id: '6', id: '7', id: '8',
\r
88 - generate_code_for_disabled_regions: 'false'
\r
90 - region: {index: '0', enabled: 'true', security: ns, start: '0x00000000', size: '0x10000000'}
\r
91 - region: {index: '1', enabled: 'true', security: ns, start: '0x20000000', size: '0xE0000000'}
\r
92 - region: {index: '2', enabled: 'true', security: nsc, start: '0x1000FE00', size: '0x00000200'}
\r
93 - region: {index: '3', enabled: 'false', security: ns, start: '0x00000000', size: '0x00000020'}
\r
94 - region: {index: '4', enabled: 'false', security: ns, start: '0x00000000', size: '0x00000020'}
\r
95 - region: {index: '5', enabled: 'false', security: ns, start: '0x00000000', size: '0x00000020'}
\r
96 - region: {index: '6', enabled: 'false', security: ns, start: '0x00000000', size: '0x00000020'}
\r
97 - region: {index: '7', enabled: 'false', security: ns, start: '0x00000000', size: '0x00000020'}
\r
99 - no: {id: AIRCR_PRIS, id: AIRCR_BFHFNMINS, id: AIRCR_SYSRESETREQS, id: SCR_SLEEPDEEPS, id: SHCSR_SECUREFAULTENA, id: NSACR_CP2, id: NSACR_CP3, id: NSACR_CP4,
\r
100 id: NSACR_CP5, id: NSACR_CP6, id: NSACR_CP7, id: CPPWR_SU0, id: CPPWR_SUS0, id: CPPWR_SU1, id: CPPWR_SUS1, id: CPPWR_SU2, id: CPPWR_SUS2, id: CPPWR_SU3, id: CPPWR_SUS3,
\r
101 id: CPPWR_SU4, id: CPPWR_SUS4, id: CPPWR_SU5, id: CPPWR_SUS5, id: CPPWR_SU6, id: CPPWR_SUS6, id: CPPWR_SU7, id: CPPWR_SUS7, id: CPPWR_SU10, id: CPPWR_SUS10, id: CPPWR_SU11,
\r
102 id: CPPWR_SUS11, id: SEC_GPIO_MASK0_LOCK, id: SEC_GPIO_MASK1_LOCK, id: SEC_CPU1_INT_MASK0_LOCK, id: SEC_CPU1_INT_MASK1_LOCK, id: MASTER_SEC_LEVEL_LOCK, id: CPU0_LOCK_NS_VTOR,
\r
103 id: CPU0_LOCK_NS_MPU, id: CPU0_LOCK_S_VTAIRCR, id: CPU0_LOCK_S_MPU, id: CPU0_LOCK_SAU, id: CPU0_LOCK_REG_LOCK, id: CPU1_LOCK_NS_VTOR, id: CPU1_LOCK_NS_MPU, id: CPU1_LOCK_REG_LOCK,
\r
104 id: AHB_MISC_CTRL_REG_ENABLE_S_PRIV_CHECK, id: AHB_MISC_CTRL_REG_ENABLE_NS_PRIV_CHECK, id: AHB_MISC_CTRL_REG_DISABLE_VIOLATION_ABORT, id: AHB_MISC_CTRL_REG_DISABLE_SIMPLE_MASTER_STRICT_MODE,
\r
105 id: AHB_MISC_CTRL_REG_DISABLE_SMART_MASTER_STRICT_MODE, id: AHB_MISC_CTRL_REG_IDAU_ALL_NS}
\r
106 - yes: {id: NSACR_CP0, id: NSACR_CP1, id: NSACR_CP10, id: NSACR_CP11, id: AHB_MISC_CTRL_REG_ENABLE_SECURE_CHECKING, id: AHB_MISC_CTRL_REG_WRITE_LOCK}
\r
107 - user_memory_regions:
\r
108 - user_memory_region: {id: Region_1, security: s_priv, name: Secure Code, start: '0x10000000', size: '0x0000FE00'}
\r
109 - user_memory_region: {id: Region_2, security: nsc_priv, name: Veneer Table, start: '0x1000FE00', size: '0x00000200'}
\r
110 - user_memory_region: {id: Region_3, security: s_priv, name: Secure Stack and Data, start: '0x30000000', size: '0x00008000'}
\r
111 - user_memory_region: {id: Region_4, security: ns_user, name: Non-secure Code, description: Privilege check is disabled so reset value (NS-User) can be used,
\r
112 start: '0x00010000', size: '0x00062000'}
\r
113 - user_memory_region: {id: Region_5, security: ns_user, name: Non-secure Stack and Data, description: 'Privilege check is disabled so reset value (NS-User) can
\r
114 be used. ', start: '0x20008000', size: '0x0002B000'}
\r
115 * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/
\r
116 /* clang-format on */
\r
119 * @brief TrustZone initialization
\r
121 * The function configures SAU and AHB.
\r
123 void BOARD_InitTrustZone()
\r
125 //####################################################################
\r
126 //### SAU configuration ##############################################
\r
127 //####################################################################
\r
129 /* Set SAU Control register: Disable SAU and All Secure */
\r
132 /* Set SAU region number */
\r
134 /* Region base address */
\r
135 SAU->RBAR = REGION_0_BASE & SAU_RBAR_BADDR_Msk;
\r
136 /* Region end address */
\r
137 SAU->RLAR = ((REGION_0_END & SAU_RLAR_LADDR_Msk) | ((0U << SAU_RLAR_NSC_Pos) & SAU_RLAR_NSC_Msk)) |
\r
138 ((1U << SAU_RLAR_ENABLE_Pos) & SAU_RLAR_ENABLE_Msk);
\r
140 /* Set SAU region number */
\r
141 SAU->RNR = 0x00000001U;
\r
142 /* Region base address */
\r
143 SAU->RBAR = REGION_1_BASE & SAU_RBAR_BADDR_Msk;
\r
144 /* Region end address */
\r
145 SAU->RLAR = ((REGION_1_END & SAU_RLAR_LADDR_Msk) | ((0U << SAU_RLAR_NSC_Pos) & SAU_RLAR_NSC_Msk)) |
\r
146 ((1U << SAU_RLAR_ENABLE_Pos) & SAU_RLAR_ENABLE_Msk);
\r
148 /* Set SAU region number */
\r
149 SAU->RNR = 0x00000002U;
\r
150 /* Region base address */
\r
151 SAU->RBAR = REGION_2_BASE & SAU_RBAR_BADDR_Msk;
\r
152 /* Region end address */
\r
153 SAU->RLAR = ((REGION_2_END & SAU_RLAR_LADDR_Msk) | ((1U << SAU_RLAR_NSC_Pos) & SAU_RLAR_NSC_Msk)) |
\r
154 ((1U << SAU_RLAR_ENABLE_Pos) & SAU_RLAR_ENABLE_Msk);
\r
156 /* Force memory writes before continuing */
\r
158 /* Flush and refill pipeline with updated permissions */
\r
160 /* Set SAU Control register: Enable SAU and All Secure (applied only if disabled) */
\r
161 SAU->CTRL = 0x00000001U;
\r
163 //####################################################################
\r
164 //### AHB Configurations #############################################
\r
165 //####################################################################
\r
167 //--------------------------------------------------------------------
\r
168 //--- AHB Security Level Configurations ------------------------------
\r
169 //--------------------------------------------------------------------
\r
170 /* Configuration of AHB Secure Controller
\r
171 * Possible values for every memory sector or peripheral rule:
\r
172 * 0 Non-secure, user access allowed.
\r
173 * 1 Non-secure, privileged access allowed.
\r
174 * 2 Secure, user access allowed.
\r
175 * 3 Secure, privileged access allowed. */
\r
177 //--- Security level configuration of memories -----------------------
\r
178 AHB_SECURE_CTRL->SEC_CTRL_FLASH_ROM[0].SEC_CTRL_FLASH_MEM_RULE[0] = 0x00000033U;
\r
179 AHB_SECURE_CTRL->SEC_CTRL_FLASH_ROM[0].SEC_CTRL_FLASH_MEM_RULE[1] = 0;
\r
180 AHB_SECURE_CTRL->SEC_CTRL_FLASH_ROM[0].SEC_CTRL_FLASH_MEM_RULE[2] = 0;
\r
181 AHB_SECURE_CTRL->SEC_CTRL_FLASH_ROM[0].SEC_CTRL_ROM_MEM_RULE[0] = 0;
\r
182 AHB_SECURE_CTRL->SEC_CTRL_FLASH_ROM[0].SEC_CTRL_ROM_MEM_RULE[1] = 0;
\r
183 AHB_SECURE_CTRL->SEC_CTRL_FLASH_ROM[0].SEC_CTRL_ROM_MEM_RULE[2] = 0;
\r
184 AHB_SECURE_CTRL->SEC_CTRL_FLASH_ROM[0].SEC_CTRL_ROM_MEM_RULE[3] = 0;
\r
185 AHB_SECURE_CTRL->SEC_CTRL_RAMX[0].MEM_RULE[0] = 0;
\r
186 AHB_SECURE_CTRL->SEC_CTRL_RAM0[0].MEM_RULE[0] = 0x33333333U;
\r
187 AHB_SECURE_CTRL->SEC_CTRL_RAM0[0].MEM_RULE[1] = 0;
\r
188 AHB_SECURE_CTRL->SEC_CTRL_RAM1[0].MEM_RULE[0] = 0;
\r
189 AHB_SECURE_CTRL->SEC_CTRL_RAM1[0].MEM_RULE[1] = 0;
\r
190 AHB_SECURE_CTRL->SEC_CTRL_RAM2[0].MEM_RULE[0] = 0;
\r
191 AHB_SECURE_CTRL->SEC_CTRL_RAM2[0].MEM_RULE[1] = 0;
\r
192 AHB_SECURE_CTRL->SEC_CTRL_RAM3[0].MEM_RULE[0] = 0;
\r
193 AHB_SECURE_CTRL->SEC_CTRL_RAM3[0].MEM_RULE[1] = 0;
\r
194 AHB_SECURE_CTRL->SEC_CTRL_RAM4[0].MEM_RULE[0] = 0;
\r
195 AHB_SECURE_CTRL->SEC_CTRL_USB_HS[0].MEM_RULE[0] = 0;
\r
197 //--- Security level configuration of peripherals --------------------
\r
198 AHB_SECURE_CTRL->SEC_CTRL_APB_BRIDGE[0].SEC_CTRL_APB_BRIDGE0_MEM_CTRL0 = 0x00000033U;
\r
199 AHB_SECURE_CTRL->SEC_CTRL_APB_BRIDGE[0].SEC_CTRL_APB_BRIDGE0_MEM_CTRL1 = 0;
\r
200 AHB_SECURE_CTRL->SEC_CTRL_APB_BRIDGE[0].SEC_CTRL_APB_BRIDGE0_MEM_CTRL2 = 0;
\r
201 AHB_SECURE_CTRL->SEC_CTRL_APB_BRIDGE[0].SEC_CTRL_APB_BRIDGE1_MEM_CTRL0 = 0;
\r
202 AHB_SECURE_CTRL->SEC_CTRL_APB_BRIDGE[0].SEC_CTRL_APB_BRIDGE1_MEM_CTRL1 = 0;
\r
203 AHB_SECURE_CTRL->SEC_CTRL_APB_BRIDGE[0].SEC_CTRL_APB_BRIDGE1_MEM_CTRL2 = 0;
\r
204 AHB_SECURE_CTRL->SEC_CTRL_APB_BRIDGE[0].SEC_CTRL_APB_BRIDGE1_MEM_CTRL3 = 0;
\r
205 AHB_SECURE_CTRL->SEC_CTRL_AHB_PORT8_SLAVE0_RULE = 0x03000000U;
\r
206 AHB_SECURE_CTRL->SEC_CTRL_AHB_PORT8_SLAVE1_RULE = 0;
\r
207 AHB_SECURE_CTRL->SEC_CTRL_AHB_PORT9_SLAVE0_RULE = 0;
\r
208 AHB_SECURE_CTRL->SEC_CTRL_AHB_PORT9_SLAVE1_RULE = 0;
\r
209 AHB_SECURE_CTRL->SEC_CTRL_AHB_PORT10[0].SLAVE0_RULE = 0;
\r
210 AHB_SECURE_CTRL->SEC_CTRL_AHB_PORT10[0].SLAVE1_RULE = 0;
\r
212 //--- Security level configuration of masters ------------------------
\r
213 AHB_SECURE_CTRL->MASTER_SEC_LEVEL = 0;
\r
214 AHB_SECURE_CTRL->MASTER_SEC_ANTI_POL_REG = 0x3FFFFFFFU;
\r
216 //--------------------------------------------------------------------
\r
217 //--- Pins: Reading GPIO state ---------------------------------------
\r
218 //--------------------------------------------------------------------
\r
219 // Possible values for every pin:
\r
222 //--------------------------------------------------------------------
\r
223 AHB_SECURE_CTRL->SEC_GPIO_MASK0 = 0xFFFFFFFFU;
\r
224 AHB_SECURE_CTRL->SEC_GPIO_MASK1 = 0xFFFFFFFFU;
\r
226 //--------------------------------------------------------------------
\r
227 //--- Interrupts: Interrupt handling by Core1 ------------------------
\r
228 //--------------------------------------------------------------------
\r
229 // Possible values for every interrupt:
\r
232 //--------------------------------------------------------------------
\r
233 AHB_SECURE_CTRL->SEC_CPU_INT_MASK0 = 0xFFFFFFFFU;
\r
234 AHB_SECURE_CTRL->SEC_CPU_INT_MASK1 = 0xFFFFFFFFU;
\r
236 //--------------------------------------------------------------------
\r
237 //--- Interrupts: Interrupt security configuration -------------------
\r
238 //--------------------------------------------------------------------
\r
239 // Possible values for every interrupt:
\r
242 //--------------------------------------------------------------------
\r
246 //--------------------------------------------------------------------
\r
247 //--- Global Options -------------------------------------------------
\r
248 //--------------------------------------------------------------------
\r
249 SCB->AIRCR = (SCB->AIRCR & 0x000009FF7U) | 0x005FA0000U;
\r
250 SCB->SCR &= 0x0FFFFFFF7U;
\r
251 SCB->SHCSR &= 0x0FFF7FFFFU;
\r
252 SCB->NSACR = 0x00000C03U;
\r
254 AHB_SECURE_CTRL->SEC_MASK_LOCK = 0x00000AAAU;
\r
255 AHB_SECURE_CTRL->MASTER_SEC_LEVEL = (AHB_SECURE_CTRL->MASTER_SEC_LEVEL & 0x03FFFFFFFU) | 0x080000000U;
\r
256 AHB_SECURE_CTRL->MASTER_SEC_ANTI_POL_REG = (AHB_SECURE_CTRL->MASTER_SEC_ANTI_POL_REG & 0x03FFFFFFFU) | 0x080000000U;
\r
257 AHB_SECURE_CTRL->CPU0_LOCK_REG = 0x800002AAU;
\r
258 AHB_SECURE_CTRL->CPU1_LOCK_REG = 0x8000000AU;
\r
259 AHB_SECURE_CTRL->MISC_CTRL_REG = (AHB_SECURE_CTRL->MISC_CTRL_REG & 0x0FFFF0003U) | 0x00000AAA4U;
\r
260 AHB_SECURE_CTRL->MISC_CTRL_DP_REG = 0x0000AAA5U;
\r