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:
- Podporu najnovších čipov – Arduino framework pre ESP32-C6 je nefunkčný
- Natívne ekosystémy komponentov – ESP-IDF komponenty sú ignorované
- Pokročilé ladenie – nástroje na ladenie ESP-IDF nie sú dostupné
- 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.