If you already have CircuitPython on your FeatherS2, you just need to boot the board into UF2 bootloader mode, and then copy the latest FeatherS2 CircuitPython UF2 file onto the drive via which ever file manager you use on your computer.
Download the latest release version of the FeatherS2 UF2 bootloader from here.
You are after the file named: tinyuf2-unexpectedmaker_feathers2-xxx.zip that has the parts in it, not the uf2 updater.
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 press & release [RESET], then let go of the [BOOT] button. If you are on Windows, you'll need to determine which COM port your FeatherS2 is connected to.
Now you just need to run the following command:
esptool.py --chip esp32s2 -p /dev/cu.usbmodem01 --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
esptool.py --chip esp32s2 -p /dev/ttyACM0 --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
esptool --chip esp32s2 -p COMxxx --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!
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.