1
6
7
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
55
56
57
58
62
63
64
65
66
67
70
71
89
90
91
92
105
106
107
108
109
110
111
115
116
121
122
123
124
125
126
127
128
129
135
/* ... */
#include <stdint.h>
#include "soc/soc.h"
#include "soc/dport_reg.h"
#include "esp_attr.h"
#include "string.h"
#include "esp_private/spi_flash_os.h"
#include "esp_private/cache_utils.h"7 includes
#define MMU_SET_ADDR_ALIGNED_ERROR 1
#define MMU_SET_PAGE_SIZE_ERROR 3
#define MMU_SET_VADDR_OUT_RANGE 5
#define PROCACHE_MMU_ADDR_BASE 0x3FF10000
#define APPCACHE_MMU_ADDR_BASE 0x3FF12000
#define PRO_DRAM1_START_ADDR 0x3F800000
#define PRO_DRAM1_END_ADDR(psize) (PRO_DRAM1_START_ADDR + ((psize) << 17))
#define CACHE_MMU_ADDRESS_BASE(cpu_no) ((cpu_no) ? (APPCACHE_MMU_ADDR_BASE) : (PROCACHE_MMU_ADDR_BASE))
#define ADDRESS_CHECK(addr,psize) (((addr) & (0xFFFF >>((64/(psize))-1))) != 0)
#define CPU_NUMBER_CHECK(cpu_no) (((cpu_no)<0) || ((cpu_no)>1))
#define PID_CHECK(pid) (((pid)<0) || ((pid)>7))
#define FLASH_MMU_EDGE_CHECK(mmu_val,num) (((mmu_val) + (num)) > 256)
#define SRAM_MMU_EDGE_CHECK(mmu_val,num,psize) (((mmu_val) + (num)) > ((8*1024)/(psize)))13 defines
unsigned int cache_sram_mmu_set_rom(int cpu_no, int pid, unsigned int vaddr, unsigned int paddr, int psize, int num);
#ifndef BOOTLOADER_BUILD
/* ... */
unsigned int IRAM_ATTR cache_sram_mmu_set(int cpu_no, int pid, unsigned int vaddr, unsigned int paddr, int psize, int num)
{
const spi_flash_guard_funcs_t *guard=spi_flash_guard_get();
if (!guard) {
return cache_sram_mmu_set_rom(cpu_no, pid, vaddr, paddr, psize, num);
}{...}
unsigned int i,shift,mask_s;
unsigned int mmu_addr;
unsigned int mmu_table_val;
if( (ADDRESS_CHECK(vaddr,psize)) || (ADDRESS_CHECK(paddr,psize)) ){
return MMU_SET_ADDR_ALIGNED_ERROR;
}{...}
if(psize == 32) {
shift = 15;
mask_s = 0;
}{...} else if(psize == 16) {
shift = 14;
mask_s = 1;
}{...} else if(psize == 8) {
shift = 13;
mask_s = 2;
}{...} else if(psize == 4) {
shift = 12;
mask_s = 3;
}{...} else if(psize == 2) {
shift = 11;
mask_s = 4;
}{...} else {
return MMU_SET_PAGE_SIZE_ERROR;
}{...}
mmu_table_val = paddr >> shift;
if(pid == 0 || pid == 1){
if(vaddr >= PRO_DRAM1_START_ADDR && vaddr < PRO_DRAM1_END_ADDR(psize)){
mmu_addr = 1152 + ((vaddr & (0x3FFFFF >> mask_s)) >> shift);
}{...} else{
return MMU_SET_VADDR_OUT_RANGE;
}{...}
}{...} else {
if(vaddr >= PRO_DRAM1_START_ADDR && vaddr < PRO_DRAM1_END_ADDR(psize)){
mmu_addr = (1024 + (pid<<7)) + ((vaddr & (0x3FFFFF >> mask_s)) >> shift);
}{...} else{
return MMU_SET_VADDR_OUT_RANGE;
}{...}
}{...}
guard->start();
for ( i = 0; i < num; i++){
*(volatile unsigned int *)(CACHE_MMU_ADDRESS_BASE(cpu_no) + mmu_addr * 4) = mmu_table_val + i;
mmu_addr++;
}{...}
if(cpu_no == 0){
DPORT_REG_SET_FIELD(DPORT_PRO_CACHE_CTRL1_REG, DPORT_PRO_CMMU_SRAM_PAGE_MODE, mask_s);
}{...} else {
DPORT_REG_SET_FIELD(DPORT_APP_CACHE_CTRL1_REG, DPORT_APP_CMMU_SRAM_PAGE_MODE, mask_s);
}{...}
guard->end();
return 0;
}{ ... }
/* ... */
#else
unsigned int cache_sram_mmu_set(int cpu_no, int pid, unsigned int vaddr, unsigned int paddr, int psize, int num) {
return cache_sram_mmu_set_rom(cpu_no, pid, vaddr, paddr, psize, num);
}{...}
/* ... */
#endif