eculocate

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README

esp32.rs (3173B)


      1 const SOC_MMU_VADDR_MASK: u32 = 0x3FFFFF;
      2 const SOC_MMU_INVALID: u32 = 1 << 8;
      3 const MMU_LL_PSRAM_ENTRY_START_ID: u32 = 1152;
      4 const SOC_IRAM0_CACHE_ADDRESS_LOW: u32 = 0x400D0000;
      5 const SOC_IRAM0_CACHE_ADDRESS_HIGH: u32 = 0x40400000;
      6 const SOC_IRAM1_CACHE_ADDRESS_LOW: u32 = 0x40400000;
      7 const SOC_IRAM1_CACHE_ADDRESS_HIGH: u32 = 0x40800000;
      8 const SOC_IROM0_CACHE_ADDRESS_LOW: u32 = 0x40800000;
      9 const SOC_IROM0_CACHE_ADDRESS_HIGH: u32 = 0x40C00000;
     10 const SOC_DRAM1_CACHE_ADDRESS_LOW: u32 = 0x3F800000;
     11 const SOC_DRAM1_CACHE_ADDRESS_HIGH: u32 = 0x3FC00000;
     12 const SOC_DROM0_CACHE_ADDRESS_LOW: u32 = 0x3F400000;
     13 const SOC_DROM0_CACHE_ADDRESS_HIGH: u32 = 0x3F800000;
     14 const DPORT_PRO_FLASH_MMU_TABLE: u32 = 0x3FF10000;
     15 
     16 pub fn mmu_ll_get_page_size(_mmu_id: u32) -> u32 {
     17     crate::mmu_hal::MMU_PAGE_64KB
     18 }
     19 
     20 pub fn mmu_ll_get_entry_id(_mmu_id: u32, vaddr: u32) -> u32 {
     21     let mut offset = 0;
     22     let mut shift_code = 0;
     23     let mut vaddr_mask = 0;
     24 
     25     if soc_address_in_bus!(SOC_DROM0_CACHE, vaddr) {
     26         offset = 0;
     27         shift_code = 16;
     28         vaddr_mask = SOC_MMU_VADDR_MASK;
     29     } else if soc_address_in_bus!(SOC_IRAM0_CACHE, vaddr) {
     30         offset = 64;
     31         shift_code = 16;
     32         vaddr_mask = SOC_MMU_VADDR_MASK;
     33     } else if soc_address_in_bus!(SOC_IRAM1_CACHE, vaddr) {
     34         offset = 128;
     35         shift_code = 16;
     36         vaddr_mask = SOC_MMU_VADDR_MASK;
     37     } else if soc_address_in_bus!(SOC_IROM0_CACHE, vaddr) {
     38         offset = 192;
     39         shift_code = 16;
     40         vaddr_mask = SOC_MMU_VADDR_MASK;
     41     } else if soc_address_in_bus!(SOC_DRAM1_CACHE, vaddr) {
     42         offset = MMU_LL_PSRAM_ENTRY_START_ID;
     43         shift_code = 15;
     44         vaddr_mask = SOC_MMU_VADDR_MASK >> 1;
     45     } else {
     46         error!("mmu_ll_get_entry_id failed!");
     47     }
     48 
     49     offset + ((vaddr & vaddr_mask) >> shift_code)
     50 }
     51 
     52 pub fn mmu_ll_entry_id_to_paddr_base(_mmu_id: u32, entry_id: u32) -> u32 {
     53     let level = unsafe { dport_interrupt_disable() };
     54     let mmu_val = unsafe { *(DPORT_PRO_FLASH_MMU_TABLE as *const u32).offset(entry_id as isize) };
     55     unsafe { dport_interrupt_restore(level) };
     56 
     57     if entry_id >= MMU_LL_PSRAM_ENTRY_START_ID {
     58         mmu_val << 15
     59     } else {
     60         mmu_val << 16
     61     }
     62 }
     63 
     64 pub fn mmu_ll_check_entry_valid(_mmu_id: u32, entry_id: u32) -> bool {
     65     let level = unsafe { dport_interrupt_disable() };
     66     let mmu_val = unsafe { *(DPORT_PRO_FLASH_MMU_TABLE as *const u32).offset(entry_id as isize) };
     67     unsafe { dport_interrupt_restore(level) };
     68 
     69     (mmu_val & SOC_MMU_INVALID) == 0
     70 }
     71 
     72 // NOTE:Idk if required!
     73 // Only used when using second core etc.
     74 
     75 const SOC_DPORT_WORKAROUND_DIS_INTERRUPT_LVL: u32 = 5;
     76 #[inline(always)]
     77 unsafe fn dport_interrupt_disable() -> u32 {
     78     let level: u32;
     79 
     80     unsafe {
     81         core::arch::asm!(
     82             "rsil {0}, {1}",
     83             out(reg) level,
     84             const SOC_DPORT_WORKAROUND_DIS_INTERRUPT_LVL,
     85             options(nomem, nostack)
     86         );
     87     }
     88 
     89     level
     90 }
     91 
     92 #[inline(always)]
     93 unsafe fn dport_interrupt_restore(level: u32) {
     94     unsafe {
     95         core::arch::asm!(
     96             "wsr.ps {0}; rsync",
     97             in(reg) level,
     98             options(nomem, nostack)
     99         );
    100     }
    101 }