Just a quick post with a C version of the decompiled ESP8266 rom function Cache_Read_Enable. This function is responsible for memory mapping the SPI flash. I’ve previously discussed it, but a couple of people have wanted the code so it seemed worth posting here. This compiles to quite a few bytes which must stay in iram so, if you want to tamper with the parameters (like rBoot big flash support does), it’s best to write a wrapper to the original rom function rather than use this code to replace it.
void Cache_Read_Enable(uint8 odd_even, uint8 mb_count, uint8 no_idea) { uint32 base1 = 0x3FEFFE00; volatile uint32 *r20c = (uint32*)(base1 + 0x20c); volatile uint32 *r224 = (uint32*)(base1 + 0x224); uint32 base2 = 0x60000200; volatile uint32 *r008 = (uint32*)(base2 + 8); while (*r20c & 0x100) { *r20c &= 0xeff; } *r008 &= 0xFFFDFFFF; *r20c &= 0x7e; *r20c |= 0x1; while ((*r20c & 0x2) == 0) { } *r20c &= 0x7e; *r008 |= 0x20000; if (odd_even == 0) { *r20c &= 0xFCFFFFFF; // clear bits 24 & 25 } else if (odd_even == 1) { *r20c &= 0xFEFFFFFF; // clear bit 24 *r20c |= 0x2000000; // set bit 25 } else { *r20c &= 0xFDFFFFFF; // clear bit 25 *r20c |= 0x1000000; // set bit 24 } *r20c &= 0xFBF8FFFF; // clear bits 16, 17, 18, 26 *r20c |= ((no_idea << 0x1a) | (mb_count << 0x10)); // set bits 26 & 18/17/16 // no_idea should be 0-1 (1 bit), mb_count 0-7 (3 bits) if (no_idea == 0) { *r224 |= 0x08; // set bit 3 } else { *r224 |= 0x18; // set bits 3 & 4 } while ((*r20c & 0x100) == 0) { *r20c |= 0x100; } return; }