diff --git a/Buildscripts/TactilitySDK/CMakeLists.txt b/Buildscripts/TactilitySDK/CMakeLists.txt index ac48c94f6..bd6825ee4 100644 --- a/Buildscripts/TactilitySDK/CMakeLists.txt +++ b/Buildscripts/TactilitySDK/CMakeLists.txt @@ -2,18 +2,6 @@ idf_component_register( INCLUDE_DIRS "Libraries/TactilityC/include" "Libraries/TactilityKernel/include" - "Libraries/TactilityFreeRtos/include" "Libraries/lvgl/include" - "Libraries/lvgl-module/include" REQUIRES esp_timer ) - -add_prebuilt_library(TactilityC Libraries/TactilityC/binary/libTactilityC.a) -add_prebuilt_library(TactilityKernel Libraries/TactilityKernel/binary/libTactilityKernel.a) -add_prebuilt_library(lvgl Libraries/lvgl/binary/liblvgl.a) -add_prebuilt_library(lvgl-module Libraries/lvgl-module/binary/liblvgl-module.a) - -target_link_libraries(${COMPONENT_LIB} INTERFACE TactilityC) -target_link_libraries(${COMPONENT_LIB} INTERFACE TactilityKernel) -target_link_libraries(${COMPONENT_LIB} INTERFACE lvgl) -target_link_libraries(${COMPONENT_LIB} INTERFACE lvgl-module) diff --git a/Buildscripts/TactilitySDK/TactilitySDK.cmake b/Buildscripts/TactilitySDK/TactilitySDK.cmake index 71afdc009..9a427ef8f 100644 --- a/Buildscripts/TactilitySDK/TactilitySDK.cmake +++ b/Buildscripts/TactilitySDK/TactilitySDK.cmake @@ -14,4 +14,31 @@ macro(tactility_project project_name) if (NOT "$ENV{ESP_IDF_VERSION}" STREQUAL "${TACTILITY_SDK_IDF_VERSION}") message(FATAL_ERROR "ESP-IDF version of Tactility SDK (${TACTILITY_SDK_IDF_VERSION}) does not match current ESP-IDF version ($ENV{ESP_IDF_VERSION})") endif() + + set(EXTRA_COMPONENT_DIRS + "Libraries/TactilityFreeRtos" + "Modules" + "Drivers" + ) + + set(COMPONENTS + TactilityFreeRtos + bm8563-module + bm8563-module + bmi270-module + mpu6886-module + pi4ioe5v6408-module + qmi8658-module + rx8130ce-module + ) + + # Regular and core features + add_prebuilt_library(TactilityC Libraries/TactilityC/binary/libTactilityC.a) + add_prebuilt_library(TactilityKernel Libraries/TactilityKernel/binary/libTactilityKernel.a) + add_prebuilt_library(lvgl Libraries/lvgl/binary/liblvgl.a) + + target_link_libraries(${COMPONENT_LIB} INTERFACE TactilityC) + target_link_libraries(${COMPONENT_LIB} INTERFACE TactilityKernel) + target_link_libraries(${COMPONENT_LIB} INTERFACE lvgl) + endmacro() diff --git a/Buildscripts/release-sdk.py b/Buildscripts/release-sdk.py index d1a155d87..b2a8b0e5c 100644 --- a/Buildscripts/release-sdk.py +++ b/Buildscripts/release-sdk.py @@ -5,6 +5,7 @@ import glob import subprocess import sys +from textwrap import dedent def map_copy(mappings, target_base): """ @@ -59,6 +60,45 @@ def map_copy(mappings, target_base): os.makedirs(os.path.dirname(final_dst), exist_ok=True) shutil.copy2(src, final_dst) + +def get_driver_mappings(driver_name): + return [ + {'src': f'Drivers/{driver_name}/include/**', 'dst': f'Drivers/{driver_name}/include/'}, + {'src': f'Drivers/{driver_name}/*.md', 'dst': f'Drivers/{driver_name}/'}, + {'src': f'build/esp-idf/{driver_name}/lib{driver_name}.a', 'dst': f'Drivers/{driver_name}/binary/lib{driver_name}.a'}, + ] + +def get_module_mappings(module_name): + return [ + {'src': f'Modules/{module_name}/include/**', 'dst': f'Modules/{module_name}/include/'}, + {'src': f'Modules/{module_name}/*.md', 'dst': f'Modules/{module_name}/'}, + {'src': f'build/esp-idf/{module_name}/lib{module_name}.a', 'dst': f'Modules/{module_name}/binary/lib{module_name}.a'}, + ] + +def create_module_cmakelists(module_name): + return dedent(f''' + cmake_minimum_required(VERSION 3.20) + idf_component_register( + INCLUDE_DIRS "include" + ) + add_prebuilt_library({module_name} "binary/lib{module_name}.a") + '''.format(module_name=module_name)) + +def write_module_cmakelists(path, content): + with open(path, 'w') as f: + f.write(content) + +def add_driver(target_path, driver_name): + mappings = get_driver_mappings(driver_name) + map_copy(mappings, target_path) + cmakelists_content = create_module_cmakelists(driver_name) + write_module_cmakelists(os.path.join(target_path, f"Drivers/{driver_name}/CMakeLists.txt"), cmakelists_content) + +def add_module(target_path, module_name): + mappings = get_module_mappings(module_name) + map_copy(mappings, target_path) + cmakelists_content = create_module_cmakelists(module_name) + write_module_cmakelists(os.path.join(target_path, f"Modules/{module_name}/CMakeLists.txt"), cmakelists_content) def main(): if len(sys.argv) < 2: @@ -85,12 +125,7 @@ def main(): {'src': 'build/esp-idf/TactilityKernel/libTactilityKernel.a', 'dst': 'Libraries/TactilityKernel/binary/'}, {'src': 'TactilityKernel/include/**', 'dst': 'Libraries/TactilityKernel/include/'}, {'src': 'TactilityKernel/CMakeLists.txt', 'dst': 'Libraries/TactilityKernel/'}, - {'src': 'TactilityKernel/LICENSE*.*', 'dst': 'Libraries/TactilityKernel/'}, - # lvgl-module - {'src': 'build/esp-idf/lvgl-module/liblvgl-module.a', 'dst': 'Libraries/lvgl-module/binary/'}, - {'src': 'Modules/lvgl-module/include/**', 'dst': 'Libraries/lvgl-module/include/'}, - {'src': 'Modules/lvgl-module/CMakeLists.txt', 'dst': 'Libraries/lvgl-module/'}, - {'src': 'Modules/lvgl-module/LICENSE*.*', 'dst': 'Libraries/lvgl-module/'}, + {'src': 'TactilityKernel/*.md', 'dst': 'Libraries/TactilityKernel/'}, # lvgl (basics) {'src': 'build/esp-idf/lvgl__lvgl/liblvgl__lvgl.a', 'dst': 'Libraries/lvgl/binary/liblvgl.a'}, {'src': 'Libraries/lvgl/lvgl.h', 'dst': 'Libraries/lvgl/include/'}, @@ -108,6 +143,18 @@ def main(): map_copy(mappings, target_path) + # Modules + add_module(target_path, "lvgl-module") + + # Drivers + add_driver(target_path, "bm8563-module") + add_driver(target_path, "bm8563-module") + add_driver(target_path, "bmi270-module") + add_driver(target_path, "mpu6886-module") + add_driver(target_path, "pi4ioe5v6408-module") + add_driver(target_path, "qmi8658-module") + add_driver(target_path, "rx8130ce-module") + # Output ESP-IDF SDK version to file esp_idf_version = os.environ.get("ESP_IDF_VERSION", "") with open(os.path.join(target_path, "idf-version.txt"), "a") as f: diff --git a/Devices/generic-esp32/devicetree.yaml b/Devices/generic-esp32/devicetree.yaml index 6a9f8cbbe..577f8a6e3 100644 --- a/Devices/generic-esp32/devicetree.yaml +++ b/Devices/generic-esp32/devicetree.yaml @@ -1,3 +1,10 @@ dependencies: - Platforms/platform-esp32 + # Add all driver modules because the generic devices are used to build the SDK + - Drivers/bm8563-module + - Drivers/bmi270-module + - Drivers/mpu6886-module + - Drivers/pi4ioe5v6408-module + - Drivers/qmi8658-module + - Drivers/rx8130ce-module dts: generic,esp32.dts diff --git a/Devices/generic-esp32c6/devicetree.yaml b/Devices/generic-esp32c6/devicetree.yaml index 3b5ab4d4c..574c81953 100644 --- a/Devices/generic-esp32c6/devicetree.yaml +++ b/Devices/generic-esp32c6/devicetree.yaml @@ -1,3 +1,10 @@ dependencies: - Platforms/platform-esp32 + # Add all driver modules because the generic devices are used to build the SDK + - Drivers/bm8563-module + - Drivers/bmi270-module + - Drivers/mpu6886-module + - Drivers/pi4ioe5v6408-module + - Drivers/qmi8658-module + - Drivers/rx8130ce-module dts: generic,esp32c6.dts diff --git a/Devices/generic-esp32p4/devicetree.yaml b/Devices/generic-esp32p4/devicetree.yaml index 4c31671aa..9f5e26586 100644 --- a/Devices/generic-esp32p4/devicetree.yaml +++ b/Devices/generic-esp32p4/devicetree.yaml @@ -1,3 +1,10 @@ dependencies: - Platforms/platform-esp32 + # Add all driver modules because the generic devices are used to build the SDK + - Drivers/bm8563-module + - Drivers/bmi270-module + - Drivers/mpu6886-module + - Drivers/pi4ioe5v6408-module + - Drivers/qmi8658-module + - Drivers/rx8130ce-module dts: generic,esp32p4.dts diff --git a/Devices/generic-esp32s3/devicetree.yaml b/Devices/generic-esp32s3/devicetree.yaml index 1a525a8ad..7dac4215e 100644 --- a/Devices/generic-esp32s3/devicetree.yaml +++ b/Devices/generic-esp32s3/devicetree.yaml @@ -1,3 +1,10 @@ dependencies: - Platforms/platform-esp32 + # Add all driver modules because the generic devices are used to build the SDK + - Drivers/bm8563-module + - Drivers/bmi270-module + - Drivers/mpu6886-module + - Drivers/pi4ioe5v6408-module + - Drivers/qmi8658-module + - Drivers/rx8130ce-module dts: generic,esp32s3.dts diff --git a/Devices/lilygo-thmi/lilygo,thmi.dts b/Devices/lilygo-thmi/lilygo,thmi.dts index a83a31db2..94b415c8d 100644 --- a/Devices/lilygo-thmi/lilygo,thmi.dts +++ b/Devices/lilygo-thmi/lilygo,thmi.dts @@ -29,5 +29,6 @@ pin-cmd = <&gpio0 11 GPIO_FLAG_NONE>; pin-d0 = <&gpio0 13 GPIO_FLAG_NONE>; bus-width = <1>; + pullups; }; }; diff --git a/Platforms/platform-esp32/bindings/espressif,esp32-sdmmc.yaml b/Platforms/platform-esp32/bindings/espressif,esp32-sdmmc.yaml index 7dbdabef9..e2acf679f 100644 --- a/Platforms/platform-esp32/bindings/espressif,esp32-sdmmc.yaml +++ b/Platforms/platform-esp32/bindings/espressif,esp32-sdmmc.yaml @@ -50,4 +50,12 @@ properties: enable-uhs: type: boolean default: false - description: Enable UHS mode \ No newline at end of file + description: Enable UHS mode + pullups: + type: boolean + default: false + description: Enable internal pullups for SDMMC pins + on-chip-ldo-chan: + type: int + default: -1 + description: On-chip LDO channel for SD power (e.g. 4 for LDO4). Set to -1 to disable. \ No newline at end of file diff --git a/Platforms/platform-esp32/include/tactility/drivers/esp32_sdmmc.h b/Platforms/platform-esp32/include/tactility/drivers/esp32_sdmmc.h index 152b42559..40beb383f 100644 --- a/Platforms/platform-esp32/include/tactility/drivers/esp32_sdmmc.h +++ b/Platforms/platform-esp32/include/tactility/drivers/esp32_sdmmc.h @@ -28,6 +28,8 @@ struct Esp32SdmmcConfig { uint8_t bus_width; bool wp_active_high; bool enable_uhs; + bool pullups; + int32_t on_chip_ldo_chan; }; /** diff --git a/Platforms/platform-esp32/source/drivers/esp32_sdmmc_fs.cpp b/Platforms/platform-esp32/source/drivers/esp32_sdmmc_fs.cpp index 9387d7568..6dbcb3785 100644 --- a/Platforms/platform-esp32/source/drivers/esp32_sdmmc_fs.cpp +++ b/Platforms/platform-esp32/source/drivers/esp32_sdmmc_fs.cpp @@ -78,20 +78,24 @@ static error_t mount(void* data) { sdmmc_host_t host = SDMMC_HOST_DEFAULT(); #if SOC_SD_PWR_CTRL_SUPPORTED - sd_pwr_ctrl_ldo_config_t ldo_config = { - .ldo_chan_id = 4, // LDO4 is typically used for SDMMC on ESP32-S3 - }; - esp_err_t pwr_err = sd_pwr_ctrl_new_on_chip_ldo(&ldo_config, &fs_data->pwr_ctrl_handle); - if (pwr_err != ESP_OK) { - LOG_E(TAG, "Failed to create SD power control driver, err=0x%x", pwr_err); - return ERROR_NOT_SUPPORTED; + // Treat non-positive values as disabled to remain safe with zero-initialized configs. + if (config->on_chip_ldo_chan > 0) { + sd_pwr_ctrl_ldo_config_t ldo_config = { + .ldo_chan_id = (uint32_t)config->on_chip_ldo_chan, + }; + esp_err_t pwr_err = sd_pwr_ctrl_new_on_chip_ldo(&ldo_config, &fs_data->pwr_ctrl_handle); + if (pwr_err != ESP_OK) { + LOG_E(TAG, "Failed to create SD power control driver, err=0x%x", pwr_err); + return ERROR_NOT_SUPPORTED; + } + host.pwr_ctrl_handle = fs_data->pwr_ctrl_handle; } - host.pwr_ctrl_handle = fs_data->pwr_ctrl_handle; #endif uint32_t slot_config_flags = 0; if (config->enable_uhs) slot_config_flags |= SDMMC_SLOT_FLAG_UHS1; if (config->wp_active_high) slot_config_flags |= SDMMC_SLOT_FLAG_WP_ACTIVE_HIGH; + if (config->pullups) slot_config_flags |= SDMMC_SLOT_FLAG_INTERNAL_PULLUP; sdmmc_slot_config_t slot_config = { .clk = to_native_pin(config->pin_clk), @@ -127,6 +131,7 @@ static error_t mount(void* data) { return ERROR_UNDEFINED; } + sdmmc_card_print_info(stdout, fs_data->card); LOG_I(TAG, "Mounted %s", fs_data->mount_path.c_str()); return ERROR_NONE; diff --git a/Tests/SdkIntegration/CMakeLists.txt b/Tests/SdkIntegration/CMakeLists.txt index 046853f6b..980270d3e 100644 --- a/Tests/SdkIntegration/CMakeLists.txt +++ b/Tests/SdkIntegration/CMakeLists.txt @@ -5,12 +5,12 @@ include($ENV{IDF_PATH}/tools/cmake/project.cmake) if (DEFINED ENV{TACTILITY_SDK_PATH}) set(TACTILITY_SDK_PATH $ENV{TACTILITY_SDK_PATH}) else() - set(TACTILITY_SDK_PATH "../../release/TactilitySDK") - message(WARNING "⚠️ TACTILITY_SDK_PATH environment variable is not set, defaulting to ${TACTILITY_SDK_PATH}") + set(TACTILITY_SDK_PATH ../../release/TactilitySDK) + message(WARNING "TACTILITY_SDK_PATH environment variable is not set, defaulting to ${TACTILITY_SDK_PATH}") endif() include("${TACTILITY_SDK_PATH}/TactilitySDK.cmake") -set(EXTRA_COMPONENT_DIRS ${TACTILITY_SDK_PATH}) +set(EXTRA_COMPONENT_DIRS ${TACTILITY_SDK_PATH} ${TACTILITY_SDK_PATH}/Modules ${TACTILITY_SDK_PATH}/Drivers) project(SdkTest) tactility_project(SdkTest) diff --git a/Tests/SdkIntegration/main/CMakeLists.txt b/Tests/SdkIntegration/main/CMakeLists.txt index db2068e9b..3e247cf3d 100644 --- a/Tests/SdkIntegration/main/CMakeLists.txt +++ b/Tests/SdkIntegration/main/CMakeLists.txt @@ -3,4 +3,11 @@ file(GLOB_RECURSE SOURCE_FILES Source/*.c) idf_component_register( SRCS ${SOURCE_FILES} REQUIRES TactilitySDK + lvgl-module + bm8563-module + bmi270-module + mpu6886-module + pi4ioe5v6408-module + qmi8658-module + rx8130ce-module ) diff --git a/Tests/SdkIntegration/main/Source/main.c b/Tests/SdkIntegration/main/Source/main.c index 13c029597..230587741 100644 --- a/Tests/SdkIntegration/main/Source/main.c +++ b/Tests/SdkIntegration/main/Source/main.c @@ -24,6 +24,14 @@ #include +#include +#include +#include +#include +#include +#include +#include + static void onShowApp(AppHandle app, void* data, lv_obj_t* parent) { lv_obj_t* toolbar = tt_lvgl_toolbar_create_for_app(parent, app); lv_obj_align(toolbar, LV_ALIGN_TOP_MID, 0, 0);