3636
3737#define SCB_VTOR_NS (*(volatile uint32_t *)(0xE002ED08))
3838
39+ #define NSACR (*(volatile uint32_t *)(0xE000ED8C))
40+ #define CPACR (*(volatile uint32_t *)(0xE000ED88))
41+
42+ #define SHCSR (*(volatile uint32_t *)(0xE000ED24))
43+ #define SHCSR_MEMFAULTENA (1 << 16)
44+ #define SHCSR_BUSFAULTENA (1 << 17)
45+ #define SHCSR_USGFAULTENA (1 << 18)
46+
47+
3948#define ACCESS_BITS_DBG (1 << 7)
4049#define ACCESS_BITS_DMA (1 << 6)
4150#define ACCESS_BITS_CORE1 (1 << 5)
@@ -122,10 +131,19 @@ static void rp2350_configure_sau(void)
122131 sau_init_region (1 , 0x10030000 , 0x1003FFFF , 1 ); /* Non-secure-callable flash */
123132 sau_init_region (2 , 0x10040000 , 0x101FFFFF , 0 ); /* Non-secure flash */
124133 sau_init_region (3 , 0x20000000 , 0x20007FFF , 1 ); /* Secure RAM */
125- sau_init_region (4 , 0x20008000 , 0x2007FFFF , 0 ); /* Non-secure RAM */
134+ sau_init_region (4 , 0x20008000 , 0x20081FFF , 0 ); /* Non-secure RAM */
135+ sau_init_region (6 , 0x40000000 , 0x5FFFFFFF , 0 ); /* Non-secure peripherals */
136+ sau_init_region (7 , 0xD0000000 , 0xDFFFFFFF , 0 ); /* Non-secure SIO region */
137+
126138
127139 /* Enable SAU */
128140 SAU_CTRL = 1 ;
141+
142+ /* Enable MemFault, BusFault and UsageFault */
143+ SHCSR |= SHCSR_MEMFAULTENA | SHCSR_BUSFAULTENA | SHCSR_USGFAULTENA ;
144+
145+ /* Add flag to trap misaligned accesses */
146+ * ((volatile uint32_t * )0xE000ED14 ) |= 0x00000008 ;
129147}
130148
131149static void rp2350_configure_nvic (void )
@@ -142,39 +160,49 @@ static void rp2350_configure_access_control(void)
142160{
143161 int i ;
144162 /* Reset ACCESSCTRL */
145- const uint32_t secure_fl = (ACCESS_BITS_SU | ACCESS_BITS_SP | ACCESS_BITS_DMA | ACCESS_BITS_DBG | ACCESS_BITS_CORE0 | ACCESS_BITS_CORE1 | ACCESS_MAGIC );
146- const uint32_t non_secure_fl = (ACCESS_BITS_NSU | ACCESS_BITS_NSP | ACCESS_BITS_DMA | ACCESS_BITS_DBG | ACCESS_BITS_CORE0 | ACCESS_BITS_CORE1 | ACCESS_MAGIC );
163+ const uint32_t secure_fl = (ACCESS_BITS_SU | ACCESS_BITS_SP | ACCESS_BITS_DMA | ACCESS_BITS_DBG | ACCESS_BITS_CORE0 | ACCESS_BITS_CORE1 ) | ACCESS_MAGIC ;
164+ const uint32_t non_secure_fl = (ACCESS_BITS_NSU | ACCESS_BITS_NSP | ACCESS_BITS_DMA | ACCESS_BITS_DBG | ACCESS_BITS_CORE0 | ACCESS_BITS_CORE1 ) | ACCESS_MAGIC ;
165+
147166 //ACCESS_CONTROL_CFGRESET = 1;
148167 /* Corresponding regions for the secure flash and RAM */
149- //for(i = 0; i < 2; i++) {
150- // ACCESS_CONTROL_SRAM(i) = secure_fl;
151- //}
168+ /*
169+ for(i = 0; i < 2; i++) {
170+ ACCESS_CONTROL_SRAM(i) = secure_fl;
171+ }
172+ */
152173 for (i = 0 ; i < 10 ; i ++ ) {
153174 ACCESS_CONTROL_SRAM (i ) = non_secure_fl | secure_fl ;
154175 }
155- ACCESS_CONTROL_ROM = secure_fl ;
176+ ACCESS_CONTROL_ROM = secure_fl | non_secure_fl ;
156177 ACCESS_CONTROL_XIP_MAIN = non_secure_fl | secure_fl ;
157178 ACCESS_CONTROL_DMA = non_secure_fl ;
158179 ACCESS_CONTROL_TRNG = secure_fl ;
159- ACCESS_CONTROL_SYSCFG = secure_fl ;
180+ ACCESS_CONTROL_SYSCFG = secure_fl | non_secure_fl ;
160181 ACCESS_CONTROL_SHA256 = secure_fl ;
161182 ACCESS_CONTROL_GPIOMASK0 = 0xFFFFFFFF ;
162183 ACCESS_CONTROL_GPIOMASK1 = 0xFFFFFFFF ;
184+ ACCESS_CONTROL_IO_BANK0 = non_secure_fl | secure_fl ;
185+ ACCESS_CONTROL_IO_BANK1 = non_secure_fl | secure_fl ;
186+ ACCESS_CONTROL_PADS_BANK0 = non_secure_fl | secure_fl ;
163187// ACCESS_CONTROL_FORCE_CORE_NS = (1 << 1); /* Force core 1 to non-secure */
164- ACCESS_CONTROL_PIO0 = non_secure_fl ;
165- ACCESS_CONTROL_PIO1 = non_secure_fl ;
166- ACCESS_CONTROL_PIO2 = non_secure_fl ;
167-
168- ACCESS_CONTROL_I2C0 = non_secure_fl ;
169- ACCESS_CONTROL_I2C1 = non_secure_fl ;
170- ACCESS_CONTROL_PWM = non_secure_fl ;
171- ACCESS_CONTROL_SPI0 = non_secure_fl ;
172- ACCESS_CONTROL_SPI1 = non_secure_fl ;
173- ACCESS_CONTROL_TIMER0 = non_secure_fl ;
174- ACCESS_CONTROL_TIMER1 = non_secure_fl ;
175- ACCESS_CONTROL_UART0 = non_secure_fl ;
176- ACCESS_CONTROL_UART1 = non_secure_fl ;
177- ACCESS_CONTROL_ADC = non_secure_fl ;
188+ ACCESS_CONTROL_PIO0 = non_secure_fl | secure_fl ;
189+ ACCESS_CONTROL_PIO1 = non_secure_fl | secure_fl ;
190+ ACCESS_CONTROL_PIO2 = non_secure_fl | secure_fl ;
191+
192+ ACCESS_CONTROL_I2C0 = non_secure_fl |secure_fl ;
193+ ACCESS_CONTROL_I2C1 = non_secure_fl | secure_fl ;
194+ ACCESS_CONTROL_PWM = non_secure_fl | secure_fl ;
195+ ACCESS_CONTROL_SPI0 = non_secure_fl | secure_fl ;
196+ ACCESS_CONTROL_SPI1 = non_secure_fl | secure_fl ;
197+ ACCESS_CONTROL_TIMER0 = non_secure_fl | secure_fl ;
198+ ACCESS_CONTROL_TIMER1 = non_secure_fl | secure_fl ;
199+ ACCESS_CONTROL_UART0 = non_secure_fl | secure_fl ;
200+ ACCESS_CONTROL_UART1 = non_secure_fl | secure_fl ;
201+ ACCESS_CONTROL_ADC = non_secure_fl | secure_fl ;
202+ ACCESS_CONTROL_RESETS = non_secure_fl | secure_fl ;
203+
204+ CPACR |= 0x000000FF ; /* Enable access to coprocessors CP0-CP7 */
205+ NSACR |= 0x000000FF ; /* Enable non-secure access to coprocessors CP0-CP7 */
178206
179207// ACCESS_CONTROL_LOCK = (1 << 0) | (1 << 1) | (1 << 3);
180208}
0 commit comments