Whilst working on a port of my Thunderbolt Monitor to the ESP32 I have had to make a few simple hardware changes to the current PCB revision (v1.1). This involved remapping some IO to different pins. I blindly selected two unused pins, cut the required traces and soldered some jumper wires to make the new connections. I later found that when I placed the shield on the ESP32 it wouldn’t be detected by the flasher. If I took the shield off I could get it to appear and flash fine. This is a nightmare for testing and it didn’t take me long to look through the datasheet of the ESP32 to find out what the issue could be.
It turns out that IO12 is used during bootup. If driven High, flash voltage (VDD_SDIO) is 1.8V not default 3.3V. It has an internal pull-down, so unconnected = Low = 3.3V. It prevents flashing and/or booting if 3.3V flash is used and this pin is pulled high, causing the flash to brownout.
There are two options here. The first is to not use that pin if you can’t control the state of it during boot. The second (the option I chose) is to blow an efuse which permanently locks the state of the pin. I knew that this board would never need a 1.8V flash voltage so entered the below command and my boot issue went away.
WARNING: This is permanent. It can’t be undone.