mirror of
https://github.com/ByteWelder/Tactility.git
synced 2026-06-19 04:15:06 +00:00
Various fixes and improvements (#515)
* Optional internal pull-ups for SD/MMC pins in DTS * Selectable on‑chip LDO channel for SD/MMC power (can be disabled) * Added several sensor/driver modules to generic ESP32 device configurations so that they become part of the SDKs * SD card mount now prints card information for clearer diagnostics * Fix for bug DTS boolean parsing. Improved tests to catch these issues. * Expanded SDK integration test to include new modules and headers * Modularized packaging to generate per‑module build files and include driver assets
This commit is contained in:
parent
be2cdc0b90
commit
4170b86137
@ -64,6 +64,9 @@ def property_to_string(property: DeviceProperty, devices: list[Device]) -> str:
|
|||||||
if type == "value" or type == "int":
|
if type == "value" or type == "int":
|
||||||
return property.value
|
return property.value
|
||||||
elif type == "boolean" or type == "bool":
|
elif type == "boolean" or type == "bool":
|
||||||
|
if property.value is None or not property.value:
|
||||||
|
return "false"
|
||||||
|
else:
|
||||||
return "true"
|
return "true"
|
||||||
elif type == "text":
|
elif type == "text":
|
||||||
return f"\"{property.value}\""
|
return f"\"{property.value}\""
|
||||||
@ -120,6 +123,7 @@ def resolve_parameters_from_bindings(device: Device, bindings: list[Binding], de
|
|||||||
result = [0] * len(binding_properties)
|
result = [0] * len(binding_properties)
|
||||||
for index, binding_property in enumerate(binding_properties):
|
for index, binding_property in enumerate(binding_properties):
|
||||||
device_property = find_device_property(device, binding_property.name)
|
device_property = find_device_property(device, binding_property.name)
|
||||||
|
# No property specified in DTS, use binding defaults
|
||||||
if device_property is None:
|
if device_property is None:
|
||||||
if binding_property.default is not None:
|
if binding_property.default is not None:
|
||||||
temp_prop = DeviceProperty(
|
temp_prop = DeviceProperty(
|
||||||
@ -130,7 +134,10 @@ def resolve_parameters_from_bindings(device: Device, bindings: list[Binding], de
|
|||||||
result[index] = property_to_string(temp_prop, devices)
|
result[index] = property_to_string(temp_prop, devices)
|
||||||
elif binding_property.required:
|
elif binding_property.required:
|
||||||
raise DevicetreeException(f"device {device.node_name} doesn't have property '{binding_property.name}'")
|
raise DevicetreeException(f"device {device.node_name} doesn't have property '{binding_property.name}'")
|
||||||
elif binding_property.type == "bool":
|
elif binding_property.type == "bool" or binding_property.type == "boolean":
|
||||||
|
if binding_property.default == "true" or binding_property.default == None:
|
||||||
|
result[index] = "true"
|
||||||
|
else: # Explicit or implied false
|
||||||
result[index] = "false"
|
result[index] = "false"
|
||||||
else:
|
else:
|
||||||
raise DevicetreeException(f"Device {device.node_name} doesn't have property '{binding_property.name}' and no default value is set")
|
raise DevicetreeException(f"Device {device.node_name} doesn't have property '{binding_property.name}' and no default value is set")
|
||||||
|
|||||||
@ -0,0 +1,16 @@
|
|||||||
|
description: Boolean test device binding
|
||||||
|
compatible: "test,bool-device"
|
||||||
|
properties:
|
||||||
|
binding-default-true-setting-implied:
|
||||||
|
type: boolean
|
||||||
|
default: true
|
||||||
|
binding-default-false-setting-implied:
|
||||||
|
type: boolean
|
||||||
|
default: false
|
||||||
|
binding-default-false-setting-direct:
|
||||||
|
type: boolean
|
||||||
|
default: false
|
||||||
|
binding-implied-true-setting-direct:
|
||||||
|
type: boolean
|
||||||
|
binding-implied-true-setting-implied:
|
||||||
|
type: boolean
|
||||||
@ -1,12 +0,0 @@
|
|||||||
description: Test device binding
|
|
||||||
compatible: "test,device"
|
|
||||||
properties:
|
|
||||||
reg:
|
|
||||||
type: int
|
|
||||||
required: true
|
|
||||||
boolean-prop:
|
|
||||||
type: boolean
|
|
||||||
int-prop:
|
|
||||||
type: int
|
|
||||||
string-prop:
|
|
||||||
type: string
|
|
||||||
@ -0,0 +1,10 @@
|
|||||||
|
description: Generic test device binding
|
||||||
|
compatible: "test,generic-device"
|
||||||
|
properties:
|
||||||
|
reg:
|
||||||
|
type: int
|
||||||
|
required: true
|
||||||
|
int-prop:
|
||||||
|
type: int
|
||||||
|
string-prop:
|
||||||
|
type: string
|
||||||
@ -0,0 +1,57 @@
|
|||||||
|
// Default headers
|
||||||
|
#include <tactility/device.h>
|
||||||
|
#include <tactility/dts.h>
|
||||||
|
#include <tactility/module.h>
|
||||||
|
// DTS headers
|
||||||
|
#include <test_include.h>
|
||||||
|
|
||||||
|
static const root_config_dt root_config = {
|
||||||
|
"Test Model"
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct Device root = {
|
||||||
|
.name = "/",
|
||||||
|
.config = &root_config,
|
||||||
|
.parent = NULL,
|
||||||
|
.internal = NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
static const generic_device_config_dt test_device@0_config = {
|
||||||
|
0,
|
||||||
|
42,
|
||||||
|
"hello"
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct Device test_device@0 = {
|
||||||
|
.name = "test-device@0",
|
||||||
|
.config = &test_device@0_config,
|
||||||
|
.parent = &root,
|
||||||
|
.internal = NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
static const bool_device_config_dt bool_test_device_config = {
|
||||||
|
true,
|
||||||
|
false,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
true
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct Device bool_test_device = {
|
||||||
|
.name = "bool-test-device",
|
||||||
|
.config = &bool_test_device_config,
|
||||||
|
.parent = &root,
|
||||||
|
.internal = NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
struct DtsDevice dts_devices[] = {
|
||||||
|
{ &root, "test,root", DTS_DEVICE_STATUS_OKAY },
|
||||||
|
{ &test_device@0, "test,generic-device", DTS_DEVICE_STATUS_OKAY },
|
||||||
|
{ &bool_test_device, "test,bool-device", DTS_DEVICE_STATUS_OKAY },
|
||||||
|
DTS_DEVICE_TERMINATOR
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
struct Module* dts_modules[] = {
|
||||||
|
NULL
|
||||||
|
};
|
||||||
@ -0,0 +1,17 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <tactility/error.h>
|
||||||
|
#include <tactility/dts.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Array of device tree modules terminated with DTS_MODULE_TERMINATOR
|
||||||
|
extern struct DtsDevice dts_devices[];
|
||||||
|
|
||||||
|
// Array of module symbols terminated with NULL
|
||||||
|
extern struct Module* dts_modules[];
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
@ -7,11 +7,16 @@
|
|||||||
model = "Test Model";
|
model = "Test Model";
|
||||||
|
|
||||||
test_device1: test-device@0 {
|
test_device1: test-device@0 {
|
||||||
compatible = "test,device";
|
compatible = "test,generic-device";
|
||||||
reg = <0>;
|
reg = <0>;
|
||||||
status = "okay";
|
status = "okay";
|
||||||
boolean-prop;
|
|
||||||
int-prop = <42>;
|
int-prop = <42>;
|
||||||
string-prop = "hello";
|
string-prop = "hello";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
bool-test-device {
|
||||||
|
compatible = "test,bool-device";
|
||||||
|
binding-default-false-setting-direct;
|
||||||
|
binding-implied-true-setting-direct;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|||||||
@ -30,12 +30,22 @@ def test_compile_success():
|
|||||||
print(f"FAILED: Compilation failed: {result.stderr} {result.stdout}")
|
print(f"FAILED: Compilation failed: {result.stderr} {result.stdout}")
|
||||||
return False
|
return False
|
||||||
|
|
||||||
if not os.path.exists(os.path.join(output_dir, "devicetree.c")):
|
for filename in ["devicetree.c", "devicetree.h"]:
|
||||||
print("FAILED: devicetree.c not generated")
|
generated_path = os.path.join(output_dir, filename)
|
||||||
|
expected_path = os.path.join(TEST_DATA_DIR, f"expected_{filename}")
|
||||||
|
|
||||||
|
if not os.path.exists(generated_path):
|
||||||
|
print(f"FAILED: {filename} not generated")
|
||||||
return False
|
return False
|
||||||
|
|
||||||
if not os.path.exists(os.path.join(output_dir, "devicetree.h")):
|
if not os.path.exists(expected_path):
|
||||||
print("FAILED: devicetree.h not generated")
|
print(f"FAILED: {os.path.basename(expected_path)} not found in test data")
|
||||||
|
return False
|
||||||
|
|
||||||
|
diff_result = subprocess.run(["diff", "-u", expected_path, generated_path], capture_output=True, text=True)
|
||||||
|
if diff_result.returncode != 0:
|
||||||
|
print(f"FAILED: {filename} does not match expected_{filename}")
|
||||||
|
print(diff_result.stdout)
|
||||||
return False
|
return False
|
||||||
|
|
||||||
print("PASSED")
|
print("PASSED")
|
||||||
|
|||||||
@ -2,18 +2,15 @@ idf_component_register(
|
|||||||
INCLUDE_DIRS
|
INCLUDE_DIRS
|
||||||
"Libraries/TactilityC/include"
|
"Libraries/TactilityC/include"
|
||||||
"Libraries/TactilityKernel/include"
|
"Libraries/TactilityKernel/include"
|
||||||
"Libraries/TactilityFreeRtos/include"
|
|
||||||
"Libraries/lvgl/include"
|
"Libraries/lvgl/include"
|
||||||
"Libraries/lvgl-module/include"
|
|
||||||
REQUIRES esp_timer
|
REQUIRES esp_timer
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# Regular and core features
|
||||||
add_prebuilt_library(TactilityC Libraries/TactilityC/binary/libTactilityC.a)
|
add_prebuilt_library(TactilityC Libraries/TactilityC/binary/libTactilityC.a)
|
||||||
add_prebuilt_library(TactilityKernel Libraries/TactilityKernel/binary/libTactilityKernel.a)
|
add_prebuilt_library(TactilityKernel Libraries/TactilityKernel/binary/libTactilityKernel.a)
|
||||||
add_prebuilt_library(lvgl Libraries/lvgl/binary/liblvgl.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 TactilityC)
|
||||||
target_link_libraries(${COMPONENT_LIB} INTERFACE TactilityKernel)
|
target_link_libraries(${COMPONENT_LIB} INTERFACE TactilityKernel)
|
||||||
target_link_libraries(${COMPONENT_LIB} INTERFACE lvgl)
|
target_link_libraries(${COMPONENT_LIB} INTERFACE lvgl)
|
||||||
target_link_libraries(${COMPONENT_LIB} INTERFACE lvgl-module)
|
|
||||||
|
|||||||
@ -14,4 +14,22 @@ macro(tactility_project project_name)
|
|||||||
if (NOT "$ENV{ESP_IDF_VERSION}" STREQUAL "${TACTILITY_SDK_IDF_VERSION}")
|
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})")
|
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()
|
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
|
||||||
|
)
|
||||||
|
|
||||||
endmacro()
|
endmacro()
|
||||||
|
|||||||
@ -5,6 +5,7 @@ import shutil
|
|||||||
import glob
|
import glob
|
||||||
import subprocess
|
import subprocess
|
||||||
import sys
|
import sys
|
||||||
|
from textwrap import dedent
|
||||||
|
|
||||||
def map_copy(mappings, target_base):
|
def map_copy(mappings, target_base):
|
||||||
"""
|
"""
|
||||||
@ -60,6 +61,45 @@ def map_copy(mappings, target_base):
|
|||||||
os.makedirs(os.path.dirname(final_dst), exist_ok=True)
|
os.makedirs(os.path.dirname(final_dst), exist_ok=True)
|
||||||
shutil.copy2(src, final_dst)
|
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():
|
def main():
|
||||||
if len(sys.argv) < 2:
|
if len(sys.argv) < 2:
|
||||||
print("Usage: release-sdk.py [target_path]")
|
print("Usage: release-sdk.py [target_path]")
|
||||||
@ -85,12 +125,7 @@ def main():
|
|||||||
{'src': 'build/esp-idf/TactilityKernel/libTactilityKernel.a', 'dst': 'Libraries/TactilityKernel/binary/'},
|
{'src': 'build/esp-idf/TactilityKernel/libTactilityKernel.a', 'dst': 'Libraries/TactilityKernel/binary/'},
|
||||||
{'src': 'TactilityKernel/include/**', 'dst': 'Libraries/TactilityKernel/include/'},
|
{'src': 'TactilityKernel/include/**', 'dst': 'Libraries/TactilityKernel/include/'},
|
||||||
{'src': 'TactilityKernel/CMakeLists.txt', 'dst': 'Libraries/TactilityKernel/'},
|
{'src': 'TactilityKernel/CMakeLists.txt', 'dst': 'Libraries/TactilityKernel/'},
|
||||||
{'src': 'TactilityKernel/LICENSE*.*', 'dst': 'Libraries/TactilityKernel/'},
|
{'src': 'TactilityKernel/*.md', '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/'},
|
|
||||||
# lvgl (basics)
|
# lvgl (basics)
|
||||||
{'src': 'build/esp-idf/lvgl__lvgl/liblvgl__lvgl.a', 'dst': 'Libraries/lvgl/binary/liblvgl.a'},
|
{'src': 'build/esp-idf/lvgl__lvgl/liblvgl__lvgl.a', 'dst': 'Libraries/lvgl/binary/liblvgl.a'},
|
||||||
{'src': 'Libraries/lvgl/lvgl.h', 'dst': 'Libraries/lvgl/include/'},
|
{'src': 'Libraries/lvgl/lvgl.h', 'dst': 'Libraries/lvgl/include/'},
|
||||||
@ -108,6 +143,17 @@ def main():
|
|||||||
|
|
||||||
map_copy(mappings, target_path)
|
map_copy(mappings, target_path)
|
||||||
|
|
||||||
|
# Modules
|
||||||
|
add_module(target_path, "lvgl-module")
|
||||||
|
|
||||||
|
# Drivers
|
||||||
|
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
|
# Output ESP-IDF SDK version to file
|
||||||
esp_idf_version = os.environ.get("ESP_IDF_VERSION", "")
|
esp_idf_version = os.environ.get("ESP_IDF_VERSION", "")
|
||||||
with open(os.path.join(target_path, "idf-version.txt"), "a") as f:
|
with open(os.path.join(target_path, "idf-version.txt"), "a") as f:
|
||||||
|
|||||||
@ -1,3 +1,10 @@
|
|||||||
dependencies:
|
dependencies:
|
||||||
- Platforms/platform-esp32
|
- 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
|
dts: generic,esp32.dts
|
||||||
|
|||||||
@ -1,3 +1,10 @@
|
|||||||
dependencies:
|
dependencies:
|
||||||
- Platforms/platform-esp32
|
- 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
|
dts: generic,esp32c6.dts
|
||||||
|
|||||||
@ -1,3 +1,10 @@
|
|||||||
dependencies:
|
dependencies:
|
||||||
- Platforms/platform-esp32
|
- 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
|
dts: generic,esp32p4.dts
|
||||||
|
|||||||
@ -1,3 +1,10 @@
|
|||||||
dependencies:
|
dependencies:
|
||||||
- Platforms/platform-esp32
|
- 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
|
dts: generic,esp32s3.dts
|
||||||
|
|||||||
@ -29,5 +29,6 @@
|
|||||||
pin-cmd = <&gpio0 11 GPIO_FLAG_NONE>;
|
pin-cmd = <&gpio0 11 GPIO_FLAG_NONE>;
|
||||||
pin-d0 = <&gpio0 13 GPIO_FLAG_NONE>;
|
pin-d0 = <&gpio0 13 GPIO_FLAG_NONE>;
|
||||||
bus-width = <1>;
|
bus-width = <1>;
|
||||||
|
pullups;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|||||||
@ -51,3 +51,11 @@ properties:
|
|||||||
type: boolean
|
type: boolean
|
||||||
default: false
|
default: false
|
||||||
description: Enable UHS mode
|
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.
|
||||||
@ -28,6 +28,8 @@ struct Esp32SdmmcConfig {
|
|||||||
uint8_t bus_width;
|
uint8_t bus_width;
|
||||||
bool wp_active_high;
|
bool wp_active_high;
|
||||||
bool enable_uhs;
|
bool enable_uhs;
|
||||||
|
bool pullups;
|
||||||
|
int32_t on_chip_ldo_chan;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -78,8 +78,10 @@ static error_t mount(void* data) {
|
|||||||
sdmmc_host_t host = SDMMC_HOST_DEFAULT();
|
sdmmc_host_t host = SDMMC_HOST_DEFAULT();
|
||||||
|
|
||||||
#if SOC_SD_PWR_CTRL_SUPPORTED
|
#if SOC_SD_PWR_CTRL_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 = {
|
sd_pwr_ctrl_ldo_config_t ldo_config = {
|
||||||
.ldo_chan_id = 4, // LDO4 is typically used for SDMMC on ESP32-S3
|
.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);
|
esp_err_t pwr_err = sd_pwr_ctrl_new_on_chip_ldo(&ldo_config, &fs_data->pwr_ctrl_handle);
|
||||||
if (pwr_err != ESP_OK) {
|
if (pwr_err != ESP_OK) {
|
||||||
@ -87,11 +89,13 @@ static error_t mount(void* data) {
|
|||||||
return ERROR_NOT_SUPPORTED;
|
return ERROR_NOT_SUPPORTED;
|
||||||
}
|
}
|
||||||
host.pwr_ctrl_handle = fs_data->pwr_ctrl_handle;
|
host.pwr_ctrl_handle = fs_data->pwr_ctrl_handle;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
uint32_t slot_config_flags = 0;
|
uint32_t slot_config_flags = 0;
|
||||||
if (config->enable_uhs) slot_config_flags |= SDMMC_SLOT_FLAG_UHS1;
|
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->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 = {
|
sdmmc_slot_config_t slot_config = {
|
||||||
.clk = to_native_pin(config->pin_clk),
|
.clk = to_native_pin(config->pin_clk),
|
||||||
@ -127,6 +131,7 @@ static error_t mount(void* data) {
|
|||||||
return ERROR_UNDEFINED;
|
return ERROR_UNDEFINED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sdmmc_card_print_info(stdout, fs_data->card);
|
||||||
LOG_I(TAG, "Mounted %s", fs_data->mount_path.c_str());
|
LOG_I(TAG, "Mounted %s", fs_data->mount_path.c_str());
|
||||||
|
|
||||||
return ERROR_NONE;
|
return ERROR_NONE;
|
||||||
|
|||||||
@ -21,11 +21,16 @@ static const auto LOGGER = Logger("SpiSdCardDevice");
|
|||||||
bool SpiSdCardDevice::applyGpioWorkAround() {
|
bool SpiSdCardDevice::applyGpioWorkAround() {
|
||||||
LOGGER.info("applyGpioWorkAround");
|
LOGGER.info("applyGpioWorkAround");
|
||||||
|
|
||||||
uint64_t pin_bit_mask = BIT64(config->spiPinCs);
|
uint64_t pin_bit_mask = config->spiPinCs != GPIO_NUM_NC ? BIT64(config->spiPinCs) : 0;
|
||||||
for (auto const& pin: config->csPinWorkAround) {
|
for (auto const& pin: config->csPinWorkAround) {
|
||||||
pin_bit_mask |= BIT64(pin);
|
pin_bit_mask |= BIT64(pin);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Nothing to do
|
||||||
|
if (pin_bit_mask == 0) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
if (!gpio::configureWithPinBitmask(pin_bit_mask, gpio::Mode::Output, false, false)) {
|
if (!gpio::configureWithPinBitmask(pin_bit_mask, gpio::Mode::Output, false, false)) {
|
||||||
LOGGER.error("GPIO work-around failed");
|
LOGGER.error("GPIO work-around failed");
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@ -5,12 +5,12 @@ include($ENV{IDF_PATH}/tools/cmake/project.cmake)
|
|||||||
if (DEFINED ENV{TACTILITY_SDK_PATH})
|
if (DEFINED ENV{TACTILITY_SDK_PATH})
|
||||||
set(TACTILITY_SDK_PATH $ENV{TACTILITY_SDK_PATH})
|
set(TACTILITY_SDK_PATH $ENV{TACTILITY_SDK_PATH})
|
||||||
else()
|
else()
|
||||||
set(TACTILITY_SDK_PATH "../../release/TactilitySDK")
|
set(TACTILITY_SDK_PATH ../../release/TactilitySDK)
|
||||||
message(WARNING "⚠️ TACTILITY_SDK_PATH environment variable is not set, defaulting to ${TACTILITY_SDK_PATH}")
|
message(WARNING "TACTILITY_SDK_PATH environment variable is not set, defaulting to ${TACTILITY_SDK_PATH}")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
include("${TACTILITY_SDK_PATH}/TactilitySDK.cmake")
|
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)
|
project(SdkTest)
|
||||||
tactility_project(SdkTest)
|
tactility_project(SdkTest)
|
||||||
|
|||||||
@ -3,4 +3,11 @@ file(GLOB_RECURSE SOURCE_FILES Source/*.c)
|
|||||||
idf_component_register(
|
idf_component_register(
|
||||||
SRCS ${SOURCE_FILES}
|
SRCS ${SOURCE_FILES}
|
||||||
REQUIRES TactilitySDK
|
REQUIRES TactilitySDK
|
||||||
|
lvgl-module
|
||||||
|
bm8563-module
|
||||||
|
bmi270-module
|
||||||
|
mpu6886-module
|
||||||
|
pi4ioe5v6408-module
|
||||||
|
qmi8658-module
|
||||||
|
rx8130ce-module
|
||||||
)
|
)
|
||||||
|
|||||||
@ -24,6 +24,13 @@
|
|||||||
|
|
||||||
#include <tactility/lvgl_module.h>
|
#include <tactility/lvgl_module.h>
|
||||||
|
|
||||||
|
#include <drivers/bm8563.h>
|
||||||
|
#include <drivers/bmi270.h>
|
||||||
|
#include <drivers/mpu6886.h>
|
||||||
|
#include <drivers/pi4ioe5v6408.h>
|
||||||
|
#include <drivers/qmi8658.h>
|
||||||
|
#include <drivers/rx8130ce.h>
|
||||||
|
|
||||||
static void onShowApp(AppHandle app, void* data, lv_obj_t* parent) {
|
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_t* toolbar = tt_lvgl_toolbar_create_for_app(parent, app);
|
||||||
lv_obj_align(toolbar, LV_ALIGN_TOP_MID, 0, 0);
|
lv_obj_align(toolbar, LV_ALIGN_TOP_MID, 0, 0);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user