This commit is contained in:
Ken Van Hoeylandt 2026-02-08 21:00:19 +01:00
parent f4df5f6890
commit c73286d70b
89 changed files with 384 additions and 717 deletions

View File

@ -63,6 +63,8 @@ def property_to_string(property: DeviceProperty, devices: list[Device]) -> str:
type = property.type
if type == "value":
return property.value
if type == "boolean":
return "true"
elif type == "text":
return f"\"{property.value}\""
elif type == "values":

View File

@ -20,8 +20,6 @@
clock-frequency = <400000>;
pin-sda = <2>;
pin-scl = <1>;
pin-sda-pullup;
pin-scl-pullup;
};
i2c_external: i2c1 {

View File

@ -2,8 +2,6 @@
#include <tactility/device.h>
#include <Tactility/hal/sdcard/SpiSdCardDevice.h>
#include <Tactility/lvgl/LvglSync.h>
#include <Tactility/RecursiveMutex.h>
using tt::hal::sdcard::SpiSdCardDevice;
@ -14,7 +12,7 @@ std::shared_ptr<SdCardDevice> createSdCard() {
GPIO_NUM_NC,
GPIO_NUM_NC,
SdCardDevice::MountBehaviour::AtBoot,
std::make_shared<tt::RecursiveMutex>(),
nullptr,
std::vector<gpio_num_t>(),
SPI3_HOST
);

View File

@ -2,8 +2,6 @@
#include <tactility/device.h>
#include <Tactility/hal/sdcard/SpiSdCardDevice.h>
#include <Tactility/lvgl/LvglSync.h>
#include <Tactility/RecursiveMutex.h>
using tt::hal::sdcard::SpiSdCardDevice;
@ -14,7 +12,7 @@ std::shared_ptr<SdCardDevice> createSdCard() {
GPIO_NUM_NC,
GPIO_NUM_NC,
SdCardDevice::MountBehaviour::AtBoot,
std::make_shared<tt::RecursiveMutex>(),
nullptr,
std::vector<gpio_num_t>(),
SPI3_HOST
);

View File

@ -8,7 +8,7 @@
#include <PwmBacklight.h>
bool initBoot() {
static bool initBoot() {
if (!driver::pwmbacklight::init(LCD_PIN_BACKLIGHT)) {
return false;
}

View File

@ -1,7 +1,5 @@
#pragma once
#include <Tactility/RecursiveMutex.h>
#include <EspLcdDisplay.h>
#include <lvgl.h>

View File

@ -20,8 +20,6 @@
clock-frequency = <400000>;
pin-sda = <19>;
pin-scl = <45>;
pin-sda-pullup;
pin-scl-pullup;
};
spi0 {

View File

@ -21,8 +21,6 @@
clock-frequency = <400000>;
pin-sda = <19>;
pin-scl = <20>;
pin-sda-pullup;
pin-scl-pullup;
};
i2c_external {

View File

@ -1,7 +1,6 @@
#include "SdCard.h"
#include <tactility/device.h>
#include <Tactility/lvgl/LvglSync.h>
#include <Tactility/hal/sdcard/SpiSdCardDevice.h>
using tt::hal::sdcard::SpiSdCardDevice;
@ -15,7 +14,7 @@ std::shared_ptr<SdCardDevice> createSdCard() {
GPIO_NUM_NC,
GPIO_NUM_NC,
SdCardDevice::MountBehaviour::AtBoot,
tt::lvgl::getSyncLock(),
nullptr,
std::vector<gpio_num_t>(),
SPI3_HOST
);

View File

@ -21,8 +21,6 @@
clock-frequency = <400000>;
pin-sda = <15>;
pin-scl = <16>;
pin-sda-pullup;
pin-scl-pullup;
};
display_spi: spi0 {

View File

@ -1,7 +1,6 @@
#include "SdCard.h"
#include <tactility/device.h>
#include <Tactility/lvgl/LvglSync.h>
#include <Tactility/hal/sdcard/SpiSdCardDevice.h>
using tt::hal::sdcard::SpiSdCardDevice;
@ -15,7 +14,7 @@ std::shared_ptr<SdCardDevice> createSdCard() {
GPIO_NUM_NC,
GPIO_NUM_NC,
SdCardDevice::MountBehaviour::AtBoot,
tt::lvgl::getSyncLock(),
nullptr,
std::vector<gpio_num_t>(),
SPI3_HOST
);

View File

@ -21,8 +21,6 @@
clock-frequency = <400000>;
pin-sda = <15>;
pin-scl = <16>;
pin-sda-pullup;
pin-scl-pullup;
};
display_spi: spi0 {

View File

@ -21,8 +21,6 @@
clock-frequency = <400000>;
pin-sda = <15>;
pin-scl = <16>;
pin-sda-pullup;
pin-scl-pullup;
};
sdcard_spi: spi0 {

View File

@ -21,8 +21,6 @@
clock-frequency = <400000>;
pin-sda = <22>;
pin-scl = <21>;
pin-sda-pullup;
pin-scl-pullup;
};
display_spi: spi0 {
@ -33,7 +31,7 @@
pin-sclk = <14>;
pin-wp = <GPIO_PIN_NONE>;
pin-hd = <GPIO_PIN_NONE>;
max-transfer-size = <0>;
max-transfer-size = <65536>;
};
sdcard_spi: spi1 {

View File

@ -21,8 +21,6 @@
clock-frequency = <400000>;
pin-sda = <22>;
pin-scl = <21>;
pin-sda-pullup;
pin-scl-pullup;
};
display_spi: spi0 {
@ -33,7 +31,7 @@
pin-sclk = <14>;
pin-wp = <GPIO_PIN_NONE>;
pin-hd = <GPIO_PIN_NONE>;
max-transfer-size = <0>;
max-transfer-size = <65536>;
};
sdcard_spi: spi1 {

View File

@ -21,8 +21,6 @@
clock-frequency = <400000>;
pin-sda = <19>;
pin-scl = <20>;
pin-sda-pullup;
pin-scl-pullup;
};
sdcard_spi: spi0 {

View File

@ -28,8 +28,6 @@
clock-frequency = <400000>;
pin-sda = <7>;
pin-scl = <8>;
pin-sda-pullup;
pin-scl-pullup;
};
i2s0 {

View File

@ -21,8 +21,6 @@
clock-frequency = <400000>;
pin-sda = <4>;
pin-scl = <8>;
pin-sda-pullup;
pin-scl-pullup;
};
i2c_external: i2c1 {
@ -31,8 +29,6 @@
clock-frequency = <400000>;
pin-sda = <17>;
pin-scl = <18>;
pin-sda-pullup;
pin-scl-pullup;
};
display_spi: spi0 {

View File

@ -2,8 +2,6 @@
#include <tactility/device.h>
#include <Tactility/hal/sdcard/SpiSdCardDevice.h>
#include <Tactility/lvgl/LvglSync.h>
#include <Tactility/RecursiveMutex.h>
using tt::hal::sdcard::SpiSdCardDevice;
@ -13,10 +11,7 @@ std::shared_ptr<SdCardDevice> createSdCard() {
GPIO_NUM_NC,
GPIO_NUM_NC,
GPIO_NUM_NC,
SdCardDevice::MountBehaviour::AtBoot,
nullptr,
std::vector<gpio_num_t>(),
SPI2_HOST
SdCardDevice::MountBehaviour::AtBoot
);
auto* spi_controller = device_find_by_name("spi0");

View File

@ -21,8 +21,6 @@
clock-frequency = <400000>;
pin-sda = <19>;
pin-scl = <20>;
pin-sda-pullup;
pin-scl-pullup;
};
i2c_external: i2c1 {
@ -31,8 +29,6 @@
clock-frequency = <400000>;
pin-sda = <17>;
pin-scl = <18>;
pin-sda-pullup;
pin-scl-pullup;
};
spi0 {

View File

@ -19,7 +19,5 @@
clock-frequency = <200000>;
pin-sda = <17>;
pin-scl = <18>;
pin-sda-pullup;
pin-scl-pullup;
};
};

View File

@ -9,7 +9,7 @@
#define LCD_PIN_RESET GPIO_NUM_1
#define LCD_HORIZONTAL_RESOLUTION 80
#define LCD_VERTICAL_RESOLUTION 160
#define LCD_SPI_TRANSFER_HEIGHT LCD_VERTICAL_RESOLUTION / 4
#define LCD_SPI_TRANSFER_HEIGHT (LCD_VERTICAL_RESOLUTION / 4)
std::shared_ptr<tt::hal::display::DisplayDevice> createDisplay() {
auto configuration = std::make_unique<St7735Display::Configuration>(

View File

@ -21,8 +21,6 @@
clock-frequency = <400000>;
pin-sda = <44>;
pin-scl = <43>;
pin-sda-pullup;
pin-scl-pullup;
};
spi0 {

View File

@ -6,12 +6,9 @@
#include <driver/gpio.h>
#include <Tactility/hal/Configuration.h>
#include <Tactility/lvgl/LvglSync.h>
#include <Bq25896.h>
#include <Drv2605.h>
#define TPAGER_SPI_TRANSFER_SIZE_LIMIT (480 * 222 * (LV_COLOR_DEPTH / 8))
bool tpagerInit();
using namespace tt::hal;
@ -38,28 +35,5 @@ static DeviceVector createDevices() {
extern const Configuration hardwareConfiguration = {
.initBoot = tpagerInit,
.createDevices = createDevices,
.spi {spi::Configuration {
.device = SPI2_HOST,
.dma = SPI_DMA_CH_AUTO,
.config = {
.mosi_io_num = GPIO_NUM_34,
.miso_io_num = GPIO_NUM_33,
.sclk_io_num = GPIO_NUM_35,
.quadwp_io_num = GPIO_NUM_NC, // Quad SPI LCD driver is not yet supported
.quadhd_io_num = GPIO_NUM_NC, // Quad SPI LCD driver is not yet supported
.data4_io_num = GPIO_NUM_NC,
.data5_io_num = GPIO_NUM_NC,
.data6_io_num = GPIO_NUM_NC,
.data7_io_num = GPIO_NUM_NC,
.data_io_default_level = false,
.max_transfer_sz = TPAGER_SPI_TRANSFER_SIZE_LIMIT,
.flags = 0,
.isr_cpu_id = ESP_INTR_CPU_AFFINITY_AUTO,
.intr_flags = 0
},
.initMode = spi::InitMode::ByTactility,
.isMutable = false,
.lock = tt::lvgl::getSyncLock() // esp_lvgl_port owns the lock for the display
}}
.createDevices = createDevices
};

View File

@ -1,5 +1,6 @@
#include "SdCard.h"
#include <tactility/device.h>
#include <Tactility/hal/sdcard/SpiSdCardDevice.h>
#include <Tactility/lvgl/LvglSync.h>
@ -23,7 +24,11 @@ std::shared_ptr<SdCardDevice> createTpagerSdCard() {
}
);
auto* spi_controller = device_find_by_name("spi0");
check(spi_controller, "spi0 not found");
return std::make_shared<SpiSdCardDevice>(
std::move(configuration)
std::move(configuration),
spi_controller
);
}

View File

@ -4,6 +4,7 @@
#include <tactility/bindings/esp32_gpio.h>
#include <tactility/bindings/esp32_i2c.h>
#include <tactility/bindings/esp32_i2s.h>
#include <tactility/bindings/esp32_spi.h>
#include <tactility/bindings/esp32_uart.h>
// Reference: https://wiki.lilygo.cc/get_started/en/LoRa_GPS/T-LoraPager/T-LoraPager.html#Pin-Overview
@ -24,6 +25,17 @@
pin-scl = <2>;
};
spi0 {
compatible = "espressif,esp32-spi";
host = <SPI2_HOST>;
pin-mosi = <34>;
pin-miso = <33>;
pin-sclk = <35>;
pin-wp = <GPIO_PIN_NONE>;
pin-hd = <GPIO_PIN_NONE>;
max-transfer-size = <0>;
};
// ES8311
// TODO: init via I2C to enable audio playback
i2s0 {

View File

@ -5,14 +5,13 @@
#include <driver/gpio.h>
#include <Tactility/hal/Configuration.h>
#include <Tactility/lvgl/LvglSync.h>
#include <PwmBacklight.h>
#include <Tca8418.h>
using namespace tt::hal;
bool initBoot() {
static bool initBoot() {
return driver::pwmbacklight::init(LCD_PIN_BACKLIGHT, 512);
}
@ -30,55 +29,5 @@ static DeviceVector createDevices() {
extern const Configuration hardwareConfiguration = {
.initBoot = initBoot,
.uiScale = UiScale::Smallest,
.createDevices = createDevices,
.spi {
// Display
spi::Configuration {
.device = SPI2_HOST,
.dma = SPI_DMA_CH_AUTO,
.config = {
.mosi_io_num = GPIO_NUM_35,
.miso_io_num = GPIO_NUM_NC,
.sclk_io_num = GPIO_NUM_36,
.quadwp_io_num = GPIO_NUM_NC,
.quadhd_io_num = GPIO_NUM_NC,
.data4_io_num = GPIO_NUM_NC,
.data5_io_num = GPIO_NUM_NC,
.data6_io_num = GPIO_NUM_NC,
.data7_io_num = GPIO_NUM_NC,
.data_io_default_level = false,
.max_transfer_sz = LCD_SPI_TRANSFER_SIZE_LIMIT,
.flags = 0,
.isr_cpu_id = ESP_INTR_CPU_AFFINITY_AUTO,
.intr_flags = 0
},
.initMode = spi::InitMode::ByTactility,
.isMutable = false,
.lock = tt::lvgl::getSyncLock()
},
// SDCard
spi::Configuration {
.device = SPI3_HOST,
.dma = SPI_DMA_CH_AUTO,
.config = {
.mosi_io_num = GPIO_NUM_14,
.miso_io_num = GPIO_NUM_39,
.sclk_io_num = GPIO_NUM_40,
.quadwp_io_num = GPIO_NUM_NC,
.quadhd_io_num = GPIO_NUM_NC,
.data4_io_num = GPIO_NUM_NC,
.data5_io_num = GPIO_NUM_NC,
.data6_io_num = GPIO_NUM_NC,
.data7_io_num = GPIO_NUM_NC,
.data_io_default_level = false,
.max_transfer_sz = 0,
.flags = 0,
.isr_cpu_id = ESP_INTR_CPU_AFFINITY_AUTO,
.intr_flags = 0
},
.initMode = spi::InitMode::ByTactility,
.isMutable = false,
.lock = nullptr
},
}
.createDevices = createDevices
};

View File

@ -1,5 +1,6 @@
#include "SdCard.h"
#include <tactility/device.h>
#include <Tactility/hal/sdcard/SpiSdCardDevice.h>
constexpr auto SDCARD_PIN_CS = GPIO_NUM_12;
@ -14,12 +15,16 @@ std::shared_ptr<SdCardDevice> createSdCard() {
GPIO_NUM_NC,
GPIO_NUM_NC,
SdCardDevice::MountBehaviour::AtBoot,
tt::hal::spi::getLock(SPI3_HOST),
nullptr,
std::vector { EXPANSION_HEADER_PIN_CS },
SPI3_HOST
);
auto* spi_controller = device_find_by_name("spi1");
check(spi_controller, "spi1 not found");
return std::make_shared<SpiSdCardDevice>(
std::move(configuration)
std::move(configuration),
spi_controller
);
}

View File

@ -4,6 +4,7 @@
#include <tactility/bindings/esp32_gpio.h>
#include <tactility/bindings/esp32_i2c.h>
#include <tactility/bindings/esp32_i2s.h>
#include <tactility/bindings/esp32_spi.h>
#include <tactility/bindings/esp32_uart.h>
// Reference: https://docs.m5stack.com/en/core/Cardputer-Adv
@ -22,8 +23,6 @@
clock-frequency = <400000>;
pin-sda = <8>;
pin-scl = <9>;
pin-sda-pullup;
pin-scl-pullup;
};
i2c_port_a {
@ -32,8 +31,28 @@
clock-frequency = <400000>;
pin-sda = <2>;
pin-scl = <1>;
pin-sda-pullup;
pin-scl-pullup;
};
display_spi: spi0 {
compatible = "espressif,esp32-spi";
host = <SPI2_HOST>;
pin-mosi = <35>;
pin-miso = <GPIO_PIN_NONE>;
pin-sclk = <36>;
pin-wp = <GPIO_PIN_NONE>;
pin-hd = <GPIO_PIN_NONE>;
max-transfer-size = <0>;
};
sdcard_spi: spi1 {
compatible = "espressif,esp32-spi";
host = <SPI3_HOST>;
pin-mosi = <14>;
pin-miso = <39>;
pin-sclk = <40>;
pin-wp = <GPIO_PIN_NONE>;
pin-hd = <GPIO_PIN_NONE>;
max-transfer-size = <0>;
};
// Speaker and microphone (ES8311)

View File

@ -7,7 +7,6 @@
#include <PwmBacklight.h>
#include <Tactility/hal/Configuration.h>
#include <Tactility/lvgl/LvglSync.h>
using namespace tt::hal;
@ -28,56 +27,5 @@ static DeviceVector createDevices() {
extern const Configuration hardwareConfiguration = {
.initBoot = initBoot,
.uiScale = UiScale::Smallest,
.createDevices = createDevices,
.spi {
// Display
spi::Configuration {
.device = SPI2_HOST,
.dma = SPI_DMA_CH_AUTO,
.config = {
.mosi_io_num = GPIO_NUM_35,
.miso_io_num = GPIO_NUM_NC,
.sclk_io_num = GPIO_NUM_36,
.quadwp_io_num = GPIO_NUM_NC,
.quadhd_io_num = GPIO_NUM_NC,
.data4_io_num = GPIO_NUM_NC,
.data5_io_num = GPIO_NUM_NC,
.data6_io_num = GPIO_NUM_NC,
.data7_io_num = GPIO_NUM_NC,
.data_io_default_level = false,
.max_transfer_sz = LCD_SPI_TRANSFER_SIZE_LIMIT,
.flags = 0,
.isr_cpu_id = ESP_INTR_CPU_AFFINITY_AUTO,
.intr_flags = 0
},
.initMode = spi::InitMode::ByTactility,
.isMutable = false,
.lock = tt::lvgl::getSyncLock()
},
// SDCard
spi::Configuration {
.device = SPI3_HOST,
.dma = SPI_DMA_CH_AUTO,
.config = {
.mosi_io_num = GPIO_NUM_14,
.miso_io_num = GPIO_NUM_39,
.sclk_io_num = GPIO_NUM_40,
.quadwp_io_num = GPIO_NUM_NC,
.quadhd_io_num = GPIO_NUM_NC,
.data4_io_num = GPIO_NUM_NC,
.data5_io_num = GPIO_NUM_NC,
.data6_io_num = GPIO_NUM_NC,
.data7_io_num = GPIO_NUM_NC,
.data_io_default_level = false,
.max_transfer_sz = 0,
.flags = 0,
.isr_cpu_id = ESP_INTR_CPU_AFFINITY_AUTO,
.intr_flags = 0
},
.initMode = spi::InitMode::ByTactility,
.isMutable = false,
.lock = nullptr
},
}
.createDevices = createDevices
};

View File

@ -1,5 +1,6 @@
#include "SdCard.h"
#include <tactility/device.h>
#include <Tactility/hal/sdcard/SpiSdCardDevice.h>
constexpr auto SDCARD_PIN_CS = GPIO_NUM_12;
@ -13,12 +14,16 @@ std::shared_ptr<SdCardDevice> createSdCard() {
GPIO_NUM_NC,
GPIO_NUM_NC,
SdCardDevice::MountBehaviour::AtBoot,
tt::hal::spi::getLock(SPI3_HOST),
nullptr,
std::vector<gpio_num_t>(),
SPI3_HOST
);
auto* spi_controller = device_find_by_name("spi1");
check(spi_controller, "spi1 not found");
return std::make_shared<SpiSdCardDevice>(
std::move(configuration)
std::move(configuration),
spi_controller
);
}

View File

@ -4,6 +4,7 @@
#include <tactility/bindings/esp32_gpio.h>
#include <tactility/bindings/esp32_i2c.h>
#include <tactility/bindings/esp32_i2s.h>
#include <tactility/bindings/esp32_spi.h>
#include <tactility/bindings/esp32_uart.h>
// Reference: https://docs.m5stack.com/en/core/Cardputer
@ -22,8 +23,28 @@
clock-frequency = <400000>;
pin-sda = <2>;
pin-scl = <1>;
pin-sda-pullup;
pin-scl-pullup;
};
display_spi: spi0 {
compatible = "espressif,esp32-spi";
host = <SPI2_HOST>;
pin-mosi = <35>;
pin-miso = <GPIO_PIN_NONE>;
pin-sclk = <36>;
pin-wp = <GPIO_PIN_NONE>;
pin-hd = <GPIO_PIN_NONE>;
max-transfer-size = <0>;
};
sdcard_spi: spi1 {
compatible = "espressif,esp32-spi";
host = <SPI3_HOST>;
pin-mosi = <14>;
pin-miso = <39>;
pin-sclk = <40>;
pin-wp = <GPIO_PIN_NONE>;
pin-hd = <GPIO_PIN_NONE>;
max-transfer-size = <0>;
};
// Speaker and microphone

View File

@ -1,14 +1,12 @@
#include "devices/Display.h"
#include "devices/SdCard.h"
#include "devices/Power.h"
#include <driver/gpio.h>
#include <Tactility/hal/Configuration.h>
#include <Tactility/lvgl/LvglSync.h>
using namespace tt::hal;
bool initBoot() {
static bool initBoot() {
return initAxp();
}
@ -22,30 +20,5 @@ static DeviceVector createDevices() {
extern const Configuration hardwareConfiguration = {
.initBoot = initBoot,
.createDevices = createDevices,
.spi {
spi::Configuration {
.device = SPI2_HOST,
.dma = SPI_DMA_CH_AUTO,
.config = {
.mosi_io_num = GPIO_NUM_23,
.miso_io_num = GPIO_NUM_38,
.sclk_io_num = GPIO_NUM_18,
.quadwp_io_num = GPIO_NUM_NC, // Quad SPI LCD driver is not yet supported
.quadhd_io_num = GPIO_NUM_NC, // Quad SPI LCD driver is not yet supported
.data4_io_num = GPIO_NUM_NC,
.data5_io_num = GPIO_NUM_NC,
.data6_io_num = GPIO_NUM_NC,
.data7_io_num = GPIO_NUM_NC,
.data_io_default_level = false,
.max_transfer_sz = LCD_SPI_TRANSFER_SIZE_LIMIT,
.flags = 0,
.isr_cpu_id = ESP_INTR_CPU_AFFINITY_AUTO,
.intr_flags = 0
},
.initMode = spi::InitMode::ByTactility,
.isMutable = false,
.lock = tt::lvgl::getSyncLock() // esp_lvgl_port owns the lock for the display
}
}
.createDevices = createDevices
};

View File

@ -12,6 +12,5 @@ constexpr auto LCD_HORIZONTAL_RESOLUTION = 320;
constexpr auto LCD_VERTICAL_RESOLUTION = 240;
constexpr auto LCD_BUFFER_HEIGHT = LCD_VERTICAL_RESOLUTION / 10;
constexpr auto LCD_BUFFER_SIZE = LCD_HORIZONTAL_RESOLUTION * LCD_BUFFER_HEIGHT;
constexpr auto LCD_SPI_TRANSFER_SIZE_LIMIT = LCD_BUFFER_SIZE * LV_COLOR_DEPTH / 8;
std::shared_ptr<tt::hal::display::DisplayDevice> createDisplay();

View File

@ -1,5 +1,6 @@
#include "SdCard.h"
#include <tactility/device.h>
#include <Tactility/hal/sdcard/SpiSdCardDevice.h>
#include <Tactility/lvgl/LvglSync.h>
@ -21,7 +22,11 @@ std::shared_ptr<SdCardDevice> createSdCard() {
}
);
auto* spi_controller = device_find_by_name("spi0");
check(spi_controller, "spi0 not found");
return std::make_shared<SpiSdCardDevice>(
std::move(configuration)
std::move(configuration),
spi_controller
);
}

View File

@ -4,6 +4,7 @@
#include <tactility/bindings/esp32_gpio.h>
#include <tactility/bindings/esp32_i2c.h>
#include <tactility/bindings/esp32_i2s.h>
#include <tactility/bindings/esp32_spi.h>
#include <tactility/bindings/esp32_uart.h>
// Reference: https://docs.m5stack.com/en/core/Core2
@ -22,8 +23,6 @@
clock-frequency = <400000>;
pin-sda = <21>;
pin-scl = <22>;
pin-sda-pullup;
pin-scl-pullup;
};
i2c_port_a {
@ -32,8 +31,17 @@
clock-frequency = <400000>;
pin-sda = <32>;
pin-scl = <33>;
pin-sda-pullup;
pin-scl-pullup;
};
spi0 {
compatible = "espressif,esp32-spi";
host = <SPI2_HOST>;
pin-mosi = <23>;
pin-miso = <38>;
pin-sclk = <18>;
pin-wp = <GPIO_PIN_NONE>;
pin-hd = <GPIO_PIN_NONE>;
max-transfer-size = <0>;
};
// NS4168: Speaker and microphone

