From 275a84b3d3d79fd82b7d74a25bf9fa43e990d1d3 Mon Sep 17 00:00:00 2001 From: The Nguyen Date: Thu, 3 Apr 2025 11:19:05 +0700 Subject: [PATCH 01/10] manifest: update hal_renesas revision to latest Update rev of hal_renesas to add support for CTSU Signed-off-by: The Nguyen --- west.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/west.yml b/west.yml index 7032362af5ced..1ac3f698bd476 100644 --- a/west.yml +++ b/west.yml @@ -226,7 +226,7 @@ manifest: - hal - name: hal_renesas path: modules/hal/renesas - revision: 0769fe1520f6c14e6301188588da758a609f181d + revision: pull/115/head groups: - hal - name: hal_rpi_pico From 6964578ede6914dcfd0f39fe2fc2a7e76beb2214 Mon Sep 17 00:00:00 2001 From: The Nguyen Date: Thu, 3 Apr 2025 11:39:03 +0700 Subject: [PATCH 02/10] drivers: input: initial support for renesas,ra-ctsu First commit to add support for Renesas RA Capasitive Sensing Unit Signed-off-by: The Nguyen --- drivers/input/CMakeLists.txt | 1 + drivers/input/Kconfig | 1 + drivers/input/Kconfig.renesas_ra | 96 +++ drivers/input/input_renesas_ra_ctsu.c | 704 ++++++++++++++++++ .../input/renesas,ra-ctsu-button.yaml | 69 ++ .../input/renesas,ra-ctsu-slider.yaml | 52 ++ dts/bindings/input/renesas,ra-ctsu-wheel.yaml | 52 ++ dts/bindings/input/renesas,ra-ctsu.yaml | 199 +++++ include/zephyr/input/input_renesas_ra_ctsu.h | 40 + modules/Kconfig.renesas | 17 + 10 files changed, 1231 insertions(+) create mode 100644 drivers/input/Kconfig.renesas_ra create mode 100644 drivers/input/input_renesas_ra_ctsu.c create mode 100644 dts/bindings/input/renesas,ra-ctsu-button.yaml create mode 100644 dts/bindings/input/renesas,ra-ctsu-slider.yaml create mode 100644 dts/bindings/input/renesas,ra-ctsu-wheel.yaml create mode 100644 dts/bindings/input/renesas,ra-ctsu.yaml create mode 100644 include/zephyr/input/input_renesas_ra_ctsu.h diff --git a/drivers/input/CMakeLists.txt b/drivers/input/CMakeLists.txt index 054c04ff60cd7..832d084655558 100644 --- a/drivers/input/CMakeLists.txt +++ b/drivers/input/CMakeLists.txt @@ -31,6 +31,7 @@ zephyr_library_sources_ifdef(CONFIG_INPUT_PAW32XX input_paw32xx.c) zephyr_library_sources_ifdef(CONFIG_INPUT_PINNACLE input_pinnacle.c) zephyr_library_sources_ifdef(CONFIG_INPUT_PMW3610 input_pmw3610.c) zephyr_library_sources_ifdef(CONFIG_INPUT_REALTEK_RTS5912_KBD input_realtek_rts5912_kbd.c) +zephyr_library_sources_ifdef(CONFIG_INPUT_RENESAS_RA_CTSU input_renesas_ra_ctsu.c) zephyr_library_sources_ifdef(CONFIG_INPUT_SBUS input_sbus.c) zephyr_library_sources_ifdef(CONFIG_INPUT_STM32_TSC_KEYS input_tsc_keys.c) zephyr_library_sources_ifdef(CONFIG_INPUT_STMPE811 input_stmpe811.c) diff --git a/drivers/input/Kconfig b/drivers/input/Kconfig index b8dc0890b5678..785f11a76ff2b 100644 --- a/drivers/input/Kconfig +++ b/drivers/input/Kconfig @@ -32,6 +32,7 @@ source "drivers/input/Kconfig.pat912x" source "drivers/input/Kconfig.paw32xx" source "drivers/input/Kconfig.pinnacle" source "drivers/input/Kconfig.pmw3610" +source "drivers/input/Kconfig.renesas_ra" source "drivers/input/Kconfig.rts5912" source "drivers/input/Kconfig.sbus" source "drivers/input/Kconfig.sdl" diff --git a/drivers/input/Kconfig.renesas_ra b/drivers/input/Kconfig.renesas_ra new file mode 100644 index 0000000000000..f6459fc3db572 --- /dev/null +++ b/drivers/input/Kconfig.renesas_ra @@ -0,0 +1,96 @@ +# Copyright (c) 2025 Renesas Electronics Corporation +# SPDX-License-Identifier: Apache-2.0 + +config INPUT_RENESAS_RA_CTSU + bool "Renesas RA Capacitive Touch driver" + default y + depends on DT_HAS_RENESAS_RA_CTSU_ENABLED + select USE_RA_FSP_CTSU + select USE_RA_FSP_TOUCH + select SYS_MEM_BLOCKS + select GPIO + select PINCTRL + help + Enable Renesas RA Touch Sensing driver. + +if INPUT_RENESAS_RA_CTSU + +config INPUT_RENESAS_RA_DEVICE_VCC + int "SoC VCC input in minivolt" + default 3300 + help + SoC VCC input in milivolt. + +config INPUT_RENESAS_RA_QE_TOUCH_CFG + bool "Using QE Touch Workflow to config this driver" + help + If this config was enabled, setting for CTSU and Cap + Touch driver will be reflected the setting that generated + from QE Touch Workflow. + Please add the generated C source files into the app CMakeLists + to make the driver can using it. + +if !INPUT_RENESAS_RA_QE_TOUCH_CFG + +config INPUT_RENESAS_RA_CTSU_NUM_SELF_ELEMENTS + int "Number of self-capacitance elements" + default 0 + help + Number of self-capacitance elements in the CTSU. + +config INPUT_RENESAS_RA_CTSU_NUM_MUTUAL_ELEMENTS + int "Number of mutual-capacitance elements" + default 0 + help + Number of mutual-capacitance elements in the CTSU. + +choice INPUT_RENESAS_RA_CTSU_CHATTERING_SUPPRESSION_TYPE + prompt "Type of chattering suppression" + default INPUT_RENESAS_RA_CTSU_CHATTERING_SUPPRESSION_TYPE_A + +config INPUT_RENESAS_RA_CTSU_CHATTERING_SUPPRESSION_TYPE_A + bool "Counter of exceed threshold is hold within hysteresis range" + help + Counter of exceed threshold is hold within hysteresis range. + +config INPUT_RENESAS_RA_CTSU_CHATTERING_SUPPRESSION_TYPE_B + bool "Counter of exceed threshold is reset within hysteresis range" + help + Counter of exceed threshold is reset within hysteresis range. + +endchoice # INPUT_RENESAS_RA_CTSU_CHATTERING_SUPPRESSION_TYPE + +endif # !INPUT_RENESAS_RA_QE_TOUCH_CFG + +config INPUT_RENESAS_RA_CTSU_POLLING_INTERVAL_MS + int "CTSU debounce interval time" + range 20 500 + default 100 + help + Debouncing interval time in milliseconds. + +config INPUT_RENESAS_RA_CTSU_STABILIZATION_TIME_US + int "CTSU stabilization time" + default 20 + help + Stabilization time required to wait between 2 scans. + +config INPUT_RENESAS_RA_CTSU_DRV_STACK_SIZE + int "CTSU internal thread stack size" + default 512 + help + CTSU driver internal thread stack size. + +config INPUT_RENESAS_RA_CTSU_DRV_PRIORITY + int "CTSU internal thread priority" + default 8 + help + CTSU driver internal thread priority. + +config INPUT_RENESAS_RA_CTSU_MSG_MEM_BLOCK_SIZE + int "CTSU internal sys_mem_blocks allocator size" + default 10 + help + CTSU driver internal sys_mem_blocks allocator maximum num blocks. + +endif # INPUT_RENESAS_RA_CTSU diff --git a/drivers/input/input_renesas_ra_ctsu.c b/drivers/input/input_renesas_ra_ctsu.c new file mode 100644 index 0000000000000..f6f4ce6634915 --- /dev/null +++ b/drivers/input/input_renesas_ra_ctsu.c @@ -0,0 +1,704 @@ +/* + * Copyright (c) 2025 Renesas Electronics Corporation + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +LOG_MODULE_REGISTER(renesas_ra_touch, CONFIG_INPUT_LOG_LEVEL); + +struct renesas_ra_ctsu_cfg { + const struct gpio_dt_spec tscap_pin; + const struct pinctrl_dev_config *pcfg; + const struct device *clock; + const struct clock_control_ra_subsys_cfg clock_subsys; + void (*irq_config)(void); +}; + +struct renesas_ra_ctsu_data { + struct k_sem scanning; + struct k_queue scan_q; + struct k_thread thread_data; + + K_KERNEL_STACK_MEMBER(thread_stack, CONFIG_INPUT_RENESAS_RA_CTSU_DRV_STACK_SIZE); +}; + +struct renesas_ra_ctsu_group_cfg { + const struct device *ctsu_dev; + size_t num_button; + size_t num_slider; + size_t num_wheel; +}; + +struct renesas_ra_ctsu_device_cb { + const struct device *dev; + void (*device_cb)(const struct device *dev, void *data); +}; + +struct renesas_ra_ctsu_group_data { + const struct device *dev; + /* FSP Touch data */ + struct st_touch_instance touch_instance; +#ifndef CONFIG_INPUT_RENESAS_RA_QE_TOUCH_CFG + struct st_touch_instance_ctrl touch_ctrl; + struct st_touch_cfg touch_cfg; + /* FSP CTSU data */ + struct st_ctsu_instance ctsu_instance; + struct st_ctsu_instance_ctrl ctsu_ctrl; + struct st_ctsu_cfg ctsu_cfg; +#endif /* CONFIG_INPUT_RENESAS_RA_QE_TOUCH_CFG */ + /* Touch driver private data */ + struct k_work reading_work; + struct k_timer sampling_timer; + /* Touch driver sample result */ + uint64_t *p_button_status; + uint16_t *p_slider_position; + uint16_t *p_wheel_position; + /* Touch device callback data */ + struct renesas_ra_ctsu_device_cb *p_button_cb; + struct renesas_ra_ctsu_device_cb *p_slider_cb; + struct renesas_ra_ctsu_device_cb *p_wheel_cb; +}; + +extern void ctsu_write_isr(void); +extern void ctsu_read_isr(void); +extern void ctsu_end_isr(void); + +struct ctsu_device_cfg { + const struct device *group_dev; + uint16_t event_code; +}; + +struct ctsu_scan_msg { + void *reserved; /* first word of queue data item reserved for the kernel */ + struct st_touch_instance *p_instance; +}; + +SYS_MEM_BLOCKS_DEFINE_STATIC(scan_msg_allocator, sizeof(struct ctsu_scan_msg), + CONFIG_INPUT_RENESAS_RA_CTSU_MSG_MEM_BLOCK_SIZE, sizeof(uint32_t)); + +static void renesas_ra_callback_adapter(touch_callback_args_t *p_args) +{ + const struct device *dev = p_args->p_context; + const struct renesas_ra_ctsu_group_cfg *cfg = dev->config; + const struct device *ctsu_dev = cfg->ctsu_dev; + struct renesas_ra_ctsu_data *ctsu_data = ctsu_dev->data; + struct renesas_ra_ctsu_group_data *data = dev->data; + + if (p_args->event == CTSU_EVENT_SCAN_COMPLETE) { + k_work_submit(&data->reading_work); + } + + k_sem_give(&ctsu_data->scanning); +} + +#define POLLING_INTERVAL_MS K_MSEC(CONFIG_INPUT_RENESAS_RA_CTSU_POLLING_INTERVAL_MS) +#define STABILIZATION_MS K_USEC(CONFIG_INPUT_RENESAS_RA_CTSU_STABILIZATION_TIME_US) + +static void renesas_ra_ctsu_drv_handler(void *arg0, void *arg1, void *arg2) +{ + ARG_UNUSED(arg1); + ARG_UNUSED(arg2); + const struct device *ctsu_dev = (const struct device *)arg0; + struct renesas_ra_ctsu_data *ctsu_data = ctsu_dev->data; + + while (true) { + struct ctsu_scan_msg *msg = k_queue_get(&ctsu_data->scan_q, K_FOREVER); + struct st_touch_instance *p_instance = msg->p_instance; + fsp_err_t err; + + k_sem_reset(&ctsu_data->scanning); + err = p_instance->p_api->scanStart(p_instance->p_ctrl); + if (err == FSP_SUCCESS) { + k_sem_take(&ctsu_data->scanning, K_FOREVER); + } + + sys_mem_blocks_free(&scan_msg_allocator, 1, (void **)&msg); + + k_sleep(STABILIZATION_MS); + } +} + +static void renesas_ra_ctsu_group_sampling_handler(struct k_timer *timer) +{ + struct renesas_ra_ctsu_group_data *data = + CONTAINER_OF(timer, struct renesas_ra_ctsu_group_data, sampling_timer); + const struct device *ctsu_dev = k_timer_user_data_get(timer); + struct renesas_ra_ctsu_data *ctsu_data = ctsu_dev->data; + struct ctsu_scan_msg *msg; + + if (sys_mem_blocks_alloc(&scan_msg_allocator, 1, (void **)&msg) != 0) { + return; + } + + msg->p_instance = (void *)&data->touch_instance; + k_queue_append(&ctsu_data->scan_q, msg); +} + +#if DT_HAS_COMPAT_STATUS_OKAY(renesas_ra_ctsu_button) +static void renesas_ra_ctsu_group_buttons_read(const struct device *dev) +{ + const struct renesas_ra_ctsu_group_cfg *cfg = dev->config; + struct renesas_ra_ctsu_group_data *data = dev->data; + + if (cfg->num_button == 0) { + return; + } + + if (*data->p_button_status != 0) { + uint64_t tmp_status = *data->p_button_status; + + while (tmp_status != 0) { + int num = u64_count_trailing_zeros(tmp_status); + struct renesas_ra_ctsu_device_cb *p_button_cb = &data->p_button_cb[num]; + + p_button_cb->device_cb(p_button_cb->dev, NULL); + WRITE_BIT(tmp_status, num, 0); + } + } +} +#endif /* DT_HAS_COMPAT_STATUS_OKAY(renesas_ra_ctsu_button) */ + +#if DT_HAS_COMPAT_STATUS_OKAY(renesas_ra_ctsu_slider) +static void renesas_ra_ctsu_group_sliders_read(const struct device *dev) +{ + const struct renesas_ra_ctsu_group_cfg *cfg = dev->config; + struct renesas_ra_ctsu_group_data *data = dev->data; + + if (cfg->num_slider == 0) { + return; + } + + for (int i = 0; i < cfg->num_slider; i++) { + uint16_t slider_position = data->p_slider_position[i]; + + if (slider_position != UINT16_MAX) { + struct renesas_ra_ctsu_device_cb *p_slider_cb = &data->p_slider_cb[i]; + + p_slider_cb->device_cb(p_slider_cb->dev, &slider_position); + } + } +} +#endif /* DT_HAS_COMPAT_STATUS_OKAY(renesas_ra_ctsu_slider) */ + +#if DT_HAS_COMPAT_STATUS_OKAY(renesas_ra_ctsu_wheel) +static void renesas_ra_ctsu_group_wheels_read(const struct device *dev) +{ + const struct renesas_ra_ctsu_group_cfg *cfg = dev->config; + struct renesas_ra_ctsu_group_data *data = dev->data; + + if (cfg->num_wheel == 0) { + return; + } + + for (int i = 0; i < cfg->num_wheel; i++) { + uint16_t wheel_position = data->p_wheel_position[i]; + + if (wheel_position != UINT16_MAX) { + struct renesas_ra_ctsu_device_cb *p_wheel_cb = &data->p_wheel_cb[i]; + + p_wheel_cb->device_cb(p_wheel_cb->dev, &wheel_position); + } + } +} +#endif /* DT_HAS_COMPAT_STATUS_OKAY(renesas_ra_ctsu_wheel) */ + +static void renesas_ra_ctsu_group_reading_handler(struct k_work *work) +{ + struct renesas_ra_ctsu_group_data *data = + CONTAINER_OF(work, struct renesas_ra_ctsu_group_data, reading_work); + const struct device *dev = data->dev; + const struct st_touch_instance *p_instance = &data->touch_instance; + fsp_err_t err; + + err = p_instance->p_api->dataGet(p_instance->p_ctrl, data->p_button_status, + data->p_slider_position, data->p_wheel_position); + if (err != FSP_SUCCESS) { + return; + } + + IF_ENABLED(DT_HAS_COMPAT_STATUS_OKAY(renesas_ra_ctsu_button), + (renesas_ra_ctsu_group_buttons_read(dev);)) + + IF_ENABLED(DT_HAS_COMPAT_STATUS_OKAY(renesas_ra_ctsu_slider), + (renesas_ra_ctsu_group_sliders_read(dev);)) + + IF_ENABLED(DT_HAS_COMPAT_STATUS_OKAY(renesas_ra_ctsu_wheel), + (renesas_ra_ctsu_group_wheels_read(dev);)) +} + +static int input_renesas_ra_ctsu_group_configure(const struct device *dev, + const struct renesas_ra_ctsu_touch_cfg *cfg) +{ + const struct st_touch_instance *p_instance = &cfg->touch_instance; + const struct renesas_ra_ctsu_group_cfg *config = dev->config; + struct renesas_ra_ctsu_group_data *data = dev->data; + fsp_err_t err; + + err = p_instance->p_api->open(p_instance->p_ctrl, p_instance->p_cfg); + if (err != FSP_SUCCESS) { + return -EIO; + } + + err = p_instance->p_api->callbackSet(p_instance->p_ctrl, renesas_ra_callback_adapter, + (void *)dev, NULL); + if (err != FSP_SUCCESS) { + p_instance->p_api->close(p_instance->p_ctrl); + return -EIO; + } + +#ifdef CONFIG_INPUT_RENESAS_RA_QE_TOUCH_CFG + data->touch_instance = *p_instance; +#endif /* CONFIG_INPUT_RENESAS_RA_QE_TOUCH_CFG */ + + k_work_init(&data->reading_work, renesas_ra_ctsu_group_reading_handler); + k_timer_init(&data->sampling_timer, renesas_ra_ctsu_group_sampling_handler, NULL); + k_timer_user_data_set(&data->sampling_timer, (void *)config->ctsu_dev); + k_timer_start(&data->sampling_timer, POLLING_INTERVAL_MS, POLLING_INTERVAL_MS); + + return 0; +} + +int z_impl_renesas_ra_ctsu_group_configure(const struct device *dev, + const struct renesas_ra_ctsu_touch_cfg *cfg) +{ +#ifndef CONFIG_INPUT_RENESAS_RA_QE_TOUCH_CFG + ARG_UNUSED(dev); + ARG_UNUSED(cfg); + return -ENOSYS; +#else + return input_renesas_ra_ctsu_group_configure(dev, cfg); +#endif /* CONFIG_INPUT_RENESAS_RA_QE_TOUCH_CFG */ +} + +static int renesas_ra_ctsu_group_init(const struct device *dev) +{ + const struct renesas_ra_ctsu_group_cfg *cfg = dev->config; +#ifndef CONFIG_INPUT_RENESAS_RA_QE_TOUCH_CFG + struct renesas_ra_ctsu_group_data *data = dev->data; + const struct renesas_ra_ctsu_touch_cfg *touch_cfg = + (const struct renesas_ra_ctsu_touch_cfg *)&data->touch_instance; +#endif /* CONFIG_INPUT_RENESAS_RA_QE_TOUCH_CFG */ + + if (!device_is_ready(cfg->ctsu_dev)) { + return -ENODEV; + } + +#ifndef CONFIG_INPUT_RENESAS_RA_QE_TOUCH_CFG + return input_renesas_ra_ctsu_group_configure(dev, touch_cfg); +#else + return 0; +#endif /* CONFIG_INPUT_RENESAS_RA_QE_TOUCH_CFG */ +} + +static void renesas_ra_ctsu_write_isr(void *arg) +{ + ARG_UNUSED(arg); + ctsu_write_isr(); +} + +static void renesas_ra_ctsu_read_isr(void *arg) +{ + ARG_UNUSED(arg); + ctsu_read_isr(); +} + +static void renesas_ra_ctsu_end_isr(void *arg) +{ + ARG_UNUSED(arg); + ctsu_end_isr(); +} + +__maybe_unused static void ctsu_renesas_ra_button_cb(const struct device *dev, void *data) +{ + ARG_UNUSED(data); + const struct ctsu_device_cfg *cfg = dev->config; + + input_report_key(dev, cfg->event_code, 0, false, K_NO_WAIT); +} + +__maybe_unused static void ctsu_renesas_ra_slider_cb(const struct device *dev, void *data) +{ + const struct ctsu_device_cfg *cfg = dev->config; + uint16_t *p_data = data; + + if (p_data == NULL) { + return; + } + + input_report_abs(dev, cfg->event_code, *p_data, false, K_NO_WAIT); +} + +#define ctsu_renesas_ra_wheel_cb ctsu_renesas_ra_slider_cb + +#define FOREACH_CHILD_CB(node_id, fn, compat) \ + IF_ENABLED(DT_NODE_HAS_COMPAT(node_id, compat), (fn(node_id))) + +#define FOREACH_CHILD(node_id, fn, compat) \ + DT_FOREACH_CHILD_STATUS_OKAY_VARGS(node_id, FOREACH_CHILD_CB, fn, compat) + +/* CTSU instance define */ +#define DT_DRV_COMPAT renesas_ra_ctsu + +/* CTSU group instance define */ +#define CTSU_ELEMENT_CFG_GET_BY_IDX(idx, id) \ + { \ + .ssdiv = DT_ENUM_IDX_BY_IDX(id, ssdiv, idx), \ + .so = DT_PROP_BY_IDX(id, so, idx), \ + .snum = DT_PROP_BY_IDX(id, snum, idx), \ + .sdpa = DT_PROP_BY_IDX(id, sdpa, idx), \ + } + +#define RENESAS_RA_CTSU_ELEM_GET(idx, node_id) DT_PROP_BY_IDX(node_id, elements, idx) + +#define CTSU_ELEM_IDX_DEFINE(node_id) \ + static uint8_t CONCAT(DT_NODE_FULL_NAME_TOKEN(node_id), _elem_index)[] = { \ + LISTIFY(DT_PROP_LEN(node_id, elements), RENESAS_RA_CTSU_ELEM_GET, (,), node_id)}; + +#define CTSU_DEVICE_BUTTON_CALLBACK_DEFINE(node_id) \ + { \ + .dev = DEVICE_DT_GET(node_id), \ + .device_cb = ctsu_renesas_ra_button_cb, \ + }, + +#define CTSU_DEVICE_SLIDER_CALLBACK_DEFINE(node_id) \ + { \ + .dev = DEVICE_DT_GET(node_id), \ + .device_cb = ctsu_renesas_ra_slider_cb, \ + }, + +#define CTSU_DEVICE_WHEEL_CALLBACK_DEFINE(node_id) \ + { \ + .dev = DEVICE_DT_GET(node_id), \ + .device_cb = ctsu_renesas_ra_wheel_cb, \ + }, + +#define CTSU_BUTTON_DT_SPEC_GET(node_id) \ + { \ + .elem_index = DT_PROP(node_id, elements), \ + .threshold = DT_PROP(node_id, threshold), \ + .hysteresis = DT_PROP(node_id, hysteresis), \ + }, + +#define CTSU_SLIDER_DT_SPEC_GET(node_id) \ + { \ + .p_elem_index = CONCAT(DT_NODE_FULL_NAME_TOKEN(node_id), _elem_index), \ + .num_elements = ARRAY_SIZE(CONCAT(DT_NODE_FULL_NAME_TOKEN(node_id), _elem_index)), \ + .threshold = DT_PROP(node_id, threshold), \ + }, + +#define CTSU_WHEEL_DT_SPEC_GET(node_id) CTSU_SLIDER_DT_SPEC_GET(node_id) + +#define CTSU_GROUP_VAR_NAME(node_id, surfix) \ + CONCAT(renesas_ra_ctsu_, DT_NODE_FULL_NAME_TOKEN(node_id), surfix) + +#define CTSU_ELEMENTS_DEFINE(node_id) \ + {LISTIFY(DT_PROP_LEN(node_id, ssdiv), CTSU_ELEMENT_CFG_GET_BY_IDX, (,), node_id)} + +#ifndef CONFIG_INPUT_RENESAS_RA_QE_TOUCH_CFG +#define RENESAS_RA_CTSU_GROUP_DEFINE(id) \ + static const ctsu_element_cfg_t CTSU_GROUP_VAR_NAME(id, _elements_cfg)[] = \ + CTSU_ELEMENTS_DEFINE(id); \ + \ + FOREACH_CHILD(id, CTSU_ELEM_IDX_DEFINE, renesas_ra_ctsu_slider); \ + FOREACH_CHILD(id, CTSU_ELEM_IDX_DEFINE, renesas_ra_ctsu_wheel); \ + \ + static touch_button_cfg_t CTSU_GROUP_VAR_NAME(id, _button_cfg)[] = { \ + FOREACH_CHILD(id, CTSU_BUTTON_DT_SPEC_GET, renesas_ra_ctsu_button)}; \ + \ + static touch_slider_cfg_t CTSU_GROUP_VAR_NAME(id, _slider_cfg)[] = { \ + FOREACH_CHILD(id, CTSU_SLIDER_DT_SPEC_GET, renesas_ra_ctsu_slider)}; \ + \ + static touch_wheel_cfg_t CTSU_GROUP_VAR_NAME(id, _wheel_cfg)[] = { \ + FOREACH_CHILD(id, CTSU_WHEEL_DT_SPEC_GET, renesas_ra_ctsu_wheel)}; \ + \ + struct renesas_ra_ctsu_device_cb CTSU_GROUP_VAR_NAME(id, _button_cb)[] = { \ + FOREACH_CHILD(id, CTSU_DEVICE_BUTTON_CALLBACK_DEFINE, renesas_ra_ctsu_button)}; \ + struct renesas_ra_ctsu_device_cb CTSU_GROUP_VAR_NAME(id, _slider_cb)[] = { \ + FOREACH_CHILD(id, CTSU_DEVICE_SLIDER_CALLBACK_DEFINE, renesas_ra_ctsu_slider)}; \ + struct renesas_ra_ctsu_device_cb CTSU_GROUP_VAR_NAME(id, _wheel_cb)[] = { \ + FOREACH_CHILD(id, CTSU_DEVICE_WHEEL_CALLBACK_DEFINE, renesas_ra_ctsu_wheel)}; \ + \ + struct renesas_ra_ctsu_group_cfg CONCAT(renesas_ra_ctsu_, DT_NODE_FULL_NAME_TOKEN(id), \ + _cfg) = { \ + .ctsu_dev = DEVICE_DT_GET(DT_PARENT(id)), \ + .num_button = ARRAY_SIZE(CTSU_GROUP_VAR_NAME(id, _button_cfg)), \ + .num_slider = ARRAY_SIZE(CTSU_GROUP_VAR_NAME(id, _slider_cfg)), \ + .num_wheel = ARRAY_SIZE(CTSU_GROUP_VAR_NAME(id, _wheel_cfg)), \ + }; \ + \ + static uint64_t CTSU_GROUP_VAR_NAME(id, _button_data); \ + static uint16_t CTSU_GROUP_VAR_NAME( \ + id, _slider_data)[ARRAY_SIZE(CTSU_GROUP_VAR_NAME(id, _slider_cfg))]; \ + static uint16_t CTSU_GROUP_VAR_NAME( \ + id, _wheel_data)[ARRAY_SIZE(CTSU_GROUP_VAR_NAME(id, _wheel_cfg))]; \ + \ + static struct renesas_ra_ctsu_group_data CTSU_GROUP_VAR_NAME(id, _data) = { \ + .dev = DEVICE_DT_GET(id), \ + .touch_instance = \ + { \ + .p_ctrl = &CTSU_GROUP_VAR_NAME(id, _data).touch_ctrl, \ + .p_cfg = &CTSU_GROUP_VAR_NAME(id, _data).touch_cfg, \ + .p_api = &g_touch_on_ctsu, \ + }, \ + .ctsu_instance = \ + { \ + .p_ctrl = &CTSU_GROUP_VAR_NAME(id, _data).ctsu_ctrl, \ + .p_cfg = &CTSU_GROUP_VAR_NAME(id, _data).ctsu_cfg, \ + .p_api = &g_ctsu_on_ctsu, \ + }, \ + .touch_cfg = \ + { \ + .on_freq = DT_PROP(id, on_freq), \ + .off_freq = DT_PROP(id, off_freq), \ + .drift_freq = DT_PROP(id, drift_freq), \ + .cancel_freq = DT_PROP(id, cancel_freq), \ + .p_ctsu_instance = &CTSU_GROUP_VAR_NAME(id, _data).ctsu_instance, \ + .p_buttons = CTSU_GROUP_VAR_NAME(id, _button_cfg), \ + .p_sliders = CTSU_GROUP_VAR_NAME(id, _slider_cfg), \ + .p_wheels = CTSU_GROUP_VAR_NAME(id, _wheel_cfg), \ + .num_sliders = ARRAY_SIZE(CTSU_GROUP_VAR_NAME(id, _slider_cfg)), \ + .num_wheels = ARRAY_SIZE(CTSU_GROUP_VAR_NAME(id, _wheel_cfg)), \ + .num_buttons = ARRAY_SIZE(CTSU_GROUP_VAR_NAME(id, _button_cfg)), \ + }, \ + .ctsu_cfg = \ + { \ + .cap = CTSU_CAP_SOFTWARE, \ + .txvsel = DT_ENUM_IDX(DT_PARENT(id), pwr_supply_sel), \ + .txvsel2 = DT_ENUM_IDX(DT_PARENT(id), pwr_supply_sel2), \ + .atune1 = DT_ENUM_IDX(DT_PARENT(id), atune1), \ + .atune12 = DT_ENUM_IDX(DT_PARENT(id), atune12), \ + .md = CONCAT(CTSU_MODE_, \ + DT_STRING_UPPER_TOKEN(DT_PARENT(id), measure_mode)), \ + .posel = DT_ENUM_IDX(DT_PARENT(id), po_sel), \ + .ctsuchac0 = DT_PROP_BY_IDX(id, ctsuchac, 0), \ + .ctsuchac1 = DT_PROP_BY_IDX(id, ctsuchac, 1), \ + .ctsuchac2 = DT_PROP_BY_IDX(id, ctsuchac, 2), \ + .ctsuchac3 = DT_PROP_BY_IDX(id, ctsuchac, 3), \ + .ctsuchac4 = DT_PROP_BY_IDX(id, ctsuchac, 4), \ + .ctsuchtrc0 = DT_PROP_BY_IDX(id, ctsuchtrc, 0), \ + .ctsuchtrc1 = DT_PROP_BY_IDX(id, ctsuchtrc, 1), \ + .ctsuchtrc2 = DT_PROP_BY_IDX(id, ctsuchtrc, 2), \ + .ctsuchtrc3 = DT_PROP_BY_IDX(id, ctsuchtrc, 3), \ + .ctsuchtrc4 = DT_PROP_BY_IDX(id, ctsuchtrc, 4), \ + .num_rx = DT_PROP(id, rx_count), \ + .num_tx = DT_PROP(id, tx_count), \ + .num_moving_average = DT_PROP(id, num_moving_avg), \ + .p_elements = CTSU_GROUP_VAR_NAME(id, _elements_cfg), \ + .write_irq = DT_IRQ_BY_NAME(DT_PARENT(id), ctsuwr, irq), \ + .read_irq = DT_IRQ_BY_NAME(DT_PARENT(id), ctsurd, irq), \ + .end_irq = DT_IRQ_BY_NAME(DT_PARENT(id), ctsufn, irq), \ + }, \ + .p_button_status = &CTSU_GROUP_VAR_NAME(id, _button_data), \ + .p_slider_position = CTSU_GROUP_VAR_NAME(id, _slider_data), \ + .p_wheel_position = CTSU_GROUP_VAR_NAME(id, _wheel_data), \ + .p_button_cb = CTSU_GROUP_VAR_NAME(id, _button_cb), \ + .p_slider_cb = CTSU_GROUP_VAR_NAME(id, _slider_cb), \ + .p_wheel_cb = CTSU_GROUP_VAR_NAME(id, _wheel_cb), \ + }; \ + \ + DEVICE_DT_DEFINE(id, renesas_ra_ctsu_group_init, NULL, &CTSU_GROUP_VAR_NAME(id, _data), \ + &CTSU_GROUP_VAR_NAME(id, _cfg), POST_KERNEL, CONFIG_INPUT_INIT_PRIORITY, \ + NULL); +#else +#define RENESAS_RA_CTSU_GROUP_DEFINE(id) \ + struct renesas_ra_ctsu_device_cb CTSU_GROUP_VAR_NAME(id, _button_cb)[] = { \ + FOREACH_CHILD(id, CTSU_DEVICE_BUTTON_CALLBACK_DEFINE, renesas_ra_ctsu_button)}; \ + struct renesas_ra_ctsu_device_cb CTSU_GROUP_VAR_NAME(id, _slider_cb)[] = { \ + FOREACH_CHILD(id, CTSU_DEVICE_SLIDER_CALLBACK_DEFINE, renesas_ra_ctsu_slider)}; \ + struct renesas_ra_ctsu_device_cb CTSU_GROUP_VAR_NAME(id, _wheel_cb)[] = { \ + FOREACH_CHILD(id, CTSU_DEVICE_WHEEL_CALLBACK_DEFINE, renesas_ra_ctsu_wheel)}; \ + \ + struct renesas_ra_ctsu_group_cfg CTSU_GROUP_VAR_NAME(id, _cfg) = { \ + .ctsu_dev = DEVICE_DT_GET(DT_PARENT(id)), \ + .num_button = ARRAY_SIZE(CTSU_GROUP_VAR_NAME(id, _button_cb)), \ + .num_slider = ARRAY_SIZE(CTSU_GROUP_VAR_NAME(id, _slider_cb)), \ + .num_wheel = ARRAY_SIZE(CTSU_GROUP_VAR_NAME(id, _wheel_cb)), \ + }; \ + \ + static uint64_t CTSU_GROUP_VAR_NAME(id, _button_data); \ + static uint16_t CTSU_GROUP_VAR_NAME( \ + id, _slider_data)[ARRAY_SIZE(CTSU_GROUP_VAR_NAME(id, _slider_cb))]; \ + static uint16_t CTSU_GROUP_VAR_NAME( \ + id, _wheel_data)[ARRAY_SIZE(CTSU_GROUP_VAR_NAME(id, _wheel_cb))]; \ + \ + static struct renesas_ra_ctsu_group_data CTSU_GROUP_VAR_NAME(id, _data) = { \ + .dev = DEVICE_DT_GET(id), \ + .p_button_status = &CTSU_GROUP_VAR_NAME(id, _button_data), \ + .p_slider_position = CTSU_GROUP_VAR_NAME(id, _slider_data), \ + .p_wheel_position = CTSU_GROUP_VAR_NAME(id, _wheel_data), \ + .p_button_cb = CTSU_GROUP_VAR_NAME(id, _button_cb), \ + .p_slider_cb = CTSU_GROUP_VAR_NAME(id, _slider_cb), \ + .p_wheel_cb = CTSU_GROUP_VAR_NAME(id, _wheel_cb), \ + }; \ + \ + DEVICE_DT_DEFINE(id, renesas_ra_ctsu_group_init, NULL, &CTSU_GROUP_VAR_NAME(id, _data), \ + &CTSU_GROUP_VAR_NAME(id, _cfg), POST_KERNEL, CONFIG_INPUT_INIT_PRIORITY, \ + NULL); +#endif + +static int renesas_ra_ctsu_init(const struct device *dev) +{ + const struct renesas_ra_ctsu_cfg *ctsu_cfg = dev->config; + struct renesas_ra_ctsu_data *data = dev->data; + k_tid_t tid; + int ret; + + if (!device_is_ready(ctsu_cfg->clock)) { + return -ENODEV; + } + + /* Perform discharge process for the TSCAP pin */ + ret = gpio_pin_configure_dt(&ctsu_cfg->tscap_pin, GPIO_OUTPUT_LOW); + if (ret != 0) { + return ret; + } + + /* Wait 10 usec for discharge to complete before switching to the CTSU pin function */ + k_busy_wait(10); + + ret = pinctrl_apply_state(ctsu_cfg->pcfg, PINCTRL_STATE_DEFAULT); + if (ret != 0) { + return ret; + } + + ret = clock_control_on(ctsu_cfg->clock, (clock_control_subsys_t)&ctsu_cfg->clock_subsys); + if (ret != 0) { + return ret; + } + + k_sem_init(&data->scanning, 0, 1); + k_queue_init(&data->scan_q); + + tid = k_thread_create( + &data->thread_data, data->thread_stack, K_THREAD_STACK_SIZEOF(data->thread_stack), + renesas_ra_ctsu_drv_handler, (void *)dev, NULL, NULL, + K_PRIO_COOP(CONFIG_INPUT_RENESAS_RA_CTSU_DRV_PRIORITY), K_ESSENTIAL, K_NO_WAIT); + if (tid == NULL) { + LOG_ERR("thread creation failed"); + return -ENODEV; + } + + k_thread_name_set(&data->thread_data, dev->name); + + ctsu_cfg->irq_config(); + + return 0; +} + +#define RENESAS_RA_CTSU_DEFINE(inst) \ + PINCTRL_DT_INST_DEFINE(inst); \ + \ + static void renesas_ra_ctsu_irq_config##inst(void) \ + { \ + IRQ_CONNECT(DT_INST_IRQ_BY_NAME(inst, ctsuwr, irq), \ + DT_INST_IRQ_BY_NAME(inst, ctsuwr, priority), \ + renesas_ra_ctsu_write_isr, NULL, 0); \ + IRQ_CONNECT(DT_INST_IRQ_BY_NAME(inst, ctsurd, irq), \ + DT_INST_IRQ_BY_NAME(inst, ctsurd, priority), renesas_ra_ctsu_read_isr, \ + NULL, 0); \ + IRQ_CONNECT(DT_INST_IRQ_BY_NAME(inst, ctsufn, irq), \ + DT_INST_IRQ_BY_NAME(inst, ctsufn, priority), renesas_ra_ctsu_end_isr, \ + NULL, 0); \ + \ + R_ICU->IELSR[DT_INST_IRQ_BY_NAME(inst, ctsuwr, irq)] = \ + BSP_PRV_IELS_ENUM(EVENT_CTSU_WRITE); \ + R_ICU->IELSR[DT_INST_IRQ_BY_NAME(inst, ctsurd, irq)] = \ + BSP_PRV_IELS_ENUM(EVENT_CTSU_READ); \ + R_ICU->IELSR[DT_INST_IRQ_BY_NAME(inst, ctsufn, irq)] = \ + BSP_PRV_IELS_ENUM(EVENT_CTSU_END); \ + \ + irq_enable(DT_INST_IRQ_BY_NAME(inst, ctsuwr, irq)); \ + irq_enable(DT_INST_IRQ_BY_NAME(inst, ctsurd, irq)); \ + irq_enable(DT_INST_IRQ_BY_NAME(inst, ctsufn, irq)); \ + } \ + \ + static const struct renesas_ra_ctsu_cfg renesas_ra_ctsu_cfg##inst = { \ + .tscap_pin = GPIO_DT_SPEC_INST_GET(inst, tscap_gpios), \ + .pcfg = PINCTRL_DT_INST_DEV_CONFIG_GET(inst), \ + .clock = DEVICE_DT_GET(DT_INST_CLOCKS_CTLR(inst)), \ + .clock_subsys = \ + { \ + .mstp = DT_INST_CLOCKS_CELL(inst, mstp), \ + .stop_bit = DT_INST_CLOCKS_CELL(inst, stop_bit), \ + }, \ + .irq_config = renesas_ra_ctsu_irq_config##inst, \ + }; \ + \ + static struct renesas_ra_ctsu_data renesas_ra_ctsu_data##inst; \ + \ + DEVICE_DT_INST_DEFINE(inst, renesas_ra_ctsu_init, NULL, &renesas_ra_ctsu_data##inst, \ + &renesas_ra_ctsu_cfg##inst, POST_KERNEL, CONFIG_INPUT_INIT_PRIORITY, \ + NULL); \ + \ + DT_INST_FOREACH_CHILD_STATUS_OKAY(inst, RENESAS_RA_CTSU_GROUP_DEFINE) + +DT_INST_FOREACH_STATUS_OKAY(RENESAS_RA_CTSU_DEFINE) + +static int ctsu_device_init(const struct device *dev) +{ + const struct ctsu_device_cfg *cfg = dev->config; + + return device_is_ready(cfg->group_dev) ? 0 : -ENODEV; +} + +#undef DT_DRV_COMPAT +#define DT_DRV_COMPAT renesas_ra_ctsu_button + +#define RENESAS_RA_CTSU_BUTTON_DEFINE(inst) \ + IF_ENABLED(DT_NODE_HAS_STATUS_OKAY(DT_INST_PARENT(inst)), ( \ + const struct ctsu_device_cfg ctsu_button_cfg##inst = { \ + .group_dev = DEVICE_DT_GET(DT_INST_PARENT(inst)), \ + .event_code = DT_INST_PROP(inst, event_code), \ + }; \ + \ + DEVICE_DT_INST_DEFINE(inst, ctsu_device_init, NULL, NULL, &ctsu_button_cfg##inst, \ + POST_KERNEL, CONFIG_INPUT_INIT_PRIORITY, NULL); \ + )) + +DT_INST_FOREACH_STATUS_OKAY(RENESAS_RA_CTSU_BUTTON_DEFINE) + +#undef DT_DRV_COMPAT +#define DT_DRV_COMPAT renesas_ra_ctsu_slider + +#define RENESAS_RA_CTSU_SLIDER_DEFINE(inst) \ + IF_ENABLED(DT_NODE_HAS_STATUS_OKAY(DT_INST_PARENT(inst)), ( \ + const struct ctsu_device_cfg ctsu_slider_cfg##inst = { \ + .group_dev = DEVICE_DT_GET(DT_INST_PARENT(inst)), \ + .event_code = DT_INST_PROP(inst, event_code), \ + }; \ + \ + DEVICE_DT_INST_DEFINE(inst, ctsu_device_init, NULL, NULL, &ctsu_slider_cfg##inst, \ + POST_KERNEL, CONFIG_INPUT_INIT_PRIORITY, NULL); \ + )) + +DT_INST_FOREACH_STATUS_OKAY(RENESAS_RA_CTSU_SLIDER_DEFINE) + +#undef DT_DRV_COMPAT +#define DT_DRV_COMPAT renesas_ra_ctsu_wheel + +#define RENESAS_RA_CTSU_WHEEL_DEFINE(inst) \ + IF_ENABLED(DT_NODE_HAS_STATUS_OKAY(DT_INST_PARENT(inst)), ( \ + const struct ctsu_device_cfg ctsu_wheel_cfg##inst = { \ + .group_dev = DEVICE_DT_GET(DT_INST_PARENT(inst)), \ + .event_code = DT_INST_PROP(inst, event_code), \ + }; \ + \ + DEVICE_DT_INST_DEFINE(inst, ctsu_device_init, NULL, NULL, &ctsu_wheel_cfg##inst, \ + POST_KERNEL, CONFIG_INPUT_INIT_PRIORITY, NULL); \ + )) + +DT_INST_FOREACH_STATUS_OKAY(RENESAS_RA_CTSU_WHEEL_DEFINE) diff --git a/dts/bindings/input/renesas,ra-ctsu-button.yaml b/dts/bindings/input/renesas,ra-ctsu-button.yaml new file mode 100644 index 0000000000000..38083f949799c --- /dev/null +++ b/dts/bindings/input/renesas,ra-ctsu-button.yaml @@ -0,0 +1,69 @@ +# Copyright (c) 2025 Renesas Electronics Corporation +# SPDX-License-Identifier: Apache-2.0 + +description: | + Renesas RA Capacitive Touch Button instance. + + This node is a renesas,ra-ctsu grandchild node and applies filters and calculations + to detect an input event on a group which is the child of renesas,ra-ctsu. + For more information see input/renesas,ra-ctsu.yaml + + Example: + + #include + + &ctsu { + compatible = "renesas,ra-ctsu"; + + group1 { + ... + button1 { + compatible = "renesas,ra-ctsu-button"; + elements = <0>; + threshold = <769>; + hysteresis = <38>; + event-code = ; + }; + + button2 { + compatible = "renesas,ra-ctsu-button"; + elements = <1>; + threshold = <769>; + hysteresis = <38>; + event-code = ; + }; + }; + }; + + Notes: The order of the CTSU button nodes in the same group must follow these elements index. + +compatible: "renesas,ra-ctsu-button" + +include: [base.yaml] + +properties: + event-code: + type: int + required: true + description: | + The key code for the device. This is used to identify the device in the + input subsystem. It should be one of the values defined in + include/input-event-codes.h. + + elements: + type: int + default: 0 + description: | + Element number from CTSU group that this button located on. + + threshold: + type: int + default: 0 + description: | + Touch/non-touch judgement threshold for automatic judgement. + + hysteresis: + type: int + default: 0 + description: | + Threshold hysteresis for chattering prevention for automatic judgement. diff --git a/dts/bindings/input/renesas,ra-ctsu-slider.yaml b/dts/bindings/input/renesas,ra-ctsu-slider.yaml new file mode 100644 index 0000000000000..2c3a1b64b5715 --- /dev/null +++ b/dts/bindings/input/renesas,ra-ctsu-slider.yaml @@ -0,0 +1,52 @@ +# Copyright (c) 2025 Renesas Electronics Corporation +# SPDX-License-Identifier: Apache-2.0 + +description: | + Renesas RA Capacitive Touch Slider instance. + + This node is a renesas,ra-ctsu grandchild node and applies filters and calculations + to detect an input event on a group which is the child of renesas,ra-ctsu. + For more information see input/renesas,ra-ctsu.yaml + + Example: + + #include + + &ctsu { + compatible = "renesas,ra-ctsu"; + + group1 { + ... + slider { + compatible = "renesas,ra-ctsu-slider"; + elements = <1>, <0>, <2>, <4>, <3>; + threshold = <573>; + event-code = ; + }; + }; + }; + +compatible: "renesas,ra-ctsu-slider" + +include: [base.yaml] + +properties: + event-code: + type: int + required: true + description: | + The key code for the device. This is used to identify the device in the + input subsystem. It should be one of the values defined in + include/input-event-codes.h. + + elements: + type: array + description: | + Element number array from CTSU group that used by this node. It should have the same + order with electrode located on the Capacitive Pad. + + threshold: + type: int + default: 0 + description: | + Touch/non-touch judgement threshold for automatic judgement. diff --git a/dts/bindings/input/renesas,ra-ctsu-wheel.yaml b/dts/bindings/input/renesas,ra-ctsu-wheel.yaml new file mode 100644 index 0000000000000..33b8dcb0c6b42 --- /dev/null +++ b/dts/bindings/input/renesas,ra-ctsu-wheel.yaml @@ -0,0 +1,52 @@ +# Copyright (c) 2025 Renesas Electronics Corporation +# SPDX-License-Identifier: Apache-2.0 + +description: | + Renesas RA Capacitive Touch Wheel + + This node is a renesas,ra-ctsu grandchild node and applies filters and calculations + to detect an input event on a group which is the child of renesas,ra-ctsu. + For more information see input/renesas,ra-ctsu.yaml + + Example: + + #include + + &ctsu { + compatible = "renesas,ra-ctsu"; + + group1 { + ... + wheel { + compatible = "renesas,ra-ctsu-wheel"; + elements = <0>, <3>, <2>, <1>; + threshold = <711>; + event-code = ; + }; + }; + }; + +compatible: "renesas,ra-ctsu-wheel" + +include: [base.yaml] + +properties: + event-code: + type: int + required: true + description: | + The key code for the device. This is used to identify the device in the + input subsystem. It should be one of the values defined in + include/input-event-codes.h. + + elements: + type: array + description: | + Element number array from CTSU group that used by this node. It should have the same + order with electrode located on the Capacitive Pad. + + threshold: + type: int + default: 0 + description: | + Touch/non-touch judgement threshold for automatic judgement. diff --git a/dts/bindings/input/renesas,ra-ctsu.yaml b/dts/bindings/input/renesas,ra-ctsu.yaml new file mode 100644 index 0000000000000..91f528dc1a5fc --- /dev/null +++ b/dts/bindings/input/renesas,ra-ctsu.yaml @@ -0,0 +1,199 @@ +# Copyright (c) 2025 Renesas Electronics Corporation +# SPDX-License-Identifier: Apache-2.0 + +description: Renesas RA Capacitive Sensing Unit + +compatible: "renesas,ra-ctsu" + +include: [base.yaml, pinctrl-device.yaml] + +properties: + pinctrl-0: + required: true + + clocks: + required: true + + interrupts: + required: true + description: IRQ number and priority to use for CTSU. + + interrupt-names: + required: true + description: | + Interrupts must be given corresponding names so that the shim driver can recognize them. + - "ctsuwr": write interrupt + - "ctsurd": read interrupt + - "ctsufn": end interrupt + + variant: + required: true + type: string + enum: ["ctsua", "ctsu2"] + description: Determine which ctsu device is in use + + clock-div: + type: int + enum: [1, 2, 4, 8] + default: 1 + description: Select divider value for operating input clock. Default as div by 1. + + pwr-supply-sel: + type: string + enum: ["vcc", "internal-power"] + default: "internal-power" + description: CTSU Transmission Power Supply Select (for both CTSUa and CTSU2). + + pwr-supply-sel2: + type: string + enum: ["pwr-supply-sel", "vcc-private"] + default: "pwr-supply-sel" + description: CTSU Transmission Power Supply Select 2 (CTSU2 Only) + + atune1: + type: string + enum: ["normal", "high"] + default: "normal" + description: | + CTSU Power Supply Capacity Adjustment (CTSUa Only): + - "normal": 40uA + - "high": 80uA + + atune12: + type: int + enum: [80, 40, 20, 160] + default: 40 + description: | + CTSU Power Supply Capacity Adjustment in uA (CTSU2 Only) + + measure-mode: + type: string + enum: + - "self-multi-scan" + - "mutual-full-scan" + - "mutual-cfc-scan" + - "current-scan" + - "correction-scan" + - "diagnosis-scan" + default: "self-multi-scan" + description: CTSU Measurement Mode Select + + po-sel: + type: string + enum: + - "low-gpio" + - "hi-z" + - "low" + - "same-pulse" + default: "same-pulse" + description: CTSU Non-Measured Channel Output Select (CTSU2 Only) + + tscap-gpios: + type: phandle-array + required: true + description: | + CTSU TSCAP Pin. This pin is used to discharge the capacitior by + control to output low, before switching to CTSU function. + +child-binding: + description: Renesas RA CTSU touch configuration + properties: + ctsuchac: + type: array + default: [0, 0, 0, 0, 0] + description: | + TSCAP pin enable mask. Expected fields, in order, are: + - ctsuchac0: TS00-TS07 enable mask + - ctsuchac1: TS08-TS15 enable mask + - ctsuchac2: TS16-TS23 enable mask + - ctsuchac3: TS24-TS31 enable mask + - ctsuchac4: TS32-TS39 enable mask + + ctsuchtrc: + type: array + default: [0, 0, 0, 0, 0] + description: | + TSCAP pin mutual-tx mask. Expected fields, in order, are: + - ctsuchtrc0: TS00-TS07 mutual-tx mask + - ctsuchtrc1: TS08-TS15 mutual-tx mask + - ctsuchtrc2: TS16-TS23 mutual-tx mask + - ctsuchtrc3: TS24-TS31 mutual-tx mask + - ctsuchtrc4: TS32-TS39 mutual-tx mask + + rx-count: + type: int + default: 0 + description: | + The number of RX channels to be used. This should be set to the number of + channels that are enabled in the ctsuchac0-4 properties. + + tx-count: + type: int + default: 0 + description: | + The number of TX channels to be used. This should be set to the number of + channels that are enabled in the ctsuchtrc0-4 properties. + + ssdiv: + type: string-array + default: ["4.00"] + enum: + - "4.00" + - "2.00" + - "1.33" + - "1.00" + - "0.80" + - "0.67" + - "0.57" + - "0.50" + - "0.44" + - "0.40" + - "0.36" + - "0.33" + - "0.31" + - "0.29" + - "0.27" + - "0.00" + description: CTSU Spectrum Diffusion Frequency Division Setting (CTSUa Only) + + so: + type: array + default: [0] + description: CTSU Sensor Offset Adjustment + + snum: + type: array + default: [0] + description: CTSU Measurement Count Setting + + sdpa: + type: array + default: [0] + description: CTSU Base Clock Setting + + on-freq: + type: int + default: 0 + description: The cumulative number of determinations of ON. + + off-freq: + type: int + default: 0 + description: The cumulative number of determinations of OFF. + + drift-freq: + type: int + default: 0 + description: Base value drift frequency (0 mean no use). + + cancel-freq: + type: int + default: 0 + description: Maximum continuous ON (0 mean no use). + + num-moving-avg: + type: int + default: 0 + description: | + The number of samples to use for moving average. If set to 0, no moving average is applied. + This is useful for smoothing the sensor readings. diff --git a/include/zephyr/input/input_renesas_ra_ctsu.h b/include/zephyr/input/input_renesas_ra_ctsu.h new file mode 100644 index 0000000000000..df890f4fc033a --- /dev/null +++ b/include/zephyr/input/input_renesas_ra_ctsu.h @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2025 Renesas Electronics Corporation + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#ifndef ZEPHYR_INCLUDE_ZEPHYR_INPUT_INPUT_RENESAS_RA_CTSU_H_ +#define ZEPHYR_INCLUDE_ZEPHYR_INPUT_INPUT_RENESAS_RA_CTSU_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +struct renesas_ra_ctsu_touch_cfg { + struct st_touch_instance touch_instance; +}; + +/** + * @brief Configure CTSU group device with a Renesas QE for Capacitive Touch Workflow generated + * configuration + * + * @param dev Pointer to the input device instance + * @param cfg Pointer to the configuration data for the device + * + * @retval 0 on success + * @retval -ENOSYS in case INPUT_RENESAS_RA_QE_TOUCH_CFG was not enabled + * @retval -errno on failure + */ +__syscall int renesas_ra_ctsu_group_configure(const struct device *dev, + const struct renesas_ra_ctsu_touch_cfg *cfg); + +#ifdef __cplusplus +} +#endif + +#include + +#endif /* ZEPHYR_INCLUDE_ZEPHYR_INPUT_INPUT_RENESAS_RA_CTSU_H_ */ diff --git a/modules/Kconfig.renesas b/modules/Kconfig.renesas index 12a898e2d8e8c..78dd7fff951e8 100644 --- a/modules/Kconfig.renesas +++ b/modules/Kconfig.renesas @@ -201,6 +201,23 @@ config USE_RA_FSP_SSI help Enable RA FSP I2S SSI driver +config USE_RA_FSP_IOPORT + bool + help + Enable RA FSP IOPORT driver + +config USE_RA_FSP_CTSU + bool + select USE_RA_FSP_IOPORT + help + Enable RA FSP CTSU driver + +config USE_RA_FSP_TOUCH + bool + depends on USE_RA_FSP_CTSU + help + Enable RA FSP TOUCH library + endif # HAS_RENESAS_RA_FSP if HAS_RENESAS_RZ_FSP From e24d5f30e648d4110244311f54c34ffa4956069c Mon Sep 17 00:00:00 2001 From: The Nguyen Date: Fri, 4 Apr 2025 15:06:41 +0700 Subject: [PATCH 03/10] bindings: pinctrl: add ctsu psel selection for Renesas RA Add CTSU pin function selection for Renesas RA devices Signed-off-by: The Nguyen --- include/zephyr/dt-bindings/pinctrl/renesas/pinctrl-ra.h | 1 + 1 file changed, 1 insertion(+) diff --git a/include/zephyr/dt-bindings/pinctrl/renesas/pinctrl-ra.h b/include/zephyr/dt-bindings/pinctrl/renesas/pinctrl-ra.h index a077cd226866e..133ea0ca5760b 100644 --- a/include/zephyr/dt-bindings/pinctrl/renesas/pinctrl-ra.h +++ b/include/zephyr/dt-bindings/pinctrl/renesas/pinctrl-ra.h @@ -48,6 +48,7 @@ #define RA_PSEL_ETH_RMII 0x17 #define RA_PSEL_GLCDC 0x19 #define RA_PSEL_OSPI 0x1c +#define RA_PSEL_CTSU 0x0c #define RA_PSEL_POS 8 #define RA_PSEL_MASK 0x1f From 5be3778c0bee2c1f0e6828a7e90a796c8f7a2405 Mon Sep 17 00:00:00 2001 From: The Nguyen Date: Mon, 9 Jun 2025 14:17:30 +0700 Subject: [PATCH 04/10] dts: arm: renesas: add CTSU device node for Renesas RA Add device node support for Renesas RA SoCs Signed-off-by: The Nguyen --- dts/arm/renesas/ra/ra2/r7fa2a1xh.dtsi | 8 ++++++++ dts/arm/renesas/ra/ra2/ra2l1.dtsi | 8 ++++++++ dts/arm/renesas/ra/ra4/r7fa4m2ax.dtsi | 8 ++++++++ dts/arm/renesas/ra/ra4/r7fa4m3ax.dtsi | 8 ++++++++ dts/arm/renesas/ra/ra4/ra4-cm4-common.dtsi | 8 ++++++++ dts/arm/renesas/ra/ra6/ra6-cm33-common.dtsi | 8 ++++++++ dts/arm/renesas/ra/ra6/ra6-cm4-common.dtsi | 8 ++++++++ 7 files changed, 56 insertions(+) diff --git a/dts/arm/renesas/ra/ra2/r7fa2a1xh.dtsi b/dts/arm/renesas/ra/ra2/r7fa2a1xh.dtsi index 053bc9ac165d8..2ae3d89839def 100644 --- a/dts/arm/renesas/ra/ra2/r7fa2a1xh.dtsi +++ b/dts/arm/renesas/ra/ra2/r7fa2a1xh.dtsi @@ -100,6 +100,14 @@ clocks = <&pclkb 0 0>; status = "disabled"; }; + + ctsu: ctsua@40081000 { + compatible = "renesas,ra-ctsu"; + reg = <0x40081000 0x24>; + clocks = <&pclkb MSTPC 3>; + variant = "ctsua"; + status = "disabled"; + }; }; clocks: clocks { diff --git a/dts/arm/renesas/ra/ra2/ra2l1.dtsi b/dts/arm/renesas/ra/ra2/ra2l1.dtsi index 23bb39e78524b..d484f7ec25361 100644 --- a/dts/arm/renesas/ra/ra2/ra2l1.dtsi +++ b/dts/arm/renesas/ra/ra2/ra2l1.dtsi @@ -515,6 +515,14 @@ #port-irq-cells = <0>; status = "disabled"; }; + + ctsu: ctsu2@40082000 { + compatible = "renesas,ra-ctsu"; + reg = <0x40082000 0x70>; + clocks = <&pclkb MSTPC 3>; + variant = "ctsu2"; + status = "disabled"; + }; }; clocks: clocks { diff --git a/dts/arm/renesas/ra/ra4/r7fa4m2ax.dtsi b/dts/arm/renesas/ra/ra4/r7fa4m2ax.dtsi index 8a155a1f6e8fc..98baf88cca8ea 100644 --- a/dts/arm/renesas/ra/ra4/r7fa4m2ax.dtsi +++ b/dts/arm/renesas/ra/ra4/r7fa4m2ax.dtsi @@ -144,6 +144,14 @@ compatible = "renesas,ra-sce9-rng"; status = "disabled"; }; + + ctsu: ctsua@40081000 { + compatible = "renesas,ra-ctsu"; + reg = <0x40081000 0x24>; + clocks = <&pclkb MSTPC 3>; + variant = "ctsua"; + status = "disabled"; + }; }; clocks: clocks { diff --git a/dts/arm/renesas/ra/ra4/r7fa4m3ax.dtsi b/dts/arm/renesas/ra/ra4/r7fa4m3ax.dtsi index a34f041f1a41e..3031ef7396e3d 100644 --- a/dts/arm/renesas/ra/ra4/r7fa4m3ax.dtsi +++ b/dts/arm/renesas/ra/ra4/r7fa4m3ax.dtsi @@ -157,6 +157,14 @@ compatible = "renesas,ra-sce9-rng"; status = "disabled"; }; + + ctsu: ctsua@40081000 { + compatible = "renesas,ra-ctsu"; + reg = <0x40081000 0x24>; + clocks = <&pclkb MSTPC 3>; + variant = "ctsua"; + status = "disabled"; + }; }; clocks: clocks { diff --git a/dts/arm/renesas/ra/ra4/ra4-cm4-common.dtsi b/dts/arm/renesas/ra/ra4/ra4-cm4-common.dtsi index 7319a75f79f6f..d6604128f23a2 100644 --- a/dts/arm/renesas/ra/ra4/ra4-cm4-common.dtsi +++ b/dts/arm/renesas/ra/ra4/ra4-cm4-common.dtsi @@ -441,6 +441,14 @@ clocks = <&pclkb 0 0>; status = "disabled"; }; + + ctsu: ctsua@40081000 { + compatible = "renesas,ra-ctsu"; + reg = <0x40081000 0x24>; + clocks = <&pclkb MSTPC 3>; + variant = "ctsua"; + status = "disabled"; + }; }; usbfs_phy: usbfs-phy { diff --git a/dts/arm/renesas/ra/ra6/ra6-cm33-common.dtsi b/dts/arm/renesas/ra/ra6/ra6-cm33-common.dtsi index 9625343ec278a..6ca8afabbaa46 100644 --- a/dts/arm/renesas/ra/ra6/ra6-cm33-common.dtsi +++ b/dts/arm/renesas/ra/ra6/ra6-cm33-common.dtsi @@ -560,6 +560,14 @@ #size-cells = <0>; status = "disabled"; }; + + ctsu: ctsua@40081000 { + compatible = "renesas,ra-ctsu"; + reg = <0x40081000 0x24>; + clocks = <&pclkb MSTPC 3>; + variant = "ctsua"; + status = "disabled"; + }; }; usbfs_phy: usbfs-phy { diff --git a/dts/arm/renesas/ra/ra6/ra6-cm4-common.dtsi b/dts/arm/renesas/ra/ra6/ra6-cm4-common.dtsi index dd2c9cacddff7..fce62f0de81b0 100644 --- a/dts/arm/renesas/ra/ra6/ra6-cm4-common.dtsi +++ b/dts/arm/renesas/ra/ra6/ra6-cm4-common.dtsi @@ -655,6 +655,14 @@ clocks = <&pclkb 0 0>; status = "disabled"; }; + + ctsu: ctsua@40081000 { + compatible = "renesas,ra-ctsu"; + reg = <0x40081000 0x24>; + clocks = <&pclkb MSTPC 3>; + variant = "ctsua"; + status = "disabled"; + }; }; usbfs_phy: usbfs-phy { From 0c1eaa38c54928544823e226e3a75dcfe7b13d5b Mon Sep 17 00:00:00 2001 From: The Nguyen Date: Wed, 25 Jun 2025 12:44:17 +0700 Subject: [PATCH 05/10] boards: renesas: ek_ra2a1: add support for ctsu on Renesas RA Enable support for CTSU button on ek_ra2a1 board Signed-off-by: The Nguyen --- boards/renesas/ek_ra2a1/Kconfig.defconfig | 9 ++++ boards/renesas/ek_ra2a1/ek_ra2a1-pinctrl.dtsi | 8 ++++ boards/renesas/ek_ra2a1/ek_ra2a1.dts | 41 +++++++++++++++++++ 3 files changed, 58 insertions(+) create mode 100644 boards/renesas/ek_ra2a1/Kconfig.defconfig diff --git a/boards/renesas/ek_ra2a1/Kconfig.defconfig b/boards/renesas/ek_ra2a1/Kconfig.defconfig new file mode 100644 index 0000000000000..842902a62b95f --- /dev/null +++ b/boards/renesas/ek_ra2a1/Kconfig.defconfig @@ -0,0 +1,9 @@ +# Copyright (c) 2025 Renesas Electronics Corporation +# SPDX-License-Identifier: Apache-2.0 + +if !INPUT_RENESAS_RA_QE_TOUCH_CFG + +config INPUT_RENESAS_RA_CTSU_NUM_SELF_ELEMENTS + default 1 + +endif # INPUT_RENESAS_RA_QE_TOUCH_CFG diff --git a/boards/renesas/ek_ra2a1/ek_ra2a1-pinctrl.dtsi b/boards/renesas/ek_ra2a1/ek_ra2a1-pinctrl.dtsi index 690f5736c7596..79fe97458138f 100644 --- a/boards/renesas/ek_ra2a1/ek_ra2a1-pinctrl.dtsi +++ b/boards/renesas/ek_ra2a1/ek_ra2a1-pinctrl.dtsi @@ -51,4 +51,12 @@ renesas,analog-enable; }; }; + + ctsu_default: ctsu_default { + group1 { + /* TS01 TSCAP */ + psels = , + ; + }; + }; }; diff --git a/boards/renesas/ek_ra2a1/ek_ra2a1.dts b/boards/renesas/ek_ra2a1/ek_ra2a1.dts index 39d5d372cd96c..6004c429c1e7e 100644 --- a/boards/renesas/ek_ra2a1/ek_ra2a1.dts +++ b/boards/renesas/ek_ra2a1/ek_ra2a1.dts @@ -83,6 +83,10 @@ status = "okay"; }; +&ioport4 { + status = "okay"; +}; + &port_irq6 { interrupts = <29 3>; status = "okay"; @@ -120,3 +124,40 @@ &wdt { status = "okay"; }; + +&ctsu { + pinctrl-0 = <&ctsu_default>; + pinctrl-names = "default"; + interrupts = <10 3>, <11 3>, <12 3>; + interrupt-names = "ctsuwr", "ctsurd", "ctsufn"; + clock-div = <1>; + pwr-supply-sel = "vcc"; + atune1 = "normal"; + measure-mode = "self-multi-scan"; + tscap-gpios = <&ioport4 9 0>; + status = "okay"; + + group1 { + ctsuchac = <0x00>, <0x80>, <0x00>, <0x00>, <0x00>; + ctsuchtrc = <0x00>, <0x00>, <0x00>, <0x00>, <0x00>; + rx-count = <1>; + tx-count = <0>; + ssdiv = "1.00"; + so = <0x108>; + snum = <0x01>; + sdpa = <0x0B>; + on-freq = <3>; + off-freq = <3>; + drift-freq = <255>; + cancel-freq = <0>; + num-moving-avg = <4>; + + ts1: button1 { + compatible = "renesas,ra-ctsu-button"; + event-code = ; + elements = <0>; + threshold = <2305>; + hysteresis = <115>; + }; + }; +}; From 905a94660cc33df14dee1a2d4cd0f14c6fd3c794 Mon Sep 17 00:00:00 2001 From: The Nguyen Date: Wed, 2 Apr 2025 11:07:23 +0700 Subject: [PATCH 06/10] boards: renesas: add support for rssk_ra2l1 boards First commit to initial support for RSSK-RA2L1 Signed-off-by: The Nguyen --- boards/renesas/rssk_ra2l1/Kconfig.rssk_ra2l1 | 5 + boards/renesas/rssk_ra2l1/board.cmake | 8 + boards/renesas/rssk_ra2l1/board.yml | 6 + boards/renesas/rssk_ra2l1/doc/index.rst | 142 ++++++++++++++++++ boards/renesas/rssk_ra2l1/doc/rssk_ra2l1.webp | Bin 0 -> 31268 bytes .../rssk_ra2l1/doc/rtk0eg0018c01001bj.webp | Bin 0 -> 33296 bytes .../rssk_ra2l1/rssk_ra2l1-pinctrl.dtsi | 15 ++ boards/renesas/rssk_ra2l1/rssk_ra2l1.dts | 100 ++++++++++++ boards/renesas/rssk_ra2l1/rssk_ra2l1.yaml | 16 ++ .../renesas/rssk_ra2l1/rssk_ra2l1_defconfig | 11 ++ 10 files changed, 303 insertions(+) create mode 100644 boards/renesas/rssk_ra2l1/Kconfig.rssk_ra2l1 create mode 100644 boards/renesas/rssk_ra2l1/board.cmake create mode 100644 boards/renesas/rssk_ra2l1/board.yml create mode 100644 boards/renesas/rssk_ra2l1/doc/index.rst create mode 100644 boards/renesas/rssk_ra2l1/doc/rssk_ra2l1.webp create mode 100644 boards/renesas/rssk_ra2l1/doc/rtk0eg0018c01001bj.webp create mode 100644 boards/renesas/rssk_ra2l1/rssk_ra2l1-pinctrl.dtsi create mode 100644 boards/renesas/rssk_ra2l1/rssk_ra2l1.dts create mode 100644 boards/renesas/rssk_ra2l1/rssk_ra2l1.yaml create mode 100644 boards/renesas/rssk_ra2l1/rssk_ra2l1_defconfig diff --git a/boards/renesas/rssk_ra2l1/Kconfig.rssk_ra2l1 b/boards/renesas/rssk_ra2l1/Kconfig.rssk_ra2l1 new file mode 100644 index 0000000000000..268835728962a --- /dev/null +++ b/boards/renesas/rssk_ra2l1/Kconfig.rssk_ra2l1 @@ -0,0 +1,5 @@ +# Copyright (c) 2025 Renesas Electronics Corporation +# SPDX-License-Identifier: Apache-2.0 + +config BOARD_RSSK_RA2L1 + select SOC_R7FA2L1ABXXFP diff --git a/boards/renesas/rssk_ra2l1/board.cmake b/boards/renesas/rssk_ra2l1/board.cmake new file mode 100644 index 0000000000000..77d8090ea705e --- /dev/null +++ b/boards/renesas/rssk_ra2l1/board.cmake @@ -0,0 +1,8 @@ +# Copyright (c) 2025 Renesas Electronics Corporation +# SPDX-License-Identifier: Apache-2.0 + +board_runner_args(jlink "--device=r7fa2l1ab") +board_runner_args(pyocd "--target=r7fa2l1ab") + +include(${ZEPHYR_BASE}/boards/common/jlink.board.cmake) +include(${ZEPHYR_BASE}/boards/common/pyocd.board.cmake) diff --git a/boards/renesas/rssk_ra2l1/board.yml b/boards/renesas/rssk_ra2l1/board.yml new file mode 100644 index 0000000000000..61447d9e96cdb --- /dev/null +++ b/boards/renesas/rssk_ra2l1/board.yml @@ -0,0 +1,6 @@ +board: + name: rssk_ra2l1 + full_name: Capacitive Touch Evaluation System for RA2L1 + vendor: renesas + socs: + - name: r7fa2l1abxxfp diff --git a/boards/renesas/rssk_ra2l1/doc/index.rst b/boards/renesas/rssk_ra2l1/doc/index.rst new file mode 100644 index 0000000000000..a8fb57ace9321 --- /dev/null +++ b/boards/renesas/rssk_ra2l1/doc/index.rst @@ -0,0 +1,142 @@ +.. zephyr:board:: rssk_ra2l1 + +Overview +******** + +The RA2L1 MCU Group Capacitive Touch Evaluation System (RTK0EG0022S01001BJ) is a +kit created for evaluating the RA2L1 MCU Group Capacitive Touch Sensing Unit (CTSU). + +RTK0EG0022S01001BJ is composed of two boards: The RA2L1 Cap Touch CPU Board is mounted with an +RA2L1 MCU which includes an on-chip CTSU. The Capacitive Touch Application Board Capacitive Touch +Application Board is equipped with self-capacitance touch buttons, wheel and slider electrodes, and LEDs +touch electrodes. + +Renesas RA2L1 Microcontroller Group has following features + +- 48MHz, Arm Cortex-M23 core +- 256kB or 128kB Code Flash, 8kB Data Flash, 32kB SRAM (divided on 2 equal areas + with- and without- ECC support) +- SCI x 5 +- SPI x 2 +- I2C x 2 +- CAN x 1 +- 12-bit A/D Converter +- 12-bit D/A Converter +- Low-Power Analog Comparator x 2 +- Temperature Sensor +- General PWM Timer 32-bit x 4 +- General PWM Timer 16-bit x 6 +- Low Power Asynchronous General-Purpose Timer x 2 +- Watchdog Timer (WDT) +- Independent Watchdog Timer (IWDT) +- Up to 85 Input/Output pins (depends on the package type) + +Hardware +******** + +The main functions of the RA2L1 Cap Touch CPU board are as follows: + +- Renesas RA2L1 MCU Group + + - R7FA2L1AB2DFP + - 100-pin LFQFP package + - 48MHz Arm Cortex®-M23 Core with built-in Arm® MPU (Armv8-M architecture) + - 32KB SRAM + - 256KB code flash memory + - 8KB data flash memory + - 32-channel capacitive touch sensing unit (CTSU) pins + +- Connectivity + + - USB serial conversion interface (FT234XD manufactured by FTDI) + - 10-pin JTAG/SWD interface for connecting external debugger or programmer (option) + - Application board GPIO interface: 2.54mm pitch, 16 pins (8 x 2 DIL) + - Application board CTSU interface: 2.54mm pitch, 40 pins (20 x 2 DIL) + +- Other functions + + - MCU current measurement jumper + - User push button switches: 2 + - User LEDs: 2 + +.. figure:: rtk0eg0018c01001bj.webp + :width: 300 + :align: center + + RA2L1 Cap Touch CPU Board (Credit: Renesas Electronics Corporation) + +Key functions of the Capacitive Touch Application Board are as follows: + +- Self-capacitance detection touch electrodes + + - Buttons: 3 + - Wheel (4-electrode configuration): 1 + - Slider (5-electrode configuration): 1 + +- LEDs: 16 + +Supported Features +================== + +.. zephyr:board-supported-hw:: + +Programming and debugging +************************* + +Building & Flashing +=================== + +You can build and flash an application with an external J-Link debug adapter connect to +J1 connector. +:ref:`build_an_application` and +:ref:`application_run` for more details. + +Here is an example for building and flashing the :zephyr:code-sample:`blinky` application. + +.. zephyr-app-commands:: + :zephyr-app: samples/basic/blinky + :board: rssk_ra2l1 + :goals: build flash + + +Debugging +========= + +Debugging also can be done with an external J-Link debug adapter connected to +J1 connector. +For the debug log output through UART console, you need to connect a USB cable +from the host PC to the USB Serial Conversion on CN5. +The following command is debugging the :zephyr:code-sample:`blinky` application. +Also, see the instructions specific to the debug server that you use. + +.. zephyr-app-commands:: + :zephyr-app: samples/basic/blinky + :board: rssk_ra2l1 + :maybe-skip-config: + :goals: debug + +Or you can use Segger Ozone (`Segger Ozone Download`_) for a visual debug interface + +Once downloaded and installed, open Segger Ozone and configure the debug project +like so: + +* Target Device: R7FA2L1AB +* Target Interface: SWD +* Target Interface Speed: 4 MHz +* Host Interface: USB +* Program File: + + +References +********** +- `RSSK-RA2L1 Web site`_ +- `RA2L1 MCU Group Website`_ + +.. _RSSK-RA2L1 Web site: + https://www.renesas.com/en/products/microcontrollers-microprocessors/ra-cortex-m-mcus/rtk0eg0022s01001bj-capacitive-touch-evaluation-system-ra2l1 + +.. _RA2L1 MCU Group Website: + https://www.renesas.com/en/products/microcontrollers-microprocessors/ra-cortex-m-mcus/ra2l1-48mhz-arm-cortex-m23-ultra-low-power-general-purpose-microcontroller + +.. _Segger Ozone Download: + https://www.segger.com/downloads/jlink#Ozone diff --git a/boards/renesas/rssk_ra2l1/doc/rssk_ra2l1.webp b/boards/renesas/rssk_ra2l1/doc/rssk_ra2l1.webp new file mode 100644 index 0000000000000000000000000000000000000000..2951997525cd16232f571f45b5b78c008931d2d4 GIT binary patch literal 31268 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 literal 0 HcmV?d00001 diff --git a/boards/renesas/rssk_ra2l1/doc/rtk0eg0018c01001bj.webp b/boards/renesas/rssk_ra2l1/doc/rtk0eg0018c01001bj.webp new file mode 100644 index 0000000000000000000000000000000000000000..044a84827475642438362b14a59c2d8d985f161f GIT binary patch literal 33296 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 literal 0 HcmV?d00001 diff --git a/boards/renesas/rssk_ra2l1/rssk_ra2l1-pinctrl.dtsi b/boards/renesas/rssk_ra2l1/rssk_ra2l1-pinctrl.dtsi new file mode 100644 index 0000000000000..8002bddb3475a --- /dev/null +++ b/boards/renesas/rssk_ra2l1/rssk_ra2l1-pinctrl.dtsi @@ -0,0 +1,15 @@ +/* + * Copyright (c) 2025 Renesas Electronics Corporation + * + * SPDX-License-Identifier: Apache-2.0 + */ + +&pinctrl { + sci9_default: sci9_default { + group1 { + /* TXD RXD */ + psels = , + ; + }; + }; +}; diff --git a/boards/renesas/rssk_ra2l1/rssk_ra2l1.dts b/boards/renesas/rssk_ra2l1/rssk_ra2l1.dts new file mode 100644 index 0000000000000..101dd455936bf --- /dev/null +++ b/boards/renesas/rssk_ra2l1/rssk_ra2l1.dts @@ -0,0 +1,100 @@ +/* + * Copyright (c) 2025 Renesas Electronics Corporation + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/dts-v1/; + +#include +#include +#include + +#include +#include +#include "rssk_ra2l1-pinctrl.dtsi" + +/ { + model = "Renesas RSSK-RA2L1"; + compatible = "renesas,r7fa2l1abxxfp", "renesas,ra2l1"; + + chosen { + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zephyr,console = &uart9; + zephyr,shell-uart = &uart9; + }; + + leds { + compatible = "gpio-leds"; + + led2: led2 { + gpios = <&ioport3 5 GPIO_ACTIVE_HIGH>; + label = "LED2"; + }; + + led3: led3 { + gpios = <&ioport3 4 GPIO_ACTIVE_HIGH>; + label = "LED3"; + }; + }; + + buttons { + compatible = "gpio-keys"; + + button0: s2 { + gpios = <&ioport2 6 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>; + label = "Push button switch 2"; + zephyr,code = ; + }; + + button1: s3 { + gpios = <&ioport2 5 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>; + label = "Push button switch 3"; + zephyr,code = ; + }; + }; + + aliases { + led0 = &led2; + led1 = &led3; + sw0 = &button0; + sw1 = &button1; + watchdog0 = &wdt; + }; +}; + +&ioport2 { + status = "okay"; +}; + +&ioport3 { + status = "okay"; +}; + +&port_irq0 { + interrupts = <8 3>; + status = "okay"; +}; + +&port_irq1 { + interrupts = <9 3>; + status = "okay"; +}; + +&sci9 { + pinctrl-0 = <&sci9_default>; + pinctrl-names = "default"; + interrupts = <0 3>, <1 3>, <2 3>, <3 3>; + interrupt-names = "rxi", "txi", "tei", "eri"; + status = "okay"; + + uart9: uart { + current-speed = <115200>; + status = "okay"; + }; +}; + +&wdt { + status = "okay"; +}; diff --git a/boards/renesas/rssk_ra2l1/rssk_ra2l1.yaml b/boards/renesas/rssk_ra2l1/rssk_ra2l1.yaml new file mode 100644 index 0000000000000..829546610065f --- /dev/null +++ b/boards/renesas/rssk_ra2l1/rssk_ra2l1.yaml @@ -0,0 +1,16 @@ +identifier: rssk_ra2l1 +name: Renesas RSSK-RA2L1 +type: mcu +arch: arm +ram: 32 +flash: 256 +toolchain: + - zephyr + - gnuarmemb +supported: + - watchdog +vendor: renesas +testing: + ignore_tags: + - net + - bluetooth diff --git a/boards/renesas/rssk_ra2l1/rssk_ra2l1_defconfig b/boards/renesas/rssk_ra2l1/rssk_ra2l1_defconfig new file mode 100644 index 0000000000000..f26066de3e521 --- /dev/null +++ b/boards/renesas/rssk_ra2l1/rssk_ra2l1_defconfig @@ -0,0 +1,11 @@ +# Copyright (c) 2025 Renesas Electronics Corporation +# SPDX-License-Identifier: Apache-2.0 + +# Enable GPIO +CONFIG_GPIO=y + +# Enable Console +CONFIG_SERIAL=y +CONFIG_UART_INTERRUPT_DRIVEN=y +CONFIG_UART_CONSOLE=y +CONFIG_CONSOLE=y From 56d57f73d132639eb1141db4b548d739bb4ab927 Mon Sep 17 00:00:00 2001 From: The Nguyen Date: Wed, 2 Apr 2025 11:07:23 +0700 Subject: [PATCH 07/10] boards: renesas: add support for rssk_ra2l1 boards First commit to initial support for RSSK-RA2L1 Signed-off-by: The Nguyen --- .../rssk_ra2l1/doc/rtk0eg0019b01002bj.webp | Bin 0 -> 46364 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 boards/renesas/rssk_ra2l1/doc/rtk0eg0019b01002bj.webp diff --git a/boards/renesas/rssk_ra2l1/doc/rtk0eg0019b01002bj.webp b/boards/renesas/rssk_ra2l1/doc/rtk0eg0019b01002bj.webp new file mode 100644 index 0000000000000000000000000000000000000000..94cec21b4496c83012e75da706821355152f6cff GIT binary patch literal 46364 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 A00000 literal 0 HcmV?d00001 From 8ccae401d58f2f82b69a8a01bb4c11716486c4cc Mon Sep 17 00:00:00 2001 From: The Nguyen Date: Sun, 22 Jun 2025 16:16:07 +0700 Subject: [PATCH 08/10] boards: shields: add support for rtk0eg0019b01002bj shield Add Capacitive Touch Application Board RTK0EG0019B01002BJ Signed-off-by: The Nguyen --- .../rtk0eg0019b01002bj/Kconfig.defconfig | 10 ++ .../shields/rtk0eg0019b01002bj/Kconfig.shield | 5 + .../doc/img/rtk0eg0019b01002bj.webp | Bin 0 -> 32580 bytes .../shields/rtk0eg0019b01002bj/doc/index.rst | 110 ++++++++++++++++++ .../rtk0eg0019b01002bj-led-matrix.yaml | 35 ++++++ .../rtk0eg0019b01002bj.overlay | 93 +++++++++++++++ boards/shields/rtk0eg0019b01002bj/shield.yml | 7 ++ 7 files changed, 260 insertions(+) create mode 100644 boards/shields/rtk0eg0019b01002bj/Kconfig.defconfig create mode 100644 boards/shields/rtk0eg0019b01002bj/Kconfig.shield create mode 100644 boards/shields/rtk0eg0019b01002bj/doc/img/rtk0eg0019b01002bj.webp create mode 100644 boards/shields/rtk0eg0019b01002bj/doc/index.rst create mode 100644 boards/shields/rtk0eg0019b01002bj/dts/bindings/rtk0eg0019b01002bj-led-matrix.yaml create mode 100644 boards/shields/rtk0eg0019b01002bj/rtk0eg0019b01002bj.overlay create mode 100644 boards/shields/rtk0eg0019b01002bj/shield.yml diff --git a/boards/shields/rtk0eg0019b01002bj/Kconfig.defconfig b/boards/shields/rtk0eg0019b01002bj/Kconfig.defconfig new file mode 100644 index 0000000000000..2da067cd79a92 --- /dev/null +++ b/boards/shields/rtk0eg0019b01002bj/Kconfig.defconfig @@ -0,0 +1,10 @@ +# Copyright (c) 2025 Renesas Electronics Corporation +# SPDX-License-Identifier: Apache-2.0 + +if INPUT_RENESAS_RA_CTSU + +config INPUT_RENESAS_RA_CTSU_NUM_SELF_ELEMENTS + default 12 + depends on !INPUT_RENESAS_RA_QE_TOUCH_CFG + +endif # INPUT_RENESAS_RA_CTSU diff --git a/boards/shields/rtk0eg0019b01002bj/Kconfig.shield b/boards/shields/rtk0eg0019b01002bj/Kconfig.shield new file mode 100644 index 0000000000000..7d5e30c1e4245 --- /dev/null +++ b/boards/shields/rtk0eg0019b01002bj/Kconfig.shield @@ -0,0 +1,5 @@ +# Copyright (c) 2025 Renesas Electronics Corporation +# SPDX-License-Identifier: Apache-2.0 + +config SHIELD_RTK0EG0019B01002BJ + def_bool $(shields_list_contains,rtk0eg0019b01002bj) diff --git a/boards/shields/rtk0eg0019b01002bj/doc/img/rtk0eg0019b01002bj.webp b/boards/shields/rtk0eg0019b01002bj/doc/img/rtk0eg0019b01002bj.webp new file mode 100644 index 0000000000000000000000000000000000000000..371248495a84ee52a5a0aaca5b4e414e98a397e4 GIT binary patch literal 32580 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 T`@8rb<2SMWwRp#0)Be8z(ngas literal 0 HcmV?d00001 diff --git a/boards/shields/rtk0eg0019b01002bj/doc/index.rst b/boards/shields/rtk0eg0019b01002bj/doc/index.rst new file mode 100644 index 0000000000000..f9e84c77bfe40 --- /dev/null +++ b/boards/shields/rtk0eg0019b01002bj/doc/index.rst @@ -0,0 +1,110 @@ +.. _rtk0eg0019b01002bj: + +RTK0EG0019B01002BJ Capacitive Touch Application Shield +###################################################### + +Overview +******** + +The RTK0EG0019B01002BJ Capacitive Touch Application Shield is designed to work with the Renesas +Capacitive Touch Evaluation Kit. + +The shield features a variety of touch sensors, including buttons, sliders, and wheels, making it +an ideal platform for developing touch-based applications. + +.. figure:: img/rtk0eg0019b01002bj.webp + :width: 300 + :align: center + + RTK0EG0019B01002BJ Capacitive Touch Application Shield (Credit: Renesas Electronics Corporation) + +Pins Assignment of the RTK0EG0019B01002BJ Shield +================================================ + +Application Header 1 (CN1) +-------------------------- + ++---------+-------------+---------+-------------+ +| CN1 Pin | Function | CN1 Pin | Function | ++=========+=============+=========+=============+ +| 15 | VCC | 16 | GND | ++---------+-------------+---------+-------------+ +| 13 | LED_ROW0 | 14 | LED_ROW1 | ++---------+-------------+---------+-------------+ +| 11 | LED_ROW2 | 12 | LED_ROW3 | ++---------+-------------+---------+-------------+ +| 9 | N/C | 10 | N/C | ++---------+-------------+---------+-------------+ +| 7 | LED_COL3 | 8 | N/C | ++---------+-------------+---------+-------------+ +| 5 | LED_COL1 | 6 | LED_COL2 | ++---------+-------------+---------+-------------+ +| 3 | N/C | 4 | LED_COL0 | ++---------+-------------+---------+-------------+ +| 1 | N/C | 2 | N/C | ++---------+-------------+---------+-------------+ + +Application Header 2 (CN2) +-------------------------- + ++---------+-------------------+---------+-------------------+ +| CN2 Pin | Touch Electrode | CN2 Pin | Touch Electrode | ++=========+===================+=========+===================+ +| 39 | N/C | 40 | TSCAP | ++---------+-------------------+---------+-------------------+ +| 37 | N/C | 38 | N/C | ++---------+-------------------+---------+-------------------+ +| 35 | N/C | 36 | TS-W1 | ++---------+-------------------+---------+-------------------+ +| 33 | N/C | 34 | TS-W2 | ++---------+-------------------+---------+-------------------+ +| 31 | TS-W3 | 32 | N/C | ++---------+-------------------+---------+-------------------+ +| 29 | N/C | 30 | N/C | ++---------+-------------------+---------+-------------------+ +| 27 | N/C | 28 | TS-W4 | ++---------+-------------------+---------+-------------------+ +| 25 | N/C | 26 | N/C | ++---------+-------------------+---------+-------------------+ +| 23 | N/C | 24 | N/C | ++---------+-------------------+---------+-------------------+ +| 21 | N/C | 22 | SHIELD-W1 | ++---------+-------------------+---------+-------------------+ +| 19 | N/C | 20 | N/C | ++---------+-------------------+---------+-------------------+ +| 17 | N/C | 18 | N/C | ++---------+-------------------+---------+-------------------+ +| 15 | N/C | 16 | N/C | ++---------+-------------------+---------+-------------------+ +| 13 | N/C | 14 | N/C | ++---------+-------------------+---------+-------------------+ +| 11 | N/C | 12 | N/C | ++---------+-------------------+---------+-------------------+ +| 9 | TS-B1 | 10 | TS-B2 | ++---------+-------------------+---------+-------------------+ +| 7 | SHIELD-B1 | 8 | TS-B3 | ++---------+-------------------+---------+-------------------+ +| 5 | TS-S1 | 6 | SHIELD-S1 | ++---------+-------------------+---------+-------------------+ +| 3 | TS-S3 | 4 | TS-S2 | ++---------+-------------------+---------+-------------------+ +| 1 | TS-S5 | 2 | TS-S4 | ++---------+-------------------+---------+-------------------+ + +Programming +*********** + +Set ``--shield rtk0eg0019b01002bj`` when you invoke ``west build``. For example: + +.. zephyr-app-commands:: + :zephyr-app: samples/subsys/input/input_dump + :board: rssk_ra2l1 + :shield: rtk0eg0019b01002bj + :goals: build + +References +********** +- `Capacitive Touch Evaluation System for RA2L1`_ + +.. _Capacitive Touch Evaluation System for RA2L1: + https://www.renesas.com/en/products/microcontrollers-microprocessors/ra-cortex-m-mcus/rtk0eg0022s01001bj-capacitive-touch-evaluation-system-ra2l1 diff --git a/boards/shields/rtk0eg0019b01002bj/dts/bindings/rtk0eg0019b01002bj-led-matrix.yaml b/boards/shields/rtk0eg0019b01002bj/dts/bindings/rtk0eg0019b01002bj-led-matrix.yaml new file mode 100644 index 0000000000000..8006c8ea172f2 --- /dev/null +++ b/boards/shields/rtk0eg0019b01002bj/dts/bindings/rtk0eg0019b01002bj-led-matrix.yaml @@ -0,0 +1,35 @@ +# Copyright (c) 2025 Renesas Electronics Corporation +# SPDX-License-Identifier: Apache-2.0 + +description: | + This binding provides resources required for the LED matrix + on the RTK0EG0019B01002BJ board. + +compatible: "rtk0eg0019b01002bj-led-matrix" + +properties: + led-row-gpios: + type: phandle-array + required: true + description: | + Identity of GPIOs that will be used to control the LED matrix. + Each entry in the array corresponds to a row of the matrix. + + led-col-gpios: + type: phandle-array + required: true + description: | + Identity of GPIOs that will be used to control the LED matrix. + Each entry in the array corresponds to a column of the matrix. + + num-rows: + type: int + required: true + description: | + Number of rows in the LED matrix. + + num-cols: + type: int + required: true + description: | + Number of columns in the LED matrix. diff --git a/boards/shields/rtk0eg0019b01002bj/rtk0eg0019b01002bj.overlay b/boards/shields/rtk0eg0019b01002bj/rtk0eg0019b01002bj.overlay new file mode 100644 index 0000000000000..8a4d33ae80d9f --- /dev/null +++ b/boards/shields/rtk0eg0019b01002bj/rtk0eg0019b01002bj.overlay @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2025 Renesas Electronics Corporation + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include + +/ { + rtk0eg0019b01002bj_cn1: rtk0eg0019b01002bj-cn1 { + gpio-map-mask = <0xffffffff 0xffffffc0>; + gpio-map-pass-thru = <0 0x3f>; + }; + + rtk0eg0019b01002bj_led_matrix: rtk0eg0019b01002bj-led-matrix { + compatible = "rtk0eg0019b01002bj-led-matrix"; + led-row-gpios = <&rtk0eg0019b01002bj_cn1 13 GPIO_ACTIVE_LOW>, + <&rtk0eg0019b01002bj_cn1 14 GPIO_ACTIVE_LOW>, + <&rtk0eg0019b01002bj_cn1 11 GPIO_ACTIVE_LOW>, + <&rtk0eg0019b01002bj_cn1 12 GPIO_ACTIVE_LOW>; + led-col-gpios = <&rtk0eg0019b01002bj_cn1 4 GPIO_ACTIVE_HIGH>, + <&rtk0eg0019b01002bj_cn1 5 GPIO_ACTIVE_HIGH>, + <&rtk0eg0019b01002bj_cn1 6 GPIO_ACTIVE_HIGH>, + <&rtk0eg0019b01002bj_cn1 7 GPIO_ACTIVE_HIGH>; + num-rows = <4>; + num-cols = <4>; + status = "okay"; + }; +}; + +&rtk0eg0019b01002bj_ctsu { + status = "okay"; + + group1 { + ctsuchac = <0x01 0x0E 0x00 0x00 0x00>; + ctsuchtrc = <0x01 0x00 0x00 0x00 0x00>; + rx-count = <3>; + tx-count = <0>; + status = "okay"; + + rtk0eg0019b01002bj_bt1: button1 { + compatible = "renesas,ra-ctsu-button"; + elements = <2>; + event-code = ; + status = "okay"; + }; + + rtk0eg0019b01002bj_bt2: button2 { + compatible = "renesas,ra-ctsu-button"; + elements = <1>; + event-code = ; + status = "okay"; + }; + + rtk0eg0019b01002bj_bt3: button3 { + compatible = "renesas,ra-ctsu-button"; + elements = <0>; + event-code = ; + status = "okay"; + }; + }; + + group2 { + ctsuchac = <0xF4 0x01 0x00 0x00 0x00>; + ctsuchtrc = <0x00 0x01 0x00 0x00 0x00>; + rx-count = <5>; + tx-count = <0>; + status = "okay"; + + rtk0eg0019b01002bj_slider: slider { + compatible = "renesas,ra-ctsu-slider"; + elements = <1>, <0>, <2>, <4>, <3>; + threshold = <703>; + event-code = ; + status = "okay"; + }; + }; + + group3 { + ctsuchac = <0x00 0x40 0xA4 0x00 0x01>; + ctsuchtrc = <0x00 0x40 0x00 0x00 0x00>; + rx-count = <4>; + tx-count = <0>; + status = "okay"; + + rtk0eg0019b01002bj_wheel: wheel { + compatible = "renesas,ra-ctsu-wheel"; + elements = <0>, <1>, <2>, <3>; + event-code = ; + status = "okay"; + }; + }; +}; diff --git a/boards/shields/rtk0eg0019b01002bj/shield.yml b/boards/shields/rtk0eg0019b01002bj/shield.yml new file mode 100644 index 0000000000000..fe1b02b9ed3a9 --- /dev/null +++ b/boards/shields/rtk0eg0019b01002bj/shield.yml @@ -0,0 +1,7 @@ +shield: + name: rtk0eg0019b01002bj + full_name: RTK0EG0019B01002BJ Capacitive Touch Application Shield + vendor: renesas + supported_features: + - input + - gpio From 7c7325e29f7776929b972dcea154a3b1a039fb82 Mon Sep 17 00:00:00 2001 From: The Nguyen Date: Wed, 25 Jun 2025 12:44:17 +0700 Subject: [PATCH 09/10] boards: renesas: rssk_ra2l1: enable Cap Touch Shield support This commit to enable rssk_ra2l1 build with rtk0eg0019b01002bj shield. Signed-off-by: The Nguyen --- .../rssk_ra2l1/rssk_ra2l1-pinctrl.dtsi | 21 +++++ boards/renesas/rssk_ra2l1/rssk_ra2l1.dts | 44 ++++++++++ .../rtk0eg0019b01002bj/boards/rssk_ra2l1.conf | 4 + .../boards/rssk_ra2l1.overlay | 83 +++++++++++++++++++ 4 files changed, 152 insertions(+) create mode 100644 boards/shields/rtk0eg0019b01002bj/boards/rssk_ra2l1.conf create mode 100644 boards/shields/rtk0eg0019b01002bj/boards/rssk_ra2l1.overlay diff --git a/boards/renesas/rssk_ra2l1/rssk_ra2l1-pinctrl.dtsi b/boards/renesas/rssk_ra2l1/rssk_ra2l1-pinctrl.dtsi index 8002bddb3475a..2602d22f2f70b 100644 --- a/boards/renesas/rssk_ra2l1/rssk_ra2l1-pinctrl.dtsi +++ b/boards/renesas/rssk_ra2l1/rssk_ra2l1-pinctrl.dtsi @@ -12,4 +12,25 @@ ; }; }; + + ctsu_default: ctsu_default { + group1 { + psels = , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + ; + }; + }; }; diff --git a/boards/renesas/rssk_ra2l1/rssk_ra2l1.dts b/boards/renesas/rssk_ra2l1/rssk_ra2l1.dts index 101dd455936bf..8baf7c2704d8d 100644 --- a/boards/renesas/rssk_ra2l1/rssk_ra2l1.dts +++ b/boards/renesas/rssk_ra2l1/rssk_ra2l1.dts @@ -62,6 +62,28 @@ sw1 = &button1; watchdog0 = &wdt; }; + + rtk0eg0019b01002bj_cn1: rtk0eg0019b01002bj-cn1 { + #gpio-cells = <2>; + gpio-map-mask = <0xffffffff 0xffffffc0>; + gpio-map-pass-thru = <0 0x3f>; + gpio-map = <4 0 &ioport5 4 0>, /* LED_COL0 */ + <5 0 &ioport4 0 0>, /* LED_COL1 */ + <6 0 &ioport7 14 0>, /* LED_COL2 */ + <7 0 &ioport4 6 0>, /* LED_COL3 */ + <11 0 &ioport7 8 0>, /* LED_ROW2 */ + <12 0 &ioport4 15 0>, /* LED_ROW3 */ + <13 0 &ioport4 14 0>, /* LED_ROW0 */ + <14 0 &ioport0 6 0>; /* LED_ROW1 */ + }; +}; + +&ioport0 { + status = "okay"; +}; + +&ioport1 { + status = "okay"; }; &ioport2 { @@ -72,6 +94,18 @@ status = "okay"; }; +&ioport4 { + status = "okay"; +}; + +&ioport5 { + status = "okay"; +}; + +&ioport7 { + status = "okay"; +}; + &port_irq0 { interrupts = <8 3>; status = "okay"; @@ -98,3 +132,13 @@ &wdt { status = "okay"; }; + +&ctsu { + pinctrl-0 = <&ctsu_default>; + pinctrl-names = "default"; + interrupts = <5 3>, <6 3>, <7 3>; + interrupt-names = "ctsuwr", "ctsurd", "ctsufn"; + tscap-gpios = <&ioport1 12 0>; +}; + +rtk0eg0019b01002bj_ctsu: &ctsu {}; diff --git a/boards/shields/rtk0eg0019b01002bj/boards/rssk_ra2l1.conf b/boards/shields/rtk0eg0019b01002bj/boards/rssk_ra2l1.conf new file mode 100644 index 0000000000000..e4cd90fa23eb0 --- /dev/null +++ b/boards/shields/rtk0eg0019b01002bj/boards/rssk_ra2l1.conf @@ -0,0 +1,4 @@ +# Copyright (c) 2025 Renesas Electronics Corporation +# SPDX-License-Identifier: Apache-2.0 + +CONFIG_INPUT_RENESAS_RA_DEVICE_VCC=5000 diff --git a/boards/shields/rtk0eg0019b01002bj/boards/rssk_ra2l1.overlay b/boards/shields/rtk0eg0019b01002bj/boards/rssk_ra2l1.overlay new file mode 100644 index 0000000000000..f33505d135e15 --- /dev/null +++ b/boards/shields/rtk0eg0019b01002bj/boards/rssk_ra2l1.overlay @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2025 Renesas Electronics Corporation + * + * SPDX-License-Identifier: Apache-2.0 + */ + +&rtk0eg0019b01002bj_ctsu { + clock-div = <1>; + pwr-supply-sel = "internal-power"; + pwr-supply-sel2 = "pwr-supply-sel"; + atune1 = "normal"; + atune12 = <40>; + measure-mode = "self-multi-scan"; + po-sel = "same-pulse"; + status = "okay"; + + group1 { + ssdiv = "4.00", "4.00", "4.00"; + so = <0x03B>, <0x059>, <0x049>; + snum = <0x07>, <0x07>, <0x07>; + sdpa = <0x0F>, <0x0F>, <0x0F>; + num-moving-avg = <4>; + on-freq = <3>; + off-freq = <3>; + drift-freq = <255>; + cancel-freq = <0>; + status = "okay"; + + button1 { + threshold = <769>; + hysteresis = <38>; + status = "okay"; + }; + + button2 { + threshold = <740>; + hysteresis = <37>; + status = "okay"; + }; + + button3 { + threshold = <784>; + hysteresis = <39>; + status = "okay"; + }; + }; + + group2 { + ssdiv = "4.00", "4.00", "4.00", "4.00", "4.00"; + so = <0x02B>, <0x03B>, <0x036>, <0x03B>, <0x03A>; + snum = <0x07>, <0x07>, <0x07>, <0x07>, <0x07>; + sdpa = <0x0F>, <0x0F>, <0x0F>, <0x0F>, <0x0F>; + num-moving-avg = <4>; + on-freq = <3>; + off-freq = <3>; + drift-freq = <255>; + cancel-freq = <0>; + status = "okay"; + + slider { + threshold = <573>; + status = "okay"; + }; + }; + + group3 { + ssdiv = "4.00", "4.00", "4.00", "4.00"; + so = <0x047>, <0x046>, <0x049>, <0x040>; + snum = <0x07>, <0x07>, <0x07>, <0x07>; + sdpa = <0x0F>, <0x0F>, <0x0F>, <0x0F>; + num-moving-avg = <4>; + on-freq = <3>; + off-freq = <3>; + drift-freq = <255>; + cancel-freq = <0>; + status = "okay"; + + wheel { + threshold = <711>; + status = "okay"; + }; + }; +}; From 3fc788cfb7273afe93b3cb3e876812b6c7fa2291 Mon Sep 17 00:00:00 2001 From: The Nguyen Date: Sun, 22 Jun 2025 15:38:53 +0700 Subject: [PATCH 10/10] samples: shields: add rtk0eg0019b01002bj sample First commit to add rtk0eg0019b01002bj shield sample Signed-off-by: The Nguyen --- .../shields/rtk0eg0019b01002bj/CMakeLists.txt | 13 + samples/shields/rtk0eg0019b01002bj/README.rst | 116 +++++ samples/shields/rtk0eg0019b01002bj/prj.conf | 9 + .../shields/rtk0eg0019b01002bj/sample.yaml | 9 + samples/shields/rtk0eg0019b01002bj/src/main.c | 189 +++++++ .../rtk0eg0019b01002bj/src/qe_touch_config.c | 473 ++++++++++++++++++ .../rtk0eg0019b01002bj/src/qe_touch_config.h | 52 ++ .../rtk0eg0019b01002bj/src/qe_touch_define.h | 91 ++++ 8 files changed, 952 insertions(+) create mode 100644 samples/shields/rtk0eg0019b01002bj/CMakeLists.txt create mode 100644 samples/shields/rtk0eg0019b01002bj/README.rst create mode 100644 samples/shields/rtk0eg0019b01002bj/prj.conf create mode 100644 samples/shields/rtk0eg0019b01002bj/sample.yaml create mode 100644 samples/shields/rtk0eg0019b01002bj/src/main.c create mode 100644 samples/shields/rtk0eg0019b01002bj/src/qe_touch_config.c create mode 100644 samples/shields/rtk0eg0019b01002bj/src/qe_touch_config.h create mode 100644 samples/shields/rtk0eg0019b01002bj/src/qe_touch_define.h diff --git a/samples/shields/rtk0eg0019b01002bj/CMakeLists.txt b/samples/shields/rtk0eg0019b01002bj/CMakeLists.txt new file mode 100644 index 0000000000000..d5f0ae5608398 --- /dev/null +++ b/samples/shields/rtk0eg0019b01002bj/CMakeLists.txt @@ -0,0 +1,13 @@ +# Copyright (c) 2025 Renesas Electronics Corporation +# SPDX-License-Identifier: Apache-2.0 + +cmake_minimum_required(VERSION 3.20.0) +find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE}) +project(rtk0eg0019b01002bj) + +target_sources(app PRIVATE src/main.c) + +if(CONFIG_INPUT_RENESAS_RA_QE_TOUCH_CFG) + zephyr_include_directories(src) + zephyr_sources(src/qe_touch_config.c) +endif() diff --git a/samples/shields/rtk0eg0019b01002bj/README.rst b/samples/shields/rtk0eg0019b01002bj/README.rst new file mode 100644 index 0000000000000..f23df417123c3 --- /dev/null +++ b/samples/shields/rtk0eg0019b01002bj/README.rst @@ -0,0 +1,116 @@ +.. zephyr:code-sample:: rtk0eg0019b01002bj + :name: RTK0EG0019B01002BJ Capacitive Touch Application Shield + :relevant-api: input_events + + Interact with the Capacitive Touch Sensor and LED matrix on the RTK0EG0019B01002BJ shield + +Overview +******** + +This sample demonstrates the usage of the Capacitive Touch Sensor using the +:ref:`rtk0eg0019b01002bj` with `Renesas Capacitive Touch Sensor Solutions`_. + +Requirements +************ + +A Renesas Capacitive Touch Evaluation Kit is needed to run this sample. It includes: + +- A MCU board which support CTSU driver (for example: RSSK-RA2L1). +- A RTK0EG0019B01002BJ Touch Application board. + +Building and Running +******************** + +Build and flash with default settings for shield +================================================ +The :ref:`rtk0eg0019b01002bj` comes with a default DTS configuration that is tuned in advance to +make it ready for development. + +Build and flash as follows, changing ``rssk_ra2l1`` for your board: + +.. zephyr-app-commands:: + :zephyr-app: samples/shields/rtk0eg0019b01002bj + :board: rssk_ra2l1 + :shield: rtk0eg0019b01002bj + :goals: build flash + :compact: + +After startup, all LEDs on the shield will blink 5 times to indicate that the +application has started. + +You can monitor input events through the console output. Additionally, the LED +corresponding to the touched sensor will turn on when you touch it. + +.. code-block:: console + + *** Booting Zephyr OS build v4.1.0-6697-gdc27367ff627 *** + rtk0eg0019b01002bj sample started + I: input event: dev=button1 type= 1 code= 11 value=0 + I: input event: dev=wheel type= 3 code= 8 value=61 + I: input event: dev=wheel type= 3 code= 8 value=67 + I: input event: dev=wheel type= 3 code= 8 value=82 + I: input event: dev=wheel type= 3 code= 8 value=111 + I: input event: dev=wheel type= 3 code= 8 value=124 + I: input event: dev=wheel type= 3 code= 8 value=134 + I: input event: dev=slider type= 3 code= 6 value=0 + I: input event: dev=slider type= 3 code= 6 value=2 + I: input event: dev=slider type= 3 code= 6 value=4 + I: input event: dev=slider type= 3 code= 6 value=6 + I: input event: dev=slider type= 3 code= 6 value=10 + I: input event: dev=slider type= 3 code= 6 value=23 + I: input event: dev=slider type= 3 code= 6 value=26 + I: input event: dev=slider type= 3 code= 6 value=27 + I: input event: dev=slider type= 3 code= 6 value=28 + +(Advanced) Using Configuration Output Generated by Renesas QE Capacitive Touch Workflow +======================================================================================= +This section is for advanced users who do not want to use the default configuration for the Cap +Touch shield and would like to tune configuration parameters manually themselves using the +`Renesas Development Assistance Tool for Capacitive Touch Sensors`_. + +Requirements +------------ + +- `e² studio`_ with Renesas QE Capacitive Touch plugin installed: recommended 2025-04.1 version +- `RA Flexible Software Package`_: recommended FSP v5.8.0 or newer + +Building and flashing with generated tuning code +------------------------------------------------ + + 1. Follow steps 6.1 to 6.5 of `Using QE and FSP to Develop Capacitive Touch Applications`_. + + 2. At step 8 in 6.5 Tuning the Capacitive Touch Interface Using QE for Capacitive Touch Plug-in, + select 'Specify an output folder' and choose this application's subfolder. + + 3. Update the include path to qe_touch_config.h and qe_touch_define.h, and add qe_touch_config.c + to the build sources in your application's CMake. + + 4. Build and flash the application with the command below: + +.. zephyr-app-commands:: + :zephyr-app: samples/shields/rtk0eg0019b01002bj + :board: rssk_ra2l1 + :shield: rtk0eg0019b01002bj + :gen-args: -DCONFIG_INPUT_RENESAS_RA_QE_TOUCH_CFG=y + :goals: build flash + :compact: + +References +********** +- `Renesas Capacitive Touch Sensor Solutions`_ +- `Renesas Development Assistance Tool for Capacitive Touch Sensors`_ + +.. _Renesas Capacitive Touch Sensor Solutions: + https://www.renesas.com/en/key-technologies/hmi/capacitive-touch-sensor-solutions + +.. _Renesas Development Assistance Tool for Capacitive Touch Sensors: + https://www.renesas.com/en/software-tool/qe-capacitive-touch-development-assistance-tool-capacitive-touch-sensors + +.. _Using QE and FSP to Develop Capacitive Touch Applications: + https://www.renesas.com/en/document/apn/using-qe-and-fsp-develop-capacitive-touch-applications?r=1170071 + +.. _e² studio: + https://www.renesas.com/en/software-tool/e-studio + +.. _RA Flexible Software Package: + https://www.renesas.com/en/software-tool/flexible-software-package diff --git a/samples/shields/rtk0eg0019b01002bj/prj.conf b/samples/shields/rtk0eg0019b01002bj/prj.conf new file mode 100644 index 0000000000000..12b75f7b1df0b --- /dev/null +++ b/samples/shields/rtk0eg0019b01002bj/prj.conf @@ -0,0 +1,9 @@ +# Copyright (c) 2025 Renesas Electronics Corporation +# SPDX-License-Identifier: Apache-2.0 + +CONFIG_LOG=y +CONFIG_LOG_MODE_MINIMAL=y + +CONFIG_INPUT=y +CONFIG_INPUT_EVENT_DUMP=y +CONFIG_GPIO=y diff --git a/samples/shields/rtk0eg0019b01002bj/sample.yaml b/samples/shields/rtk0eg0019b01002bj/sample.yaml new file mode 100644 index 0000000000000..3b6911e20ccff --- /dev/null +++ b/samples/shields/rtk0eg0019b01002bj/sample.yaml @@ -0,0 +1,9 @@ +sample: + name: RTK0EG0019B01002BJ Capacitive Touch Application Shield +tests: + sample.shields.rtk0eg0019b01002bj: + harness: shield + tags: shield + platform_allow: + - rssk_ra2l1 + extra_args: SHIELD=rtk0eg0019b01002bj diff --git a/samples/shields/rtk0eg0019b01002bj/src/main.c b/samples/shields/rtk0eg0019b01002bj/src/main.c new file mode 100644 index 0000000000000..f617f63a09bd8 --- /dev/null +++ b/samples/shields/rtk0eg0019b01002bj/src/main.c @@ -0,0 +1,189 @@ +/* + * Copyright (c) 2025 Renesas Electronics Corporation + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include +#include +#include +#include + +#ifdef CONFIG_INPUT_RENESAS_RA_QE_TOUCH_CFG +#include "qe_touch_config.h" +#endif /* CONFIG_INPUT_RENESAS_RA_QE_TOUCH_CFG*/ + +#define LED_MATRIX DT_NODELABEL(rtk0eg0019b01002bj_led_matrix) +#define BUTTON1 DT_NODELABEL(rtk0eg0019b01002bj_bt1) +#define BUTTON2 DT_NODELABEL(rtk0eg0019b01002bj_bt2) +#define BUTTON3 DT_NODELABEL(rtk0eg0019b01002bj_bt3) +#define SLIDER DT_NODELABEL(rtk0eg0019b01002bj_slider) +#define WHEEL DT_NODELABEL(rtk0eg0019b01002bj_wheel) + +#define QE_TOUCH_CFG1 DT_CHILD(DT_NODELABEL(rtk0eg0019b01002bj_ctsu), group1) +#define QE_TOUCH_CFG2 DT_CHILD(DT_NODELABEL(rtk0eg0019b01002bj_ctsu), group2) +#define QE_TOUCH_CFG3 DT_CHILD(DT_NODELABEL(rtk0eg0019b01002bj_ctsu), group3) + +#define NUM_ROWS DT_PROP(LED_MATRIX, num_rows) +#define NUM_COLS DT_PROP(LED_MATRIX, num_cols) + +#define LED_MATRIX_ROWS(idx, nodeid) GPIO_DT_SPEC_GET_BY_IDX(nodeid, led_row_gpios, idx) +#define LED_MATRIX_COLS(idx, nodeid) GPIO_DT_SPEC_GET_BY_IDX(nodeid, led_col_gpios, idx) + +#define BUTTON_LED_NUM (3U) + +#define SLIDER_LED_NUM (5U) +#define SLIDER_RESOLUTION (100) + +#define WHEEL_LED_NUM (8U) +#define WHEEL_RESOLUTION_DEGREE (360) + +static const struct gpio_dt_spec led_row[NUM_ROWS] = { + LISTIFY(NUM_ROWS, LED_MATRIX_ROWS, (,), LED_MATRIX), +}; + +static const struct gpio_dt_spec led_col[NUM_COLS] = { + LISTIFY(NUM_COLS, LED_MATRIX_COLS, (,), LED_MATRIX), +}; + +static const unsigned int wheel_leds_lut[WHEEL_LED_NUM] = {0, 1, 2, 3, 4, 5, 6, 7}; +static const unsigned int slider_leds_lut[SLIDER_LED_NUM] = {8, 9, 10, 11, 12}; +static const unsigned int button_leds_lut[BUTTON_LED_NUM] = {13, 14, 15}; + +static void rtk0eg0019b01002bj_led_output(unsigned int led_idx, bool on) +{ + /* Refer to RTK0EG0022S01001BJ - Design Package for the Touch Application board layout */ + static const unsigned int led_map[NUM_ROWS * NUM_COLS][2] = { + {0, 0}, {1, 0}, {2, 0}, {3, 0}, {0, 1}, {1, 1}, {2, 1}, {3, 1}, + {0, 3}, {1, 3}, {2, 3}, {3, 3}, {0, 2}, {1, 2}, {2, 2}, {3, 2}, + }; + const struct gpio_dt_spec *p_led_row = &led_row[led_map[led_idx][0]]; + const struct gpio_dt_spec *p_led_col = &led_col[led_map[led_idx][1]]; + + gpio_pin_set_dt(p_led_row, on ? 1 : 0); + gpio_pin_set_dt(p_led_col, on ? 1 : 0); +} + +static void rtk0eg0019b01002bj_led_init(void) +{ + for (int i = 0; i < NUM_ROWS; i++) { + gpio_pin_configure_dt(&led_row[i], GPIO_OUTPUT_INACTIVE); + } + + for (int i = 0; i < NUM_COLS; i++) { + gpio_pin_configure_dt(&led_col[i], GPIO_OUTPUT_INACTIVE); + } +} + +static void blink_leds(unsigned int duration_ms) +{ + for (int i = 0; i < 5; i++) { + /* Turn all LEDs ON */ + for (int j = 0; j < NUM_ROWS * NUM_COLS; j++) { + rtk0eg0019b01002bj_led_output(j, true); + } + k_msleep(duration_ms); + + /* Turn all LEDs OFF */ + for (int j = 0; j < NUM_ROWS * NUM_COLS; j++) { + rtk0eg0019b01002bj_led_output(j, false); + } + k_msleep(duration_ms); + } +} + +static inline unsigned int wheel_get_current_step(unsigned int value) +{ + return (value * WHEEL_LED_NUM) / WHEEL_RESOLUTION_DEGREE; +} + +static inline unsigned int slider_get_current_step(unsigned int value) +{ + return (value * SLIDER_LED_NUM) / SLIDER_RESOLUTION; +} + +static void rtk0eg0019b01002bj_evt_handler(struct input_event *evt, void *user_data) +{ + unsigned int led_idx; + + /* Set all LEDs to OFF */ + for (int i = 0; i < NUM_ROWS * NUM_COLS; i++) { + rtk0eg0019b01002bj_led_output(i, false); + } + + switch (evt->code) { + case INPUT_KEY_0: { + led_idx = button_leds_lut[0]; + break; + } + case INPUT_KEY_1: { + led_idx = button_leds_lut[1]; + break; + } + case INPUT_KEY_2: { + led_idx = button_leds_lut[2]; + break; + } + case INPUT_ABS_WHEEL: { + led_idx = wheel_get_current_step(evt->value) + wheel_leds_lut[0]; + break; + } + case INPUT_ABS_THROTTLE: { + led_idx = slider_get_current_step(evt->value) + slider_leds_lut[0]; + break; + } + default: + /* Unexpected event */ + return; + } + + rtk0eg0019b01002bj_led_output(led_idx, true); +} + +INPUT_CALLBACK_DEFINE_NAMED(DEVICE_DT_GET(BUTTON1), rtk0eg0019b01002bj_evt_handler, NULL, button1); +INPUT_CALLBACK_DEFINE_NAMED(DEVICE_DT_GET(BUTTON2), rtk0eg0019b01002bj_evt_handler, NULL, button2); +INPUT_CALLBACK_DEFINE_NAMED(DEVICE_DT_GET(BUTTON3), rtk0eg0019b01002bj_evt_handler, NULL, button3); +INPUT_CALLBACK_DEFINE_NAMED(DEVICE_DT_GET(SLIDER), rtk0eg0019b01002bj_evt_handler, NULL, slider); +INPUT_CALLBACK_DEFINE_NAMED(DEVICE_DT_GET(WHEEL), rtk0eg0019b01002bj_evt_handler, NULL, wheel); + +int main(void) +{ +#ifdef CONFIG_INPUT_RENESAS_RA_QE_TOUCH_CFG + const struct device *qe_touch_cfg1 = DEVICE_DT_GET(QE_TOUCH_CFG1); + const struct device *qe_touch_cfg2 = DEVICE_DT_GET(QE_TOUCH_CFG2); + const struct device *qe_touch_cfg3 = DEVICE_DT_GET(QE_TOUCH_CFG3); + int ret; +#endif + rtk0eg0019b01002bj_led_init(); + + /* Blink all leds 5 times, each time is 200ms */ + blink_leds(200); + +#ifdef CONFIG_INPUT_RENESAS_RA_QE_TOUCH_CFG + ret = renesas_ra_ctsu_group_configure( + qe_touch_cfg1, (struct renesas_ra_ctsu_touch_cfg *)&g_qe_touch_instance_config01); + if (ret < 0) { + printk("Failed to configure QE Touch Group 1: %d\n", ret); + return ret; + } + + ret = renesas_ra_ctsu_group_configure( + qe_touch_cfg2, (struct renesas_ra_ctsu_touch_cfg *)&g_qe_touch_instance_config02); + if (ret < 0) { + printk("Failed to configure QE Touch Group 2: %d\n", ret); + return ret; + } + + ret = renesas_ra_ctsu_group_configure( + qe_touch_cfg3, (struct renesas_ra_ctsu_touch_cfg *)&g_qe_touch_instance_config03); + if (ret < 0) { + printk("Failed to configure QE Touch Group 3: %d\n", ret); + return ret; + } +#endif + + printk("rtk0eg0019b01002bj sample started\n"); + return 0; +} diff --git a/samples/shields/rtk0eg0019b01002bj/src/qe_touch_config.c b/samples/shields/rtk0eg0019b01002bj/src/qe_touch_config.c new file mode 100644 index 0000000000000..57f405451bc25 --- /dev/null +++ b/samples/shields/rtk0eg0019b01002bj/src/qe_touch_config.c @@ -0,0 +1,473 @@ +/* + * Copyright (c) 2025 Renesas Electronics Corporation + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/************************************************************************************************** + * File Name : qe_touch_config.c + * Description : This file includes module implementations. + **************************************************************************************************/ +/************************************************************************************************** + * History : MM/DD/YYYY Version Description + * : 09/02/2019 1.00 First Release + * : 10/07/2019 1.00a Provisional Version for RA2L1 + * : 12/26/2019 1.10 Corresponding for FSP V0.10.0 + * : 02/20/2020 1.20 Corresponding for FSP V0.12.0 + * : 02/26/2020 1.21 Adding information for Temperature Correction + * : 03/04/2020 1.30 Corresponding for FSP V1.0.0 RC0 + * : 03/10/2020 1.31 Corresponding for FSP V1.0.0 RC1 + * : 09/10/2020 1.40 Corresponding for FSP V2.0.0 Beta2 + * : 05/26/2021 1.50 Adding Diagnosis Supporting + * : 06/01/2021 1.51 Fixing a Little + * : 07/15/2021 1.52 Fixing a Little + * : 08/20/2021 1.53 Fixing a Little + * : 11/13/2021 1.60 Adding information for Initial Offset Tuning + * : 03/31/2023 1.61 Improving Traceability + * : 04/18/2023 1.70 Adding 3 Frequency Judgement Supporting + * : 07/30/2024 1.80 Adding Auto Judgement Supporting + **************************************************************************************************/ +/************************************************************************************************** + * Touch I/F Configuration File : quickstart_rssk_ra2l1_ep.tifcfg + * Tuning Log File : quickstart_rssk_ra2l1_ep_log_tuning20230904134024.log + **************************************************************************************************/ + +#include "qe_touch_config.h" + +volatile uint8_t g_qe_touch_flag; +volatile ctsu_event_t g_qe_ctsu_event; + +void qe_touch_callback(touch_callback_args_t *p_args) +{ + g_qe_touch_flag = 1; + g_qe_ctsu_event = p_args->event; +} + +/************************************************************************************************** + * CTSU Related Information for [CONFIG01] configuration. + **************************************************************************************************/ + +const ctsu_element_cfg_t g_qe_ctsu_element_cfg_config01[] = { + {.ssdiv = CTSU_SSDIV_4000, .so = 0x000, .snum = 0x07, .sdpa = 0x1F}, + {.ssdiv = CTSU_SSDIV_4000, .so = 0x00F, .snum = 0x07, .sdpa = 0x1F}, + {.ssdiv = CTSU_SSDIV_4000, .so = 0x007, .snum = 0x07, .sdpa = 0x1F}, +}; + +const ctsu_cfg_t g_qe_ctsu_cfg_config01 = { + .cap = CTSU_CAP_SOFTWARE, + + .txvsel = CTSU_TXVSEL_INTERNAL_POWER, + .txvsel2 = CTSU_TXVSEL_MODE, + + .atune12 = CTSU_ATUNE12_40UA, + .md = CTSU_MODE_SELF_MULTI_SCAN, + .posel = CTSU_POSEL_SAME_PULSE, + + .ctsuchac0 = 0x01, /* ch0-ch7 enable mask */ + .ctsuchac1 = 0x0E, /* ch8-ch15 enable mask */ + .ctsuchac2 = 0x00, /* ch16-ch23 enable mask */ + .ctsuchac3 = 0x00, /* ch24-ch31 enable mask */ + .ctsuchac4 = 0x00, /* ch32-ch39 enable mask */ + .ctsuchtrc0 = 0x01, /* ch0-ch7 mutual tx mask */ + .ctsuchtrc1 = 0x00, /* ch8-ch15 mutual tx mask */ + .ctsuchtrc2 = 0x00, /* ch16-ch23 mutual tx mask */ + .ctsuchtrc3 = 0x00, /* ch24-ch31 mutual tx mask */ + .ctsuchtrc4 = 0x00, /* ch32-ch39 mutual tx mask */ + .num_rx = 3, + .num_tx = 0, + .p_elements = g_qe_ctsu_element_cfg_config01, + +#if (CTSU_TARGET_VALUE_CONFIG_SUPPORT == 1) + .tuning_self_target_value = 4608, + .tuning_mutual_target_value = 10240, +#endif + + .num_moving_average = 4, + .p_callback = &qe_touch_callback, +#if (CTSU_CFG_DTC_SUPPORT_ENABLE == 1) + .p_transfer_tx = &g_transfer0, + .p_transfer_rx = &g_transfer1, +#else + .p_transfer_tx = NULL, + .p_transfer_rx = NULL, +#endif + + .write_irq = CTSU_WRITE_IRQn, + .read_irq = CTSU_READ_IRQn, + .end_irq = CTSU_END_IRQn, + +}; + +ctsu_instance_ctrl_t g_qe_ctsu_ctrl_config01; + +const ctsu_instance_t g_qe_ctsu_instance_config01 = { + .p_ctrl = &g_qe_ctsu_ctrl_config01, + .p_cfg = &g_qe_ctsu_cfg_config01, + .p_api = &g_ctsu_on_ctsu, +}; + +/************************************************************************************************** + * Touch Related Information for [CONFIG01] configuration. + **************************************************************************************************/ + +#define QE_TOUCH_CONFIG01_NUM_BUTTONS (3) +#define QE_TOUCH_CONFIG01_NUM_SLIDERS (0) +#define QE_TOUCH_CONFIG01_NUM_WHEELS (0) +#define QE_TOUCH_CONFIG01_NUM_TOUCH_PADS (0) + +/* Button configurations */ +#if (QE_TOUCH_CONFIG01_NUM_BUTTONS != 0) +const touch_button_cfg_t g_qe_touch_button_cfg_config01[] = { + + /* VMM */ + /* button02 */ + { + .elem_index = 0, + .threshold = 306, + .hysteresis = 15, + }, + /* button01 */ + { + .elem_index = 1, + .threshold = 226, + .hysteresis = 11, + }, + /* button00 */ + { + .elem_index = 2, + .threshold = 261, + .hysteresis = 13, + }, +}; +#endif + +/* Slider configurations */ +#if (QE_TOUCH_CONFIG01_NUM_SLIDERS != 0) +const touch_slider_cfg_t g_qe_touch_slider_cfg_config01[] = {NULL}; +#endif + +/* Wheel configurations */ +#if (QE_TOUCH_CONFIG01_NUM_WHEELS != 0) +const touch_wheel_cfg_t g_qe_touch_wheel_cfg_config01[] = {NULL}; +#endif + +/* Touch pad configurations */ +#if (QE_TOUCH_CONFIG01_NUM_TOUCH_PADS != 0) +const touch_pad_cfg_t g_qe_touch_touch_pad_cfg_config01 = {NULL}; +#endif + +/* Touch configurations */ +const touch_cfg_t g_qe_touch_cfg_config01 = { + .p_buttons = g_qe_touch_button_cfg_config01, + .p_sliders = NULL, + .p_wheels = NULL, +#if (TOUCH_CFG_PAD_ENABLE != 0) + .p_pad = NULL, +#endif + .num_buttons = QE_TOUCH_CONFIG01_NUM_BUTTONS, + .num_sliders = QE_TOUCH_CONFIG01_NUM_SLIDERS, + .num_wheels = QE_TOUCH_CONFIG01_NUM_WHEELS, + + .number = 0, +#if ((TOUCH_CFG_UART_MONITOR_SUPPORT == 1) || (TOUCH_CFG_UART_TUNING_SUPPORT == 1)) + .p_uart_instance = &g_uart_qe, +#else + .p_uart_instance = NULL, +#endif + + .on_freq = 3, + .off_freq = 3, + .drift_freq = 255, + .cancel_freq = 0, + + .p_ctsu_instance = &g_qe_ctsu_instance_config01, +}; + +touch_instance_ctrl_t g_qe_touch_ctrl_config01; + +const touch_instance_t g_qe_touch_instance_config01 = { + .p_ctrl = &g_qe_touch_ctrl_config01, + .p_cfg = &g_qe_touch_cfg_config01, + .p_api = &g_touch_on_ctsu, +}; + +/************************************************************************************************** + * CTSU Related Information for [CONFIG02] configuration. + **************************************************************************************************/ + +const ctsu_element_cfg_t g_qe_ctsu_element_cfg_config02[] = { + {.ssdiv = CTSU_SSDIV_4000, .so = 0x021, .snum = 0x07, .sdpa = 0x0F}, + {.ssdiv = CTSU_SSDIV_4000, .so = 0x032, .snum = 0x07, .sdpa = 0x0F}, + {.ssdiv = CTSU_SSDIV_4000, .so = 0x02C, .snum = 0x07, .sdpa = 0x0F}, + {.ssdiv = CTSU_SSDIV_4000, .so = 0x034, .snum = 0x07, .sdpa = 0x0F}, + {.ssdiv = CTSU_SSDIV_4000, .so = 0x032, .snum = 0x07, .sdpa = 0x0F}, +}; + +const ctsu_cfg_t g_qe_ctsu_cfg_config02 = { + .cap = CTSU_CAP_SOFTWARE, + + .txvsel = CTSU_TXVSEL_INTERNAL_POWER, + .txvsel2 = CTSU_TXVSEL_MODE, + + .atune12 = CTSU_ATUNE12_40UA, + .md = CTSU_MODE_SELF_MULTI_SCAN, + .posel = CTSU_POSEL_SAME_PULSE, + + .ctsuchac0 = 0xF4, /* ch0-ch7 enable mask */ + .ctsuchac1 = 0x01, /* ch8-ch15 enable mask */ + .ctsuchac2 = 0x00, /* ch16-ch23 enable mask */ + .ctsuchac3 = 0x00, /* ch24-ch31 enable mask */ + .ctsuchac4 = 0x00, /* ch32-ch39 enable mask */ + .ctsuchtrc0 = 0x00, /* ch0-ch7 mutual tx mask */ + .ctsuchtrc1 = 0x01, /* ch8-ch15 mutual tx mask */ + .ctsuchtrc2 = 0x00, /* ch16-ch23 mutual tx mask */ + .ctsuchtrc3 = 0x00, /* ch24-ch31 mutual tx mask */ + .ctsuchtrc4 = 0x00, /* ch32-ch39 mutual tx mask */ + .num_rx = 5, + .num_tx = 0, + .p_elements = g_qe_ctsu_element_cfg_config02, + +#if (CTSU_TARGET_VALUE_CONFIG_SUPPORT == 1) + .tuning_self_target_value = 4608, + .tuning_mutual_target_value = 10240, +#endif + + .num_moving_average = 4, + .p_callback = &qe_touch_callback, +#if (CTSU_CFG_DTC_SUPPORT_ENABLE == 1) + .p_transfer_tx = &g_transfer0, + .p_transfer_rx = &g_transfer1, +#else + .p_transfer_tx = NULL, + .p_transfer_rx = NULL, +#endif + + .write_irq = CTSU_WRITE_IRQn, + .read_irq = CTSU_READ_IRQn, + .end_irq = CTSU_END_IRQn, + +}; + +ctsu_instance_ctrl_t g_qe_ctsu_ctrl_config02; + +const ctsu_instance_t g_qe_ctsu_instance_config02 = { + .p_ctrl = &g_qe_ctsu_ctrl_config02, + .p_cfg = &g_qe_ctsu_cfg_config02, + .p_api = &g_ctsu_on_ctsu, +}; + +/************************************************************************************************** + * Touch Related Information for [CONFIG02] configuration. + **************************************************************************************************/ + +#define QE_TOUCH_CONFIG02_NUM_BUTTONS (0) +#define QE_TOUCH_CONFIG02_NUM_SLIDERS (1) +#define QE_TOUCH_CONFIG02_NUM_WHEELS (0) +#define QE_TOUCH_CONFIG02_NUM_TOUCH_PADS (0) + +/* Button configurations */ +#if (QE_TOUCH_CONFIG02_NUM_BUTTONS != 0) +const touch_button_cfg_t g_qe_touch_button_cfg_config02[] = { + + /* VMM */ + NULL}; +#endif + +/* Slider configurations */ +const uint8_t g_qe_touch_elem_slider_config02_slider00[] = {1, 0, 2, 4, 3}; + +#if (QE_TOUCH_CONFIG02_NUM_SLIDERS != 0) +const touch_slider_cfg_t g_qe_touch_slider_cfg_config02[] = { + /* slider00 */ + { + .p_elem_index = g_qe_touch_elem_slider_config02_slider00, + .num_elements = 5, + .threshold = 570, + }, +}; +#endif + +/* Wheel configurations */ +#if (QE_TOUCH_CONFIG02_NUM_WHEELS != 0) +const touch_wheel_cfg_t g_qe_touch_wheel_cfg_config02[] = {NULL}; +#endif + +/* Touch pad configurations */ +#if (QE_TOUCH_CONFIG02_NUM_TOUCH_PADS != 0) +const touch_pad_cfg_t g_qe_touch_touch_pad_cfg_config02 = {NULL}; +#endif + +/* Touch configurations */ +const touch_cfg_t g_qe_touch_cfg_config02 = { + .p_buttons = NULL, + .p_sliders = g_qe_touch_slider_cfg_config02, + .p_wheels = NULL, +#if (TOUCH_CFG_PAD_ENABLE != 0) + .p_pad = NULL, +#endif + .num_buttons = QE_TOUCH_CONFIG02_NUM_BUTTONS, + .num_sliders = QE_TOUCH_CONFIG02_NUM_SLIDERS, + .num_wheels = QE_TOUCH_CONFIG02_NUM_WHEELS, + + .number = 1, +#if ((TOUCH_CFG_UART_MONITOR_SUPPORT == 1) || (TOUCH_CFG_UART_TUNING_SUPPORT == 1)) + .p_uart_instance = &g_uart_qe, +#else + .p_uart_instance = NULL, +#endif + + .on_freq = 3, + .off_freq = 3, + .drift_freq = 255, + .cancel_freq = 0, + + .p_ctsu_instance = &g_qe_ctsu_instance_config02, +}; + +touch_instance_ctrl_t g_qe_touch_ctrl_config02; + +const touch_instance_t g_qe_touch_instance_config02 = { + .p_ctrl = &g_qe_touch_ctrl_config02, + .p_cfg = &g_qe_touch_cfg_config02, + .p_api = &g_touch_on_ctsu, +}; + +/************************************************************************************************** + * CTSU Related Information for [CONFIG03] configuration. + **************************************************************************************************/ + +const ctsu_element_cfg_t g_qe_ctsu_element_cfg_config03[] = { + {.ssdiv = CTSU_SSDIV_4000, .so = 0x03F, .snum = 0x07, .sdpa = 0x0F}, + {.ssdiv = CTSU_SSDIV_4000, .so = 0x03D, .snum = 0x07, .sdpa = 0x0F}, + {.ssdiv = CTSU_SSDIV_4000, .so = 0x041, .snum = 0x07, .sdpa = 0x0F}, + {.ssdiv = CTSU_SSDIV_4000, .so = 0x037, .snum = 0x07, .sdpa = 0x0F}, +}; + +const ctsu_cfg_t g_qe_ctsu_cfg_config03 = { + .cap = CTSU_CAP_SOFTWARE, + + .txvsel = CTSU_TXVSEL_INTERNAL_POWER, + .txvsel2 = CTSU_TXVSEL_MODE, + + .atune12 = CTSU_ATUNE12_40UA, + .md = CTSU_MODE_SELF_MULTI_SCAN, + .posel = CTSU_POSEL_SAME_PULSE, + + .ctsuchac0 = 0x00, /* ch0-ch7 enable mask */ + .ctsuchac1 = 0x40, /* ch8-ch15 enable mask */ + .ctsuchac2 = 0xA4, /* ch16-ch23 enable mask */ + .ctsuchac3 = 0x00, /* ch24-ch31 enable mask */ + .ctsuchac4 = 0x01, /* ch32-ch39 enable mask */ + .ctsuchtrc0 = 0x00, /* ch0-ch7 mutual tx mask */ + .ctsuchtrc1 = 0x40, /* ch8-ch15 mutual tx mask */ + .ctsuchtrc2 = 0x00, /* ch16-ch23 mutual tx mask */ + .ctsuchtrc3 = 0x00, /* ch24-ch31 mutual tx mask */ + .ctsuchtrc4 = 0x00, /* ch32-ch39 mutual tx mask */ + .num_rx = 4, + .num_tx = 0, + .p_elements = g_qe_ctsu_element_cfg_config03, + +#if (CTSU_TARGET_VALUE_CONFIG_SUPPORT == 1) + .tuning_self_target_value = 4608, + .tuning_mutual_target_value = 10240, +#endif + + .num_moving_average = 4, + .p_callback = &qe_touch_callback, +#if (CTSU_CFG_DTC_SUPPORT_ENABLE == 1) + .p_transfer_tx = &g_transfer0, + .p_transfer_rx = &g_transfer1, +#else + .p_transfer_tx = NULL, + .p_transfer_rx = NULL, +#endif + + .write_irq = CTSU_WRITE_IRQn, + .read_irq = CTSU_READ_IRQn, + .end_irq = CTSU_END_IRQn, + +}; + +ctsu_instance_ctrl_t g_qe_ctsu_ctrl_config03; + +const ctsu_instance_t g_qe_ctsu_instance_config03 = { + .p_ctrl = &g_qe_ctsu_ctrl_config03, + .p_cfg = &g_qe_ctsu_cfg_config03, + .p_api = &g_ctsu_on_ctsu, +}; + +/************************************************************************************************** + * Touch Related Information for [CONFIG03] configuration. + **************************************************************************************************/ + +#define QE_TOUCH_CONFIG03_NUM_BUTTONS (0) +#define QE_TOUCH_CONFIG03_NUM_SLIDERS (0) +#define QE_TOUCH_CONFIG03_NUM_WHEELS (1) +#define QE_TOUCH_CONFIG03_NUM_TOUCH_PADS (0) + +/* Button configurations */ +#if (QE_TOUCH_CONFIG03_NUM_BUTTONS != 0) +const touch_button_cfg_t g_qe_touch_button_cfg_config03[] = { + + /* VMM */ + NULL}; +#endif + +/* Slider configurations */ +#if (QE_TOUCH_CONFIG03_NUM_SLIDERS != 0) +const touch_slider_cfg_t g_qe_touch_slider_cfg_config03[] = {NULL}; +#endif + +/* Wheel configurations */ +const uint8_t g_qe_touch_elem_wheel_config03_wheel00[] = {1, 0, 3, 2}; + +#if (QE_TOUCH_CONFIG03_NUM_WHEELS != 0) +const touch_wheel_cfg_t g_qe_touch_wheel_cfg_config03[] = { + /* wheel00 */ + { + .p_elem_index = g_qe_touch_elem_wheel_config03_wheel00, + .num_elements = 4, + .threshold = 585, + }, +}; +#endif + +/* Touch pad configurations */ +#if (QE_TOUCH_CONFIG03_NUM_TOUCH_PADS != 0) +const touch_pad_cfg_t g_qe_touch_touch_pad_cfg_config03 = {NULL}; +#endif + +/* Touch configurations */ +const touch_cfg_t g_qe_touch_cfg_config03 = { + .p_buttons = NULL, + .p_sliders = NULL, + .p_wheels = g_qe_touch_wheel_cfg_config03, +#if (TOUCH_CFG_PAD_ENABLE != 0) + .p_pad = NULL, +#endif + .num_buttons = QE_TOUCH_CONFIG03_NUM_BUTTONS, + .num_sliders = QE_TOUCH_CONFIG03_NUM_SLIDERS, + .num_wheels = QE_TOUCH_CONFIG03_NUM_WHEELS, + + .number = 2, +#if ((TOUCH_CFG_UART_MONITOR_SUPPORT == 1) || (TOUCH_CFG_UART_TUNING_SUPPORT == 1)) + .p_uart_instance = &g_uart_qe, +#else + .p_uart_instance = NULL, +#endif + + .on_freq = 3, + .off_freq = 3, + .drift_freq = 255, + .cancel_freq = 0, + + .p_ctsu_instance = &g_qe_ctsu_instance_config03, +}; + +touch_instance_ctrl_t g_qe_touch_ctrl_config03; + +const touch_instance_t g_qe_touch_instance_config03 = { + .p_ctrl = &g_qe_touch_ctrl_config03, + .p_cfg = &g_qe_touch_cfg_config03, + .p_api = &g_touch_on_ctsu, +}; diff --git a/samples/shields/rtk0eg0019b01002bj/src/qe_touch_config.h b/samples/shields/rtk0eg0019b01002bj/src/qe_touch_config.h new file mode 100644 index 0000000000000..a5a6acd892994 --- /dev/null +++ b/samples/shields/rtk0eg0019b01002bj/src/qe_touch_config.h @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2025 Renesas Electronics Corporation + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/************************************************************************************************** + * File Name : qe_touch_config.h + * Description : This file includes definitions. + **************************************************************************************************/ +/************************************************************************************************** + * History : MM/DD/YYYY Version Description + * : 09/02/2019 1.00 First Release + * : 01/16/2020 1.01 Visible CTSU control structure for API using + * : 02/20/2020 1.10 Corresponding for FSP V0.12.0 + * : 02/26/2020 1.11 Adding information for Temperature Correction + * : 03/02/2020 1.20 Corresponding for FSP V1.0.0 RC0 + * : 05/26/2021 1.30 Adding Diagnosis Supporting + * : 07/15/2021 1.31 Fixing a Little + * : 03/31/2023 1.32 Improving Traceability + * : 07/30/2024 1.40 Adding Auto Judgement Supporting + **************************************************************************************************/ +/************************************************************************************************** + * Touch I/F Configuration File : quickstart_rssk_ra2l1_ep.tifcfg + * Tuning Log File : quickstart_rssk_ra2l1_ep_log_tuning20230904134024.log + **************************************************************************************************/ + +#ifndef QE_TOUCH_CONFIG_H +#define QE_TOUCH_CONFIG_H + +#include "hal_data.h" +#include "qe_touch_define.h" + +/************************************************************************************************** + * Exported global variables + **************************************************************************************************/ +extern const ctsu_instance_t g_qe_ctsu_instance_config01; +extern const ctsu_instance_t g_qe_ctsu_instance_config02; +extern const ctsu_instance_t g_qe_ctsu_instance_config03; +extern const touch_instance_t g_qe_touch_instance_config01; +extern const touch_instance_t g_qe_touch_instance_config02; +extern const touch_instance_t g_qe_touch_instance_config03; + +extern volatile uint8_t g_qe_touch_flag; +extern volatile ctsu_event_t g_qe_ctsu_event; + +/************************************************************************************************** + * Exported global functions (to be accessed by other files) + **************************************************************************************************/ +extern void qe_touch_callback(touch_callback_args_t *p_args); + +#endif /* QE_TOUCH_CONFIG_H */ diff --git a/samples/shields/rtk0eg0019b01002bj/src/qe_touch_define.h b/samples/shields/rtk0eg0019b01002bj/src/qe_touch_define.h new file mode 100644 index 0000000000000..7f618574e115c --- /dev/null +++ b/samples/shields/rtk0eg0019b01002bj/src/qe_touch_define.h @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2025 Renesas Electronics Corporation + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/************************************************************************************************** + * File Name : qe_touch_define.h + * Description : This file includes definitions. + **************************************************************************************************/ +/************************************************************************************************** + * History : MM/DD/YYYY Version Description + * : 09/02/2019 1.00 First Release + * : 12/26/2019 1.10 Corresponding for FSP V0.10.0 + * : 01/16/2020 1.11 Adding "Button State Mask" macros + * : 02/20/2020 1.20 Corresponding for FSP V0.12.0 + * : 03/04/2020 1.21 Corresponding for FSP V1.0.0 RC0 + * : 06/26/2020 1.22 Corresponding for FSP V1.1.0 + * : 09/10/2020 1.30 Corresponding for FSP V2.0.0 Beta2 + * : 05/26/2021 1.40 Adding Diagnosis Supporting + * : 06/01/2021 1.41 Fixing a Little + * : 11/17/2021 1.50 Adding information for Initial Offset Tuning + * : 12/06/2021 1.51 Fixing a Little + * : 09/05/2022 1.52 Fixing a Little + * : 03/23/2023 1.60 Adding 3 Frequency Judgement Supporting + * : 03/31/2023 1.61 Improving Traceability + * : 07/25/2024 1.70 Adding Auto Correction / Auto Multi Clock Correction / MEC + *Supporting : 09/04/2024 1.71 Adding version info macro of QE : 12/06/2024 1.72 Adding macro + *for auto judgment + **************************************************************************************************/ +/************************************************************************************************** + * Touch I/F Configuration File : quickstart_rssk_ra2l1_ep.tifcfg + * Tuning Log File : quickstart_rssk_ra2l1_ep_log_tuning20230904134024.log + **************************************************************************************************/ + +#ifndef QE_TOUCH_DEFINE_H +#define QE_TOUCH_DEFINE_H + +/************************************************************************************************** + * Macro definitions + **************************************************************************************************/ +#define QE_TOUCH_VERSION (0x0410) + +#define CTSU_CFG_NUM_SELF_ELEMENTS (12) + +#define CTSU_CFG_NUM_MUTUAL_ELEMENTS (0) +#define CTSU_CFG_NUM_CFC (0) +#define CTSU_CFG_NUM_CFC_TX (0) + +#define TOUCH_CFG_MONITOR_ENABLE (1) +#define TOUCH_CFG_NUM_BUTTONS (3) +#define TOUCH_CFG_NUM_SLIDERS (1) +#define TOUCH_CFG_NUM_WHEELS (1) +#define TOUCH_CFG_PAD_ENABLE (0) + +#define QE_TOUCH_MACRO_CTSU_IP_KIND (2) + +#define CTSU_CFG_VCC_MV (5000) +#define CTSU_CFG_LOW_VOLTAGE_MODE (0) + +#define CTSU_CFG_PCLK_DIVISION (0) + +#define CTSU_CFG_TSCAP_PORT (0x010C) + +#define CTSU_CFG_NUM_SUMULTI (3) +#define CTSU_CFG_SUMULTI0 (0x3F) +#define CTSU_CFG_SUMULTI1 (0x36) +#define CTSU_CFG_SUMULTI2 (0x48) + +#define CTSU_CFG_CALIB_RTRIM_SUPPORT (0) +#define CTSU_CFG_TEMP_CORRECTION_SUPPORT (0) +#define CTSU_CFG_TEMP_CORRECTION_TS (0) +#define CTSU_CFG_TEMP_CORRECTION_TIME (0) + +#define CTSU_CFG_TARGET_VALUE_QE_SUPPORT (1) + +#define CTSU_CFG_MAJORITY_MODE (1) +#define CTSU_CFG_NUM_AUTOJUDGE_SELF_ELEMENTS (0) +#define CTSU_CFG_NUM_AUTOJUDGE_MUTUAL_ELEMENTS (0) + +/************************************************************************************************** + * Button State Mask for each configuration. + **************************************************************************************************/ +#define CONFIG01_INDEX_BUTTON00 (2) +#define CONFIG01_MASK_BUTTON00 (1ULL << CONFIG01_INDEX_BUTTON00) +#define CONFIG01_INDEX_BUTTON01 (1) +#define CONFIG01_MASK_BUTTON01 (1ULL << CONFIG01_INDEX_BUTTON01) +#define CONFIG01_INDEX_BUTTON02 (0) +#define CONFIG01_MASK_BUTTON02 (1ULL << CONFIG01_INDEX_BUTTON02) + +#endif /* QE_TOUCH_DEFINE_H */