fOS 2.2.0 is a touchscreen firmware for ESP32-S3 CrowPanel devices. This release introduces a production OTA + Recovery workflow with dedicated partitions, SD-based update staging, boot fallback logic, and display settings persistence.
- New OTA architecture with dedicated partitions:
app0for the main fOS firmwareapp1for a minimal recovery firmware- no SPIFFS, SD card based update staging
- OTA workflow added to the update screen:
- OTA file list is loaded from GitHub in background (UI stays responsive)
- selected OTA image is downloaded to
/system/update/update.bin - latest recovery image is downloaded to
/system/update/recovery.bin - recovery image is flashed to
app1 - next boot partition is switched to
app1and device restarts
- Recovery workflow added:
- recovery verifies
/system/update/update.bin - flashes
update.bintoapp0 - switches boot partition back to
app0 - restarts automatically
- recovery verifies
- Boot safety logic added:
pending_update+boot_attempt_countertracking- automatic fallback to recovery after repeated failed boots
- Display settings added:
- brightness save in settings
- minimum brightness is limited to
5% - persistent value stored in
/system/display/brightness.txt - value is loaded on startup
- Existing 2.1 runtime features remain included:
- SD app runtime in
AppContent clockandweatherapp types- upgraded radio, clock, and weather runtime UI
- SD app runtime in
- ESP32-S3 CrowPanel (default project config is
CrowPanel_70) - microSD card
- USB cable for flashing
- Arduino IDE 2.x
- ESP32 board package:
esp32 by Espressif Systems - Arduino libraries:
lvglLovyanGFXESP32-audioI2S(providesAudio.h)
- Active panel type is set in
LGFX_CrowPanel.h. - Supported panel defines in this project:
CrowPanel_70CrowPanel_50CrowPanel_43
- Partition layout for OTA/Recovery is provided in
partitions.csv:app0:0x370000(main system)app1:0x080000(recovery)
- Arduino IDE board option
PSRAMshould be set toOPI PSRAM. - SD chip-select is set to
SD_CS = 10infOS2.0.ino.
- Install Arduino IDE 2.x.
- Install
esp32 by Espressif Systemsin Board Manager. - Install required libraries:
lvgl,LovyanGFX,ESP32-audioI2S. - Open
fOS2.0.inoin Arduino IDE. - Select your ESP32-S3 target board and serial port.
- Set board options:
Partition Scheme: use the custom project partition file (app0/app1 layout)PSRAM: OPI PSRAM
- Verify panel define in
LGFX_CrowPanel.h. - Build and upload firmware.
- Prepare SD card as described below and insert it.
- Reboot the device.
- Filesystem:
FAT32 - Partition scheme: MBR (recommended)
Use a clean FAT32 card for first boot. Avoid exFAT and NTFS.
The firmware creates missing system folders automatically on startup.
/apps- SD apps (max 6 loaded)
/text- text files for file manager and text editor
/music/files- local audio files (
.mp3,.wav,.ogg,.aac,.m4a)
- local audio files (
/music/webradio/webradio.txt- one station per line in this format:
Sender Name|https://stream-url.example
Example:
SomaFM Groove Salad|http://ice1.somafm.com/groovesalad-128-mp3
ByteFM|https://stream.byte.fm/stream/bytefm_www
Optional system-managed files:
/system/wifi/wlans.txt- Wi-Fi profiles as
SSID|PASSWORD(one per line)
- Wi-Fi profiles as
/system/timezone/timezone.txt- saved timezone rule
/system/display/brightness.txt- saved display brightness in percent (
5..100)
- saved display brightness in percent (
/system/update/update.bin- staged OTA image for
app0
- staged OTA image for
/system/update/recovery.bin- staged recovery image for
app1
- staged recovery image for
Each app is a folder under /apps/<app_name>/ with at least app.cfg.
name=Display Name
icon=Optional short tile text/symbol
type=ui|text|button|calculator|radio|clock|weather
scrollable=true|false
Additional keys by type:
type=uilayout=layout.ui
type=textcontent=content.txt
type=buttonbutton_text=...button_message=...
type=clock- no extra keys required
type=weather- no extra keys required
One element per line, semicolon-separated fields.
type=label;x=40;y=40;w=720;h=40;text=Hello
type=button;x=40;y=100;w=240;h=70;text=Start;bg=0x2095F6;fg=0xFFFFFF
type=textarea;x=40;y=190;w=420;h=140;text=Line1\nLine2
type=switch;x=500;y=120;value=true
type=checkbox;x=500;y=180;text=Option;value=false
type=panel;x=20;y=20;w=760;h=430;bg=0xF2F2F2
Supported type= values in layout lines:
labelbuttontextareaswitchcheckboxpanel
- Home
- Settings (Wi-Fi, timezone, system info)
- Storage Manager (folder navigation + delete file)
- Text Editor (open/create/overwrite-save)
- App Launcher (
AppL1toAppL6) - App Content runtime area
- Runtime apps:
- Calculator
- Radio
- Clock
- Weather
See example app/ for ready-to-copy examples:
hello_fosbutton_demoebook_demoui_democalculator_demoradio_democlock_demoweather_demotext(AppContent text editor app)
Webradio example list:
example app/music/webradio/webradio.txt
- SD not detected:
- Reformat SD to FAT32
- Check card seating and wiring
- Verify
SD_CSinfOS2.0.ino
- SD apps not visible:
- Ensure app folders are under
/apps - Ensure each app has valid
app.cfg - Max 6 apps are shown
- Ensure app folders are under
- No local files in radio app:
- Place audio files in
/music/files
- Place audio files in
- No web stations in radio app:
- Ensure
/music/webradio/webradio.txtexists - Validate
Sender|URLformat
- Ensure
- No weather data in weather app:
- Ensure device has Wi-Fi connection
- Check internet access to
ip-api.comandapi.open-meteo.com - Re-open weather app after Wi-Fi reconnect
- OTA update list appears late:
- list loading is asynchronous in 2.2.0 and no longer blocks the UI
- check serial output for
[OTA]logs if files do not appear