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 type = property.type
if type == "value": if type == "value":
return property.value return property.value
if type == "boolean":
return "true"
elif type == "text": elif type == "text":
return f"\"{property.value}\"" return f"\"{property.value}\""
elif type == "values": elif type == "values":

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -6,12 +6,9 @@
#include <driver/gpio.h> #include <driver/gpio.h>
#include <Tactility/hal/Configuration.h> #include <Tactility/hal/Configuration.h>
#include <Tactility/lvgl/LvglSync.h>
#include <Bq25896.h> #include <Bq25896.h>
#include <Drv2605.h> #include <Drv2605.h>
#define TPAGER_SPI_TRANSFER_SIZE_LIMIT (480 * 222 * (LV_COLOR_DEPTH / 8))
bool tpagerInit(); bool tpagerInit();
using namespace tt::hal; using namespace tt::hal;
@ -38,28 +35,5 @@ static DeviceVector createDevices() {
extern const Configuration hardwareConfiguration = { extern const Configuration hardwareConfiguration = {
.initBoot = tpagerInit, .initBoot = tpagerInit,
.createDevices = createDevices, .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
}}
}; };

View File

@ -1,5 +1,6 @@
#include "SdCard.h" #include "SdCard.h"
#include <tactility/device.h>
#include <Tactility/hal/sdcard/SpiSdCardDevice.h> #include <Tactility/hal/sdcard/SpiSdCardDevice.h>
#include <Tactility/lvgl/LvglSync.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>( 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_gpio.h>
#include <tactility/bindings/esp32_i2c.h> #include <tactility/bindings/esp32_i2c.h>
#include <tactility/bindings/esp32_i2s.h> #include <tactility/bindings/esp32_i2s.h>
#include <tactility/bindings/esp32_spi.h>
#include <tactility/bindings/esp32_uart.h> #include <tactility/bindings/esp32_uart.h>
// Reference: https://wiki.lilygo.cc/get_started/en/LoRa_GPS/T-LoraPager/T-LoraPager.html#Pin-Overview // Reference: https://wiki.lilygo.cc/get_started/en/LoRa_GPS/T-LoraPager/T-LoraPager.html#Pin-Overview
@ -24,6 +25,17 @@
pin-scl = <2>; 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 // ES8311
// TODO: init via I2C to enable audio playback // TODO: init via I2C to enable audio playback
i2s0 { i2s0 {

View File

@ -5,14 +5,13 @@
#include <driver/gpio.h> #include <driver/gpio.h>
#include <Tactility/hal/Configuration.h> #include <Tactility/hal/Configuration.h>
#include <Tactility/lvgl/LvglSync.h>
#include <PwmBacklight.h> #include <PwmBacklight.h>
#include <Tca8418.h> #include <Tca8418.h>
using namespace tt::hal; using namespace tt::hal;
bool initBoot() { static bool initBoot() {
return driver::pwmbacklight::init(LCD_PIN_BACKLIGHT, 512); return driver::pwmbacklight::init(LCD_PIN_BACKLIGHT, 512);
} }
@ -30,55 +29,5 @@ static DeviceVector createDevices() {
extern const Configuration hardwareConfiguration = { extern const Configuration hardwareConfiguration = {
.initBoot = initBoot, .initBoot = initBoot,
.uiScale = UiScale::Smallest, .uiScale = UiScale::Smallest,
.createDevices = createDevices, .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
},
}
}; };

View File

@ -1,5 +1,6 @@
#include "SdCard.h" #include "SdCard.h"
#include <tactility/device.h>
#include <Tactility/hal/sdcard/SpiSdCardDevice.h> #include <Tactility/hal/sdcard/SpiSdCardDevice.h>
constexpr auto SDCARD_PIN_CS = GPIO_NUM_12; constexpr auto SDCARD_PIN_CS = GPIO_NUM_12;
@ -14,12 +15,16 @@ std::shared_ptr<SdCardDevice> createSdCard() {
GPIO_NUM_NC, GPIO_NUM_NC,
GPIO_NUM_NC, GPIO_NUM_NC,
SdCardDevice::MountBehaviour::AtBoot, SdCardDevice::MountBehaviour::AtBoot,
tt::hal::spi::getLock(SPI3_HOST), nullptr,
std::vector { EXPANSION_HEADER_PIN_CS }, std::vector { EXPANSION_HEADER_PIN_CS },
SPI3_HOST SPI3_HOST
); );
auto* spi_controller = device_find_by_name("spi1");
check(spi_controller, "spi1 not found");
return std::make_shared<SpiSdCardDevice>( 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_gpio.h>
#include <tactility/bindings/esp32_i2c.h> #include <tactility/bindings/esp32_i2c.h>
#include <tactility/bindings/esp32_i2s.h> #include <tactility/bindings/esp32_i2s.h>
#include <tactility/bindings/esp32_spi.h>
#include <tactility/bindings/esp32_uart.h> #include <tactility/bindings/esp32_uart.h>
// Reference: https://docs.m5stack.com/en/core/Cardputer-Adv // Reference: https://docs.m5stack.com/en/core/Cardputer-Adv
@ -22,8 +23,6 @@
clock-frequency = <400000>; clock-frequency = <400000>;
pin-sda = <8>; pin-sda = <8>;
pin-scl = <9>; pin-scl = <9>;
pin-sda-pullup;
pin-scl-pullup;
}; };
i2c_port_a { i2c_port_a {
@ -32,8 +31,28 @@
clock-frequency = <400000>; clock-frequency = <400000>;
pin-sda = <2>; pin-sda = <2>;
pin-scl = <1>; 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) // Speaker and microphone (ES8311)

View File

@ -7,7 +7,6 @@
#include <PwmBacklight.h> #include <PwmBacklight.h>
#include <Tactility/hal/Configuration.h> #include <Tactility/hal/Configuration.h>
#include <Tactility/lvgl/LvglSync.h>
using namespace tt::hal; using namespace tt::hal;
@ -28,56 +27,5 @@ static DeviceVector createDevices() {
extern const Configuration hardwareConfiguration = { extern const Configuration hardwareConfiguration = {
.initBoot = initBoot, .initBoot = initBoot,
.uiScale = UiScale::Smallest, .uiScale = UiScale::Smallest,
.createDevices = createDevices, .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
},
}
}; };

