Pred niekoľkými mesiacmi som písal o svojej sklamanej skúsenosti pri pokuse naprogramovať Nordic nRF52840 dongle cez PlatformIO. Záver bol jasný: opustiť PlatformIO a použiť natívne toolchainy. A predsa tu som znova, bláznivo si mysliac „možno tentoraz to bude inak” pri novšom čipe ESP32-C6. Spoiler: nebolo.

Nastavenie #

Mal som jednoduchý cieľ: zobraziť text na doske ESP32-C6 s displejom ST7789 pomocou LVGL. To by malo byť v roku 2025 priamočiare, však? ESP32-C6 nie je nejaká obscúrna vývojová doska – je to najnovší mainline čip Espressif so zabudovanou podporou WiFi 6, Zigbee a Thread.

Začal som tým, čo sa zdalo byť rozumným prístupom: PlatformIO s Arduino frameworkom, keďže som mal fungujúci kód z iných ESP32 projektov.

Prvý pokus: Arduino Framework #

Môj platformio.ini vyzeral nevinne:

[env:esp32-c6-devkitc-1]
platform = espressif32
framework = arduino
board = esp32-c6-devkitc-1
monitor_speed = 115200

lib_deps =
    lvgl/lvgl@^8.3.0

build_flags =
    -D LV_CONF_SKIP=1

Toto bohužiaľ zlyhalo spektakulárne:

CONFIGURATION: https://docs.platformio.org/page/boards/espressif32/esp32-c6-devkitc-1.html
PLATFORM: Espressif 32 (6.12.0) > Espressif ESP32-C6-DevKitC-1
HARDWARE: ESP32C6 160MHz, 320KB RAM, 8MB Flash
DEBUG: Current (cmsis-dap) External (cmsis-dap, esp-bridge, esp-builtin, esp-prog, iot-bus-jtag, jlink, minimodule, olimex-arm-usb-ocd, olimex-arm-usb-ocd-h, olimex-arm-usb-tiny-h, olimex-jtag-tiny, tumpa)
PACKAGES:
 - framework-arduinoespressif32 @ 3.20017.241212+sha.dcc1105b
 - tool-esptoolpy @ 2.40900.250804 (4.9.0)
 - toolchain-riscv32-esp @ 8.4.0+2021r2-patch5
Error: This board doesn't support arduino framework!
================================================================================= [FAILED] Took 31.46 seconds =================================================================================

Moment, čo? Doska nepodporuje Arduino framework? Ale ESP32-C6 DevKit je predsa priamo uvedený v dokumentácii dosiek PlatformIO. To nedáva žiadny zmysel.

Druhý pokus: Vynútenie Arduino Frameworku #

Možno by to šlo prinútiť fungovať použitím staršieho Arduino core:

[env:esp32-c6-devkitc-1]
platform = espressif32@^6.8.1
framework = arduino
board = esp32-c6-devkitc-1
monitor_speed = 115200

platform_packages =
    framework-arduinoespressif32 @ https://github.com/espressif/arduino-esp32.git#3.0.0

lib_deps =
    lvgl/lvgl@^8.3.0

build_flags =
    -D LV_CONF_SKIP=1
    -D ARDUINO_USB_CDC_ON_BOOT=1

Tentokrát som dostal inú chybu:

Configuring toolchain packages from a remote source...
Tool Manager: Installing espressif/toolchain-riscv32-esp @ 14.2.0+20241119
UnknownPackageError: Could not find the package with 'espressif/toolchain-riscv32-esp @ 14.2.0+20241119' requirements for your system 'darwin_arm64'

Á, problémy s podporou macOS ARM64. Cutting-edge platforma sa pokúša použiť toolchain, ktorý pre môj M3 Mac neexistuje. Späť na začiatok.

Tretí pokus: ESP-IDF Framework #

Dobre, skúsme radšej ESP-IDF framework:

[env:esp32-c6-devkitc-1]
platform = espressif32
framework = espidf
board = esp32-c6-devkitc-1
monitor_speed = 115200

lib_deps =
    lvgl/lvgl@^8.3.0

build_flags =
    -D LV_CONF_SKIP=1

Toto sa skutočne začalo kompilovať! Pokrok! Ale potom môj hlavičkový súbor ovládača displeja spôsobil problémy:

In file included from src/main.c:5:
./Display_ST7789.h:2:10: fatal error: SPI.h: No such file or directory

