mirror of
https://github.com/ByteWelder/Tactility.git
synced 2026-02-19 03:13:14 +00:00
WIP
This commit is contained in:
parent
1f843750cd
commit
5699d05675
@ -124,7 +124,7 @@ def write_device(file, device: Device, bindings: list[Binding], verbose: bool):
|
||||
file.write(f"\t.config = &{config_instance_name},\n")
|
||||
file.write(f"\t.api = &{api_instance_name},\n")
|
||||
file.write("\t.state = { .init_result = 0, .initialized = false },\n")
|
||||
file.write("\t.data = nullptr,\n")
|
||||
file.write("\t.data = NULL,\n")
|
||||
file.write("\t.operations = { ")
|
||||
file.write(f".init = {init_function_name}, ")
|
||||
file.write(f".deinit = {deinit_function_name}")
|
||||
@ -157,7 +157,7 @@ def write_device_list(file, devices: list[Device]):
|
||||
for device in devices:
|
||||
write_device_list_entry(file, device)
|
||||
# Terminator
|
||||
file.write(f"\tnullptr\n")
|
||||
file.write(f"\tNULL\n")
|
||||
file.write("};\n\n")
|
||||
|
||||
def generate_devicetree_c(filename: str, items: list[object], bindings: list[Binding], verbose: bool):
|
||||
@ -184,14 +184,14 @@ def generate_devicetree_h(filename: str):
|
||||
with open(filename, "w") as file:
|
||||
file.write(dedent('''\
|
||||
#pragma once
|
||||
#include <device.h>
|
||||
#include <tactility/device.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @return an array of device* where the last item in the array is nullptr
|
||||
* @return an array of device* where the last item in the array is NULL
|
||||
*/
|
||||
struct device** devices_builtin_get();
|
||||
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
cmake_minimum_required(VERSION 3.20)
|
||||
|
||||
set(CMAKE_CXX_STANDARD 26)
|
||||
set(CMAKE_CXX_STANDARD 23)
|
||||
set(CMAKE_ASM_COMPILE_OBJECT "${CMAKE_CXX_COMPILER_TARGET}")
|
||||
|
||||
include("Buildscripts/logo.cmake")
|
||||
@ -32,6 +32,7 @@ if (DEFINED ENV{ESP_IDF_VERSION})
|
||||
"Firmware"
|
||||
"Devices/${TACTILITY_DEVICE_PROJECT}"
|
||||
"Drivers"
|
||||
"core"
|
||||
"Tactility"
|
||||
"TactilityC"
|
||||
"TactilityCore"
|
||||
@ -80,8 +81,7 @@ if (NOT DEFINED ENV{ESP_IDF_VERSION})
|
||||
add_subdirectory(Libraries/QRCode)
|
||||
add_subdirectory(Libraries/minitar)
|
||||
add_subdirectory(Libraries/minmea)
|
||||
add_subdirectory(Drivers/drivers-abstract)
|
||||
add_subdirectory(Drivers/drivers-core)
|
||||
add_subdirectory(core)
|
||||
|
||||
# FreeRTOS
|
||||
set(FREERTOS_CONFIG_FILE_DIRECTORY ${PROJECT_SOURCE_DIR}/Devices/simulator/Source CACHE STRING "")
|
||||
|
||||
@ -1,12 +1,7 @@
|
||||
file(GLOB_RECURSE SOURCE_FILES Source/*.c*)
|
||||
|
||||
set(CMAKE_CXX_STANDARD 26)
|
||||
set(CMAKE_C_STANDARD 23)
|
||||
|
||||
idf_component_register(
|
||||
SRCS ${SOURCE_FILES}
|
||||
INCLUDE_DIRS "Source"
|
||||
REQUIRES Tactility esp_lcd ST7796 BQ25896 BQ27220 TCA8418 DRV2605 PwmBacklight driver esp_adc drivers-esp
|
||||
)
|
||||
|
||||
target_compile_options(${COMPONENT_LIB} PRIVATE -std=c23)
|
||||
|
||||
@ -4,8 +4,8 @@
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <device.h>
|
||||
#include <drivers/root.h>
|
||||
#include <tactility/device.h>
|
||||
#include <tactility/drivers/root.h>
|
||||
|
||||
// Inherit base config
|
||||
#define tlora_pager_config root_config
|
||||
|
||||
@ -1,8 +1,8 @@
|
||||
/dts-v1/;
|
||||
|
||||
#include <drivers/tlora_pager.h>
|
||||
#include <drivers-esp/esp32_gpio.h>
|
||||
#include <drivers-esp/esp32_i2c.h>
|
||||
#include <tactility/drivers/esp32_gpio.h>
|
||||
#include <tactility/drivers/esp32_i2c.h>
|
||||
|
||||
/ {
|
||||
compatible = "lilygo,tlora-pager";
|
||||
@ -18,5 +18,6 @@
|
||||
clock-frequency = <100000>;
|
||||
pin-sda = <&gpio0 3 GPIO_ACTIVE_HIGH>;
|
||||
pin-scl = <&gpio0 2 GPIO_ACTIVE_HIGH>;
|
||||
port = <I2C_NUM_0>;
|
||||
};
|
||||
};
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
dependencies:
|
||||
- Drivers/drivers-abstract
|
||||
- core
|
||||
bindings: ./
|
||||
dts: simulator.dts
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
/dts-v1/;
|
||||
|
||||
#include <device.h>
|
||||
#include <drivers/root.h>
|
||||
#include <tactility/device.h>
|
||||
#include <tactility/drivers/root.h>
|
||||
|
||||
/ {
|
||||
model = "Simulator";
|
||||
|
||||
@ -1,23 +0,0 @@
|
||||
cmake_minimum_required(VERSION 3.20)
|
||||
|
||||
file(GLOB_RECURSE SOURCES "source/*.c**")
|
||||
|
||||
if (DEFINED ENV{ESP_IDF_VERSION})
|
||||
|
||||
idf_component_register(
|
||||
SRCS ${SOURCES}
|
||||
INCLUDE_DIRS "include/"
|
||||
REQUIRES drivers-core
|
||||
)
|
||||
|
||||
target_compile_options(${COMPONENT_LIB} PRIVATE -std=c23)
|
||||
|
||||
else ()
|
||||
|
||||
add_library(drivers-abstract OBJECT)
|
||||
target_sources(drivers-abstract PRIVATE ${SOURCES})
|
||||
target_include_directories(drivers-abstract PUBLIC include/)
|
||||
target_link_libraries(drivers-abstract PUBLIC drivers-core)
|
||||
target_compile_options(drivers-abstract PRIVATE -std=c23)
|
||||
|
||||
endif ()
|
||||
@ -1,23 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <stdint.h>
|
||||
#include "gpio.h"
|
||||
|
||||
struct i2c_controller_config {
|
||||
uint32_t clock_frequency;
|
||||
struct gpio_pin_config pin_sda;
|
||||
struct gpio_pin_config pin_scl;
|
||||
};
|
||||
|
||||
struct i2c_controller_api {
|
||||
bool (*master_read)(struct device* dev, uint8_t address, uint8_t* data, size_t dataSize); // TODO: add timeout
|
||||
bool (*master_write)(struct device* dev, uint8_t address, const uint8_t* data, uint16_t dataSize); // TODO: add timeout
|
||||
};
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
@ -1,5 +0,0 @@
|
||||
#include "drivers/i2c_controller.h"
|
||||
|
||||
#if !defined(CONFIG_I2C_CONTROLLER_DEVICE_COUNT_LIMIT)
|
||||
#define CONFIG_I2C_CONTROLLER_DEVICE_COUNT_LIMIT 4
|
||||
#endif
|
||||
@ -1,21 +0,0 @@
|
||||
cmake_minimum_required(VERSION 3.20)
|
||||
|
||||
file(GLOB_RECURSE SOURCES "source/*.c**")
|
||||
|
||||
if (DEFINED ENV{ESP_IDF_VERSION})
|
||||
|
||||
idf_component_register(
|
||||
SRCS ${SOURCES}
|
||||
INCLUDE_DIRS "include/"
|
||||
)
|
||||
|
||||
target_compile_options(${COMPONENT_LIB} PRIVATE -std=c23)
|
||||
|
||||
else ()
|
||||
|
||||
add_library(drivers-core OBJECT)
|
||||
target_sources(drivers-core PRIVATE ${SOURCES})
|
||||
target_include_directories(drivers-core PUBLIC include/)
|
||||
target_compile_options(drivers-core PRIVATE -std=c23)
|
||||
|
||||
endif ()
|
||||
@ -7,17 +7,14 @@ if (DEFINED ENV{ESP_IDF_VERSION})
|
||||
idf_component_register(
|
||||
SRCS ${SOURCES}
|
||||
INCLUDE_DIRS "include/"
|
||||
REQUIRES drivers-abstract driver
|
||||
REQUIRES core driver
|
||||
)
|
||||
|
||||
target_compile_options(${COMPONENT_LIB} PRIVATE -std=c23)
|
||||
|
||||
else ()
|
||||
|
||||
add_library(drivers-esp OBJECT)
|
||||
target_sources(drivers-esp PRIVATE ${SOURCES})
|
||||
target_include_directories(drivers-esp PUBLIC include/)
|
||||
target_link_libraries(drivers-esp PUBLIC drivers-abstract)
|
||||
target_compile_options(drivers-esp PRIVATE -std=c23)
|
||||
target_link_libraries(drivers-esp PUBLIC core)
|
||||
|
||||
endif ()
|
||||
@ -1,3 +1,10 @@
|
||||
description: ESP32 GPIO Controller
|
||||
|
||||
include: ["i2c-controller.yaml"]
|
||||
|
||||
properties:
|
||||
port:
|
||||
type: int
|
||||
description: |
|
||||
The port number, defined by i2c_port_t.
|
||||
Depending on the hardware, these values are available: I2C_NUM_0, I2C_NUM_1, LP_I2C_NUM_0
|
||||
|
||||
@ -1,3 +1,3 @@
|
||||
dependencies:
|
||||
- Drivers/drivers-abstract
|
||||
- core
|
||||
bindings: bindings
|
||||
|
||||
@ -1,22 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <device.h>
|
||||
#include <drivers/i2c_controller.h>
|
||||
|
||||
// Inherit base config
|
||||
#define esp32_i2c_config i2c_controller_config
|
||||
|
||||
// Inherit base API
|
||||
#define esp32_i2c_api i2c_controller_api
|
||||
|
||||
int esp32_i2c_init(const struct device* device);
|
||||
|
||||
int esp32_i2c_deinit(const struct device* device);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
@ -4,10 +4,13 @@
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <device.h>
|
||||
#include <drivers/gpio_controller.h>
|
||||
#include <tactility/device.h>
|
||||
#include <tactility/drivers/gpio_controller.h>
|
||||
|
||||
struct esp32_gpio_config {
|
||||
uint8_t gpio_count;
|
||||
};
|
||||
|
||||
#define esp32_gpio_config gpio_controller_config
|
||||
#define esp32_gpio_api gpio_controller_api
|
||||
|
||||
int esp32_gpio_init(const struct device* device);
|
||||
28
Drivers/drivers-esp/include/tactility/drivers/esp32_i2c.h
Normal file
28
Drivers/drivers-esp/include/tactility/drivers/esp32_i2c.h
Normal file
@ -0,0 +1,28 @@
|
||||
#pragma once
|
||||
|
||||
#include <hal/i2c_types.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <tactility/device.h>
|
||||
#include <tactility/drivers/i2c_controller.h>
|
||||
|
||||
struct esp32_i2c_config {
|
||||
uint32_t clock_frequency;
|
||||
struct gpio_pin_config pin_sda;
|
||||
struct gpio_pin_config pin_scl;
|
||||
const i2c_port_t port;
|
||||
};
|
||||
|
||||
// Inherit base API
|
||||
#define esp32_i2c_api i2c_controller_api
|
||||
|
||||
int esp32_i2c_init(const struct device* device);
|
||||
|
||||
int esp32_i2c_deinit(const struct device* device);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
@ -1,12 +1,13 @@
|
||||
#include <drivers-esp/esp32_gpio.h>
|
||||
#include <drivers/gpio_controller.h>
|
||||
#include <drivers/gpio.h>
|
||||
// ESP
|
||||
#include <esp_log.h>
|
||||
#include <tactility/drivers/esp32_gpio.h>
|
||||
#include <tactility/drivers/gpio_controller.h>
|
||||
|
||||
#include <driver/gpio.h>
|
||||
#include <esp_log.h>
|
||||
|
||||
#define TAG "esp32_gpio"
|
||||
|
||||
#define GET_CONFIG(dev) ((struct esp32_gpio_config*)dev->config)
|
||||
|
||||
static bool set_level(const struct device* dev, gpio_pin_t pin, bool high) {
|
||||
return gpio_set_level(pin, high) == ESP_OK;
|
||||
}
|
||||
@ -17,16 +18,70 @@ static bool get_level(const struct device* dev, gpio_pin_t pin, bool* high) {
|
||||
}
|
||||
|
||||
static bool set_options(const struct device* dev, gpio_pin_t pin, gpio_flags_t options) {
|
||||
// TODO
|
||||
// gpio_set_direction()
|
||||
// gpio_set_pull_mode()
|
||||
return true;
|
||||
const struct esp32_gpio_config* config = GET_CONFIG(dev);
|
||||
|
||||
if (pin >= config->gpio_count) {
|
||||
return false;
|
||||
}
|
||||
|
||||
gpio_mode_t mode;
|
||||
if (options & (GPIO_DIRECTION_INPUT_OUTPUT)) {
|
||||
mode = GPIO_MODE_INPUT_OUTPUT;
|
||||
} else if (options & GPIO_DIRECTION_INPUT) {
|
||||
mode = GPIO_MODE_INPUT;
|
||||
} else if (options & GPIO_DIRECTION_OUTPUT) {
|
||||
mode = GPIO_MODE_OUTPUT;
|
||||
} else {
|
||||
assert(false);
|
||||
}
|
||||
|
||||
const gpio_config_t esp_config = {
|
||||
.pin_bit_mask = 1UL << pin,
|
||||
.mode = mode,
|
||||
.pull_up_en = (options & GPIO_PULL_UP) ? GPIO_PULLUP_ENABLE : GPIO_PULLUP_DISABLE,
|
||||
.pull_down_en = (options & GPIO_PULL_DOWN) ? GPIO_PULLDOWN_ENABLE : GPIO_PULLDOWN_DISABLE,
|
||||
.intr_type = GPIO_INTERRUPT_FROM_OPTIONS(options),
|
||||
#if SOC_GPIO_SUPPORT_PIN_HYS_FILTER
|
||||
.hys_ctrl_mode = GPIO_HYS_CTRL_EFUSE
|
||||
#endif
|
||||
};
|
||||
|
||||
return gpio_config(&esp_config) == ESP_OK;
|
||||
}
|
||||
|
||||
static bool get_options(const struct device* dev, gpio_pin_t pin, gpio_flags_t* options) {
|
||||
// gpio_get_direction()
|
||||
// gpio_get_pull_mode()
|
||||
// TODO
|
||||
gpio_io_config_t esp_config;
|
||||
if (gpio_get_io_config((gpio_num_t)pin, &esp_config) != ESP_OK) {
|
||||
return false;
|
||||
}
|
||||
|
||||
gpio_flags_t output = 0;
|
||||
|
||||
if (esp_config.pu) {
|
||||
output |= GPIO_PULL_UP;
|
||||
}
|
||||
|
||||
if (esp_config.pd) {
|
||||
output |= GPIO_PULL_DOWN;
|
||||
}
|
||||
|
||||
if (esp_config.ie) {
|
||||
output |= GPIO_DIRECTION_INPUT;
|
||||
}
|
||||
|
||||
if (esp_config.oe) {
|
||||
output |= GPIO_DIRECTION_OUTPUT;
|
||||
}
|
||||
|
||||
if (esp_config.oe) {
|
||||
output |= GPIO_DIRECTION_OUTPUT;
|
||||
}
|
||||
|
||||
if (esp_config.oe_inv) {
|
||||
output |= GPIO_ACTIVE_LOW;
|
||||
}
|
||||
|
||||
*options = output;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@ -1,23 +1,39 @@
|
||||
#include "drivers-esp/esp32_i2c.h"
|
||||
#include <drivers/i2c_controller.h>
|
||||
#include "tactility/drivers/esp32_i2c.h"
|
||||
|
||||
#include "driver/i2c.h"
|
||||
|
||||
#include <esp_log.h>
|
||||
#include <stdio.h>
|
||||
#include <tactility/drivers/i2c_controller.h>
|
||||
|
||||
#define TAG "esp32_i2c"
|
||||
|
||||
#define GET_CONFIG(dev) static_cast<struct i2c_esp_config>(dev->config)
|
||||
#define GET_CONFIG(dev) ((struct esp32_i2c_config*)dev->config)
|
||||
|
||||
static bool master_read(struct device* dev, uint8_t address, uint8_t* data, size_t dataSize) {
|
||||
return true;
|
||||
static bool read(struct device* dev, uint8_t address, uint8_t* data, size_t dataSize, TickType_t timeout) {
|
||||
// TODO: mutex
|
||||
esp_err_t result = i2c_master_read_from_device(GET_CONFIG(dev)->port, address, data, dataSize, timeout);
|
||||
ESP_ERROR_CHECK_WITHOUT_ABORT(result);
|
||||
return result == ESP_OK;
|
||||
}
|
||||
|
||||
static bool master_write(struct device* dev, uint8_t address, const uint8_t* data, uint16_t dataSize) {
|
||||
return true;
|
||||
static bool write(struct device* dev, uint8_t address, const uint8_t* data, uint16_t dataSize, TickType_t timeout) {
|
||||
// TODO: mutex
|
||||
esp_err_t result = i2c_master_write_to_device(GET_CONFIG(dev)->port, address, data, dataSize, timeout);
|
||||
ESP_ERROR_CHECK_WITHOUT_ABORT(result);
|
||||
return result == ESP_OK;
|
||||
}
|
||||
|
||||
static bool write_read(struct device* dev, uint8_t address, const uint8_t* write_data, size_t write_data_size, uint8_t* read_data, size_t read_data_size, TickType_t timeout) {
|
||||
// TODO: mutex
|
||||
esp_err_t result = i2c_master_write_read_device(GET_CONFIG(dev)->port, address, write_data, write_data_size, read_data, read_data_size, timeout);
|
||||
ESP_ERROR_CHECK_WITHOUT_ABORT(result);
|
||||
return result == ESP_OK;
|
||||
}
|
||||
|
||||
const struct esp32_i2c_api esp32_i2c_api_instance = {
|
||||
.master_read = master_read,
|
||||
.master_write = master_write
|
||||
.read = read,
|
||||
.write = write,
|
||||
.write_read = write_read
|
||||
};
|
||||
|
||||
int esp32_i2c_init(const struct device* device) {
|
||||
|
||||
@ -1,8 +1,5 @@
|
||||
cmake_minimum_required(VERSION 3.20)
|
||||
|
||||
set(CMAKE_CXX_STANDARD 26)
|
||||
set(CMAKE_C_STANDARD 23)
|
||||
|
||||
file(GLOB_RECURSE SOURCE_FILES "Source/*.c*")
|
||||
|
||||
# Determine device identifier and project location
|
||||
@ -25,9 +22,8 @@ if (DEFINED ENV{ESP_IDF_VERSION})
|
||||
idf_component_register(
|
||||
SRCS ${SOURCE_FILES}
|
||||
REQUIRES ${DEVICE_COMPONENTS}
|
||||
REQUIRES Tactility TactilityC drivers-core drivers-abstract drivers-esp ${TACTILITY_DEVICE_PROJECT}
|
||||
REQUIRES Tactility TactilityC core drivers-esp ${TACTILITY_DEVICE_PROJECT}
|
||||
)
|
||||
target_compile_options(${COMPONENT_LIB} PRIVATE -std=c23)
|
||||
|
||||
else ()
|
||||
|
||||
@ -38,12 +34,10 @@ else ()
|
||||
PRIVATE TactilityFreeRtos
|
||||
PRIVATE Simulator
|
||||
PRIVATE SDL2::SDL2-static SDL2-static
|
||||
PRIVATE drivers-abstract
|
||||
PRIVATE drivers-core
|
||||
PRIVATE core
|
||||
)
|
||||
|
||||
target_include_directories(FirmwareSim PRIVATE "${CMAKE_SOURCE_DIR}/Firmware/Generated")
|
||||
target_compile_options(FirmwareSim PRIVATE -std=c++23)
|
||||
|
||||
add_definitions(-D_Nullable=)
|
||||
add_definitions(-D_Nonnull=)
|
||||
|
||||
@ -1,9 +1,5 @@
|
||||
cmake_minimum_required(VERSION 3.20)
|
||||
|
||||
set(CMAKE_CXX_STANDARD 26)
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||
set(CMAKE_CXX_EXTENSIONS OFF)
|
||||
|
||||
if (DEFINED ENV{ESP_IDF_VERSION})
|
||||
idf_component_register(
|
||||
SRC_DIRS "Source/"
|
||||
|
||||
@ -1,9 +1,5 @@
|
||||
cmake_minimum_required(VERSION 3.20)
|
||||
|
||||
set(CMAKE_CXX_STANDARD 26)
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||
set(CMAKE_CXX_EXTENSIONS OFF)
|
||||
|
||||
if (DEFINED ENV{ESP_IDF_VERSION})
|
||||
idf_component_register(
|
||||
SRC_DIRS "Source/"
|
||||
|
||||
@ -1,12 +1,10 @@
|
||||
cmake_minimum_required(VERSION 3.20)
|
||||
|
||||
set(CMAKE_CXX_STANDARD 26)
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||
|
||||
if (DEFINED ENV{ESP_IDF_VERSION})
|
||||
file(GLOB_RECURSE SOURCE_FILES Source/*.c*)
|
||||
|
||||
list(APPEND REQUIRES_LIST
|
||||
core
|
||||
TactilityCore
|
||||
TactilityFreeRtos
|
||||
lvgl
|
||||
@ -27,8 +25,6 @@ if (DEFINED ENV{ESP_IDF_VERSION})
|
||||
vfs
|
||||
fatfs
|
||||
lwip
|
||||
drivers-abstract
|
||||
drivers-core
|
||||
)
|
||||
|
||||
if ("${IDF_TARGET}" STREQUAL "esp32s3")
|
||||
@ -81,8 +77,7 @@ else()
|
||||
PUBLIC lv_screenshot
|
||||
PUBLIC minmea
|
||||
PUBLIC minitar
|
||||
PUBLIC drivers-abstract
|
||||
PUBLIC drivers-core
|
||||
PUBLIC core
|
||||
)
|
||||
endif()
|
||||
|
||||
|
||||
@ -4,7 +4,8 @@
|
||||
#include <Tactility/app/AppManifest.h>
|
||||
#include <Tactility/hal/Configuration.h>
|
||||
#include <Tactility/service/ServiceManifest.h>
|
||||
#include <device.h>
|
||||
|
||||
#include <tactility/device.h>
|
||||
|
||||
namespace tt {
|
||||
|
||||
|
||||
@ -1,8 +1,5 @@
|
||||
cmake_minimum_required(VERSION 3.20)
|
||||
|
||||
set(CMAKE_CXX_STANDARD 26)
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||
|
||||
if (DEFINED ENV{ESP_IDF_VERSION})
|
||||
file(GLOB_RECURSE SOURCE_FILES Source/*.c*)
|
||||
|
||||
|
||||
@ -1,8 +1,5 @@
|
||||
cmake_minimum_required(VERSION 3.20)
|
||||
|
||||
set(CMAKE_CXX_STANDARD 26)
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||
|
||||
if (DEFINED ENV{ESP_IDF_VERSION})
|
||||
file(GLOB_RECURSE SOURCE_FILES Source/*.c*)
|
||||
|
||||
|
||||
@ -1,8 +1,5 @@
|
||||
cmake_minimum_required(VERSION 3.20)
|
||||
|
||||
set(CMAKE_CXX_STANDARD 26)
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||
|
||||
if (DEFINED ENV{ESP_IDF_VERSION})
|
||||
|
||||
idf_component_register(
|
||||
|
||||
@ -1,3 +1,5 @@
|
||||
#pragma once
|
||||
|
||||
#ifdef ESP_PLATFORM
|
||||
#include <freertos/FreeRTOS.h>
|
||||
#include <freertos/queue.h>
|
||||
|
||||
18
core/CMakeLists.txt
Normal file
18
core/CMakeLists.txt
Normal file
@ -0,0 +1,18 @@
|
||||
cmake_minimum_required(VERSION 3.20)
|
||||
|
||||
file(GLOB_RECURSE SOURCES "source/*.c**")
|
||||
|
||||
if (DEFINED ENV{ESP_IDF_VERSION})
|
||||
|
||||
idf_component_register(
|
||||
SRCS ${SOURCES}
|
||||
INCLUDE_DIRS "include/"
|
||||
)
|
||||
|
||||
else ()
|
||||
|
||||
add_library(core OBJECT ${SOURCES})
|
||||
target_include_directories(core PUBLIC include/)
|
||||
target_link_libraries(core PUBLIC freertos_kernel)
|
||||
|
||||
endif ()
|
||||
@ -6,6 +6,7 @@ extern "C" {
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stddef.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
struct device;
|
||||
|
||||
@ -4,23 +4,33 @@
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <device.h>
|
||||
#include <tactility/device.h>
|
||||
|
||||
#define GPIO_OPTIONS_MASK 0x1f
|
||||
|
||||
#define GPIO_ACTIVE_HIGH (0 << 0)
|
||||
#define GPIO_ACTIVE_LOW (1 << 0)
|
||||
|
||||
#define GPIO_UNIDIRECTIONAL (0 << 1)
|
||||
#define GPIO_BIDIRECTIONAL (1 << 1)
|
||||
|
||||
#define GPIO_OPEN_DRAIN (GPIO_UNIDIRECTIONAL | (0 << 2))
|
||||
#define GPIO_OPEN_SOURCE (GPIO_UNIDIRECTIONAL | (1 << 2))
|
||||
#define GPIO_DIRECTION_INPUT (1 << 1)
|
||||
#define GPIO_DIRECTION_OUTPUT (1 << 2)
|
||||
#define GPIO_DIRECTION_INPUT_OUTPUT (GPIO_DIRECTION_INPUT | GPIO_DIRECTION_OUTPUT)
|
||||
|
||||
#define GPIO_PULL_UP (0 << 3)
|
||||
#define GPIO_PULL_DOWN (1 << 4)
|
||||
|
||||
#define GPIO_INTERRUPT_WAKE_UP (1 << 5)
|
||||
#define GPIO_INTERRUPT_BITMASK (0b111 << 5) // 3 bits to hold the values [0, 5]
|
||||
#define GPIO_INTERRUPT_FROM_OPTIONS(options) (gpio_interrupt_type_t)((options & GPIO_INTERRUPT_BITMASK) >> 5)
|
||||
#define GPIO_INTERRUPT_TO_OPTIONS(options, interrupt) (options | (interrupt << 5))
|
||||
|
||||
typedef enum {
|
||||
GPIO_INTERRUPT_DISABLE = 0,
|
||||
GPIO_INTERRUPT_POS_EDGE = 1,
|
||||
GPIO_INTERRUPT_NEG_EDGE = 2,
|
||||
GPIO_INTERRUPT_ANY_EDGE = 3,
|
||||
GPIO_INTERRUPT_LOW_LEVEL = 4,
|
||||
GPIO_INTERRUPT_HIGH_LEVEL = 5,
|
||||
GPIO__MAX,
|
||||
} gpio_interrupt_type_t;
|
||||
|
||||
/**
|
||||
* @brief Provides a type to hold a GPIO pin index.
|
||||
@ -4,13 +4,9 @@
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include "gpio.h"
|
||||
|
||||
struct gpio_controller_config {
|
||||
uint8_t gpio_count;
|
||||
};
|
||||
|
||||
struct gpio_controller_api {
|
||||
bool (*set_level)(const struct device*, gpio_pin_t pin, bool high);
|
||||
bool (*get_level)(const struct device*, gpio_pin_t pin, bool* high);
|
||||
@ -18,9 +14,6 @@ struct gpio_controller_api {
|
||||
bool (*get_options)(const struct device*, gpio_pin_t pin, gpio_flags_t* options);
|
||||
};
|
||||
|
||||
#define GPIO_API(dev) ((struct gpio_controller_api*)dev->api)
|
||||
#define GPIO_CONFIG(dev) ((struct gpio_controller_config*)dev->config)
|
||||
|
||||
bool gpio_controller_set_level(const struct device* dev, gpio_pin_t pin, bool high);
|
||||
bool gpio_controller_get_level(const struct device* dev, gpio_pin_t pin, bool* high);
|
||||
bool gpio_controller_set_options(const struct device* dev, gpio_pin_t pin, gpio_flags_t options);
|
||||
26
core/include/tactility/drivers/i2c_controller.h
Normal file
26
core/include/tactility/drivers/i2c_controller.h
Normal file
@ -0,0 +1,26 @@
|
||||
#pragma once
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include <tactility/freertos/freertos.h>
|
||||
#include "gpio.h"
|
||||
|
||||
struct i2c_controller_api {
|
||||
bool (*read)(struct device* dev, uint8_t address, uint8_t* data, size_t dataSize, TickType_t timeout);
|
||||
bool (*write)(struct device* dev, uint8_t address, const uint8_t* data, uint16_t dataSize, TickType_t timeout);
|
||||
bool (*write_read)(struct device* dev, uint8_t address, const uint8_t* write_data, size_t write_data_size, uint8_t* read_data, size_t read_data_size, TickType_t timeout);
|
||||
};
|
||||
|
||||
bool i2c_controller_read(struct device* dev, uint8_t address, uint8_t* data, size_t dataSize, TickType_t timeout);
|
||||
|
||||
bool i2c_controller_write(struct device* dev, uint8_t address, const uint8_t* data, uint16_t dataSize, TickType_t timeout);
|
||||
|
||||
bool i2c_controller_write_read(struct device* dev, uint8_t address, const uint8_t* write_data, size_t write_data_size, uint8_t* read_data, size_t read_data_size, TickType_t timeout);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
3
core/include/tactility/freertos/README.md
Normal file
3
core/include/tactility/freertos/README.md
Normal file
@ -0,0 +1,3 @@
|
||||
Compatibility include files for FreeRTOS.
|
||||
Custom FreeRTOS from ESP-IDF prefixes paths with "freertos/",
|
||||
but this isn't the normal behaviour for the regular FreeRTOS project.
|
||||
10
core/include/tactility/freertos/event_groups.h
Normal file
10
core/include/tactility/freertos/event_groups.h
Normal file
@ -0,0 +1,10 @@
|
||||
#pragma once
|
||||
|
||||
#ifdef ESP_PLATFORM
|
||||
#include <freertos/FreeRTOS.h>
|
||||
#include <freertos/event_groups.h>
|
||||
#else
|
||||
#include <FreeRTOS.h>
|
||||
#include <event_groups.h>
|
||||
#endif
|
||||
|
||||
7
core/include/tactility/freertos/freertos.h
Normal file
7
core/include/tactility/freertos/freertos.h
Normal file
@ -0,0 +1,7 @@
|
||||
#pragma once
|
||||
|
||||
#ifdef ESP_PLATFORM
|
||||
#include <freertos/FreeRTOS.h>
|
||||
#else
|
||||
#include <FreeRTOS.h>
|
||||
#endif
|
||||
7
core/include/tactility/freertos/port.h
Normal file
7
core/include/tactility/freertos/port.h
Normal file
@ -0,0 +1,7 @@
|
||||
#pragma once
|
||||
|
||||
#include "freertos.h"
|
||||
|
||||
#ifndef ESP_PLATFORM
|
||||
#define xPortInIsrContext(x) (false)
|
||||
#endif
|
||||
10
core/include/tactility/freertos/queue.h
Normal file
10
core/include/tactility/freertos/queue.h
Normal file
@ -0,0 +1,10 @@
|
||||
#pragma once
|
||||
|
||||
#ifdef ESP_PLATFORM
|
||||
#include <freertos/FreeRTOS.h>
|
||||
#include <freertos/queue.h>
|
||||
#else
|
||||
#include <FreeRTOS.h>
|
||||
#include <queue.h>
|
||||
#endif
|
||||
|
||||
19
core/include/tactility/freertos/semaphore.h
Normal file
19
core/include/tactility/freertos/semaphore.h
Normal file
@ -0,0 +1,19 @@
|
||||
#pragma once
|
||||
|
||||
#ifdef ESP_PLATFORM
|
||||
#include <freertos/FreeRTOS.h>
|
||||
#include <freertos/semphr.h>
|
||||
#else
|
||||
#include <FreeRTOS.h>
|
||||
#include <semphr.h>
|
||||
#endif
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
struct SemaphoreHandleDeleter {
|
||||
static void operator()(QueueHandle_t handleToDelete) {
|
||||
assert(xPortInIsrContext() == pdFALSE);
|
||||
vSemaphoreDelete(handleToDelete);
|
||||
}
|
||||
};
|
||||
|
||||
10
core/include/tactility/freertos/task.h
Normal file
10
core/include/tactility/freertos/task.h
Normal file
@ -0,0 +1,10 @@
|
||||
#pragma once
|
||||
|
||||
#ifdef ESP_PLATFORM
|
||||
#include <freertos/FreeRTOS.h>
|
||||
#include <freertos/task.h>
|
||||
#else
|
||||
#include <FreeRTOS.h>
|
||||
#include <task.h>
|
||||
#endif
|
||||
|
||||
9
core/include/tactility/freertos/timers.h
Normal file
9
core/include/tactility/freertos/timers.h
Normal file
@ -0,0 +1,9 @@
|
||||
#pragma once
|
||||
|
||||
#ifdef ESP_PLATFORM
|
||||
#include <freertos/FreeRTOS.h>
|
||||
#include <freertos/timers.h>
|
||||
#else
|
||||
#include <FreeRTOS.h>
|
||||
#include <timers.h>
|
||||
#endif
|
||||
25
core/include/tactility/log.h
Normal file
25
core/include/tactility/log.h
Normal file
@ -0,0 +1,25 @@
|
||||
#pragma once
|
||||
|
||||
#ifdef ESP_PLATFORM
|
||||
#include <esp_log.h>
|
||||
#endif
|
||||
|
||||
#ifndef ESP_PLATFORM
|
||||
|
||||
void log_generic(const char* tag, const char* format, ...);
|
||||
|
||||
#define LOG_E(x, ...) log(x, ##__VA_ARGS__)
|
||||
#define LOG_W(x, ...) log(x, ##__VA_ARGS__)
|
||||
#define LOG_I(x, ...) log(x, ##__VA_ARGS__)
|
||||
#define LOG_D(x, ...) log(x, ##__VA_ARGS__)
|
||||
#define LOG_V(x, ...) log(x, ##__VA_ARGS__)
|
||||
|
||||
#else
|
||||
|
||||
#define LOG_E(x, ...) ESP_LOGD(x, ##__VA_ARGS__)
|
||||
#define LOG_W(x, ...) ESP_LOGW(x, ##__VA_ARGS__)
|
||||
#define LOG_I(x, ...) ESP_LOGI(x, ##__VA_ARGS__)
|
||||
#define LOG_D(x, ...) ESP_LOGD(x, ##__VA_ARGS__)
|
||||
#define LOG_V(x, ...) ESP_LOGV(x, ##__VA_ARGS__)
|
||||
|
||||
#endif
|
||||
@ -1,25 +1,27 @@
|
||||
#include "device.h"
|
||||
#include <tactility/device.h>
|
||||
#include <tactility/log.h>
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#define CONFIG_DEVICE_INDEX_SIZE 64
|
||||
#define TAG "device"
|
||||
|
||||
// TODO: Automatically increase allocated size
|
||||
static const struct device* device_index[CONFIG_DEVICE_INDEX_SIZE ] = {
|
||||
nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
|
||||
nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
|
||||
nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
|
||||
nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||||
};
|
||||
|
||||
uint8_t device_init(struct device* const dev) {
|
||||
assert(dev != nullptr);
|
||||
printf("device_init: %s\n", dev->name);
|
||||
assert(dev != NULL);
|
||||
LOG_I(TAG, "init %s", dev->name);
|
||||
|
||||
if (!dev->state.initialized) {
|
||||
if (dev->operations.init == nullptr) {
|
||||
if (dev->operations.init == NULL) {
|
||||
dev->state.initialized = true;
|
||||
dev->state.init_result = 0U;
|
||||
} else {
|
||||
@ -32,10 +34,10 @@ uint8_t device_init(struct device* const dev) {
|
||||
}
|
||||
|
||||
bool device_init_all(struct device** const device_array) {
|
||||
assert(device_array != nullptr);
|
||||
assert(device_array != NULL);
|
||||
struct device** current_device = device_array;
|
||||
bool all_succeeded = true;
|
||||
while (*current_device != nullptr) {
|
||||
while (*current_device != NULL) {
|
||||
struct device* device = *current_device;
|
||||
if (device_init(device) != 0U) {
|
||||
all_succeeded = false;
|
||||
@ -46,10 +48,11 @@ bool device_init_all(struct device** const device_array) {
|
||||
}
|
||||
|
||||
uint8_t device_deinit(struct device* const dev) {
|
||||
assert(dev != nullptr);
|
||||
assert(dev != NULL);
|
||||
LOG_I(TAG, "deinit %s", dev->name);
|
||||
|
||||
if (dev->state.initialized) {
|
||||
if (dev->operations.deinit != nullptr) {
|
||||
if (dev->operations.deinit != NULL) {
|
||||
dev->state.init_result = dev->operations.deinit(dev);
|
||||
if (dev->state.init_result == 0U) {
|
||||
dev->state.initialized = false;
|
||||
@ -63,15 +66,16 @@ uint8_t device_deinit(struct device* const dev) {
|
||||
}
|
||||
|
||||
bool device_is_ready(const struct device* const dev) {
|
||||
assert(dev != nullptr);
|
||||
assert(dev != NULL);
|
||||
return dev->state.initialized && (dev->state.init_result == 0U);
|
||||
}
|
||||
|
||||
|
||||
void device_add(const struct device* dev) {
|
||||
assert(dev != nullptr);
|
||||
assert(dev != NULL);
|
||||
LOG_I(TAG, "add %s", dev->name);
|
||||
for (int i = 0; i < CONFIG_DEVICE_INDEX_SIZE; i++) {
|
||||
if (device_index[i] == nullptr) {
|
||||
if (device_index[i] == NULL) {
|
||||
device_index[i] = dev;
|
||||
return;
|
||||
}
|
||||
@ -80,9 +84,9 @@ void device_add(const struct device* dev) {
|
||||
}
|
||||
|
||||
void device_add_all(struct device** const device_array) {
|
||||
assert(device_array != nullptr);
|
||||
assert(device_array != NULL);
|
||||
struct device** current_device = device_array;
|
||||
while (*current_device != nullptr) {
|
||||
while (*current_device != NULL) {
|
||||
struct device* device = *current_device;
|
||||
device_add(device);
|
||||
current_device++;
|
||||
@ -90,10 +94,11 @@ void device_add_all(struct device** const device_array) {
|
||||
}
|
||||
|
||||
bool device_remove(const struct device* dev) {
|
||||
assert(dev != nullptr);
|
||||
assert(dev != NULL);
|
||||
LOG_I(TAG, "remove %s", dev->name);
|
||||
for (int i = 0; i < CONFIG_DEVICE_INDEX_SIZE; i++) {
|
||||
if (device_index[i] == dev) {
|
||||
device_index[i] = nullptr;
|
||||
device_index[i] = NULL;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@ -101,10 +106,10 @@ bool device_remove(const struct device* dev) {
|
||||
}
|
||||
|
||||
bool device_find_next_by_compatible(const char* identifier, const struct device** dev) {
|
||||
bool found_first = (*dev == nullptr);
|
||||
bool found_first = (*dev == NULL);
|
||||
for (int device_idx = 0; device_idx < CONFIG_DEVICE_INDEX_SIZE; device_idx++) {
|
||||
auto indexed_device = device_index[device_idx];
|
||||
if (indexed_device != nullptr) {
|
||||
const struct device* indexed_device = device_index[device_idx];
|
||||
if (indexed_device != NULL) {
|
||||
if (!found_first) {
|
||||
if (indexed_device == *dev) {
|
||||
found_first = true;
|
||||
@ -1,4 +1,6 @@
|
||||
#include <drivers/gpio_controller.h>
|
||||
#include <tactility/drivers/gpio_controller.h>
|
||||
|
||||
#define GPIO_API(dev) ((struct gpio_controller_api*)dev->api)
|
||||
|
||||
bool gpio_controller_set_level(const struct device* dev, gpio_pin_t pin, bool high) {
|
||||
return GPIO_API(dev)->set_level(dev, pin, high);
|
||||
15
core/source/drivers/i2c_controller.c
Normal file
15
core/source/drivers/i2c_controller.c
Normal file
@ -0,0 +1,15 @@
|
||||
#include <tactility/drivers/i2c_controller.h>
|
||||
|
||||
#define GPIO_API(dev) ((struct i2c_controller_api*)dev->api)
|
||||
|
||||
bool i2c_controller_read(struct device* dev, uint8_t address, uint8_t* data, size_t dataSize, TickType_t timeout) {
|
||||
return GPIO_API(dev)->read(dev, address, data, dataSize, timeout);
|
||||
}
|
||||
|
||||
bool i2c_controller_write(struct device* dev, uint8_t address, const uint8_t* data, uint16_t dataSize, TickType_t timeout) {
|
||||
return GPIO_API(dev)->write(dev, address, data, dataSize, timeout);
|
||||
}
|
||||
|
||||
bool i2c_controller_write_read(struct device* dev, uint8_t address, const uint8_t* write_data, size_t write_data_size, uint8_t* read_data, size_t read_data_size, TickType_t timeout) {
|
||||
return GPIO_API(dev)->write_read(dev, address, write_data, write_data_size, read_data, read_data_size, timeout);
|
||||
}
|
||||
@ -1,3 +1,3 @@
|
||||
#include <drivers/root.h>
|
||||
#include "tactility/drivers/root.h"
|
||||
|
||||
const struct root_api root_api_instance = {};
|
||||
17
core/source/log.c
Normal file
17
core/source/log.c
Normal file
@ -0,0 +1,17 @@
|
||||
#include <tactility/log.h>
|
||||
|
||||
#ifndef ESP_PLATFORM
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
void log_generic(const char* tag, const char* format, ...) {
|
||||
va_list args;
|
||||
va_start(args, format);
|
||||
printf("%s ", tag);
|
||||
vprintf(format, args);
|
||||
printf("\n");
|
||||
va_end(args);
|
||||
}
|
||||
|
||||
#endif
|
||||
Loading…
x
Reference in New Issue
Block a user