@@ -100,6 +100,21 @@ static void IRAM_ATTR spi_flash_mmap_init()
100100 DPORT_STALL_OTHER_CPU_END ();
101101}
102102
103+ static void IRAM_ATTR get_mmu_region (spi_flash_mmap_memory_t memory , int * out_begin , int * out_size ,uint32_t * region_addr )
104+ {
105+ if (memory == SPI_FLASH_MMAP_DATA ) {
106+ // Vaddr0
107+ * out_begin = 0 ;
108+ * out_size = 64 ;
109+ * region_addr = VADDR0_START_ADDR ;
110+ } else {
111+ // only part of VAddr1 is usable, so adjust for that
112+ * out_begin = PRO_IRAM0_FIRST_USABLE_PAGE ;
113+ * out_size = 3 * 64 - * out_begin ;
114+ * region_addr = VADDR1_FIRST_USABLE_ADDR ;
115+ }
116+ }
117+
103118esp_err_t IRAM_ATTR spi_flash_mmap (size_t src_addr , size_t size , spi_flash_mmap_memory_t memory ,
104119 const void * * out_ptr , spi_flash_mmap_handle_t * out_handle )
105120{
@@ -157,17 +172,7 @@ esp_err_t IRAM_ATTR spi_flash_mmap_pages(int *pages, size_t page_count, spi_flas
157172 int region_begin ; // first page to check
158173 int region_size ; // number of pages to check
159174 uint32_t region_addr ; // base address of memory region
160- if (memory == SPI_FLASH_MMAP_DATA ) {
161- // Vaddr0
162- region_begin = 0 ;
163- region_size = 64 ;
164- region_addr = VADDR0_START_ADDR ;
165- } else {
166- // only part of VAddr1 is usable, so adjust for that
167- region_begin = PRO_IRAM0_FIRST_USABLE_PAGE ;
168- region_size = 3 * 64 - region_begin ;
169- region_addr = VADDR1_FIRST_USABLE_ADDR ;
170- }
175+ get_mmu_region (memory ,& region_begin ,& region_size ,& region_addr );
171176 if (region_size < page_count ) {
172177 return ESP_ERR_NO_MEM ;
173178 }
@@ -176,7 +181,7 @@ esp_err_t IRAM_ATTR spi_flash_mmap_pages(int *pages, size_t page_count, spi_flas
176181 // entries are treated as wildcards.
177182 int start ;
178183 int end = region_begin + region_size - page_count ;
179- for (start = region_begin ; start < end ; ++ start ) {
184+ for (start = region_begin ; start <= end ; ++ start ) {
180185 int pageno = 0 ;
181186 int pos ;
182187 DPORT_STALL_OTHER_CPU_START ();
@@ -194,7 +199,7 @@ esp_err_t IRAM_ATTR spi_flash_mmap_pages(int *pages, size_t page_count, spi_flas
194199 }
195200 }
196201 // checked all the region(s) and haven't found anything?
197- if (start == end ) {
202+ if (start > end ) {
198203 * out_handle = 0 ;
199204 * out_ptr = NULL ;
200205 ret = ESP_ERR_NO_MEM ;
@@ -292,6 +297,28 @@ void spi_flash_mmap_dump()
292297 }
293298}
294299
300+ uint32_t spi_flash_mmap_get_free_pages (spi_flash_mmap_memory_t memory )
301+ {
302+ spi_flash_mmap_init ();
303+ int count = 0 ;
304+ int region_begin ; // first page to check
305+ int region_size ; // number of pages to check
306+ uint32_t region_addr ; // base address of memory region
307+ get_mmu_region (memory ,& region_begin ,& region_size ,& region_addr );
308+ DPORT_STALL_OTHER_CPU_START ();
309+ for (int i = region_begin ; i < region_begin + region_size ; ++ i ) {
310+ if (s_mmap_page_refcnt [i ] == 0 && DPORT_PRO_FLASH_MMU_TABLE [i ] == INVALID_ENTRY_VAL ) {
311+ count ++ ;
312+ }
313+ }
314+ DPORT_STALL_OTHER_CPU_END ();
315+ if (count >= 1 ) {
316+ return count - 1 ; //don't sure mmap src_addr,if src_addr not align 64K bytes,max need one more pages
317+ } else {
318+ return 0 ;
319+ }
320+ }
321+
295322/* 256-bit (up to 16MB of 64KB pages) bitset of all flash pages
296323 that have been written to since last cache flush.
297324
0 commit comments