View File

@ -4,7 +4,6 @@
#include <driver/gpio.h>
#include <Tactility/hal/Configuration.h>
#include <Tactility/lvgl/LvglSync.h>
#include <Axp2101Power.h>
using namespace tt::hal;
@ -21,30 +20,5 @@ static DeviceVector createDevices() {
extern const Configuration hardwareConfiguration = {
.initBoot = initBoot,
.createDevices = createDevices,
.spi {
spi::Configuration {
.device = SPI3_HOST,
.dma = SPI_DMA_CH_AUTO,
.config = {
.mosi_io_num = GPIO_NUM_37,
.miso_io_num = GPIO_NUM_35,
.sclk_io_num = GPIO_NUM_36,
.data2_io_num = GPIO_NUM_NC,
.data3_io_num = GPIO_NUM_NC,
.data4_io_num = GPIO_NUM_NC,
.data5_io_num = GPIO_NUM_NC,
.data6_io_num = GPIO_NUM_NC,
.data7_io_num = GPIO_NUM_NC,
.data_io_default_level = false,
.max_transfer_sz = LCD_SPI_TRANSFER_SIZE_LIMIT,
.flags = 0,
.isr_cpu_id = ESP_INTR_CPU_AFFINITY_AUTO,
.intr_flags = 0
},
.initMode = spi::InitMode::ByTactility,
.isMutable = false,
.lock = tt::lvgl::getSyncLock() // esp_lvgl_port owns the lock for the display
}
}
.createDevices = createDevices
};

View File

@ -5,7 +5,7 @@
#include <driver/spi_common.h>
// Display
constexpr auto LCD_SPI_HOST = SPI3_HOST;
constexpr auto LCD_SPI_HOST = SPI2_HOST;
constexpr auto LCD_PIN_CS = GPIO_NUM_3;
constexpr auto LCD_PIN_DC = GPIO_NUM_35;
constexpr auto LCD_HORIZONTAL_RESOLUTION = 320;

View File

@ -1,5 +1,6 @@
#include "SdCard.h"
#include <tactility/device.h>
#include <Tactility/lvgl/LvglSync.h>
#include <Tactility/hal/sdcard/SpiSdCardDevice.h>
@ -16,13 +17,14 @@ std::shared_ptr<SdCardDevice> createSdCard() {
GPIO_NUM_NC,
SdCardDevice::MountBehaviour::AtBoot,
tt::lvgl::getSyncLock(),
std::vector {
CORES3_LCD_PIN_CS
},
SPI3_HOST
std::vector { CORES3_LCD_PIN_CS }
);
auto* spi_controller = device_find_by_name("spi0");
check(spi_controller, "spi0 not found");
return std::make_shared<SpiSdCardDevice>(
std::move(configuration)
std::move(configuration),
spi_controller
);
}

