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;
}