View File

@ -1,5 +1,6 @@
#include "SdCard.h" #include "SdCard.h"
#include <tactility/device.h>
#include <Tactility/hal/sdcard/SpiSdCardDevice.h> #include <Tactility/hal/sdcard/SpiSdCardDevice.h>
constexpr auto SDCARD_PIN_CS = GPIO_NUM_12; constexpr auto SDCARD_PIN_CS = GPIO_NUM_12;
@ -13,12 +14,16 @@ std::shared_ptr<SdCardDevice> createSdCard() {
GPIO_NUM_NC, GPIO_NUM_NC,
GPIO_NUM_NC, GPIO_NUM_NC,
SdCardDevice::MountBehaviour::AtBoot, SdCardDevice::MountBehaviour::AtBoot,
tt::hal::spi::getLock(SPI3_HOST), nullptr,
std::vector<gpio_num_t>(), std::vector<gpio_num_t>(),
SPI3_HOST SPI3_HOST
); );
auto* spi_controller = device_find_by_name("spi1");
check(spi_controller, "spi1 not found");
return std::make_shared<SpiSdCardDevice>( 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_gpio.h>
#include <tactility/bindings/esp32_i2c.h> #include <tactility/bindings/esp32_i2c.h>
#include <tactility/bindings/esp32_i2s.h> #include <tactility/bindings/esp32_i2s.h>
#include <tactility/bindings/esp32_spi.h>
#include <tactility/bindings/esp32_uart.h> #include <tactility/bindings/esp32_uart.h>
// Reference: https://docs.m5stack.com/en/core/Cardputer // Reference: https://docs.m5stack.com/en/core/Cardputer
@ -22,8 +23,28 @@
clock-frequency = <400000>; clock-frequency = <400000>;
pin-sda = <2>; pin-sda = <2>;
pin-scl = <1>; 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 // Speaker and microphone

View File

@ -1,14 +1,12 @@
#include "devices/Display.h" #include "devices/Display.h"
#include "devices/SdCard.h" #include "devices/SdCard.h"
#include "devices/Power.h" #include "devices/Power.h"
#include <driver/gpio.h>
#include <Tactility/hal/Configuration.h> #include <Tactility/hal/Configuration.h>
#include <Tactility/lvgl/LvglSync.h>
using namespace tt::hal; using namespace tt::hal;
bool initBoot() { static bool initBoot() {
return initAxp(); return initAxp();
} }
@ -22,30 +20,5 @@ static DeviceVector createDevices() {
extern const Configuration hardwareConfiguration = { extern const Configuration hardwareConfiguration = {
.initBoot = initBoot, .initBoot = initBoot,
.createDevices = createDevices, .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
}
}
}; };

View File

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

View File

