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 }