Installing the UF2 Bootloader

Normally you would need to compile the UF2 bootloader from source, but I have pre-compiled it to make it easier and have put the 4x .bin files you need into a zip that you can download here.

To install the ESP32-S2 UF2 bootloader on your FeatherS2 you will need to have the latest esptool installed (3.0 as of this time). You can grab esptool tool from the github repo

Put the .bin files into a folder, and then open a terminal session (or command prompt in Windows) and navigate to the folder.

To flash your FeatherS2 you need to plug it into your computer and put it into download mode. To do that you press and hold the [BOOT] button and then click [RESET] and then let go of the [BOOT] button. If you are on Windows, you'll need to determine which COM port it's connected to. On macOS your FeatherS2 will be /dev/cu.usbmodem01 and on Linux it should be /dev/ttyACM0.

Now you just need to run the following command, swapping out the correct serial device for your OS after the -p.

esptool.py --chip esp32s2 -p /dev/cu.usbmodem01 -b 921600 --before=default_reset --after=no_reset write_flash --flash_mode dio --flash_size detect --flash_freq 80m 0x1000 bootloader.bin 0x8000 partition-table.bin 0xe000 ota_data_initial.bin 0x410000 tinyuf2.bin

Your should then see the following results (or similar)

esptool.py v3.0
Serial port /dev/cu.usbmodem01
Connecting....
Chip is ESP32-S2
Features: WiFi, ADC and temperature sensor calibration in BLK2 of efuse
Crystal is 40MHz
MAC: 7c:df:a1:00:8c:18
Uploading stub...
Running stub...
Stub running...
Changing baud rate to 921600
Changed.
Configuring flash size...
Auto-detected Flash size: 16MB
Flash params set to 0x024f
Compressed 20752 bytes to 12545...
Wrote 20752 bytes (12545 compressed) at 0x00001000 in 0.1 seconds (effective 1364.7 kbit/s)...
Hash of data verified.
Compressed 3072 bytes to 138...
Wrote 3072 bytes (138 compressed) at 0x00008000 in 0.0 seconds (effective 6676.5 kbit/s)...
Hash of data verified.
Compressed 8192 bytes to 31...
Wrote 8192 bytes (31 compressed) at 0x0000e000 in 0.0 seconds (effective 23231.7 kbit/s)...
Hash of data verified.
Compressed 133472 bytes to 81338...
Wrote 133472 bytes (81338 compressed) at 0x002d0000 in 1.3 seconds (effective 852.7 kbit/s)...
Hash of data verified.

Leaving...
Staying in bootloader.
Now all you need to do is reset your board and you will see the RGB LED flash green (maybe red first very quickly) and then the USB will be mounted into UF2 mode! That's it!

What do I do now?

Now you can install any FeatherS2 version of the CiruitPython firmware you like, simply by downloading the .uf2 version of the firmware and copying it onto the mounted UF2 drive. When it's copying, you'll see the RGB LED start flashing orange, until it's done!

You can always grab the latest "release" versions of CircuitPython from here.