View File

@ -4,6 +4,7 @@
#include <tactility/bindings/esp32_gpio.h>
#include <tactility/bindings/esp32_i2c.h>
#include <tactility/bindings/esp32_i2s.h>
#include <tactility/bindings/esp32_spi.h>
#include <tactility/bindings/esp32_uart.h>
// Reference: https://docs.m5stack.com/en/core/CoreS3
@ -22,8 +23,6 @@
clock-frequency = <400000>;
pin-sda = <12>;
pin-scl = <11>;
pin-sda-pullup;
pin-scl-pullup;
};
i2c_port_a {
@ -32,18 +31,14 @@
clock-frequency = <400000>;
pin-sda = <2>;
pin-scl = <1>;
pin-sda-pullup;
pin-scl-pullup;
};
/*
i2c_port_b {
compatible = "espressif,esp32-i2c";
port = <I2C_NUM_1>;
clock-frequency = <400000>;
pin-sda = <9>;
pin-scl = <8>;
pin-sda-pullup;
pin-scl-pullup;
};
i2c_port_c {
@ -52,8 +47,17 @@
clock-frequency = <400000>;
pin-sda = <18>;
pin-scl = <17>;
sda-pullup;
scl-pullup;
};
*/
spi0 {
compatible = "espressif,esp32-spi";
host = <SPI2_HOST>;
pin-mosi = <37>;
pin-miso = <35>;
pin-sclk = <36>;
pin-wp = <GPIO_PIN_NONE>;
pin-hd = <GPIO_PIN_NONE>;
max-transfer-size = <0>;
};
// TODO: Enable speaker via ES7210 I2C: https://github.com/m5stack/M5Unified/blob/a6256725481f1bc366655fa48cf03b6095e30ad1/src/M5Unified.cpp#L417