*******************************************************************
* Looking for SPI.h dependency? Check our library registry!
*
* CLI  > platformio lib search "header:SPI.h"
* Web  > https://registry.platformio.org/search?q=header:%1B%5Bm%1B%5BKSPI.h
*
*******************************************************************

    2 | #include <SPI.h>
      |          ^~~~~~~
compilation terminated.

Samozrejme. Môj ovládač displeja bol napísaný pre SPI knižnicu Arduina, ale teraz používam ESP-IDF framework. Potrebujem prepísať celý ovládač, aby využíval SPI API ESP-IDF.

Štvrtý pokus: Manuálny ovládač displeja #

Strávil som čas konverziou Arduino SPI volaní na ekvivalenty ESP-IDF:

// Arduino style
SPI.begin();
digitalWrite(PIN_DC, HIGH);

// ESP-IDF style
spi_bus_initialize(SPI2_HOST, &buscfg, SPI_DMA_CH_AUTO);
gpio_set_level(PIN_DC, 1);

Po značnom úsilí som mal funkčný základný ovládač displeja, no potom sa sťažoval linker:

/Users/peterbabic/.platformio/packages/toolchain-riscv32-esp/bin/../lib/gcc/riscv32-esp-elf/14.2.0/../../../../riscv32-esp-elf/bin/ld: .pio/build/esp32-c6-devkitc-1/src/main.c.o: in function `my_disp_flush':
/Users/peterbabic/work/balint-tracking/firmware/src/main.c:17:(.text.my_disp_flush+0x1c): undefined reference to `LCD_addWindow'
/Users/peterbabic/.platformio/packages/toolchain-riscv32-esp/bin/../lib/gcc/riscv32-esp-elf/14.2.0/../../../../riscv32-esp-elf/bin/ld: .pio/build/esp32-c6-devkitc-1/src/main.c.o: in function `app_main':
/Users/peterbabic/work/balint-tracking/firmware/src/main.c:26:(.text.app_main+0x36): undefined reference to `LCD_Init'

PlatformIO s ESP-IDF frameworkom automaticky nekompiluje ďalšie C súbory. Je potrebné vytvoriť CMakeLists.txt súbory a spravovať build manuálne – v podstate znovu vytvárať to, čo natívny ESP-IDF robí automaticky.

Piaty pokus: ESP Component Registry #

Potom som objavil oficiálnu LVGL komponentu od Espressif: esp_lvgl_port. Tá zvláda všetku komplexnosť inicializácie LVGL a správne sa integruje s LCD ovládačmi ESP32. Perfektné!

Skúsil som ju pridať cez idf_component.yml:

dependencies:
  espressif/esp_lvgl_port: "^2.6.0"
  lvgl/lvgl: "^8"

Ale PlatformIO tento súbor úplne ignoruje:

src/main.c:10:10: fatal error: esp_lvgl_port.h: No such file or directory

*****************************************************************************
* Looking for esp_lvgl_port.h dependency? Check our library registry!
*
* CLI  > platformio lib search "header:esp_lvgl_port.h"
* Web  > https://registry.platformio.org/search?q=header:%1B%5Bm%1B%5BKesp_lvgl_port.h
*****************************************************************************

   10 | #include "esp_lvgl_port.h"
      |          ^~~~~~~~~~~~~~~~~
compilation terminated.

PlatformIO sa vôbec neintegruje s registrom komponentov ESP-IDF. Celý ekosystém ESP-IDF komponentov je nedostupný.

Vzorec sa vynára #

Presne to isté sa stalo s donglem nRF52840. PlatformIO funguje skvele pre staršie, dobre zavedené dosky a frameworky, ale rozpadá sa, keď potrebujete:

  1. Podporu najnovších čipov – Arduino framework pre ESP32-C6 je nefunkčný
  2. Natívne ekosystémy komponentov – ESP-IDF komponenty sú ignorované
  3. Pokročilé ladenie – nástroje na ladenie ESP-IDF nie sú dostupné
  4. Správne riadenie toolchainu – cutting-edge toolchainy chýbajú pre novšie platformy

Základný problém je, že PlatformIO je abstrakčná vrstva, ktorá sa snaží zjednotiť rôzne embedded ekosystémy, no nevyhnutne zaostáva za natívnymi toolchainmi a stráca dôležitú funkcionalitu pri preklade.

Dúfam, že tieto chybové správy niekomu v budúcnosti pomôžu.