390 lines
23 KiB
C
390 lines
23 KiB
C
#include "bsp.h"
|
|
#include "crane_ds_mpu.h"
|
|
#include "loadTable.h"
|
|
#include "UART.h"
|
|
|
|
unsigned int region_cnt = 0;
|
|
|
|
BOOL xip_access_enable = TRUE;
|
|
|
|
#ifdef QUECTEL_PROJECT_CUST
|
|
extern unsigned int Image$$DDR_NONCACHE_REGION_ACIPC_PS_UL$$Base;
|
|
unsigned int quec_nocache_start_check(unsigned int addr)
|
|
{
|
|
if((unsigned int)(&Image$$DDR_NONCACHE_REGION_ACIPC_PS_UL$$Base) != addr){
|
|
RTI_LOG("mpu_error %s %s,0x%x,0x%x",__FILE__,__LINE__,(unsigned int)(&Image$$DDR_NONCACHE_REGION_ACIPC_PS_UL$$Base),addr);
|
|
ASSERT(0)
|
|
}
|
|
return addr;
|
|
}
|
|
|
|
#define NOCACHE_STARTADDR_CHECK(ADDR) quec_nocache_start_check(ADDR)
|
|
#endif
|
|
|
|
static unsigned int crane_ds_mpu_16M_psram_16M_flash_xip(unsigned int cnt) {
|
|
#ifdef CRANE_MCU_DONGLE
|
|
|
|
#ifdef CRANELS_16M16M
|
|
/*
|
|
mpu_config_region_set_mem(region_num, base_address, REGION_SIZE, ACCESS_PERMISSION, cacheable, shared, execute_never) */
|
|
mpu_config_region_set_mem(cnt++, 0x00000000, REG_64KB, READ_ONLY, 0, 0, 0);//[ 64K] ATCM
|
|
mpu_config_region_set_mem(cnt++, 0xB0020000, REG_64KB, FULL_ACCESS, 0, 0, 1);//[ 64k] BTCM
|
|
mpu_config_region_set_mem(cnt++, 0x80000000, REG_16MB, FULL_ACCESS, 0, 0, 0);//[ 32M] DDR_QSPI_NOR_FLASH (support all 8M/16M/32M flash)
|
|
mpu_config_region_set_mem(cnt++, 0x7E000000, REG_16MB, FULL_ACCESS, 1, 0, 0);//[ 8M] PSRAM_BACKGROUND (support both 8M/16M PSRAM)
|
|
|
|
#ifdef SINGLE_SIM
|
|
mpu_config_region_set_mem(cnt++, 0x7EF60000, REG_128KB, FULL_ACCESS, 0, 1, 0);//[ 1M] DDR_NONCACHE
|
|
mpu_config_region_set_mem(cnt++, 0x7EF80000, REG_512KB, FULL_ACCESS, 0, 1, 0);//[ 1M] DDR_NONCACHE
|
|
#else
|
|
mpu_config_region_set_mem(cnt++, 0x7EF00000, REG_1MB, FULL_ACCESS, 0, 1, 0);//[ 1M] DDR_NONCACHE
|
|
#endif
|
|
/*
|
|
mpu_config_region_set_dev(region_num, base_address, region_size, shared); */
|
|
mpu_config_region_set_dev(cnt++, 0xC0000000, REG_1GB, 1); //[ 1G] ASIC_REG_ADDR (force align)
|
|
mpu_config_region_set_mem(cnt++, 0xD1000000, REG_64KB, FULL_ACCESS, 0, 1, 1);//[ 64K] SQU (non align)
|
|
#else
|
|
/*
|
|
mpu_config_region_set_mem(region_num, base_address, REGION_SIZE, ACCESS_PERMISSION, cacheable, shared, execute_never) */
|
|
mpu_config_region_set_mem(cnt++, 0x00000000, REG_64KB, READ_ONLY, 0, 0, 0);//[ 64K] ATCM
|
|
mpu_config_region_set_mem(cnt++, 0xB0020000, REG_64KB, FULL_ACCESS, 0, 0, 1);//[ 64k] BTCM
|
|
mpu_config_region_set_mem(cnt++, 0x80000000, REG_32MB, FULL_ACCESS, 0, 0, 0);//[ 32M] DDR_QSPI_NOR_FLASH (support all 8M/16M/32M flash)
|
|
mpu_config_region_set_mem(cnt++, 0x7E000000, REG_16MB, FULL_ACCESS, 1, 0, 0);//[ 16M] PSRAM_BACKGROUND (support both 8M/16M PSRAM)
|
|
|
|
#if defined(DM_LTEONLY_16MPSRAM)
|
|
mpu_config_region_set_mem(cnt++, 0x7E000000, REG_4MB, READ_ONLY, 1, 0, 0);
|
|
mpu_config_region_set_mem(cnt++, 0x7E400000, REG_1MB, READ_ONLY, 1, 0, 0);//[ 8M] DDR_PSRAM_CODE
|
|
#else
|
|
mpu_config_region_set_mem(cnt++, 0x7E000000, REG_8MB, READ_ONLY, 1, 0, 0);
|
|
mpu_config_region_set_mem(cnt++, 0x7E800000, REG_1MB, READ_ONLY, 1, 0, 0);//[ 8M] DDR_PSRAM_CODE
|
|
#endif
|
|
|
|
mpu_config_region_set_mem(cnt++, 0x7EF00000, REG_1MB, FULL_ACCESS, 0, 1, 0);//[ 1M] DDR_NONCACHE
|
|
/*
|
|
mpu_config_region_set_dev(region_num, base_address, region_size, shared); */
|
|
mpu_config_region_set_dev(cnt++, 0xC0000000, REG_1GB, 1); //[ 1G] ASIC_REG_ADDR (force align)
|
|
mpu_config_region_set_mem(cnt++, 0xD1000000, REG_64KB, FULL_ACCESS, 0, 1, 1);//[ 64K] SQU (non align)
|
|
#endif
|
|
#else
|
|
/*
|
|
mpu_config_region_set_mem(region_num, base_address, REGION_SIZE, ACCESS_PERMISSION, cacheable, shared, execute_never) */
|
|
mpu_config_region_set_mem(cnt++, 0x00000000, REG_64KB, READ_ONLY, 0, 0, 0);//[ 64K] ATCM
|
|
mpu_config_region_set_mem(cnt++, 0xB0020000, REG_64KB, FULL_ACCESS, 0, 0, 1);//[ 64k] BTCM
|
|
mpu_config_region_set_mem(cnt++, 0x80000000, REG_32MB, FULL_ACCESS, 0, 0, 0);//[ 32M] DDR_QSPI_NOR_FLASH (support both 16M/32M flash)
|
|
mpu_config_region_set_mem(cnt++, 0x7E000000, REG_16MB, FULL_ACCESS, 1, 0, 0);//[ 16M] PSRAM_BACKGROUND
|
|
#ifdef ENABLE_CAT1_LG
|
|
mpu_config_region_set_mem(cnt++, 0x7E000000, REG_2MB, READ_ONLY, 1, 0, 0);//[ 3M] DDR_DSP_RO & PS_CRANE_MCU_DONGLE
|
|
mpu_config_region_set_mem(cnt++, 0x7E200000, REG_1MB, READ_ONLY, 1, 0, 0);
|
|
#else
|
|
mpu_config_region_set_mem(cnt++, 0x7E000000, REG_2MB, READ_ONLY, 1, 0, 0);//[2.5M] DDR_DSP_RO & PS_CRANE_MCU_DONGLE
|
|
mpu_config_region_set_mem(cnt++, 0x7E200000, REG_1MB, READ_ONLY, 1, 0, 0);
|
|
mpu_config_region_set_mem(cnt++, 0x7E280000, REG_512KB, FULL_ACCESS, 1, 0, 0);
|
|
#endif
|
|
|
|
mpu_config_region_set_mem(cnt++, 0x7EE80000, REG_512KB, FULL_ACCESS, 0, 1, 0);//[1.5M] DDR_NONCACHE
|
|
mpu_config_region_set_mem(cnt++, 0x7EF00000, REG_1MB, FULL_ACCESS, 0, 1, 0);
|
|
/*
|
|
mpu_config_region_set_dev(region_num, base_address, region_size, shared); */
|
|
mpu_config_region_set_dev(cnt++, 0xC0000000, REG_1GB, 1); //[ 1G] ASIC_REG_ADDR (force align)
|
|
mpu_config_region_set_mem(cnt++, 0xD1000000, REG_64KB, FULL_ACCESS, 0, 1, 1);//[ 64K] SQU (non align)
|
|
#endif
|
|
return (cnt-1);//return configed region count
|
|
}
|
|
|
|
static unsigned int crane_ds_mpu_16M_psram_16M_flash_psram(unsigned int cnt) {
|
|
/*
|
|
mpu_config_region_set_mem(region_num, base_address, REGION_SIZE, ACCESS_PERMISSION, cacheable, shared, execute_never) */
|
|
mpu_config_region_set_mem(cnt++, 0x00000000, REG_64KB, READ_ONLY, 0, 0, 0);//[ 64K] ATCM
|
|
mpu_config_region_set_mem(cnt++, 0xB0020000, REG_64KB, FULL_ACCESS, 0, 0, 1);//[ 64k] BTCM
|
|
mpu_config_region_set_mem(cnt++, 0x80000000, REG_32MB, FULL_ACCESS, 0, 0, 0);//[ 32M] DDR_QSPI_NOR_FLASH (support both 16M/32M flash)
|
|
mpu_config_region_set_mem(cnt++, 0x7E000000, REG_16MB, FULL_ACCESS, 1, 0, 0);//[ 16M] PSRAM_BACKGROUND (support both 8M/16M PSRAM)
|
|
#ifdef ENABLE_CAT1_LG
|
|
//TODO:xiaoke for further refine
|
|
/*
|
|
mpu_config_region_set_mem(cnt++, 0x7E000000, REG_2MB, READ_ONLY, 0, 0, 1);//[2.25M] DDR_DSP_RO
|
|
mpu_config_region_set_mem(cnt++, 0x7E200000, REG_256KB, READ_ONLY, 0, 0, 1);//[+256K]
|
|
*/
|
|
#else
|
|
//TODO:xiaoke for further refine
|
|
/*
|
|
mpu_config_region_set_mem(cnt++, 0x7E000000, REG_1MB, FULL_ACCESS, 0, 0, 1);//[1.5M] DDR_DSP_RO
|
|
mpu_config_region_set_mem(cnt++, 0x7E100000, REG_512KB, READ_ONLY, p, 1, 1);
|
|
*/
|
|
#endif
|
|
mpu_config_region_set_mem(cnt++, 0x7EE00000, REG_2MB, FULL_ACCESS, 0, 1, 1);//[1.5M] DDR_NONCACHE
|
|
mpu_config_region_set_mem(cnt++, 0x7EE00000, REG_512KB, FULL_ACCESS, 1, 0, 0);
|
|
/*
|
|
mpu_config_region_set_dev(region_num, base_address, region_size, shared); */
|
|
mpu_config_region_set_dev(cnt++, 0xC0000000, REG_1GB, 1); //[ 1G] ASIC_REG_ADDR (force align)
|
|
mpu_config_region_set_mem(cnt++, 0xD1000000, REG_64KB, FULL_ACCESS, 0, 1, 1);//[ 64K] SQU (non align)
|
|
|
|
return (cnt-1);//return configed region count
|
|
}
|
|
|
|
|
|
#if defined(CRANEM_SS_16MRAM)
|
|
static unsigned int crane_ss_mpu_16M_psram_8M_flash_xip(unsigned int cnt) {
|
|
/*
|
|
mpu_config_region_set_mem(region_num, base_address, REGION_SIZE, ACCESS_PERMISSION, cacheable, shared, execute_never) */
|
|
mpu_config_region_set_mem(cnt++, 0x00000000, REG_64KB, READ_ONLY, 0, 0, 0);//[ 64K] ATCM
|
|
mpu_config_region_set_mem(cnt++, 0xB0020000, REG_64KB, FULL_ACCESS, 0, 0, 1);//[ 64k] BTCM
|
|
mpu_config_region_set_mem(cnt++, 0x80000000, REG_32MB, FULL_ACCESS, 0, 0, 0);//[ 32M] DDR_QSPI_NOR_FLASH (support both 16M/32M flash)
|
|
mpu_config_region_set_mem(cnt++, 0x7E000000, REG_16MB, FULL_ACCESS, 1, 0, 0);//[ 16M] PSRAM_BACKGROUND (support both 8M/16M PSRAM)
|
|
|
|
mpu_config_region_set_mem(cnt++, 0x7EF00000, REG_1MB, FULL_ACCESS, 0, 1, 1);//[1.0M] DDR_NONCACHE
|
|
mpu_config_region_set_mem(cnt++, 0x7EF00000, REG_128KB, FULL_ACCESS, 1, 0, 0);//[256K] DDR_CACHE
|
|
|
|
/*
|
|
mpu_config_region_set_dev(region_num, base_address, region_size, shared); */
|
|
mpu_config_region_set_dev(cnt++, 0xC0000000, REG_1GB, 1); //[ 1G] ASIC_REG_ADDR (force align)
|
|
mpu_config_region_set_mem(cnt++, 0xD1000000, REG_64KB, FULL_ACCESS, 0, 1, 1);//[ 64K] SQU (non align)
|
|
|
|
return (cnt-1);//return configed region count
|
|
}
|
|
#endif
|
|
|
|
static unsigned int crane_ds_mpu_8M_psram_8M_flash_xip(unsigned int cnt) {
|
|
#ifdef CRANE_MCU_DONGLE
|
|
/*
|
|
mpu_config_region_set_mem(region_num, base_address, REGION_SIZE, ACCESS_PERMISSION, cacheable, shared, execute_never) */
|
|
mpu_config_region_set_mem(cnt++, 0x00000000, REG_64KB, READ_ONLY, 0, 0, 0);//[ 64K] ATCM
|
|
mpu_config_region_set_mem(cnt++, 0xB0020000, REG_64KB, FULL_ACCESS, 0, 0, 1);//[ 64k] BTCM
|
|
mpu_config_region_set_mem(cnt++, 0x80000000, REG_8MB, FULL_ACCESS, 0, 0, 0);//[ 32M] DDR_QSPI_NOR_FLASH (support all 8M/16M/32M flash)
|
|
mpu_config_region_set_mem(cnt++, 0x7E000000, REG_8MB, FULL_ACCESS, 1, 0, 0);//[ 8M] PSRAM_BACKGROUND (support both 8M/16M PSRAM)
|
|
|
|
#ifdef ASR_PLATFORM_CRANELS//8+8 nocache 配置走else pony add 20230414
|
|
mpu_config_region_set_mem(cnt++, NOCACHE_STARTADDR_CHECK(0x7E760000), REG_128KB, FULL_ACCESS, 0, 1, 0);//[ 1M] DDR_NONCACHE
|
|
mpu_config_region_set_mem(cnt++, 0x7E780000, REG_512KB, FULL_ACCESS, 0, 1, 0);//[ 1M] DDR_NONCACHE
|
|
#elif defined(LTEGSM_THIN) //1603c
|
|
mpu_config_region_set_mem(cnt++, NOCACHE_STARTADDR_CHECK(0x7E720000), REG_128KB, FULL_ACCESS, 0, 1, 0);//[ 1M] DDR_NONCACHE
|
|
mpu_config_region_set_mem(cnt++, 0x7E740000, REG_256KB, FULL_ACCESS, 0, 1, 0);//[ 1M] DDR_NONCACHE
|
|
mpu_config_region_set_mem(cnt++, 0x7E780000, REG_512KB, FULL_ACCESS, 0, 1, 0);//[ 1M] DDR_NONCACHE
|
|
#else //1606
|
|
//For 1606 8+8 项目,R07 SDK
|
|
mpu_config_region_set_mem(cnt++, NOCACHE_STARTADDR_CHECK(0x7E700000), REG_1MB, FULL_ACCESS, 0, 1, 0);//[ 1M] DDR_NONCACHE
|
|
#endif
|
|
/*
|
|
mpu_config_region_set_dev(region_num, base_address, region_size, shared); */
|
|
mpu_config_region_set_dev(cnt++, 0xC0000000, REG_1GB, 1); //[ 1G] ASIC_REG_ADDR (force align)
|
|
mpu_config_region_set_mem(cnt++, 0xD1000000, REG_64KB, FULL_ACCESS, 0, 1, 1);//[ 64K] SQU (non align)
|
|
|
|
#else
|
|
/*
|
|
mpu_config_region_set_mem(region_num, base_address, REGION_SIZE, ACCESS_PERMISSION, cacheable, shared, execute_never) */
|
|
mpu_config_region_set_mem(cnt++, 0x00000000, REG_64KB, READ_ONLY, 0, 0, 0);//[ 64K] ATCM
|
|
mpu_config_region_set_mem(cnt++, 0xB0020000, REG_64KB, FULL_ACCESS, 0, 0, 1);//[ 64k] BTCM
|
|
mpu_config_region_set_mem(cnt++, 0x80000000, REG_32MB, FULL_ACCESS, 0, 0, 0);//[ 32M] DDR_QSPI_NOR_FLASH (support all 8M/16M/32M flash)
|
|
mpu_config_region_set_mem(cnt++, 0x7E000000, REG_16MB, FULL_ACCESS, 1, 0, 0);//[ 16M] PSRAM_BACKGROUND (support both 8M/16M PSRAM)
|
|
|
|
mpu_config_region_set_mem(cnt++, 0x7E180000, REG_512KB, READ_ONLY, 1, 0, 0);//[+512K] DDR_PSRAM_CODE
|
|
mpu_config_region_set_mem(cnt++, 0x7E200000, REG_512KB, READ_ONLY, 1, 0, 0);//[+512K]
|
|
mpu_config_region_set_mem(cnt++, 0x7E680000, REG_512KB, FULL_ACCESS, 0, 1, 0);//[+ 512K] DDR_NONCACHE
|
|
|
|
mpu_config_region_set_mem(cnt++, 0x7E700000, REG_1MB, FULL_ACCESS, 0, 1, 0);//[ 1M] DDR_NONCACHE
|
|
|
|
mpu_config_region_set_mem(cnt++, 0x7E000000, REG_1MB, READ_ONLY, 0, 1, 1);//[1.5M] DDR_DSP_RO
|
|
mpu_config_region_set_mem(cnt++, 0x7E100000, REG_512KB, READ_ONLY, 0, 1, 1);
|
|
|
|
/*
|
|
mpu_config_region_set_dev(region_num, base_address, region_size, shared); */
|
|
mpu_config_region_set_dev(cnt++, 0xC0000000, REG_1GB, 1); //[ 1G] ASIC_REG_ADDR (force align)
|
|
mpu_config_region_set_mem(cnt++, 0xD1000000, REG_64KB, FULL_ACCESS, 0, 1, 1);//[ 64K] SQU (non align)
|
|
#endif
|
|
return (cnt-1);//return configed region count
|
|
}
|
|
|
|
static unsigned int crane_ds_mpu_4M_psram_4M_flash_xip(unsigned int cnt) {
|
|
#ifdef CRANE_MCU_DONGLE
|
|
/*
|
|
mpu_config_region_set_mem(region_num, base_address, REGION_SIZE, ACCESS_PERMISSION, cacheable, shared, execute_never) */
|
|
mpu_config_region_set_mem(cnt++, 0x00000000, REG_64KB, READ_ONLY, 0, 0, 0);//[ 64K] ATCM
|
|
mpu_config_region_set_mem(cnt++, 0xB0020000, REG_64KB, FULL_ACCESS, 0, 0, 1);//[ 64k] BTCM
|
|
mpu_config_region_set_mem(cnt++, 0x80000000, REG_32MB, FULL_ACCESS, 0, 0, 0);//[ 32M] DDR_QSPI_NOR_FLASH (support all 8M/16M/32M flash)
|
|
mpu_config_region_set_mem(cnt++, 0x7E000000, REG_4MB, FULL_ACCESS, 1, 0, 0);//[ 4M] PSRAM_BACKGROUND (support both 8M/16M PSRAM)
|
|
|
|
//Sharon.li@20230411 OPEN版本4+4和2+4的项目单卡的基线NOCACHE分区起始地址一样
|
|
#ifdef SINGLE_SIM
|
|
#ifdef QUECTEL_USBNET_SUPPORT
|
|
//for 1602 2+4 And 4+4 项目,支持USBNET的IPC行业版本
|
|
mpu_config_region_set_mem(cnt++, NOCACHE_STARTADDR_CHECK(0x7E36A000), REG_8KB, FULL_ACCESS, 0, 1, 0);//[ 1M] DDR_NONCACHE
|
|
mpu_config_region_set_mem(cnt++, 0x7E368000, REG_32KB, FULL_ACCESS, 0, 1, 0);//[ 1M] DDR_NONCACHE
|
|
mpu_config_region_set_mem(cnt++, 0x7E370000, REG_64KB, FULL_ACCESS, 0, 1, 0);//[ 1M] DDR_NONCACHE
|
|
mpu_config_region_set_mem(cnt++, 0x7E380000, REG_512KB, FULL_ACCESS, 0, 1, 0);//[ 1M] DDR_NONCACHE
|
|
#else
|
|
//for 1602/1606 2+4 And 4+4 项目
|
|
mpu_config_region_set_mem(cnt++, NOCACHE_STARTADDR_CHECK(0x7E370000), REG_64KB, FULL_ACCESS, 0, 1, 0);//[ 1M] DDR_NONCACHE
|
|
mpu_config_region_set_mem(cnt++, 0x7E380000, REG_512KB, FULL_ACCESS, 0, 1, 0);//[ 1M] DDR_NONCACHE
|
|
#endif
|
|
#endif
|
|
/*
|
|
mpu_config_region_set_dev(region_num, base_address, region_size, shared); */
|
|
mpu_config_region_set_dev(cnt++, 0xC0000000, REG_1GB, 1); //[ 1G] ASIC_REG_ADDR (force align)
|
|
mpu_config_region_set_mem(cnt++, 0xD1000000, REG_64KB, FULL_ACCESS, 0, 1, 1);//[ 64K] SQU (non align)
|
|
|
|
#endif
|
|
return (cnt-1);//return configed region count
|
|
}
|
|
|
|
|
|
//xiaokeweng@20191008 flash cache_line auto config
|
|
//for partition table , the XIP code part should be cacheable
|
|
//but the NVM/factory/fota_pkg should always be noncache ,
|
|
//so implement solution to detect the cache_line address
|
|
//aligned inside [dsp_start_addr ~ reserved_end_addr] for C-code MPU audo reconfig
|
|
|
|
#define CACHELINE_ALIGN_REGION_SIZE(REG_N) (2 << REG_N)
|
|
|
|
static unsigned int crane_ds_mpu_flash_noncache_line_auto_mpu(unsigned int cnt){
|
|
|
|
//ptable fetch noncache_line area [dsp.bin.start ~ reserved.end]
|
|
unsigned int dsp_start_addr = get_dsp_start_address_offset();
|
|
#ifdef QUECTEL_OPEN_CPU
|
|
/*以app结束地址为cache结束地址*/
|
|
unsigned int reserved_end_addr = get_flash_cache_end_address_offset();
|
|
#else
|
|
unsigned int reserved_end_addr = get_reserved_end_address_offset();
|
|
#endif
|
|
|
|
unsigned int cache_line_max = reserved_end_addr;
|
|
unsigned int cache_line_min = dsp_start_addr;
|
|
unsigned int cache_line = 0;
|
|
|
|
unsigned int tmp_addr = cache_line_max;
|
|
unsigned int tmp_align= REG_16MB;
|
|
unsigned int min_align= REG_1MB;
|
|
unsigned int mpu_num= 0;
|
|
|
|
if(is_partition_internal_flash("nvm")){
|
|
mpu_config_region_set_mem(++cnt, 0x80000000, REG_32MB, FULL_ACCESS, 1, 0, 0);
|
|
}else{
|
|
RTI_LOG("[MPU] cache_line_max = [0x%0.8x], cache_line_min = [0x%0.8x]\r\n",cache_line_max,cache_line_min);
|
|
|
|
#if (defined(CRANEL_4MRAM) || defined(CRANEL_8MRAM))
|
|
min_align = REG_4KB;
|
|
#endif
|
|
#ifdef QUECTEL_OPEN_CPU
|
|
while(!(cache_line > cache_line_max) && (tmp_align >= min_align)) { // open 配置到app_end前
|
|
#else
|
|
//while(!(cache_line >= cache_line_min && cache_line <= cache_line_max) && (tmp_align >= min_align)) {
|
|
#endif
|
|
RTI_LOG("[MPU] tmp_addr = [0x%0.8x],CACHELINE_ALIGN_REGION_SIZE(tmp_align) = [0x%0.8x] , add/align=[%d]\r\n"
|
|
,tmp_addr
|
|
,CACHELINE_ALIGN_REGION_SIZE(tmp_align)
|
|
,tmp_addr/CACHELINE_ALIGN_REGION_SIZE(tmp_align));
|
|
|
|
if(tmp_addr/CACHELINE_ALIGN_REGION_SIZE(tmp_align) == 1){
|
|
|
|
//update tmp_addr
|
|
tmp_addr -= CACHELINE_ALIGN_REGION_SIZE(tmp_align);
|
|
|
|
//reconfig mpu
|
|
//mpu_config_region_set_mem(region_num, base_address, REGION_SIZE, ACCESS_PERMISSION, cacheable, shared, execute_never)
|
|
mpu_config_region_set_mem(++cnt, 0x80000000+cache_line, (region_size)tmp_align, FULL_ACCESS, 1, 0, 0);//RO cacheable code onside flash
|
|
|
|
//update cache_line
|
|
cache_line += CACHELINE_ALIGN_REGION_SIZE(tmp_align);
|
|
|
|
RTI_LOG("[MPU] cnt=[%0.2d],tmp_align=[0x%0.2x],CACHELINE_ALIGN_REGION_SIZE(tmp_align) = [0x%0.8x],cache_line = [0x%0.8x]\r\n"
|
|
,cnt
|
|
,tmp_align
|
|
,CACHELINE_ALIGN_REGION_SIZE(tmp_align)
|
|
,cache_line);
|
|
}
|
|
#ifdef QUECTEL_OPEN_CPU
|
|
if(cnt>=14){
|
|
//mpu region cnt at[0-14],cnt 15 should be used by ASR,if cnt exceed 14 will happen assert!
|
|
RTI_LOG("MPU[%d] num error!", cnt);
|
|
break;
|
|
}
|
|
#endif
|
|
//update tmp_align
|
|
tmp_align -= 0x01;
|
|
}
|
|
}
|
|
|
|
if(cnt>=15){
|
|
//mpu region cnt at[0-14],cnt 15 should be used by ASR,if cnt exceed 14 will happen assert!
|
|
RTI_LOG("MPU[%d] num error!", cnt);
|
|
ASSERT(0);
|
|
}
|
|
|
|
//reset unused mpu region
|
|
mpu_num = cnt;
|
|
while(mpu_num<15){
|
|
mpu_config_region_set_mem(++mpu_num, 0x00000000, 0x00, NO_ACCESS, 1, 0, 0);
|
|
}
|
|
|
|
return (cnt);
|
|
}
|
|
|
|
void crane_ds_mpu(void) {
|
|
unsigned int cnt ;
|
|
//uart_printf("[MPU] function:%s,line:%d\r\n", __func__,__LINE__);
|
|
|
|
CPUartLogPrintf("Crane mpu configure");
|
|
|
|
//step1:entry action, disable I/D cache,set 4G FULL_ACCESS background on region BACKGROUND_REGION
|
|
mpu_config_entry_action();
|
|
|
|
//step2:config and enable project mpu , start from (BACKGROUND_REGION+1)
|
|
cnt = (BACKGROUND_REGION + 1);
|
|
#ifdef RUN_XIP_MODE
|
|
#if defined(CRANEM_8MRAM) || defined(_8MNORFLASH) || defined(LTEONLY_8M8M) || defined(LTEGSM_THIN)//8M_FLASH
|
|
#if defined(CRANELS_16M16M)
|
|
cnt = crane_ds_mpu_16M_psram_16M_flash_xip(cnt);
|
|
#elif defined(CRANEM_SS_16MRAM)
|
|
cnt = crane_ss_mpu_16M_psram_8M_flash_xip(cnt);
|
|
#else
|
|
cnt = crane_ds_mpu_8M_psram_8M_flash_xip(cnt);
|
|
#endif
|
|
#elif defined(CRANEL_4MRAM)
|
|
cnt = crane_ds_mpu_4M_psram_4M_flash_xip(cnt);
|
|
#else
|
|
cnt = crane_ds_mpu_16M_psram_16M_flash_xip(cnt);
|
|
#endif
|
|
#else
|
|
cnt = crane_ds_mpu_16M_psram_16M_flash_psram(cnt);
|
|
#endif
|
|
cnt = crane_ds_mpu_flash_noncache_line_auto_mpu(cnt);
|
|
|
|
//step3:exit action, enable I/D cache,enable 4G NO_ACCESS background on region BACKGROUND_REGION
|
|
mpu_config_exit_action();
|
|
|
|
region_cnt = cnt;
|
|
|
|
crane_ds_mpu_xip_enable(TRUE);
|
|
|
|
//step4:uart dump configed mpu region
|
|
mpu_config_uart_dump(15);
|
|
|
|
//uart_printf("[MPU] function:%s,line:%d\r\n", __func__,__LINE__);
|
|
|
|
return;
|
|
}
|
|
|
|
void crane_ds_mpu_xip_enable(bool enable)
|
|
{
|
|
if(enable)
|
|
{
|
|
mpu_config_region_set_mem(15, 0x80000000, 0x00, NO_ACCESS, 1, 0, TRUE);
|
|
}
|
|
else
|
|
{
|
|
mpu_config_region_set_mem(15, 0x80000000, REG_32MB, NO_ACCESS, 1, 0, TRUE);
|
|
}
|
|
|
|
if(!SysIsAssert())
|
|
{
|
|
xip_access_enable = enable;
|
|
}
|
|
}
|
|
void crane_ds_mpu_xip_cache_enable(void)
|
|
{
|
|
mpu_config_region_set_mem(15, 0x80000000, 0x00, FULL_ACCESS, 0, 0, 0);
|
|
}
|
|
|
|
void crane_ds_mpu_xip_cache_disable(void)
|
|
{
|
|
mpu_config_region_set_mem(15, 0x80000000, REG_32MB, FULL_ACCESS, 0, 0, 0);
|
|
|
|
}
|