| #define MEM_CACHE_WBWA SCB_MPU_RASR_TEX(1) | SCB_MPU_RASR_C | SCB_MPU_RASR_B | #define MEM_CACHE_WBWA SCB_MPU_RASR_TEX(1) | SCB_MPU_RASR_C | SCB_MPU_RASR_B | ||||
| #define MEM_NOCACHE SCB_MPU_RASR_TEX(1) | #define MEM_NOCACHE SCB_MPU_RASR_TEX(1) | ||||
| #define DEV_NOCACHE SCB_MPU_RASR_TEX(2) | #define DEV_NOCACHE SCB_MPU_RASR_TEX(2) | ||||
| #define SIZE_32B (SCB_MPU_RASR_SIZE(4) | SCB_MPU_RASR_ENABLE) | |||||
| #define SIZE_64B (SCB_MPU_RASR_SIZE(5) | SCB_MPU_RASR_ENABLE) | |||||
| #define SIZE_128B (SCB_MPU_RASR_SIZE(6) | SCB_MPU_RASR_ENABLE) | |||||
| #define SIZE_256B (SCB_MPU_RASR_SIZE(7) | SCB_MPU_RASR_ENABLE) | |||||
| #define SIZE_512B (SCB_MPU_RASR_SIZE(8) | SCB_MPU_RASR_ENABLE) | |||||
| #define SIZE_1K (SCB_MPU_RASR_SIZE(9) | SCB_MPU_RASR_ENABLE) | |||||
| #define SIZE_2K (SCB_MPU_RASR_SIZE(10) | SCB_MPU_RASR_ENABLE) | |||||
| #define SIZE_4K (SCB_MPU_RASR_SIZE(11) | SCB_MPU_RASR_ENABLE) | |||||
| #define SIZE_8K (SCB_MPU_RASR_SIZE(12) | SCB_MPU_RASR_ENABLE) | |||||
| #define SIZE_16K (SCB_MPU_RASR_SIZE(13) | SCB_MPU_RASR_ENABLE) | |||||
| #define SIZE_32K (SCB_MPU_RASR_SIZE(14) | SCB_MPU_RASR_ENABLE) | |||||
| #define SIZE_64K (SCB_MPU_RASR_SIZE(15) | SCB_MPU_RASR_ENABLE) | |||||
| #define SIZE_128K (SCB_MPU_RASR_SIZE(16) | SCB_MPU_RASR_ENABLE) | #define SIZE_128K (SCB_MPU_RASR_SIZE(16) | SCB_MPU_RASR_ENABLE) | ||||
| #define SIZE_256K (SCB_MPU_RASR_SIZE(17) | SCB_MPU_RASR_ENABLE) | #define SIZE_256K (SCB_MPU_RASR_SIZE(17) | SCB_MPU_RASR_ENABLE) | ||||
| #define SIZE_512K (SCB_MPU_RASR_SIZE(18) | SCB_MPU_RASR_ENABLE) | #define SIZE_512K (SCB_MPU_RASR_SIZE(18) | SCB_MPU_RASR_ENABLE) | ||||
| #define SIZE_16M (SCB_MPU_RASR_SIZE(23) | SCB_MPU_RASR_ENABLE) | #define SIZE_16M (SCB_MPU_RASR_SIZE(23) | SCB_MPU_RASR_ENABLE) | ||||
| #define SIZE_32M (SCB_MPU_RASR_SIZE(24) | SCB_MPU_RASR_ENABLE) | #define SIZE_32M (SCB_MPU_RASR_SIZE(24) | SCB_MPU_RASR_ENABLE) | ||||
| #define SIZE_64M (SCB_MPU_RASR_SIZE(25) | SCB_MPU_RASR_ENABLE) | #define SIZE_64M (SCB_MPU_RASR_SIZE(25) | SCB_MPU_RASR_ENABLE) | ||||
| #define SIZE_256M (SCB_MPU_RASR_SIZE(26) | SCB_MPU_RASR_ENABLE) | |||||
| #define SIZE_128M (SCB_MPU_RASR_SIZE(26) | SCB_MPU_RASR_ENABLE) | |||||
| #define SIZE_256M (SCB_MPU_RASR_SIZE(27) | SCB_MPU_RASR_ENABLE) | |||||
| #define SIZE_512M (SCB_MPU_RASR_SIZE(28) | SCB_MPU_RASR_ENABLE) | |||||
| #define SIZE_1G (SCB_MPU_RASR_SIZE(29) | SCB_MPU_RASR_ENABLE) | |||||
| #define SIZE_2G (SCB_MPU_RASR_SIZE(30) | SCB_MPU_RASR_ENABLE) | |||||
| #define SIZE_4G (SCB_MPU_RASR_SIZE(31) | SCB_MPU_RASR_ENABLE) | |||||
| #define REGION(n) (SCB_MPU_RBAR_REGION(n) | SCB_MPU_RBAR_VALID) | #define REGION(n) (SCB_MPU_RBAR_REGION(n) | SCB_MPU_RBAR_VALID) | ||||
| FLASHMEM void configure_cache(void) | FLASHMEM void configure_cache(void) | ||||
| SCB_MPU_CTRL = 0; // turn off MPU | SCB_MPU_CTRL = 0; // turn off MPU | ||||
| SCB_MPU_RBAR = 0x00000000 | REGION(0); // ITCM | |||||
| uint32_t i = 0; | |||||
| SCB_MPU_RBAR = 0x00000000 | REGION(i++); //https://developer.arm.com/docs/146793866/10/why-does-the-cortex-m7-initiate-axim-read-accesses-to-memory-addresses-that-do-not-fall-under-a-defined-mpu-region | |||||
| SCB_MPU_RASR = SCB_MPU_RASR_TEX(0) | NOACCESS | NOEXEC | SIZE_4G; | |||||
| SCB_MPU_RBAR = 0x00000000 | REGION(i++); // ITCM | |||||
| SCB_MPU_RASR = MEM_NOCACHE | READWRITE | SIZE_512K; | SCB_MPU_RASR = MEM_NOCACHE | READWRITE | SIZE_512K; | ||||
| SCB_MPU_RBAR = 0x00000000 | REGION(i++); // trap NULL pointer deref | |||||
| SCB_MPU_RASR = DEV_NOCACHE | NOACCESS | SIZE_32B; | |||||
| SCB_MPU_RBAR = 0x00200000 | REGION(1); // Boot ROM | |||||
| SCB_MPU_RBAR = 0x00200000 | REGION(i++); // Boot ROM | |||||
| SCB_MPU_RASR = MEM_CACHE_WT | READONLY | SIZE_128K; | SCB_MPU_RASR = MEM_CACHE_WT | READONLY | SIZE_128K; | ||||
| SCB_MPU_RBAR = 0x20000000 | REGION(2); // DTCM | |||||
| SCB_MPU_RBAR = 0x20000000 | REGION(i++); // DTCM | |||||
| SCB_MPU_RASR = MEM_NOCACHE | READWRITE | NOEXEC | SIZE_512K; | SCB_MPU_RASR = MEM_NOCACHE | READWRITE | NOEXEC | SIZE_512K; | ||||
| SCB_MPU_RBAR = ((uint32_t)&_ebss) | REGION(i++); // trap stack overflow | |||||
| SCB_MPU_RASR = SCB_MPU_RASR_TEX(0) | NOACCESS | NOEXEC | SIZE_32B; | |||||
| SCB_MPU_RBAR = 0x20200000 | REGION(3); // RAM (AXI bus) | |||||
| SCB_MPU_RBAR = 0x20200000 | REGION(i++); // RAM (AXI bus) | |||||
| SCB_MPU_RASR = MEM_CACHE_WBWA | READWRITE | NOEXEC | SIZE_1M; | SCB_MPU_RASR = MEM_CACHE_WBWA | READWRITE | NOEXEC | SIZE_1M; | ||||
| SCB_MPU_RBAR = 0x40000000 | REGION(4); // Peripherals | |||||
| SCB_MPU_RBAR = 0x40000000 | REGION(i++); // Peripherals | |||||
| SCB_MPU_RASR = DEV_NOCACHE | READWRITE | NOEXEC | SIZE_64M; | SCB_MPU_RASR = DEV_NOCACHE | READWRITE | NOEXEC | SIZE_64M; | ||||
| SCB_MPU_RBAR = 0x60000000 | REGION(5); // QSPI Flash | |||||
| SCB_MPU_RBAR = 0x60000000 | REGION(i++); // QSPI Flash | |||||
| SCB_MPU_RASR = MEM_CACHE_WBWA | READONLY | SIZE_16M; | SCB_MPU_RASR = MEM_CACHE_WBWA | READONLY | SIZE_16M; | ||||
| SCB_MPU_RBAR = 0x70000000 | REGION(6); // FlexSPI2 | |||||
| SCB_MPU_RBAR = 0x70000000 | REGION(i++); // FlexSPI2 | |||||
| SCB_MPU_RASR = MEM_CACHE_WBWA | READONLY | SIZE_256M; | SCB_MPU_RASR = MEM_CACHE_WBWA | READONLY | SIZE_256M; | ||||
| SCB_MPU_RBAR = 0x70000000 | REGION(7); // FlexSPI2 | |||||
| SCB_MPU_RBAR = 0x70000000 | REGION(i++); // FlexSPI2 | |||||
| SCB_MPU_RASR = MEM_CACHE_WBWA | READWRITE | SIZE_16M; | SCB_MPU_RASR = MEM_CACHE_WBWA | READWRITE | SIZE_16M; | ||||
| // TODO: 32 byte sub-region at 0x00000000 with NOACCESS, to trap NULL pointer deref | |||||
| // TODO: protect access to power supply config | // TODO: protect access to power supply config | ||||
| // TODO: 32 byte sub-region at end of .bss section with NOACCESS, to trap stack overflow | |||||
| SCB_MPU_CTRL = SCB_MPU_CTRL_ENABLE; | SCB_MPU_CTRL = SCB_MPU_CTRL_ENABLE; | ||||
| SCB_CCR |= (SCB_CCR_IC | SCB_CCR_DC); | SCB_CCR |= (SCB_CCR_IC | SCB_CCR_DC); | ||||
| } | } | ||||
| FLASHMEM void usb_pll_start() | FLASHMEM void usb_pll_start() | ||||
| { | { | ||||
| while (1) { | while (1) { |