View File

@ -1,9 +1,7 @@
#include "devices/Display.h"
#include "devices/SdCard.h"
#include <driver/gpio.h>
#include <Tactility/hal/Configuration.h>
#include <Tactility/lvgl/LvglSync.h>
using namespace tt::hal;
@ -17,30 +15,5 @@ static DeviceVector createDevices() {
extern const Configuration hardwareConfiguration = {
.initBoot = nullptr,
.createDevices = createDevices,
.spi {
spi::Configuration {
.device = SPI2_HOST,
.dma = SPI_DMA_CH_AUTO,
.config = {
.mosi_io_num = GPIO_NUM_38,
.miso_io_num = GPIO_NUM_40,
.sclk_io_num = GPIO_NUM_39,
.quadwp_io_num = GPIO_NUM_NC,
.quadhd_io_num = GPIO_NUM_NC,
.data4_io_num = GPIO_NUM_NC,
.data5_io_num = GPIO_NUM_NC,
.data6_io_num = GPIO_NUM_NC,
.data7_io_num = GPIO_NUM_NC,
.data_io_default_level = false,
.max_transfer_sz = 4096,
.flags = 0,
.isr_cpu_id = ESP_INTR_CPU_AFFINITY_AUTO,
.intr_flags = 0
},
.initMode = spi::InitMode::ByTactility,
.isMutable = false,
.lock = tt::lvgl::getSyncLock()
}
}
.createDevices = createDevices
};

View File

@ -1,5 +1,6 @@
#include "SdCard.h"
#include <tactility/device.h>
#include <Tactility/lvgl/LvglSync.h>
#include <Tactility/hal/sdcard/SpiSdCardDevice.h>
@ -13,13 +14,14 @@ std::shared_ptr<SdCardDevice> createSdCard() {
GPIO_NUM_NC,
GPIO_NUM_NC,
GPIO_NUM_NC,
SdCardDevice::MountBehaviour::AtBoot,
tt::lvgl::getSyncLock(),
std::vector<gpio_num_t>{},
SPI2_HOST
SdCardDevice::MountBehaviour::AtBoot
);
auto* spi_controller = device_find_by_name("spi0");
check(spi_controller, "spi0 not found");
return std::make_shared<SpiSdCardDevice>(
std::move(configuration)
std::move(configuration),
spi_controller
);
}

View File

@ -1,6 +1,6 @@
[general]
vendor=M5Stack
name=Paper S3
name=PaperS3
incubating=true
[hardware]

View File

@ -3,6 +3,7 @@
#include <tactility/bindings/root.h>
#include <tactility/bindings/esp32_gpio.h>
#include <tactility/bindings/esp32_i2c.h>
#include <tactility/bindings/esp32_spi.h>
/ {
compatible = "root";
@ -19,7 +20,16 @@
clock-frequency = <400000>;
pin-sda = <41>;
pin-scl = <42>;
pin-sda-pullup;
pin-scl-pullup;
};
spi0 {
compatible = "espressif,esp32-spi";
host = <SPI2_HOST>;
pin-mosi = <38>;
pin-miso = <40>;
pin-sclk = <39>;
pin-wp = <GPIO_PIN_NONE>;
pin-hd = <GPIO_PIN_NONE>;
max-transfer-size = <4096>;
};
};

View File

