Linux nativně na ESP32-S3 – bez emulace a rovnou s 9,7″ e-paperem

Linux na ESP32 není úplně nová myšlenka. Už dříve existovaly projekty, které jej na tomto mikrokontroléru spouštěly pomocí emulace jiného procesoru. Tentokrát je ale situace podstatně zajímavější.

Linux 6.11 běží přímo na Xtensa jádru ESP32-S3, bez emulace. A aby samotný terminál na sériové lince nebyl málo, shell se po přihlášení zároveň zrcadlí na 9,7″ e-paperový displej ED097TC2 s rozlišením 1200 × 825 pixelů.

Původní ukázku zveřejnil na X uživatel Svermigo:

Co je na videích?

První video ukazuje přímo e-paperový displej, na kterém se objevuje výstup shellu: uname -a s kernelem 6.11.0-forkbank, vyhledání Wi-Fi sítí příkazem wifi, připojení k síti a nakonec úspěšný:

ping svermigo.cz

Druhé video ukazuje top s linuxovými procesy, kworkery, shelly a síťovou komunikací. To vše na zařízení, kde se dostupná paměť počítá v jednotkách megabajtů.

Od resetu k přihlašovacímu promptu se systém dostane přibližně za 14 sekund.

Skutečný Linux na Xtensa

Nejde o linuxové API postavené nad FreeRTOS ani o emulovaný RISC-V nebo ARM procesor. Použitý projekt spouští Linux kernel 6.11 zkompilovaný přímo pro Xtensa ESP32-S3.

Verze s e-paperovým terminálem a webovým instalátorem je ve forku svermigo/Linux-on-esp32-S3, což je fork projektu paulneja/Linux-on-esp32-S3.

Nejde přitom jen o kernel a jednoduchý BusyBox. V systému jsou například Bash 5.2, Dash, Nano, GNU Make 4.4, MicroPython 1.26, Lua, cron, nc, socat, HTTP server, Telnet a volitelně SSH přes Dropbear. Funguje Wi-Fi, DHCP, NTP i běžná komunikace po internetu.

Vidět:

root@esp32:~#

na mikrokontroléru ESP32-S3 působí pořád trochu nepatřičně.

Linux bez MMU a experimentální fork()

ESP32-S3 nemá klasickou Memory Management Unit, kterou běžný Linux používá například pro virtuální paměť a izolaci procesů. Kernel proto běží v režimu NOMMU.

NOMMU Linux není sám o sobě novinka, problémem jsou ale některé běžné unixové mechanismy, především fork().

Aktuální projekt proto používá experimentální řešení založené na software memory banks. Není to náhrada skutečné MMU – chybí hardwarová izolace paměti i klasické copy-on-write – ale umožňuje oddělit soukromá data procesů natolik, aby mohl fungovat software, který byl na jednodušších NOMMU systémech problematický.

Soukromá paměť procesu se při fork() rovnou kopíruje a na jeden fork je limit 512 KiB. Backend navíc vyžaduje jednojádrový (UP) Linux a fork z vícevláknového procesu odmítá.

Díky tomu funguje například Bash se subshelly a pipes, GNU Make nebo více procesů v MicroPythonu.

Na mikrokontroléru s 8 MB PSRAM je to jedna z nejzajímavějších částí celého projektu.

Dvě jádra, Linux a FreeRTOS vedle sebe

ESP32-S3 má dvě procesorová jádra a projekt je využívá poměrně neobvyklým způsobem:

  • Core 1: Linux
  • Core 0: ESP-IDF / FreeRTOS (u varianty s displejem také vykreslování na e-paper)

Jedním z hlavních důvodů je Wi-Fi. Část Wi-Fi stacku Espressifu je dostupná jako binární komponenta pro ESP-IDF a nelze ji jednoduše použít jako běžný linuxový ovladač.

FreeRTOS proto obstarává nízkoúrovňovou komunikaci s Wi-Fi hardwarem a Linux s ním komunikuje přes sdílenou paměť. Z pohledu Linuxu pak síť funguje přes vlastní síťové rozhraní espsta0. Deska umí být jen klientem, režim přístupového bodu (SoftAP) byl z projektu odstraněn.