@ -1,5 +1,6 @@
#include "SdCard.h" #include "SdCard.h"
#include <tactility/device.h>
#include <Tactility/hal/sdcard/SpiSdCardDevice.h> #include <Tactility/hal/sdcard/SpiSdCardDevice.h>
#include <Tactility/lvgl/LvglSync.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>( 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_gpio.h>
#include <tactility/bindings/esp32_i2c.h> #include <tactility/bindings/esp32_i2c.h>
#include <tactility/bindings/esp32_i2s.h> #include <tactility/bindings/esp32_i2s.h>
#include <tactility/bindings/esp32_spi.h>
#include <tactility/bindings/esp32_uart.h> #include <tactility/bindings/esp32_uart.h>
// Reference: https://docs.m5stack.com/en/core/Core2 // Reference: https://docs.m5stack.com/en/core/Core2
@ -22,8 +23,6 @@
clock-frequency = <400000>; clock-frequency = <400000>;
pin-sda = <21>; pin-sda = <21>;
pin-scl = <22>; pin-scl = <22>;
pin-sda-pullup;
pin-scl-pullup;
}; };
i2c_port_a { i2c_port_a {
@ -32,8 +31,17 @@
clock-frequency = <400000>; clock-frequency = <400000>;
pin-sda = <32>; pin-sda = <32>;
pin-scl = <33>; 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 // NS4168: Speaker and microphone

View File

@ -4,7 +4,6 @@
#include <driver/gpio.h> #include <driver/gpio.h>
#include <Tactility/hal/Configuration.h> #include <Tactility/hal/Configuration.h>
#include <Tactility/lvgl/LvglSync.h>
#include <Axp2101Power.h> #include <Axp2101Power.h>
using namespace tt::hal; using namespace tt::hal;
@ -21,30 +20,5 @@ static DeviceVector createDevices() {
extern const Configuration hardwareConfiguration = { extern const Configuration hardwareConfiguration = {
.initBoot = initBoot, .initBoot = initBoot,
.createDevices = createDevices, .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
}
}
}; };

View File

@ -5,7 +5,7 @@
#include <driver/spi_common.h> #include <driver/spi_common.h>
// Display // 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_CS = GPIO_NUM_3;
constexpr auto LCD_PIN_DC = GPIO_NUM_35; constexpr auto LCD_PIN_DC = GPIO_NUM_35;
constexpr auto LCD_HORIZONTAL_RESOLUTION = 320; constexpr auto LCD_HORIZONTAL_RESOLUTION = 320;

View File

@ -1,5 +1,6 @@
#include "SdCard.h" #include "SdCard.h"
#include <tactility/device.h>
#include <Tactility/lvgl/LvglSync.h> #include <Tactility/lvgl/LvglSync.h>
#include <Tactility/hal/sdcard/SpiSdCardDevice.h> #include <Tactility/hal/sdcard/SpiSdCardDevice.h>
@ -16,13 +17,14 @@ std::shared_ptr<SdCardDevice> createSdCard() {
GPIO_NUM_NC, GPIO_NUM_NC,
SdCardDevice::MountBehaviour::AtBoot, SdCardDevice::MountBehaviour::AtBoot,
tt::lvgl::getSyncLock(), tt::lvgl::getSyncLock(),
std::vector { std::vector { CORES3_LCD_PIN_CS }
CORES3_LCD_PIN_CS
},
SPI3_HOST
); );
auto* spi_controller = device_find_by_name("spi0");
check(spi_controller, "spi0 not found");
return std::make_shared<SpiSdCardDevice>( 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_gpio.h>
#include <tactility/bindings/esp32_i2c.h> #include <tactility/bindings/esp32_i2c.h>
#include <tactility/bindings/esp32_i2s.h> #include <tactility/bindings/esp32_i2s.h>
#include <tactility/bindings/esp32_spi.h>
#include <tactility/bindings/esp32_uart.h> #include <tactility/bindings/esp32_uart.h>
// Reference: https://docs.m5stack.com/en/core/CoreS3 // Reference: https://docs.m5stack.com/en/core/CoreS3
@ -22,8 +23,6 @@
clock-frequency = <400000>; clock-frequency = <400000>;
pin-sda = <12>; pin-sda = <12>;
pin-scl = <11>; pin-scl = <11>;
pin-sda-pullup;
pin-scl-pullup;
}; };
i2c_port_a { i2c_port_a {
@ -32,18 +31,14 @@
clock-frequency = <400000>; clock-frequency = <400000>;
pin-sda = <2>; pin-sda = <2>;
pin-scl = <1>; pin-scl = <1>;
pin-sda-pullup;
pin-scl-pullup;
}; };
/*
i2c_port_b { i2c_port_b {
compatible = "espressif,esp32-i2c"; compatible = "espressif,esp32-i2c";
port = <I2C_NUM_1>; port = <I2C_NUM_1>;
clock-frequency = <400000>; clock-frequency = <400000>;
pin-sda = <9>; pin-sda = <9>;
pin-scl = <8>; pin-scl = <8>;
pin-sda-pullup;
pin-scl-pullup;
}; };
i2c_port_c { i2c_port_c {
@ -52,8 +47,17 @@
clock-frequency = <400000>; clock-frequency = <400000>;
pin-sda = <18>; pin-sda = <18>;
pin-scl = <17>; 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 // 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/Display.h"
#include "devices/SdCard.h" #include "devices/SdCard.h"
#include <driver/gpio.h>
#include <Tactility/hal/Configuration.h> #include <Tactility/hal/Configuration.h>
#include <Tactility/lvgl/LvglSync.h>
using namespace tt::hal; using namespace tt::hal;
@ -17,30 +15,5 @@ static DeviceVector createDevices() {
extern const Configuration hardwareConfiguration = { extern const Configuration hardwareConfiguration = {
.initBoot = nullptr, .initBoot = nullptr,
.createDevices = createDevices, .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()
}
}
}; };

View File

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

View File

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

View File

@ -3,6 +3,7 @@
#include <tactility/bindings/root.h> #include <tactility/bindings/root.h>
#include <tactility/bindings/esp32_gpio.h> #include <tactility/bindings/esp32_gpio.h>
#include <tactility/bindings/esp32_i2c.h> #include <tactility/bindings/esp32_i2c.h>
#include <tactility/bindings/esp32_spi.h>
/ { / {
compatible = "root"; compatible = "root";
@ -19,7 +20,16 @@
clock-frequency = <400000>; clock-frequency = <400000>;
pin-sda = <41>; pin-sda = <41>;
pin-scl = <42>; 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/Display.h"
#include "devices/Power.h" #include "devices/Power.h"
#include <driver/gpio.h>
#include <Tactility/hal/Configuration.h> #include <Tactility/hal/Configuration.h>
#include <Tactility/lvgl/LvglSync.h>
#include <ButtonControl.h> #include <ButtonControl.h>
using namespace tt::hal; using namespace tt::hal;
bool initBoot() { static bool initBoot() {
// CH552 applies 4 V to GPIO 0, which reduces Wi-Fi sensitivity // 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: // Setting output to high adds a bias of 3.3 V and suppresses over-voltage:
gpio::configure(0, gpio::Mode::Output, false, false); gpio::configure(0, gpio::Mode::Output, false, false);
@ -28,30 +26,5 @@ static DeviceVector createDevices() {
extern const Configuration hardwareConfiguration = { extern const Configuration hardwareConfiguration = {
.initBoot = initBoot, .initBoot = initBoot,
.uiScale = UiScale::Smallest, .uiScale = UiScale::Smallest,
.createDevices = createDevices, .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
}
}
}; };

View File

@ -3,6 +3,7 @@
#include <tactility/bindings/root.h> #include <tactility/bindings/root.h>
#include <tactility/bindings/esp32_gpio.h> #include <tactility/bindings/esp32_gpio.h>
#include <tactility/bindings/esp32_i2c.h> #include <tactility/bindings/esp32_i2c.h>
#include <tactility/bindings/esp32_spi.h>
#include <tactility/bindings/esp32_uart.h> #include <tactility/bindings/esp32_uart.h>
/ { / {
@ -20,8 +21,6 @@
clock-frequency = <400000>; clock-frequency = <400000>;
pin-sda = <21>; pin-sda = <21>;
pin-scl = <22>; pin-scl = <22>;
pin-sda-pullup;
pin-scl-pullup;
}; };
i2c_grove { i2c_grove {
@ -30,8 +29,17 @@
clock-frequency = <400000>; clock-frequency = <400000>;
pin-sda = <32>; pin-sda = <32>;
pin-scl = <33>; 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 { uart_grove: uart1 {

View File

@ -2,7 +2,6 @@
#include <driver/gpio.h> #include <driver/gpio.h>
#include <Tactility/hal/Configuration.h> #include <Tactility/hal/Configuration.h>
#include <Tactility/lvgl/LvglSync.h>
#include <ButtonControl.h> #include <ButtonControl.h>
#include <PwmBacklight.h> #include <PwmBacklight.h>
@ -30,30 +29,5 @@ static DeviceVector createDevices() {
extern const Configuration hardwareConfiguration = { extern const Configuration hardwareConfiguration = {
.initBoot = initBoot, .initBoot = initBoot,
.uiScale = UiScale::Smallest, .uiScale = UiScale::Smallest,
.createDevices = createDevices, .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
}
}
}; };

View File

@ -2,6 +2,7 @@
#include <tactility/bindings/root.h> #include <tactility/bindings/root.h>
#include <tactility/bindings/esp32_gpio.h> #include <tactility/bindings/esp32_gpio.h>
#include <tactility/bindings/esp32_i2c.h> #include <tactility/bindings/esp32_i2c.h>
#include <tactility/bindings/esp32_spi.h>
#include <tactility/bindings/esp32_uart.h> #include <tactility/bindings/esp32_uart.h>
/ { / {
@ -19,8 +20,6 @@
clock-frequency = <400000>; clock-frequency = <400000>;
pin-sda = <21>; pin-sda = <21>;
pin-scl = <22>; pin-scl = <22>;
pin-sda-pullup;
pin-scl-pullup;
}; };
i2c_grove { i2c_grove {
@ -29,8 +28,17 @@
clock-frequency = <400000>; clock-frequency = <400000>;
pin-sda = <32>; pin-sda = <32>;
pin-scl = <33>; 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 { uart_grove: uart1 {

View File

@ -88,31 +88,5 @@ static bool initBoot() {
extern const Configuration hardwareConfiguration = { extern const Configuration hardwareConfiguration = {
.initBoot = initBoot, .initBoot = initBoot,
.createDevices = createDevices, .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
}
}
}; };

View File

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

View File

@ -1,5 +1,6 @@
#include "SdCard.h" #include "SdCard.h"
#include <tactility/device.h>
#include <Tactility/hal/sdcard/SpiSdCardDevice.h> #include <Tactility/hal/sdcard/SpiSdCardDevice.h>
constexpr auto SDCARD_PIN_CS = GPIO_NUM_42; 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, GPIO_NUM_NC,
GPIO_NUM_NC, GPIO_NUM_NC,
SdCardDevice::MountBehaviour::AtBoot, SdCardDevice::MountBehaviour::AtBoot
tt::hal::spi::getLock(SPI3_HOST),
std::vector<gpio_num_t>(),
SPI3_HOST
); );
auto* spi_controller = device_find_by_name("spi0");
check(spi_controller, "spi0 not found");
return std::make_shared<SpiSdCardDevice>( 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/root.h>
#include <tactility/bindings/esp32_gpio.h> #include <tactility/bindings/esp32_gpio.h>
#include <tactility/bindings/esp32_i2c.h> #include <tactility/bindings/esp32_i2c.h>
#include <tactility/bindings/esp32_spi.h>
/ { / {
compatible = "root"; compatible = "root";
@ -19,8 +20,6 @@
clock-frequency = <400000>; clock-frequency = <400000>;
pin-sda = <31>; pin-sda = <31>;
pin-scl = <32>; pin-scl = <32>;
pin-sda-pullup;
pin-scl-pullup;
}; };
i2c_port_a { i2c_port_a {
@ -29,7 +28,16 @@
clock-frequency = <400000>; clock-frequency = <400000>;
pin-sda = <53>; pin-sda = <53>;
pin-scl = <54>; 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 "UnPhoneFeatures.h"
#include "devices/Hx8357Display.h" #include "devices/Hx8357Display.h"
#include "devices/SdCard.h" #include "devices/SdCard.h"
#include <driver/gpio.h>
#include <Tactility/hal/Configuration.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(); bool initBoot();
@ -19,30 +15,5 @@ static tt::hal::DeviceVector createDevices() {
extern const tt::hal::Configuration hardwareConfiguration = { extern const tt::hal::Configuration hardwareConfiguration = {
.initBoot = initBoot, .initBoot = initBoot,
.createDevices = createDevices, .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
}
}
}; };

View File

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

View File

@ -1,5 +1,6 @@
#include "SdCard.h" #include "SdCard.h"
#include <tactility/device.h>
#include <Tactility/lvgl/LvglSync.h> #include <Tactility/lvgl/LvglSync.h>
#include <Tactility/hal/sdcard/SpiSdCardDevice.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>( 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/root.h>
#include <tactility/bindings/esp32_gpio.h> #include <tactility/bindings/esp32_gpio.h>
#include <tactility/bindings/esp32_i2c.h> #include <tactility/bindings/esp32_i2c.h>
#include <tactility/bindings/esp32_spi.h>
/ { / {
compatible = "root"; compatible = "root";
@ -19,7 +20,16 @@
clock-frequency = <400000>; clock-frequency = <400000>;
pin-sda = <3>; pin-sda = <3>;
pin-scl = <4>; 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/Display.h"
#include "devices/SdCard.h" #include "devices/SdCard.h"
#include <driver/gpio.h>
#include <Tactility/hal/Configuration.h> #include <Tactility/hal/Configuration.h>
#include <Tactility/lvgl/LvglSync.h>
#include <PwmBacklight.h> #include <PwmBacklight.h>
#include <ButtonControl.h> #include <ButtonControl.h>
@ -24,31 +22,5 @@ static bool initBoot() {
extern const Configuration hardwareConfiguration = { extern const Configuration hardwareConfiguration = {
.initBoot = initBoot, .initBoot = initBoot,
.uiScale = UiScale::Smallest, .uiScale = UiScale::Smallest,
.createDevices = createDevices, .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
}
}
}; };

View File

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

View File

@ -3,6 +3,7 @@
#include <tactility/bindings/root.h> #include <tactility/bindings/root.h>
#include <tactility/bindings/esp32_gpio.h> #include <tactility/bindings/esp32_gpio.h>
#include <tactility/bindings/esp32_i2c.h> #include <tactility/bindings/esp32_i2c.h>
#include <tactility/bindings/esp32_spi.h>
#include <tactility/bindings/esp32_uart.h> #include <tactility/bindings/esp32_uart.h>
/ { / {
@ -20,8 +21,17 @@
clock-frequency = <400000>; clock-frequency = <400000>;
pin-sda = <16>; pin-sda = <16>;
pin-scl = <17>; 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 { uart0 {

View File

@ -3,7 +3,6 @@
#include <driver/gpio.h> #include <driver/gpio.h>
#include <Tactility/hal/Configuration.h> #include <Tactility/hal/Configuration.h>
#include <Tactility/lvgl/LvglSync.h>
#include <PwmBacklight.h> #include <PwmBacklight.h>
using namespace tt::hal; using namespace tt::hal;
@ -22,55 +21,5 @@ static bool initBoot() {
extern const Configuration hardwareConfiguration = { extern const Configuration hardwareConfiguration = {
.initBoot = initBoot, .initBoot = initBoot,
.uiScale = UiScale::Smallest, .uiScale = UiScale::Smallest,
.createDevices = createDevices, .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
}
}
}; };

View File

@ -8,4 +8,3 @@ constexpr auto LCD_HORIZONTAL_RESOLUTION = 240;
constexpr auto LCD_VERTICAL_RESOLUTION = 240; constexpr auto LCD_VERTICAL_RESOLUTION = 240;
constexpr auto LCD_BUFFER_HEIGHT = LCD_VERTICAL_RESOLUTION / 3; constexpr auto LCD_BUFFER_HEIGHT = LCD_VERTICAL_RESOLUTION / 3;
constexpr auto LCD_BUFFER_SIZE = LCD_HORIZONTAL_RESOLUTION * LCD_BUFFER_HEIGHT; 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/lvgl/LvglSync.h>
#include <Tactility/hal/sdcard/SpiSdCardDevice.h> #include <Tactility/hal/sdcard/SpiSdCardDevice.h>
#include <Tactility/RecursiveMutex.h> #include <Tactility/RecursiveMutex.h>
#include <driver/gpio.h>
using tt::hal::sdcard::SpiSdCardDevice; using tt::hal::sdcard::SpiSdCardDevice;
@ -13,12 +14,16 @@ std::shared_ptr<SdCardDevice> createSdCard() {
GPIO_NUM_NC, GPIO_NUM_NC,
GPIO_NUM_NC, GPIO_NUM_NC,
SdCardDevice::MountBehaviour::AtBoot, SdCardDevice::MountBehaviour::AtBoot,
std::make_shared<tt::RecursiveMutex>(), nullptr,
std::vector<gpio_num_t>(), std::vector<gpio_num_t>(),
SPI3_HOST SPI3_HOST
); );
auto* spi_controller = device_find_by_name("spi1");
check(spi_controller, "spi1 not found");
return std::make_shared<SpiSdCardDevice>( 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/root.h>
#include <tactility/bindings/esp32_gpio.h> #include <tactility/bindings/esp32_gpio.h>
#include <tactility/bindings/esp32_i2c.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"; compatible = "root";
model = "Waveshare S3 LCD 1.3"; model = "Waveshare S3 LCD 1.3";
@ -19,7 +21,27 @@
clock-frequency = <400000>; clock-frequency = <400000>;
pin-sda = <47>; pin-sda = <47>;
pin-scl = <48>; 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/Display.h"
#include "devices/SdCard.h"
#include <driver/gpio.h> #include <driver/gpio.h>
#include <Tactility/hal/Configuration.h> #include <Tactility/hal/Configuration.h>
#include <Tactility/lvgl/LvglSync.h>
#include <PwmBacklight.h> #include <PwmBacklight.h>
using namespace tt::hal; using namespace tt::hal;
@ -12,8 +10,7 @@ constexpr auto* TAG = "Waveshare";
static DeviceVector createDevices() { static DeviceVector createDevices() {
return { return {
createDisplay(), createDisplay()
createSdCard()
}; };
} }
@ -24,57 +21,5 @@ static bool initBoot() {
extern const Configuration hardwareConfiguration = { extern const Configuration hardwareConfiguration = {
.initBoot = initBoot, .initBoot = initBoot,
.uiScale = UiScale::Smallest, .uiScale = UiScale::Smallest,
.createDevices = createDevices, .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
}
}
}; };

View File

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

View File

@ -18,4 +18,10 @@ shape=circle
dpi=265 dpi=265
[lvgl] [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/root.h>
#include <tactility/bindings/esp32_gpio.h> #include <tactility/bindings/esp32_gpio.h>
#include <tactility/bindings/esp32_i2c.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"; compatible = "root";
model = "Waveshare S3 Touch LCD 1.28"; model = "Waveshare S3 Touch LCD 1.28";
@ -13,11 +15,33 @@
gpio-count = <49>; gpio-count = <49>;
}; };
i2c_main { i2c0 {
compatible = "espressif,esp32-i2c"; compatible = "espressif,esp32-i2c";
port = <I2C_NUM_0>; port = <I2C_NUM_0>;
clock-frequency = <400000>; clock-frequency = <400000>;
pin-sda = <6>; pin-sda = <6>;
pin-scl = <7>; 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/Display.h"
#include "devices/Sdcard.h" #include "devices/Sdcard.h"
#include <driver/gpio.h>
#include <Tactility/hal/Configuration.h> #include <Tactility/hal/Configuration.h>
#include <Tactility/lvgl/LvglSync.h>
#define SPI_TRANSFER_SIZE_LIMIT (172 * 320 * (LV_COLOR_DEPTH / 8))
bool initBoot(); bool initBoot();
@ -21,53 +17,5 @@ static std::vector<std::shared_ptr<tt::hal::Device>> createDevices() {
extern const Configuration hardwareConfiguration = { extern const Configuration hardwareConfiguration = {
.initBoot = initBoot, .initBoot = initBoot,
.uiScale = UiScale::Smallest, .uiScale = UiScale::Smallest,
.createDevices = createDevices, .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
}
}
}; };

View File

@ -3,8 +3,6 @@
#include <esp_lcd_touch_axs5106.h> #include <esp_lcd_touch_axs5106.h>
#include <esp_err.h> #include <esp_err.h>
constexpr auto* TAG = "AXS5106";
bool Axs5106Touch::createIoHandle(esp_lcd_panel_io_handle_t& outHandle) { 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(); 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; 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_PIN_RESET = GPIO_NUM_40;
constexpr auto LCD_HORIZONTAL_RESOLUTION = 172; constexpr auto LCD_HORIZONTAL_RESOLUTION = 172;
constexpr auto LCD_VERTICAL_RESOLUTION = 320; constexpr auto LCD_VERTICAL_RESOLUTION = 320;
constexpr auto LCD_SPI_TRANSFER_HEIGHT = (LCD_VERTICAL_RESOLUTION / 10);
void setBacklightDuty(uint8_t level); void setBacklightDuty(uint8_t level);

View File

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

View File

@ -1,12 +1,12 @@
#include "Sdcard.h" #include "Sdcard.h"
#include <tactility/device.h>
#include <Tactility/lvgl/LvglSync.h> #include <Tactility/lvgl/LvglSync.h>
#include <Tactility/hal/sdcard/SpiSdCardDevice.h> #include <Tactility/hal/sdcard/SpiSdCardDevice.h>
using tt::hal::sdcard::SpiSdCardDevice; using tt::hal::sdcard::SpiSdCardDevice;
constexpr auto SDCARD_PIN_CS = GPIO_NUM_14; constexpr auto SDCARD_PIN_CS = GPIO_NUM_14;
constexpr auto LCD_PIN_CS = GPIO_NUM_21;
std::shared_ptr<SdCardDevice> createSdCard() { std::shared_ptr<SdCardDevice> createSdCard() {
auto configuration = std::make_unique<SpiSdCardDevice::Config>( auto configuration = std::make_unique<SpiSdCardDevice::Config>(
@ -15,12 +15,16 @@ std::shared_ptr<SdCardDevice> createSdCard() {
GPIO_NUM_NC, GPIO_NUM_NC,
GPIO_NUM_NC, GPIO_NUM_NC,
SdCardDevice::MountBehaviour::AtBoot, SdCardDevice::MountBehaviour::AtBoot,
tt::hal::spi::getLock(SPI3_HOST), nullptr,
std::vector { LCD_PIN_CS }, std::vector<gpio_num_t> { },
SPI3_HOST SPI3_HOST
); );
auto* spi_controller = device_find_by_name("spi1");
check(spi_controller, "spi1 not found");
return std::make_shared<SpiSdCardDevice>( 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/root.h>
#include <tactility/bindings/esp32_gpio.h> #include <tactility/bindings/esp32_gpio.h>
#include <tactility/bindings/esp32_i2c.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"; compatible = "root";
model = "Waveshare S3 Touch LCD 1.47"; model = "Waveshare S3 Touch LCD 1.47";
@ -19,7 +21,27 @@
clock-frequency = <400000>; clock-frequency = <400000>;
pin-sda = <42>; pin-sda = <42>;
pin-scl = <41>; 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/Display.h"
#include "devices/SdCard.h" #include "devices/SdCard.h"
#include <driver/gpio.h>
#include <Tactility/hal/Configuration.h> #include <Tactility/hal/Configuration.h>
@ -14,31 +13,5 @@ static DeviceVector createDevices() {
} }
extern const Configuration hardwareConfiguration = { extern const Configuration hardwareConfiguration = {
.createDevices = createDevices, .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
}
}
}; };

View File

@ -1,6 +1,8 @@
#include "SdCard.h" #include "SdCard.h"
#include <tactility/device.h>
#include <Tactility/hal/sdcard/SpiSdCardDevice.h> #include <Tactility/hal/sdcard/SpiSdCardDevice.h>
#include <Tactility/lvgl/LvglSync.h>
using tt::hal::sdcard::SpiSdCardDevice; using tt::hal::sdcard::SpiSdCardDevice;
@ -10,10 +12,15 @@ std::shared_ptr<SdCardDevice> createSdCard() {
GPIO_NUM_NC, GPIO_NUM_NC,
GPIO_NUM_NC, 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>( 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/root.h>
#include <tactility/bindings/esp32_gpio.h> #include <tactility/bindings/esp32_gpio.h>
#include <tactility/bindings/esp32_i2c.h> #include <tactility/bindings/esp32_i2c.h>
#include <tactility/bindings/esp32_spi.h>
#include <tactility/bindings/esp32_uart.h> #include <tactility/bindings/esp32_uart.h>
/ { / {
@ -20,8 +21,17 @@
clock-frequency = <400000>; clock-frequency = <400000>;
pin-sda = <8>; pin-sda = <8>;
pin-scl = <9>; 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 { uart1 {

View File

@ -19,7 +19,5 @@
clock-frequency = <400000>; clock-frequency = <400000>;
pin-sda = <6>; pin-sda = <6>;
pin-scl = <5>; 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. - Make a root device type so it can be discovered more easily.
- DTS/yaml: Consider support for default values. - DTS/yaml: Consider support for default values.
- DTS: throw custom exceptions and catch them to show cleaner error messages. - 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 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: - 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: Callback for device/start stop with filtering on device type:

View File

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

View File

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

View File

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

View File

@ -28,7 +28,7 @@ public:
bool mirrorX = false, bool mirrorX = false,
bool mirrorY = false, bool mirrorY = false,
bool invertColor = 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), ) : spiHostDevice(spiHostDevice),
csPin(csPin), csPin(csPin),
dcPin(dcPin), dcPin(dcPin),

View File

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

View File

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

View File

@ -12,12 +12,12 @@ extern struct LvglModuleConfig lvgl_module_config;
static bool initialized = false; static bool initialized = false;
bool lvgl_lock(void) { 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); return lvgl_port_lock(portMAX_DELAY);
} }
bool lvgl_try_lock_timed(uint32_t timeout) { 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)); return lvgl_port_lock(millis_to_ticks(timeout));
} }

View File

@ -20,7 +20,6 @@ enum class UiScale {
struct Configuration { struct Configuration {
/** /**
* Called before I2C/SPI/etc is initialized.
* Used for powering on the peripherals manually. * Used for powering on the peripherals manually.
*/ */
const InitBoot initBoot = nullptr; 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) { static bool shouldScanForAutoConnect(std::shared_ptr<Wifi> wifi) {
auto lock = wifi->dataMutex.asScopedLock(); auto lock = wifi->dataMutex.asScopedLock();
if (!lock.lock(100)) { if (!lock.lock(100 / portTICK_PERIOD_MS)) {
return false; return false;
} }
@ -893,7 +893,7 @@ std::string getIp() {
auto wifi = std::static_pointer_cast<Wifi>(wifi_singleton); auto wifi = std::static_pointer_cast<Wifi>(wifi_singleton);
auto lock = wifi->dataMutex.asScopedLock(); auto lock = wifi->dataMutex.asScopedLock();
if (!lock.lock(100)) { if (!lock.lock(100 / portTICK_PERIOD_MS)) {
return "0.0.0.0"; return "0.0.0.0";
} }

View File

@ -90,19 +90,28 @@ const esp_elfsym main_symbols[] {
// esp_sntp.h // esp_sntp.h
ESP_ELFSYM_EXPORT(sntp_get_sync_status), ESP_ELFSYM_EXPORT(sntp_get_sync_status),
// math.h // 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(atan),
ESP_ELFSYM_EXPORT(atanhf),
ESP_ELFSYM_EXPORT(atanf), ESP_ELFSYM_EXPORT(atanf),
ESP_ELFSYM_EXPORT(cos), ESP_ELFSYM_EXPORT(cos),
ESP_ELFSYM_EXPORT(coshf),
ESP_ELFSYM_EXPORT(cosf), ESP_ELFSYM_EXPORT(cosf),
ESP_ELFSYM_EXPORT(sin), ESP_ELFSYM_EXPORT(sin),
ESP_ELFSYM_EXPORT(sinhf),
ESP_ELFSYM_EXPORT(sinf), ESP_ELFSYM_EXPORT(sinf),
ESP_ELFSYM_EXPORT(tan), ESP_ELFSYM_EXPORT(tan),
ESP_ELFSYM_EXPORT(tanhf),
ESP_ELFSYM_EXPORT(tanf), ESP_ELFSYM_EXPORT(tanf),
ESP_ELFSYM_EXPORT(frexp), ESP_ELFSYM_EXPORT(frexp),
ESP_ELFSYM_EXPORT(frexpf), ESP_ELFSYM_EXPORT(frexpf),
ESP_ELFSYM_EXPORT(modf), ESP_ELFSYM_EXPORT(modf),
ESP_ELFSYM_EXPORT(modff), ESP_ELFSYM_EXPORT(modff),
ESP_ELFSYM_EXPORT(fmodf),
ESP_ELFSYM_EXPORT(ceil), ESP_ELFSYM_EXPORT(ceil),
ESP_ELFSYM_EXPORT(ceilf), ESP_ELFSYM_EXPORT(ceilf),
ESP_ELFSYM_EXPORT(fabs), ESP_ELFSYM_EXPORT(fabs),

View File

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