eculocate

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

mmu_hal.rs (1740B)


      1 pub const MMU_PAGE_8KB: u32 = 0x2000;
      2 pub const MMU_PAGE_16KB: u32 = 0x4000;
      3 pub const MMU_PAGE_32KB: u32 = 0x8000;
      4 pub const MMU_PAGE_64KB: u32 = 0x10000;
      5 
      6 fn mmu_hal_pages_to_bytes(mmu_id: u32, page_num: u32) -> u32 {
      7     let mmu_page_size = crate::mmu_ll::mmu_ll_get_page_size(mmu_id);
      8     let shift_code = match mmu_page_size {
      9         MMU_PAGE_64KB => 16,
     10         MMU_PAGE_32KB => 15,
     11         MMU_PAGE_16KB => 14,
     12         _ => panic!("WRONG MMU_PAGE_SIZE! 0x{:X?}", mmu_page_size),
     13     };
     14 
     15     page_num << shift_code
     16 }
     17 
     18 pub fn esp_get_current_running_partition(partitions: &[(u32, u32)]) -> Option<usize> {
     19     // NOTE:
     20     // mmu_id is always 0 because s_vaddr_to_paddr is using 0 for all targets
     21     // except esp32p4 (per SOC_MMU_PER_EXT_MEM_TARGET define)
     22     //
     23     // https://github.com/espressif/esp-idf/blob/b5ac4fbdf9e9fb320bb0a98ee4fbaa18f8566f37/components/esp_mm/esp_mmu_map.c#L754
     24     let mmu_id = 0;
     25 
     26     let ptr = esp_get_current_running_partition as *const () as *const u32;
     27     let entry_id = crate::mmu_ll::mmu_ll_get_entry_id(mmu_id, ptr as u32);
     28 
     29     if !crate::mmu_ll::mmu_ll_check_entry_valid(mmu_id, entry_id) {
     30         error!("mmu_ll_check_entry_valid failed!");
     31 
     32         return None;
     33     }
     34 
     35     // page_num is always 1
     36     // https://github.com/espressif/esp-idf/blob/master/components/hal/mmu_hal.c#L129
     37     let page_size_in_bytes = mmu_hal_pages_to_bytes(mmu_id, 1);
     38     let offset = (ptr as u32) % page_size_in_bytes;
     39 
     40     let paddr_base = crate::mmu_ll::mmu_ll_entry_id_to_paddr_base(mmu_id, entry_id);
     41     let paddr = paddr_base | offset;
     42 
     43     for (i, part) in partitions.iter().enumerate() {
     44         if paddr >= part.0 && paddr < part.0 + part.1 {
     45             return Some(i);
     46         }
     47     }
     48 
     49     None
     50 }