Na jednom ESP32-S3 tak současně běží FreeRTOS i Linux.

16 MB Flash, 8 MB RAM

Referenční konfigurace používá ESP32-S3 N16R8:

  • 16 MB Flash
  • 8 MB Octal/OPI PSRAM

Pro samotný Linux není potřeba SD karta ani další RAM navíc. Tak malé množství paměti ale vyžaduje několik triků.

Root filesystem je uložen jako read-only CramFS a velká část systému využívá XIP – Execute In Place, takže programy mohou být spouštěny přímo z Flash a není nutné všechno kopírovat do RAM.

Zapisovatelná data mají vlastní oblasti /etc a /home se souborovým systémem JFFS2, namontované přes read-only kořen.

9,7″ e-paper místo monitoru

Displejová varianta používá řídicí desku SVERIO PaperBoard EPDiy s ESP32-S3 a panel ED097TC2.

  • úhlopříčka 9,7″
  • rozlišení 1200 × 825 px
  • 16 odstínů šedi (terminál kreslí černobíle rychlým průběhem DU)
  • paralelní rozhraní a podpora EPDiy

SVERIO PaperBoard – řídicí deska EPDiy

SVERIO PaperBoard 9,7″ ED097TC2 – kompletní sada

Jak se shell dostane na e-paper

Linux na displej nekreslí přes framebuffer. Ten by v 8 MB PSRAM zabral příliš mnoho paměti. Místo toho kernel poskytuje zařízení /dev/epd, které posílá znaky terminálu přes sdílenou paměť na jádro 0. Tam je firmware s upravenou knihovnou EPDiy převede na obraz.

Po přihlášení roota na sériové konzoli se automaticky spustí epd-shell. Ten přeposílá výstup shellu zároveň do sériového terminálu i na displej. Bootovací hlášky se na e-paper nevypisují, zrcadlení začíná až přihlášením.

  • textový terminál 75 × 34 znaků
  • posun kurzoru, scrollování, inverzní text a základní escape sekvence (není to plné VT100)
  • překreslují se jen změněné řádky
  • zrcadlení lze vypnout vytvořením souboru /etc/paperboard-no-mirror

V reakcích se objevila i otázka, zda by takový displej mohl fungovat jako 60Hz monitor. Samotné e-paperové panely se skenují podobnou frekvencí jako LCD, typicky 50 až 120 Hz. Rozdíl je v tom, že jedna změna obrazu trvá několik snímků, než se částice v pixelu přesunou. Že to jde rychle i s e-paperem, ukazuje Modos Paper Monitor s obnovovací frekvencí až 75 Hz. Stojí za tím ale FPGA Xilinx Spartan-6 LX16 s řadičem Caster, který každý pixel řídí jako samostatnou oblast a může změnu přerušit i uprostřed překreslování.

Na ESP32-S3 připravuje EPDiy obsah řádků procesorem a z fronty je průběžně posílá do LCD periferie. Jedna změna přitom potřebuje několik průchodů celou plochou. V této konstrukci se o jádro 0 navíc dělí vykreslování s Wi-Fi. Proto je tu displej terminálem, který překresluje jen změněné řádky, a ne monitorem.

Flashování přímo z prohlížeče

Vyzkoušet systém nemusí znamenat instalaci toolchainu, kompilaci kernelu ani ruční práci s esptool. K dispozici je webový flasher využívající Web Serial. Stačí Google Chrome na počítači:

ESP32 Linux Web Installer

Obsahuje dvě hlavní varianty:

  • Paperboard V3 – pro SVERIO PaperBoard v1 s panelem ED097TC2, včetně výstupu terminálu na e-paper.
  • Headless V1 – bez displeje, pro ostatní desky s ESP32-S3 N16R8.

Flashuje se celý obraz, takže se přepíše veškerý obsah Flash včetně nastavení a uživatelských souborů.

Po flashnutí lze systém ovládat přes sériový terminál na 115200 baud (8N1, bez řízení toku). Výchozí přihlášení je root / changeme123. Heslo je veřejné, proto je dobré ho hned změnit příkazem passwd – Telnet je totiž ve výchozím stavu zapnutý a hesla posílá v otevřené podobě. Wi-Fi se nastaví příkazem wifi, který vyhledá sítě a zeptá se na heslo.