@ -1,14 +1,12 @@
#include "devices/Display.h"
#include "devices/Power.h"
#include <driver/gpio.h>
#include <Tactility/hal/Configuration.h>
#include <Tactility/lvgl/LvglSync.h>
#include <ButtonControl.h>
using namespace tt::hal;
bool initBoot() {
static bool initBoot() {
// CH552 applies 4 V to GPIO 0, which reduces Wi-Fi sensitivity
// Setting output to high adds a bias of 3.3 V and suppresses over-voltage:
gpio::configure(0, gpio::Mode::Output, false, false);
@ -28,30 +26,5 @@ static DeviceVector createDevices() {
extern const Configuration hardwareConfiguration = {
.initBoot = initBoot,
.uiScale = UiScale::Smallest,
.createDevices = createDevices,
.spi {
spi::Configuration {
.device = SPI2_HOST,
.dma = SPI_DMA_CH_AUTO,
.config = {
.mosi_io_num = GPIO_NUM_15,
.miso_io_num = GPIO_NUM_NC,
.sclk_io_num = GPIO_NUM_13,
.quadwp_io_num = GPIO_NUM_NC,
.quadhd_io_num = GPIO_NUM_NC,
.data4_io_num = GPIO_NUM_NC,
.data5_io_num = GPIO_NUM_NC,
.data6_io_num = GPIO_NUM_NC,
.data7_io_num = GPIO_NUM_NC,
.data_io_default_level = false,
.max_transfer_sz = LCD_SPI_TRANSFER_SIZE_LIMIT,
.flags = 0,
.isr_cpu_id = ESP_INTR_CPU_AFFINITY_AUTO,
.intr_flags = 0
},
.initMode = spi::InitMode::ByTactility,
.isMutable = false,
.lock = tt::lvgl::getSyncLock() // esp_lvgl_port owns the lock for the display
}
}
.createDevices = createDevices
};

View File

@ -3,6 +3,7 @@
#include <tactility/bindings/root.h>
#include <tactility/bindings/esp32_gpio.h>
#include <tactility/bindings/esp32_i2c.h>
#include <tactility/bindings/esp32_spi.h>
#include <tactility/bindings/esp32_uart.h>
/ {
@ -20,8 +21,6 @@
clock-frequency = <400000>;
pin-sda = <21>;
pin-scl = <22>;
pin-sda-pullup;
pin-scl-pullup;
};
i2c_grove {
@ -30,8 +29,17 @@
clock-frequency = <400000>;
pin-sda = <32>;
pin-scl = <33>;
pin-sda-pullup;
pin-scl-pullup;
};
spi0 {
compatible = "espressif,esp32-spi";
host = <SPI2_HOST>;
pin-mosi = <15>;
pin-miso = <GPIO_PIN_NONE>;
pin-sclk = <13>;
pin-wp = <GPIO_PIN_NONE>;
pin-hd = <GPIO_PIN_NONE>;
max-transfer-size = <0>;
};
uart_grove: uart1 {

View File

@ -2,7 +2,6 @@
#include <driver/gpio.h>
#include <Tactility/hal/Configuration.h>
#include <Tactility/lvgl/LvglSync.h>
#include <ButtonControl.h>
#include <PwmBacklight.h>
@ -30,30 +29,5 @@ static DeviceVector createDevices() {
extern const Configuration hardwareConfiguration = {
.initBoot = initBoot,
.uiScale = UiScale::Smallest,
.createDevices = createDevices,
.spi {
spi::Configuration {
.device = SPI2_HOST,
.dma = SPI_DMA_CH_AUTO,
.config = {
.mosi_io_num = GPIO_NUM_15,
.miso_io_num = GPIO_NUM_NC,
.sclk_io_num = GPIO_NUM_13,
.quadwp_io_num = GPIO_NUM_NC,
.quadhd_io_num = GPIO_NUM_NC,
.data4_io_num = GPIO_NUM_NC,
.data5_io_num = GPIO_NUM_NC,
.data6_io_num = GPIO_NUM_NC,
.data7_io_num = GPIO_NUM_NC,
.data_io_default_level = false,
.max_transfer_sz = LCD_SPI_TRANSFER_SIZE_LIMIT,
.flags = 0,
.isr_cpu_id = ESP_INTR_CPU_AFFINITY_AUTO,
.intr_flags = 0
},
.initMode = spi::InitMode::ByTactility,
.isMutable = false,
.lock = tt::lvgl::getSyncLock() // esp_lvgl_port owns the lock for the display
}
}
.createDevices = createDevices
};

View File

@ -2,6 +2,7 @@
#include <tactility/bindings/root.h>
#include <tactility/bindings/esp32_gpio.h>
#include <tactility/bindings/esp32_i2c.h>
#include <tactility/bindings/esp32_spi.h>
#include <tactility/bindings/esp32_uart.h>
/ {
@ -19,8 +20,6 @@
clock-frequency = <400000>;
pin-sda = <21>;
pin-scl = <22>;
pin-sda-pullup;
pin-scl-pullup;
};
i2c_grove {
@ -29,8 +28,17 @@
clock-frequency = <400000>;
pin-sda = <32>;
pin-scl = <33>;
pin-sda-pullup;
pin-scl-pullup;
};
spi0 {
compatible = "espressif,esp32-spi";
host = <SPI2_HOST>;
pin-mosi = <15>;
pin-miso = <GPIO_PIN_NONE>;
pin-sclk = <13>;
pin-wp = <GPIO_PIN_NONE>;
pin-hd = <GPIO_PIN_NONE>;
max-transfer-size = <0>;
};
uart_grove: uart1 {

View File

@ -88,31 +88,5 @@ static bool initBoot() {
extern const Configuration hardwareConfiguration = {
.initBoot = initBoot,
.createDevices = createDevices,
.spi = {
// SDCard
spi::Configuration {
.device = SPI3_HOST,
.dma = SPI_DMA_CH_AUTO,
.config = {
.mosi_io_num = GPIO_NUM_44,
.miso_io_num = GPIO_NUM_39,
.sclk_io_num = GPIO_NUM_43,
.quadwp_io_num = GPIO_NUM_NC,
.quadhd_io_num = GPIO_NUM_NC,
.data4_io_num = GPIO_NUM_NC,
.data5_io_num = GPIO_NUM_NC,
.data6_io_num = GPIO_NUM_NC,
.data7_io_num = GPIO_NUM_NC,
.data_io_default_level = false,
.max_transfer_sz = 0,
.flags = 0,
.isr_cpu_id = ESP_INTR_CPU_AFFINITY_AUTO,
.intr_flags = 0
},
.initMode = spi::InitMode::ByTactility,
.isMutable = false,
.lock = nullptr
}
}
.createDevices = createDevices
};

View File

@ -34,7 +34,7 @@ public:
Ili9881cDisplay(
const std::shared_ptr<EspLcdConfiguration>& configuration
) : EspLcdDisplayV2(configuration, std::make_shared<NoLock>()) {}
) : EspLcdDisplayV2(configuration) {}
~Ili9881cDisplay() override;

View File

@ -1,5 +1,6 @@
#include "SdCard.h"
#include <tactility/device.h>
#include <Tactility/hal/sdcard/SpiSdCardDevice.h>
constexpr auto SDCARD_PIN_CS = GPIO_NUM_42;
@ -12,13 +13,14 @@ std::shared_ptr<SdCardDevice> createSdCard() {
GPIO_NUM_NC,
GPIO_NUM_NC,
GPIO_NUM_NC,
SdCardDevice::MountBehaviour::AtBoot,
tt::hal::spi::getLock(SPI3_HOST),
std::vector<gpio_num_t>(),
SPI3_HOST
SdCardDevice::MountBehaviour::AtBoot
);
auto* spi_controller = device_find_by_name("spi0");
check(spi_controller, "spi0 not found");
return std::make_shared<SpiSdCardDevice>(
std::move(configuration)
std::move(configuration),
spi_controller
);
}

View File

@ -3,6 +3,7 @@
#include <tactility/bindings/root.h>
#include <tactility/bindings/esp32_gpio.h>
#include <tactility/bindings/esp32_i2c.h>
#include <tactility/bindings/esp32_spi.h>
/ {
compatible = "root";
@ -19,8 +20,6 @@
clock-frequency = <400000>;
pin-sda = <31>;
pin-scl = <32>;
pin-sda-pullup;
pin-scl-pullup;
};
i2c_port_a {
@ -29,7 +28,16 @@
clock-frequency = <400000>;
pin-sda = <53>;
pin-scl = <54>;
pin-sda-pullup;
pin-scl-pullup;
};
sdcard_spi: spi0 {
compatible = "espressif,esp32-spi";
host = <SPI2_HOST>;
pin-mosi = <44>;
pin-miso = <39>;
pin-sclk = <43>;
pin-wp = <GPIO_PIN_NONE>;
pin-hd = <GPIO_PIN_NONE>;
max-transfer-size = <0>;
};
};

View File

@ -1,12 +1,8 @@
#include "UnPhoneFeatures.h"
#include "devices/Hx8357Display.h"
#include "devices/SdCard.h"
#include <driver/gpio.h>
#include <Tactility/hal/Configuration.h>
#include <Tactility/lvgl/LvglSync.h>
#define UNPHONE_SPI_TRANSFER_SIZE_LIMIT (UNPHONE_LCD_HORIZONTAL_RESOLUTION * UNPHONE_LCD_SPI_TRANSFER_HEIGHT * LV_COLOR_DEPTH / 8)
bool initBoot();
@ -19,30 +15,5 @@ static tt::hal::DeviceVector createDevices() {
extern const tt::hal::Configuration hardwareConfiguration = {
.initBoot = initBoot,
.createDevices = createDevices,
.spi {
tt::hal::spi::Configuration {
.device = SPI2_HOST,
.dma = SPI_DMA_CH_AUTO,
.config = {
.mosi_io_num = GPIO_NUM_40,
.miso_io_num = GPIO_NUM_41,
.sclk_io_num = GPIO_NUM_39,
.quadwp_io_num = -1, // Quad SPI LCD driver is not yet supported
.quadhd_io_num = -1, // Quad SPI LCD driver is not yet supported
.data4_io_num = GPIO_NUM_NC,
.data5_io_num = GPIO_NUM_NC,
.data6_io_num = GPIO_NUM_NC,
.data7_io_num = GPIO_NUM_NC,
.data_io_default_level = false,
.max_transfer_sz = UNPHONE_SPI_TRANSFER_SIZE_LIMIT,
.flags = 0,
.isr_cpu_id = ESP_INTR_CPU_AFFINITY_AUTO,
.intr_flags = 0
},
.initMode = tt::hal::spi::InitMode::ByTactility,
.isMutable = false,
.lock = tt::lvgl::getSyncLock() // esp_lvgl_port owns the lock for the display
}
}
.createDevices = createDevices
};

View File

@ -2,7 +2,6 @@
#include <Tactility/hal/display/DisplayDevice.h>
#include <Tactility/hal/display/DisplayDriver.h>
#include <Tactility/Mutex.h>
#include <esp_lcd_types.h>
#include <lvgl.h>
@ -17,7 +16,6 @@
#define UNPHONE_LCD_HORIZONTAL_RESOLUTION 320
#define UNPHONE_LCD_VERTICAL_RESOLUTION 480
#define UNPHONE_LCD_DRAW_BUFFER_HEIGHT (UNPHONE_LCD_VERTICAL_RESOLUTION / 15)
#define UNPHONE_LCD_SPI_TRANSFER_HEIGHT (UNPHONE_LCD_VERTICAL_RESOLUTION / 15)
class Hx8357Display : public tt::hal::display::DisplayDevice {

View File

@ -1,5 +1,6 @@
#include "SdCard.h"
#include <tactility/device.h>
#include <Tactility/lvgl/LvglSync.h>
#include <Tactility/hal/sdcard/SpiSdCardDevice.h>
@ -25,7 +26,11 @@ std::shared_ptr<SdCardDevice> createSdCard() {
}
);
auto* spi_controller = device_find_by_name("spi0");
check(spi_controller, "spi0 not found");
return std::make_shared<SpiSdCardDevice>(
std::move(configuration)
std::move(configuration),
spi_controller
);
}

View File

@ -3,6 +3,7 @@
#include <tactility/bindings/root.h>
#include <tactility/bindings/esp32_gpio.h>
#include <tactility/bindings/esp32_i2c.h>
#include <tactility/bindings/esp32_spi.h>
/ {
compatible = "root";
@ -19,7 +20,16 @@
clock-frequency = <400000>;
pin-sda = <3>;
pin-scl = <4>;
pin-sda-pullup;
pin-scl-pullup;
};
sdcard_spi: spi0 {
compatible = "espressif,esp32-spi";
host = <SPI2_HOST>;
pin-mosi = <40>;
pin-miso = <41>;
pin-sclk = <39>;
pin-wp = <GPIO_PIN_NONE>;
pin-hd = <GPIO_PIN_NONE>;
max-transfer-size = <65536>;
};
};

View File

@ -1,9 +1,7 @@
#include "devices/Display.h"
#include "devices/SdCard.h"
#include <driver/gpio.h>
#include <Tactility/hal/Configuration.h>
#include <Tactility/lvgl/LvglSync.h>
#include <PwmBacklight.h>
#include <ButtonControl.h>
@ -24,31 +22,5 @@ static bool initBoot() {
extern const Configuration hardwareConfiguration = {
.initBoot = initBoot,
.uiScale = UiScale::Smallest,
.createDevices = createDevices,
.spi {
// Display
spi::Configuration {
.device = SPI2_HOST,
.dma = SPI_DMA_DISABLED,
.config = {
.mosi_io_num = GPIO_NUM_11,
.miso_io_num = GPIO_NUM_NC,
.sclk_io_num = GPIO_NUM_12,
.quadwp_io_num = GPIO_NUM_NC,
.quadhd_io_num = GPIO_NUM_NC,
.data4_io_num = GPIO_NUM_NC,
.data5_io_num = GPIO_NUM_NC,
.data6_io_num = GPIO_NUM_NC,
.data7_io_num = GPIO_NUM_NC,
.data_io_default_level = false,
.max_transfer_sz = LCD_SPI_TRANSFER_SIZE_LIMIT,
.flags = 0,
.isr_cpu_id = ESP_INTR_CPU_AFFINITY_AUTO,
.intr_flags = 0
},
.initMode = spi::InitMode::ByTactility,
.isMutable = false,
.lock = tt::lvgl::getSyncLock() // esp_lvgl_port owns the lock for the display
}
}
.createDevices = createDevices
};

View File

@ -14,6 +14,5 @@ constexpr auto LCD_HORIZONTAL_RESOLUTION = 135;
constexpr auto LCD_VERTICAL_RESOLUTION = 240;
constexpr auto LCD_BUFFER_HEIGHT = LCD_VERTICAL_RESOLUTION / 3;
constexpr auto LCD_BUFFER_SIZE = LCD_HORIZONTAL_RESOLUTION * LCD_BUFFER_HEIGHT;
constexpr auto LCD_SPI_TRANSFER_SIZE_LIMIT = LCD_BUFFER_SIZE * LV_COLOR_DEPTH / 8;
std::shared_ptr<tt::hal::display::DisplayDevice> createDisplay();

View File

@ -3,6 +3,7 @@
#include <tactility/bindings/root.h>
#include <tactility/bindings/esp32_gpio.h>
#include <tactility/bindings/esp32_i2c.h>
#include <tactility/bindings/esp32_spi.h>
#include <tactility/bindings/esp32_uart.h>
/ {
@ -20,8 +21,17 @@
clock-frequency = <400000>;
pin-sda = <16>;
pin-scl = <17>;
pin-sda-pullup;
pin-scl-pullup;
};
spi0 {
compatible = "espressif,esp32-spi";
host = <SPI2_HOST>;
pin-mosi = <11>;
pin-miso = <GPIO_PIN_NONE>;
pin-sclk = <12>;
pin-wp = <GPIO_PIN_NONE>;
pin-hd = <GPIO_PIN_NONE>;
max-transfer-size = <0>;
};
uart0 {

View File

@ -3,7 +3,6 @@
#include <driver/gpio.h>
#include <Tactility/hal/Configuration.h>
#include <Tactility/lvgl/LvglSync.h>
#include <PwmBacklight.h>
using namespace tt::hal;
@ -22,55 +21,5 @@ static bool initBoot() {
extern const Configuration hardwareConfiguration = {
.initBoot = initBoot,
.uiScale = UiScale::Smallest,
.createDevices = createDevices,
.spi {
// Display
spi::Configuration {
.device = SPI2_HOST,
.dma = SPI_DMA_DISABLED,
.config = {
.mosi_io_num = GPIO_NUM_41,
.miso_io_num = GPIO_NUM_NC,
.sclk_io_num = GPIO_NUM_40,
.quadwp_io_num = GPIO_NUM_NC,
.quadhd_io_num = GPIO_NUM_NC,
.data4_io_num = GPIO_NUM_NC,
.data5_io_num = GPIO_NUM_NC,
.data6_io_num = GPIO_NUM_NC,
.data7_io_num = GPIO_NUM_NC,
.data_io_default_level = false,
.max_transfer_sz = LCD_SPI_TRANSFER_SIZE_LIMIT,
.flags = 0,
.isr_cpu_id = ESP_INTR_CPU_AFFINITY_AUTO,
.intr_flags = 0
},
.initMode = spi::InitMode::ByTactility,
.isMutable = false,
.lock = tt::lvgl::getSyncLock() // esp_lvgl_port owns the lock for the display
},
// SD card
spi::Configuration {
.device = SPI3_HOST,
.dma = SPI_DMA_CH_AUTO,
.config = {
.mosi_io_num = GPIO_NUM_18,
.miso_io_num = GPIO_NUM_16,
.sclk_io_num = GPIO_NUM_21,
.quadwp_io_num = GPIO_NUM_NC,
.quadhd_io_num = GPIO_NUM_NC,
.data4_io_num = GPIO_NUM_NC,
.data5_io_num = GPIO_NUM_NC,
.data6_io_num = GPIO_NUM_NC,
.data7_io_num = GPIO_NUM_NC,
.data_io_default_level = false,
.max_transfer_sz = 32768,
.flags = 0,
.isr_cpu_id = ESP_INTR_CPU_AFFINITY_AUTO,
.intr_flags = 0
},
.initMode = spi::InitMode::ByTactility,
.isMutable = false,
.lock = nullptr // No custom lock needed
}
}
.createDevices = createDevices
};

View File

@ -8,4 +8,3 @@ constexpr auto LCD_HORIZONTAL_RESOLUTION = 240;
constexpr auto LCD_VERTICAL_RESOLUTION = 240;
constexpr auto LCD_BUFFER_HEIGHT = LCD_VERTICAL_RESOLUTION / 3;
constexpr auto LCD_BUFFER_SIZE = LCD_HORIZONTAL_RESOLUTION * LCD_BUFFER_HEIGHT;
constexpr auto LCD_SPI_TRANSFER_SIZE_LIMIT = LCD_BUFFER_SIZE * LV_COLOR_DEPTH / 8;

View File

@ -3,6 +3,7 @@
#include <Tactility/lvgl/LvglSync.h>
#include <Tactility/hal/sdcard/SpiSdCardDevice.h>
#include <Tactility/RecursiveMutex.h>
#include <driver/gpio.h>
using tt::hal::sdcard::SpiSdCardDevice;
@ -13,12 +14,16 @@ std::shared_ptr<SdCardDevice> createSdCard() {
GPIO_NUM_NC,
GPIO_NUM_NC,
SdCardDevice::MountBehaviour::AtBoot,
std::make_shared<tt::RecursiveMutex>(),
nullptr,
std::vector<gpio_num_t>(),
SPI3_HOST
);
auto* spi_controller = device_find_by_name("spi1");
check(spi_controller, "spi1 not found");
return std::make_shared<SpiSdCardDevice>(
std::move(configuration)
std::move(configuration),
spi_controller
);
}

View File

@ -3,7 +3,9 @@
#include <tactility/bindings/root.h>
#include <tactility/bindings/esp32_gpio.h>
#include <tactility/bindings/esp32_i2c.h>
#include <tactility/bindings/esp32_spi.h>
// Reference: https://www.waveshare.com/wiki/ESP32-S3-LCD-1.3
/ {
compatible = "root";
model = "Waveshare S3 LCD 1.3";
@ -19,7 +21,27 @@
clock-frequency = <400000>;
pin-sda = <47>;
pin-scl = <48>;
pin-sda-pullup;
pin-scl-pullup;
};
spi0 {
compatible = "espressif,esp32-spi";
host = <SPI2_HOST>;
pin-mosi = <41>;
pin-miso = <GPIO_PIN_NONE>;
pin-sclk = <40>;
pin-wp = <GPIO_PIN_NONE>;
pin-hd = <GPIO_PIN_NONE>;
max-transfer-size = <0>;
};
spi1 {
compatible = "espressif,esp32-spi";
host = <SPI3_HOST>;
pin-mosi = <18>;
pin-miso = <16>;
pin-sclk = <21>;
pin-wp = <GPIO_PIN_NONE>;
pin-hd = <GPIO_PIN_NONE>;
max-transfer-size = <0>;
};
};

View File

@ -1,9 +1,7 @@
#include "devices/Display.h"
#include "devices/SdCard.h"
#include <driver/gpio.h>
#include <Tactility/hal/Configuration.h>
#include <Tactility/lvgl/LvglSync.h>
#include <PwmBacklight.h>
using namespace tt::hal;
@ -12,8 +10,7 @@ constexpr auto* TAG = "Waveshare";
static DeviceVector createDevices() {
return {
createDisplay(),
createSdCard()
createDisplay()
};
}
@ -24,57 +21,5 @@ static bool initBoot() {
extern const Configuration hardwareConfiguration = {
.initBoot = initBoot,
.uiScale = UiScale::Smallest,
.createDevices = createDevices,
.spi {
// Display
spi::Configuration {
.device = SPI2_HOST,
.dma = SPI_DMA_DISABLED,
.config = {
.mosi_io_num = GPIO_NUM_11,
.miso_io_num = GPIO_NUM_12,
.sclk_io_num = GPIO_NUM_10,
.quadwp_io_num = GPIO_NUM_NC,
.quadhd_io_num = GPIO_NUM_NC,
.data4_io_num = GPIO_NUM_NC,
.data5_io_num = GPIO_NUM_NC,
.data6_io_num = GPIO_NUM_NC,
.data7_io_num = GPIO_NUM_NC,
.data_io_default_level = false,
.max_transfer_sz = ((240 * (240 / 10)) * LV_COLOR_DEPTH / 8),
.flags = 0,
.isr_cpu_id = ESP_INTR_CPU_AFFINITY_AUTO,
.intr_flags = 0
},
.initMode = spi::InitMode::ByTactility,
.isMutable = false,
.lock = tt::lvgl::getSyncLock() // esp_lvgl_port owns the lock for the display
},
// SD card available via external sd card module and uses VSYS (5V) / GND / IO15 / IO16 / IO17 / IO18 pins.
// Common micro sd card module you'd find on aliexpress with voltage regulator onboard. Others may work.
// JST SH 1.0 Header, GND / VSYS (5V) / RESET / BOOT / GND / 3.3V / IO15 / IO16 / IO17 / IO18 / IO21 / IO33
spi::Configuration {
.device = SPI3_HOST,
.dma = SPI_DMA_CH_AUTO,
.config = {
.mosi_io_num = GPIO_NUM_16,
.miso_io_num = GPIO_NUM_15,
.sclk_io_num = GPIO_NUM_17,
.quadwp_io_num = GPIO_NUM_NC,
.quadhd_io_num = GPIO_NUM_NC,
.data4_io_num = GPIO_NUM_NC,
.data5_io_num = GPIO_NUM_NC,
.data6_io_num = GPIO_NUM_NC,
.data7_io_num = GPIO_NUM_NC,
.data_io_default_level = false,
.max_transfer_sz = 32768,
.flags = 0,
.isr_cpu_id = ESP_INTR_CPU_AFFINITY_AUTO,
.intr_flags = 0
},
.initMode = spi::InitMode::ByTactility,
.isMutable = false,
.lock = nullptr // No custom lock needed
}
}
.createDevices = createDevices
};

View File

@ -1,8 +1,8 @@
#include "SdCard.h"
#include <tactility/device.h>
#include <Tactility/lvgl/LvglSync.h>
#include <Tactility/hal/sdcard/SpiSdCardDevice.h>
#include <Tactility/RecursiveMutex.h>
using tt::hal::sdcard::SpiSdCardDevice;
@ -13,12 +13,16 @@ std::shared_ptr<SdCardDevice> createSdCard() {
GPIO_NUM_NC,
GPIO_NUM_NC,
SdCardDevice::MountBehaviour::AtBoot,
std::make_shared<tt::RecursiveMutex>(),
nullptr,
std::vector<gpio_num_t>(),
SPI3_HOST
);
auto* spi_controller = device_find_by_name("spi1");
check(spi_controller, "spi1 not found");
return std::make_shared<SpiSdCardDevice>(
std::move(configuration)
std::move(configuration),
spi_controller
);
}

View File

@ -18,4 +18,10 @@ shape=circle
dpi=265
[lvgl]
colorDepth=16
colorDepth=16
[sdkconfig]
# Fix error "PSRAM space not enough for the Flash instructions" on boot:
CONFIG_SPIRAM_FETCH_INSTRUCTIONS=n
CONFIG_SPIRAM_RODATA=n
CONFIG_SPIRAM_XIP_FROM_PSRAM=n

View File

@ -3,7 +3,9 @@
#include <tactility/bindings/root.h>
#include <tactility/bindings/esp32_gpio.h>
#include <tactility/bindings/esp32_i2c.h>
#include <tactility/bindings/esp32_spi.h>
// Reference: https://www.waveshare.com/wiki/ESP32-S3-Touch-LCD-1.28
/ {
compatible = "root";
model = "Waveshare S3 Touch LCD 1.28";
@ -13,11 +15,33 @@
gpio-count = <49>;
};
i2c_main {
i2c0 {
compatible = "espressif,esp32-i2c";
port = <I2C_NUM_0>;
clock-frequency = <400000>;
pin-sda = <6>;
pin-scl = <7>;
};
display_spi: spi0 {
compatible = "espressif,esp32-spi";
host = <SPI2_HOST>;
pin-mosi = <11>;
pin-miso = <12>;
pin-sclk = <10>;
pin-wp = <GPIO_PIN_NONE>;
pin-hd = <GPIO_PIN_NONE>;
max-transfer-size = <0>;
};
sdcard_spi: spi1 {
compatible = "espressif,esp32-spi";
host = <SPI3_HOST>;
pin-mosi = <16>;
pin-miso = <15>;
pin-sclk = <17>;
pin-wp = <GPIO_PIN_NONE>;
pin-hd = <GPIO_PIN_NONE>;
max-transfer-size = <0>;
};
};

View File

@ -1,11 +1,7 @@
#include "devices/Display.h"
#include "devices/Sdcard.h"
#include <driver/gpio.h>
#include <Tactility/hal/Configuration.h>
#include <Tactility/lvgl/LvglSync.h>
#define SPI_TRANSFER_SIZE_LIMIT (172 * 320 * (LV_COLOR_DEPTH / 8))
bool initBoot();
@ -21,53 +17,5 @@ static std::vector<std::shared_ptr<tt::hal::Device>> createDevices() {
extern const Configuration hardwareConfiguration = {
.initBoot = initBoot,
.uiScale = UiScale::Smallest,
.createDevices = createDevices,
.spi {
spi::Configuration {
.device = SPI2_HOST,
.dma = SPI_DMA_CH_AUTO,
.config = {
.mosi_io_num = GPIO_NUM_39,
.miso_io_num = GPIO_NUM_NC,
.sclk_io_num = GPIO_NUM_38,
.quadwp_io_num = GPIO_NUM_NC, // Quad SPI LCD driver is not yet supported
.quadhd_io_num = GPIO_NUM_NC, // Quad SPI LCD driver is not yet supported
.data4_io_num = GPIO_NUM_NC,
.data5_io_num = GPIO_NUM_NC,
.data6_io_num = GPIO_NUM_NC,
.data7_io_num = GPIO_NUM_NC,
.data_io_default_level = false,
.max_transfer_sz = SPI_TRANSFER_SIZE_LIMIT,
.flags = 0,
.isr_cpu_id = ESP_INTR_CPU_AFFINITY_AUTO,
.intr_flags = 0
},
.initMode = spi::InitMode::ByTactility,
.isMutable = false,
.lock = tt::lvgl::getSyncLock() // esp_lvgl_port owns the lock for the display
},
spi::Configuration {
.device = SPI3_HOST,
.dma = SPI_DMA_CH_AUTO,
.config = {
.mosi_io_num = GPIO_NUM_15,
.miso_io_num = GPIO_NUM_17,
.sclk_io_num = GPIO_NUM_16,
.data2_io_num = GPIO_NUM_NC,
.data3_io_num = GPIO_NUM_NC,
.data4_io_num = GPIO_NUM_NC,
.data5_io_num = GPIO_NUM_NC,
.data6_io_num = GPIO_NUM_NC,
.data7_io_num = GPIO_NUM_NC,
.data_io_default_level = false,
.max_transfer_sz = SPI_TRANSFER_SIZE_LIMIT,
.flags = 0,
.isr_cpu_id = ESP_INTR_CPU_AFFINITY_AUTO,
.intr_flags = 0
},
.initMode = spi::InitMode::ByTactility,
.isMutable = false,
.lock = nullptr
}
}
.createDevices = createDevices
};

View File

@ -3,8 +3,6 @@
#include <esp_lcd_touch_axs5106.h>
#include <esp_err.h>
constexpr auto* TAG = "AXS5106";
bool Axs5106Touch::createIoHandle(esp_lcd_panel_io_handle_t& outHandle) {
esp_lcd_panel_io_i2c_config_t io_config = ESP_LCD_TOUCH_IO_I2C_AXS5106_CONFIG();
return esp_lcd_new_panel_io_i2c(configuration->port, &io_config, &outHandle) == ESP_OK;

View File

@ -8,7 +8,6 @@ constexpr auto LCD_PIN_DC = GPIO_NUM_45;
constexpr auto LCD_PIN_RESET = GPIO_NUM_40;
constexpr auto LCD_HORIZONTAL_RESOLUTION = 172;
constexpr auto LCD_VERTICAL_RESOLUTION = 320;
constexpr auto LCD_SPI_TRANSFER_HEIGHT = (LCD_VERTICAL_RESOLUTION / 10);
void setBacklightDuty(uint8_t level);

View File

@ -84,9 +84,7 @@ public:
explicit Jd9853Display(std::unique_ptr<Configuration> inConfiguration) :
configuration(std::move(inConfiguration)
) {
assert(configuration != nullptr);
}
) {}
std::string getName() const override { return "JD9853"; }

View File

@ -1,12 +1,12 @@
#include "Sdcard.h"
#include <tactility/device.h>
#include <Tactility/lvgl/LvglSync.h>
#include <Tactility/hal/sdcard/SpiSdCardDevice.h>
using tt::hal::sdcard::SpiSdCardDevice;
constexpr auto SDCARD_PIN_CS = GPIO_NUM_14;
constexpr auto LCD_PIN_CS = GPIO_NUM_21;
std::shared_ptr<SdCardDevice> createSdCard() {
auto configuration = std::make_unique<SpiSdCardDevice::Config>(
@ -15,12 +15,16 @@ std::shared_ptr<SdCardDevice> createSdCard() {
GPIO_NUM_NC,
GPIO_NUM_NC,
SdCardDevice::MountBehaviour::AtBoot,
tt::hal::spi::getLock(SPI3_HOST),
std::vector { LCD_PIN_CS },
nullptr,
std::vector<gpio_num_t> { },
SPI3_HOST
);
auto* spi_controller = device_find_by_name("spi1");
check(spi_controller, "spi1 not found");
return std::make_shared<SpiSdCardDevice>(
std::move(configuration)
std::move(configuration),
spi_controller
);
}

View File

@ -3,7 +3,9 @@
#include <tactility/bindings/root.h>
#include <tactility/bindings/esp32_gpio.h>
#include <tactility/bindings/esp32_i2c.h>
#include <tactility/bindings/esp32_spi.h>
// Reference: https://www.waveshare.com/wiki/ESP32-S3-Touch-LCD-1.47
/ {
compatible = "root";
model = "Waveshare S3 Touch LCD 1.47";
@ -19,7 +21,27 @@
clock-frequency = <400000>;
pin-sda = <42>;
pin-scl = <41>;
pin-sda-pullup;
pin-scl-pullup;
};
display_spi: spi0 {
compatible = "espressif,esp32-spi";
host = <SPI2_HOST>;
pin-mosi = <39>;
pin-miso = <GPIO_PIN_NONE>;
pin-sclk = <38>;
pin-wp = <GPIO_PIN_NONE>;
pin-hd = <GPIO_PIN_NONE>;
max-transfer-size = <0>;
};
sdcard_spi: spi1 {
compatible = "espressif,esp32-spi";
host = <SPI3_HOST>;
pin-mosi = <15>;
pin-miso = <17>;
pin-sclk = <16>;
pin-wp = <GPIO_PIN_NONE>;
pin-hd = <GPIO_PIN_NONE>;
max-transfer-size = <0>;
};
};

View File

@ -1,6 +1,5 @@
#include "devices/Display.h"
#include "devices/SdCard.h"
#include <driver/gpio.h>
#include <Tactility/hal/Configuration.h>
@ -14,31 +13,5 @@ static DeviceVector createDevices() {
}
extern const Configuration hardwareConfiguration = {
.createDevices = createDevices,
.spi {
// SD card
spi::Configuration {
.device = SPI2_HOST,
.dma = SPI_DMA_CH_AUTO,
.config = {
.mosi_io_num = GPIO_NUM_11,
.miso_io_num = GPIO_NUM_13,
.sclk_io_num = GPIO_NUM_12,
.quadwp_io_num = GPIO_NUM_NC,
.quadhd_io_num = GPIO_NUM_NC,
.data4_io_num = GPIO_NUM_NC,
.data5_io_num = GPIO_NUM_NC,
.data6_io_num = GPIO_NUM_NC,
.data7_io_num = GPIO_NUM_NC,
.data_io_default_level = false,
.max_transfer_sz = 8192,
.flags = 0,
.isr_cpu_id = ESP_INTR_CPU_AFFINITY_AUTO,
.intr_flags = 0
},
.initMode = spi::InitMode::ByTactility,
.isMutable = false,
.lock = nullptr
}
}
.createDevices = createDevices
};

View File

@ -1,6 +1,8 @@
#include "SdCard.h"
#include <tactility/device.h>
#include <Tactility/hal/sdcard/SpiSdCardDevice.h>
#include <Tactility/lvgl/LvglSync.h>
using tt::hal::sdcard::SpiSdCardDevice;
@ -10,10 +12,15 @@ std::shared_ptr<SdCardDevice> createSdCard() {
GPIO_NUM_NC,
GPIO_NUM_NC,
GPIO_NUM_NC,
SdCardDevice::MountBehaviour::AtBoot
SdCardDevice::MountBehaviour::AtBoot,
tt::lvgl::getSyncLock()
);
auto* spi_controller = device_find_by_name("spi0");
check(spi_controller, "spi0 not found");
return std::make_shared<SpiSdCardDevice>(
std::move(configuration)
std::move(configuration),
spi_controller
);
}

View File

@ -3,6 +3,7 @@
#include <tactility/bindings/root.h>
#include <tactility/bindings/esp32_gpio.h>
#include <tactility/bindings/esp32_i2c.h>
#include <tactility/bindings/esp32_spi.h>
#include <tactility/bindings/esp32_uart.h>
/ {
@ -20,8 +21,17 @@
clock-frequency = <400000>;
pin-sda = <8>;
pin-scl = <9>;
pin-sda-pullup;
pin-scl-pullup;
};
spi0 {
compatible = "espressif,esp32-spi";
host = <SPI2_HOST>;
pin-mosi = <11>;
pin-miso = <13>;
pin-sclk = <12>;
pin-wp = <GPIO_PIN_NONE>;
pin-hd = <GPIO_PIN_NONE>;
max-transfer-size = <0>;
};
uart1 {

View File

@ -19,7 +19,5 @@
clock-frequency = <400000>;
pin-sda = <6>;
pin-scl = <5>;
pin-sda-pullup;
pin-scl-pullup;
};
};

View File

@ -14,6 +14,7 @@
- Make a root device type so it can be discovered more easily.
- DTS/yaml: Consider support for default values.
- DTS: throw custom exceptions and catch them to show cleaner error messages.
- When device.py selects a new device, it should automatically delete the build dirs (build/, cmake-*/) when it detects that the platform has changed.
- Add font design tokens such as "regular", "title" and "smaller". Perhaps via the LVGL kernel module.
- Add kernel listening mechanism so that the root device init can be notified when a device becomes available:
Callback for device/start stop with filtering on device type:

View File

@ -1,6 +1,5 @@
#pragma once
#include <Tactility/Lock.h>
#include <tactility/check.h>
#include <Tactility/hal/display/DisplayDevice.h>

View File

@ -65,7 +65,7 @@ protected:
public:
EspLcdDisplayV2(const std::shared_ptr<EspLcdConfiguration>& configuration) :
explicit EspLcdDisplayV2(const std::shared_ptr<EspLcdConfiguration>& configuration) :
configuration(configuration)
{
assert(configuration != nullptr);

View File

@ -12,8 +12,6 @@
class Gc9a01Display final : public EspLcdDisplay {
std::shared_ptr<tt::Lock> lock;
public:
class Configuration {
@ -82,12 +80,8 @@ private:
public:
explicit Gc9a01Display(std::unique_ptr<Configuration> inConfiguration) :
EspLcdDisplay(tt::hal::spi::getLock(inConfiguration->spiHostDevice)),
configuration(std::move(inConfiguration)
) {
assert(configuration != nullptr);
assert(getLock() != nullptr);
}
) {}
std::string getName() const override { return "GC9A01"; }

View File

@ -28,7 +28,7 @@ public:
bool mirrorX = false,
bool mirrorY = false,
bool invertColor = false,
uint32_t bufferSize = 0 // Size in pixel count. 0 means default, which is 1/20 of the screen size
uint32_t bufferSize = 0 // Size in pixel count. 0 means default, which is 1/10 of the screen size
) : spiHostDevice(spiHostDevice),
csPin(csPin),
dcPin(dcPin),

View File

@ -12,8 +12,6 @@
class St7735Display final : public EspLcdDisplay {
std::shared_ptr<tt::Lock> lock;
public:
class Configuration {

View File

@ -78,7 +78,6 @@ private:
public:
explicit St7796Display(std::unique_ptr<Configuration> inConfiguration) :
EspLcdDisplay(tt::hal::spi::getLock(inConfiguration->spiHostDevice)),
configuration(std::move(inConfiguration)
) {
assert(configuration != nullptr);

View File

@ -12,12 +12,12 @@ extern struct LvglModuleConfig lvgl_module_config;
static bool initialized = false;
bool lvgl_lock(void) {
if (!initialized) return true; // We allow (ake) locking because it's safe to do so as LVGL is not running yet
if (!initialized) return true; // We allow (fake) locking because it's safe to do so as LVGL is not running yet
return lvgl_port_lock(portMAX_DELAY);
}
bool lvgl_try_lock_timed(uint32_t timeout) {
if (!initialized) return true; // We allow (ake) locking because it's safe to do so as LVGL is not running yet
if (!initialized) return true; // We allow (fake) locking because it's safe to do so as LVGL is not running yet
return lvgl_port_lock(millis_to_ticks(timeout));
}

View File

@ -20,7 +20,6 @@ enum class UiScale {
struct Configuration {
/**
* Called before I2C/SPI/etc is initialized.
* Used for powering on the peripherals manually.
*/
const InitBoot initBoot = nullptr;

View File

@ -858,7 +858,7 @@ static void dispatchDisconnectButKeepActive(std::shared_ptr<Wifi> wifi) {
static bool shouldScanForAutoConnect(std::shared_ptr<Wifi> wifi) {
auto lock = wifi->dataMutex.asScopedLock();
if (!lock.lock(100)) {
if (!lock.lock(100 / portTICK_PERIOD_MS)) {
return false;
}
@ -893,7 +893,7 @@ std::string getIp() {
auto wifi = std::static_pointer_cast<Wifi>(wifi_singleton);
auto lock = wifi->dataMutex.asScopedLock();
if (!lock.lock(100)) {
if (!lock.lock(100 / portTICK_PERIOD_MS)) {
return "0.0.0.0";
}

View File

@ -90,19 +90,28 @@ const esp_elfsym main_symbols[] {
// esp_sntp.h
ESP_ELFSYM_EXPORT(sntp_get_sync_status),
// math.h
ESP_ELFSYM_EXPORT(acos),
ESP_ELFSYM_EXPORT(acoshf),
ESP_ELFSYM_EXPORT(acosf),
ESP_ELFSYM_EXPORT(asin),
ESP_ELFSYM_EXPORT(asinhf),
ESP_ELFSYM_EXPORT(asinf),
ESP_ELFSYM_EXPORT(atan),
ESP_ELFSYM_EXPORT(atanhf),
ESP_ELFSYM_EXPORT(atanf),
ESP_ELFSYM_EXPORT(cos),
ESP_ELFSYM_EXPORT(coshf),
ESP_ELFSYM_EXPORT(cosf),
ESP_ELFSYM_EXPORT(sin),
ESP_ELFSYM_EXPORT(sinhf),
ESP_ELFSYM_EXPORT(sinf),
ESP_ELFSYM_EXPORT(tan),
ESP_ELFSYM_EXPORT(tanhf),
ESP_ELFSYM_EXPORT(tanf),
ESP_ELFSYM_EXPORT(frexp),
ESP_ELFSYM_EXPORT(frexpf),
ESP_ELFSYM_EXPORT(modf),
ESP_ELFSYM_EXPORT(modff),
ESP_ELFSYM_EXPORT(fmodf),
ESP_ELFSYM_EXPORT(ceil),
ESP_ELFSYM_EXPORT(ceilf),
ESP_ELFSYM_EXPORT(fabs),

View File

@ -10,7 +10,7 @@ namespace tt {
class SpiDeviceLock : public Lock {
::Device* device;
public:
SpiDeviceLock(::Device* device) : device(device) { }
explicit SpiDeviceLock(::Device* device) : device(device) { }
bool lock(TickType_t timeout) const override {
return spi_controller_try_lock(device, timeout) == ERROR_NONE;