mirror of
https://github.com/ByteWelder/Tactility.git
synced 2026-08-18 16:05:05 +00:00
- Added kernel base drivers for: display, pointer (touch, mouse, etc.), keyboard, adc, power supply and backlight - Implement new kernel driver modules: `st7789-module` and `gt911-module` - Implement ESP32 ADC "oneshot" kernel driver - Implement ESP32 backlight kernel driver with ledc API - Implemented `battery-sense` driver that allows for voltage measurement and creates a power supply child device - Updated github actions - Updated flash scripts - Fix for esp32 legacy driver conflict with ADC - Created separate `lilygo-tdeck` and `lilygo-tdeck-plus` devices - Created `lilygo-module` with LilyGO kernel drivers - Fix for intermittent errors in build related to code generation of `devicetree.c` - `lvgl-module` can now map kernel drivers onto LVGL devices - Created `KernelDisplayApp` as a mirror of `HalDisplayApp` (formerly `DisplayApp`) - Removed `struct` and `enum` prefix in a lot of kernel driver cpp source files - `lilygo-tdeck` and `lilygo-tdeck-plus` are now fully relying on kernel drivers and don't use any of the old HAL
103 lines
3.4 KiB
C++
103 lines
3.4 KiB
C++
// SPDX-License-Identifier: Apache-2.0
|
|
#include <esp_adc/adc_oneshot.h>
|
|
|
|
#include <tactility/error_esp32.h>
|
|
#include <tactility/driver.h>
|
|
#include <tactility/drivers/adc_controller.h>
|
|
#include <tactility/drivers/esp32_adc_oneshot.h>
|
|
#include <tactility/log.h>
|
|
#include <tactility/time.h>
|
|
|
|
#define TAG "esp32_adc_oneshot"
|
|
|
|
#define GET_CONFIG(device) ((Esp32AdcOneshotConfig*)device->config)
|
|
#define GET_HANDLE(device) ((adc_oneshot_unit_handle_t)device_get_driver_data(device))
|
|
|
|
static const Esp32AdcOneshotChannelConfig* find_channel_config(const Esp32AdcOneshotConfig* dts_config, uint8_t channel_index) {
|
|
if (channel_index >= dts_config->channel_count) {
|
|
return nullptr;
|
|
}
|
|
return &dts_config->channels[channel_index];
|
|
}
|
|
|
|
extern "C" {
|
|
|
|
static error_t read_raw(Device* device, uint8_t channel, int* out_raw, TickType_t timeout) {
|
|
if (xPortInIsrContext()) return ERROR_ISR_STATUS;
|
|
auto* dts_config = GET_CONFIG(device);
|
|
auto* channel_config = find_channel_config(dts_config, channel);
|
|
if (channel_config == nullptr) {
|
|
return ERROR_OUT_OF_RANGE;
|
|
}
|
|
|
|
esp_err_t esp_error = adc_oneshot_read(GET_HANDLE(device), channel_config->channel, out_raw);
|
|
if (esp_error != ESP_OK) {
|
|
LOG_E(TAG, "read(channel=%u) failed: %s", channel, esp_err_to_name(esp_error));
|
|
}
|
|
return esp_err_to_error(esp_error);
|
|
}
|
|
|
|
static error_t start(Device* device) {
|
|
LOG_I(TAG, "start %s", device->name);
|
|
auto* dts_config = GET_CONFIG(device);
|
|
|
|
adc_oneshot_unit_init_cfg_t init_config = {
|
|
.unit_id = dts_config->unit_id,
|
|
.clk_src = dts_config->clk_src,
|
|
.ulp_mode = dts_config->ulp_mode,
|
|
};
|
|
|
|
adc_oneshot_unit_handle_t handle;
|
|
esp_err_t esp_error = adc_oneshot_new_unit(&init_config, &handle);
|
|
if (esp_error != ESP_OK) {
|
|
LOG_E(TAG, "Failed to create ADC unit %d: %s", (int)dts_config->unit_id, esp_err_to_name(esp_error));
|
|
return ERROR_RESOURCE;
|
|
}
|
|
|
|
for (size_t i = 0; i < dts_config->channel_count; i++) {
|
|
const auto& channel_config = dts_config->channels[i];
|
|
adc_oneshot_chan_cfg_t chan_cfg = {
|
|
.atten = channel_config.atten,
|
|
.bitwidth = channel_config.bitwidth,
|
|
};
|
|
esp_error = adc_oneshot_config_channel(handle, channel_config.channel, &chan_cfg);
|
|
if (esp_error != ESP_OK) {
|
|
LOG_E(TAG, "Failed to configure channel %d: %s", (int)channel_config.channel, esp_err_to_name(esp_error));
|
|
adc_oneshot_del_unit(handle);
|
|
return ERROR_RESOURCE;
|
|
}
|
|
}
|
|
|
|
device_set_driver_data(device, handle);
|
|
return ERROR_NONE;
|
|
}
|
|
|
|
static error_t stop(Device* device) {
|
|
LOG_I(TAG, "stop %s", device->name);
|
|
esp_err_t esp_error = adc_oneshot_del_unit(GET_HANDLE(device));
|
|
if (esp_error != ESP_OK) {
|
|
LOG_E(TAG, "Deleting ADC unit failed: %s", esp_err_to_name(esp_error));
|
|
}
|
|
device_set_driver_data(device, nullptr);
|
|
return ERROR_NONE;
|
|
}
|
|
|
|
static constexpr AdcControllerApi ESP32_ADC_ONESHOT_API = {
|
|
.read_raw = read_raw
|
|
};
|
|
|
|
extern Module platform_esp32_module;
|
|
|
|
Driver esp32_adc_oneshot_driver = {
|
|
.name = "esp32_adc_oneshot",
|
|
.compatible = (const char*[]) { "espressif,esp32-adc-oneshot", nullptr },
|
|
.start_device = start,
|
|
.stop_device = stop,
|
|
.api = &ESP32_ADC_ONESHOT_API,
|
|
.device_type = &ADC_CONTROLLER_TYPE,
|
|
.owner = &platform_esp32_module,
|
|
.internal = nullptr
|
|
};
|
|
|
|
} // extern "C"
|