Vyzkoušet jde i simulátor

Kdo nemá vhodný hardware, může si Linuxový terminál vyzkoušet také v browserovém simulátoru ESP32:

ESP32 simulator – Linux terminal

Je to jednoduchý způsob, jak se na prostředí podívat bez flashování fyzické desky.

Nativní Linux vs. emulace RISC-V

Existuje ještě druhý způsob, jak dostat Linux na ESP32: emulovat jiný procesor.

Projekt nodestark/esp32-running-linux například emuluje RISC-V CPU, na kterém teprve běží Linux. Existuje i jeho browserová verze.

Je to technicky zajímavé, ale od řešení popsaného v tomto článku zásadně odlišné. Při emulaci musí ESP32 překládat nebo interpretovat instrukce virtuálního procesoru, což výrazně snižuje výkon.

Zde Linux běží nativně: kernel je sestaven přímo pro Xtensa a jeho instrukce vykonává přímo ESP32-S3.

Kde se Linux pro ESP32 vzal?

Současný projekt nevznikl od nuly. Důležitou část práce kolem podpory Linuxu na architektuře Xtensa odvedl Max Filippov (jcmvbkbc).

Za pozornost stojí jeho projekt:

jcmvbkbc/esp32-linux-build

Obsahuje build infrastrukturu pro Linux na ESP32 a ESP32-S3. Od Maxe Filippova pochází i samotný kernel (větev xtensa-6.11-esp32 v repozitáři jcmvbkbc/linux-xtensa), upravený Buildroot a firmware esp-hosted s IPC mechanismem. Ten běží vedle Linuxu na druhém jádru a zprostředkuje mu Wi-Fi přes sdílenou paměť.

Projekt paulneja na to navazuje experimentálním fork(), výrazně větším userspace, hardwarovou akcelerací RSA a kompletní build pipeline. Fork svermigo pak přidává e-paperový terminál a webový instalátor.

Je tedy lepší jej chápat jako další krok v několikaletém vývoji Linuxu pro Xtensa než jako úplně nový jednorázový hack.

K čemu je Linux na ESP32?

ESP32-S3 samozřejmě není konkurence pro Raspberry Pi nebo jiné linuxové SBC. Pokud projekt skutečně potřebuje Linux, běžný jednodeskový počítač nabídne více RAM, MMU, rychlejší úložiště i výrazně vyšší výkon.

Tady je zajímavá hlavně technická hranice toho, co lze z mikrokontroléru dostat.

Na zařízení se dvěma Xtensa jádry, 8 MB RAM a 16 MB Flash běží Linux 6.11, Bash, více procesů, MicroPython, GNU Make, Wi-Fi a běžné síťové nástroje. Za přibližně 14 sekund nabootuje do login promptu a může svůj shell vykreslovat na téměř desetipalcový e-paper.

Není to praktická náhrada linuxového počítače. Je to ale velmi pěkná ukázka toho, jak nečekaně daleko se dnes dá ESP32-S3 dotlačit.

Autorem článku je Svermigo

Sdílejte článek:
Ukaž světu,
že jsi Maker!
Koupit tričko
Kafe pro Chiptrona
Dodej energii dalšímu článku

Související články

Přišel mi engineering sample vývojového kitu ESP32-C3-DevKitM-1.

Různé vývojové desky s čipy ESP32 – srovnání variant

ESP32, S2, S3, C3, C6, H2, C5, P4 i chystaný S31 – který čip vybrat pro váš projekt? Srovnávací tabulka periferií, rozhodovací strom podle use-case, přehled softwarových platforem a tipy, kde koupit vývojové desky v Česku.

V Octopus LAB (sledujte nás na FB) jsme se poslední dobou hodně soustředili na ESP32 ve spojení s Micropythonem.

Nenasytný Micropython v ESP32 V OctopusLabu ani poslední tři měsíce nezahálíme.

Konečně jsem se dostal k sepsání krátkého návodu, jak rozchodit ESP32 (mnohem, mnohem výkonnější ESP8266).

OctopusLAB (komunitní projekt české společnosti Octopus engine s.

Trendy