fix(driver_twai): fixed c5 listenonly mode errata, add rx buffer check

This commit is contained in:
wanckl
2025-06-26 12:25:43 +08:00
parent 7f325d47bf
commit e6fcaf4e34
17 changed files with 174 additions and 185 deletions

View File

@@ -308,24 +308,24 @@ static void twai_configure_gpio(twai_obj_t *p_obj)
//Set RX pin //Set RX pin
gpio_func_sel(p_obj->rx_io, PIN_FUNC_GPIO); gpio_func_sel(p_obj->rx_io, PIN_FUNC_GPIO);
gpio_input_enable(p_obj->rx_io); gpio_input_enable(p_obj->rx_io);
esp_rom_gpio_connect_in_signal(p_obj->rx_io, twai_controller_periph_signals.controllers[controller_id].rx_sig, false); esp_rom_gpio_connect_in_signal(p_obj->rx_io, twai_periph_signals[controller_id].rx_sig, false);
//Set TX pin //Set TX pin
gpio_func_sel(p_obj->tx_io, PIN_FUNC_GPIO); gpio_func_sel(p_obj->tx_io, PIN_FUNC_GPIO);
esp_rom_gpio_connect_out_signal(p_obj->tx_io, twai_controller_periph_signals.controllers[controller_id].tx_sig, false, false); esp_rom_gpio_connect_out_signal(p_obj->tx_io, twai_periph_signals[controller_id].tx_sig, false, false);
//Configure output clock pin (Optional) //Configure output clock pin (Optional)
if (GPIO_IS_VALID_OUTPUT_GPIO(p_obj->clkout_io)) { if (GPIO_IS_VALID_OUTPUT_GPIO(p_obj->clkout_io)) {
gpio_mask |= BIT64(p_obj->clkout_io); gpio_mask |= BIT64(p_obj->clkout_io);
gpio_func_sel(p_obj->clkout_io, PIN_FUNC_GPIO); gpio_func_sel(p_obj->clkout_io, PIN_FUNC_GPIO);
esp_rom_gpio_connect_out_signal(p_obj->clkout_io, twai_controller_periph_signals.controllers[controller_id].clk_out_sig, false, false); esp_rom_gpio_connect_out_signal(p_obj->clkout_io, twai_periph_signals[controller_id].clk_out_sig, false, false);
} }
//Configure bus status pin (Optional) //Configure bus status pin (Optional)
if (GPIO_IS_VALID_OUTPUT_GPIO(p_obj->bus_off_io)) { if (GPIO_IS_VALID_OUTPUT_GPIO(p_obj->bus_off_io)) {
gpio_mask |= BIT64(p_obj->bus_off_io); gpio_mask |= BIT64(p_obj->bus_off_io);
gpio_func_sel(p_obj->bus_off_io, PIN_FUNC_GPIO); gpio_func_sel(p_obj->bus_off_io, PIN_FUNC_GPIO);
esp_rom_gpio_connect_out_signal(p_obj->bus_off_io, twai_controller_periph_signals.controllers[controller_id].bus_off_sig, false, false); esp_rom_gpio_connect_out_signal(p_obj->bus_off_io, twai_periph_signals[controller_id].bus_off_sig, false, false);
} }
uint64_t busy_mask = esp_gpio_reserve(gpio_mask); uint64_t busy_mask = esp_gpio_reserve(gpio_mask);
@@ -343,7 +343,7 @@ static void twai_release_gpio(twai_obj_t *p_obj)
assert(GPIO_IS_VALID_OUTPUT_GPIO(p_obj->tx_io)); //coverity check assert(GPIO_IS_VALID_OUTPUT_GPIO(p_obj->tx_io)); //coverity check
uint64_t gpio_mask = BIT64(p_obj->tx_io); uint64_t gpio_mask = BIT64(p_obj->tx_io);
esp_rom_gpio_connect_in_signal(GPIO_MATRIX_CONST_ONE_INPUT, twai_controller_periph_signals.controllers[p_obj->controller_id].rx_sig, false); esp_rom_gpio_connect_in_signal(GPIO_MATRIX_CONST_ONE_INPUT, twai_periph_signals[p_obj->controller_id].rx_sig, false);
gpio_output_disable(p_obj->tx_io); gpio_output_disable(p_obj->tx_io);
if (GPIO_IS_VALID_OUTPUT_GPIO(p_obj->clkout_io)) { if (GPIO_IS_VALID_OUTPUT_GPIO(p_obj->clkout_io)) {
gpio_mask |= BIT64(p_obj->clkout_io); gpio_mask |= BIT64(p_obj->clkout_io);
@@ -413,7 +413,7 @@ static esp_err_t twai_alloc_driver_obj(const twai_general_config_t *g_config, tw
goto err; goto err;
} }
//Allocate interrupt //Allocate interrupt
ret = esp_intr_alloc(twai_controller_periph_signals.controllers[controller_id].irq_id, ret = esp_intr_alloc(twai_periph_signals[controller_id].irq_id,
g_config->intr_flags | ESP_INTR_FLAG_INTRDISABLED, g_config->intr_flags | ESP_INTR_FLAG_INTRDISABLED,
twai_intr_handler_main, twai_intr_handler_main,
p_obj, p_obj,

View File

@@ -145,6 +145,7 @@ esp_err_t twai_node_transmit(twai_node_handle_t node, const twai_frame_t *frame,
esp_err_t twai_node_receive_from_isr(twai_node_handle_t node, twai_frame_t *rx_frame) esp_err_t twai_node_receive_from_isr(twai_node_handle_t node, twai_frame_t *rx_frame)
{ {
ESP_RETURN_ON_FALSE_ISR(node && rx_frame, ESP_ERR_INVALID_ARG, TAG, "invalid argument: null"); ESP_RETURN_ON_FALSE_ISR(node && rx_frame, ESP_ERR_INVALID_ARG, TAG, "invalid argument: null");
ESP_RETURN_ON_FALSE_ISR((rx_frame->buffer_len == 0) || esp_ptr_in_dram(rx_frame->buffer) || esp_ptr_external_ram(rx_frame->buffer), ESP_ERR_INVALID_ARG, TAG, "invalid 'rx_frame->buffer' pointer or buffer_len");
ESP_RETURN_ON_FALSE_ISR(node->receive_isr, ESP_ERR_NOT_SUPPORTED, TAG, "receive func null"); ESP_RETURN_ON_FALSE_ISR(node->receive_isr, ESP_ERR_NOT_SUPPORTED, TAG, "receive func null");
return node->receive_isr(node, rx_frame); return node->receive_isr(node, rx_frame);

View File

@@ -6,6 +6,7 @@
#include "esp_twai.h" #include "esp_twai.h"
#include "esp_twai_onchip.h" #include "esp_twai_onchip.h"
#include "soc/gpio_sig_map.h"
#include "esp_private/twai_interface.h" #include "esp_private/twai_interface.h"
#include "esp_private/twai_utils.h" #include "esp_private/twai_utils.h"
#include "twai_private.h" #include "twai_private.h"
@@ -127,27 +128,25 @@ static esp_err_t _node_config_io(twai_onchip_ctx_t *node, const twai_onchip_node
uint64_t reserve_mask = BIT64(node_config->io_cfg.tx); uint64_t reserve_mask = BIT64(node_config->io_cfg.tx);
// Set RX pin // Set RX pin
gpio_input_enable(node_config->io_cfg.rx);
gpio_set_pull_mode(node_config->io_cfg.rx, GPIO_PULLUP_ONLY); // pullup to avoid noise if no connection to transceiver gpio_set_pull_mode(node_config->io_cfg.rx, GPIO_PULLUP_ONLY); // pullup to avoid noise if no connection to transceiver
gpio_func_sel(node_config->io_cfg.rx, PIN_FUNC_GPIO); gpio_matrix_input(node_config->io_cfg.rx, twai_periph_signals[node->ctrlr_id].rx_sig, false);
esp_rom_gpio_connect_in_signal(node_config->io_cfg.rx, twai_controller_periph_signals.controllers[node->ctrlr_id].rx_sig, false);
// Set TX pin // Set TX pin
gpio_func_sel(node_config->io_cfg.tx, PIN_FUNC_GPIO); // If enable_listen_only, disconnect twai signal, and output high to avoid any influence to bus
esp_rom_gpio_connect_out_signal(node_config->io_cfg.tx, twai_controller_periph_signals.controllers[node->ctrlr_id].tx_sig, false, false); gpio_set_level(node_config->io_cfg.tx, 1);
int tx_sig = (node_config->flags.enable_listen_only) ? SIG_GPIO_OUT_IDX : twai_periph_signals[node->ctrlr_id].tx_sig;
gpio_matrix_output(node_config->io_cfg.tx, tx_sig, false, false);
//Configure output clock pin (Optional) //Configure output clock pin (Optional)
if (GPIO_IS_VALID_OUTPUT_GPIO(node_config->io_cfg.quanta_clk_out)) { if (GPIO_IS_VALID_OUTPUT_GPIO(node_config->io_cfg.quanta_clk_out)) {
reserve_mask |= BIT64(node_config->io_cfg.quanta_clk_out); reserve_mask |= BIT64(node_config->io_cfg.quanta_clk_out);
gpio_func_sel(node_config->io_cfg.quanta_clk_out, PIN_FUNC_GPIO); gpio_matrix_output(node_config->io_cfg.quanta_clk_out, twai_periph_signals[node->ctrlr_id].clk_out_sig, false, false);
esp_rom_gpio_connect_out_signal(node_config->io_cfg.quanta_clk_out, twai_controller_periph_signals.controllers[node->ctrlr_id].clk_out_sig, false, false);
} }
//Configure bus status pin (Optional) //Configure bus status pin (Optional)
if (GPIO_IS_VALID_OUTPUT_GPIO(node_config->io_cfg.bus_off_indicator)) { if (GPIO_IS_VALID_OUTPUT_GPIO(node_config->io_cfg.bus_off_indicator)) {
reserve_mask |= BIT64(node_config->io_cfg.bus_off_indicator); reserve_mask |= BIT64(node_config->io_cfg.bus_off_indicator);
gpio_func_sel(node_config->io_cfg.bus_off_indicator, PIN_FUNC_GPIO); gpio_matrix_output(node_config->io_cfg.bus_off_indicator, twai_periph_signals[node->ctrlr_id].bus_off_sig, false, false);
esp_rom_gpio_connect_out_signal(node_config->io_cfg.bus_off_indicator, twai_controller_periph_signals.controllers[node->ctrlr_id].bus_off_sig, false, false);
} }
node->gpio_reserved = reserve_mask; node->gpio_reserved = reserve_mask;
@@ -163,7 +162,7 @@ static esp_err_t _node_config_io(twai_onchip_ctx_t *node, const twai_onchip_node
static void _node_release_io(twai_onchip_ctx_t *node) static void _node_release_io(twai_onchip_ctx_t *node)
{ {
esp_rom_gpio_connect_in_signal(GPIO_MATRIX_CONST_ONE_INPUT, twai_controller_periph_signals.controllers[node->ctrlr_id].rx_sig, false); esp_rom_gpio_connect_in_signal(GPIO_MATRIX_CONST_ONE_INPUT, twai_periph_signals[node->ctrlr_id].rx_sig, false);
esp_gpio_revoke(node->gpio_reserved); esp_gpio_revoke(node->gpio_reserved);
for (; node->gpio_reserved > 0;) { for (; node->gpio_reserved > 0;) {
uint8_t pos = __builtin_ctzll(node->gpio_reserved); uint8_t pos = __builtin_ctzll(node->gpio_reserved);
@@ -615,7 +614,7 @@ esp_err_t twai_new_node_onchip(const twai_onchip_node_config_t *node_config, twa
ESP_GOTO_ON_FALSE(node->tx_mount_queue, ESP_ERR_NO_MEM, err, TAG, "no_mem"); ESP_GOTO_ON_FALSE(node->tx_mount_queue, ESP_ERR_NO_MEM, err, TAG, "no_mem");
uint32_t intr_flags = TWAI_INTR_ALLOC_FLAGS; uint32_t intr_flags = TWAI_INTR_ALLOC_FLAGS;
intr_flags |= (node_config->intr_priority > 0) ? BIT(node_config->intr_priority) : ESP_INTR_FLAG_LOWMED; intr_flags |= (node_config->intr_priority > 0) ? BIT(node_config->intr_priority) : ESP_INTR_FLAG_LOWMED;
ESP_GOTO_ON_ERROR(esp_intr_alloc(twai_controller_periph_signals.controllers[ctrlr_id].irq_id, intr_flags, _node_isr_main, (void *)node, &node->intr_hdl), ESP_GOTO_ON_ERROR(esp_intr_alloc(twai_periph_signals[ctrlr_id].irq_id, intr_flags, _node_isr_main, (void *)node, &node->intr_hdl),
err, TAG, "Alloc interrupt failed"); err, TAG, "Alloc interrupt failed");
// Enable bus clock and reset controller // Enable bus clock and reset controller
@@ -638,10 +637,10 @@ esp_err_t twai_new_node_onchip(const twai_onchip_node_config_t *node_config, twa
#if CONFIG_PM_ENABLE #if CONFIG_PM_ENABLE
#if SOC_TWAI_CLK_SUPPORT_APB #if SOC_TWAI_CLK_SUPPORT_APB
// DFS can change APB frequency. So add lock to prevent sleep and APB freq from changing // DFS can change APB frequency. So add lock to prevent sleep and APB freq from changing
ESP_GOTO_ON_ERROR(esp_pm_lock_create(ESP_PM_APB_FREQ_MAX, 0, twai_controller_periph_signals.controllers[ctrlr_id].module_name, &node->pm_lock), err, TAG, "init power manager failed"); ESP_GOTO_ON_ERROR(esp_pm_lock_create(ESP_PM_APB_FREQ_MAX, 0, twai_periph_signals[ctrlr_id].module_name, &node->pm_lock), err, TAG, "init power manager failed");
#else // XTAL #else // XTAL
// XTAL freq can be closed in light sleep, so we need to create a lock to prevent light sleep // XTAL freq can be closed in light sleep, so we need to create a lock to prevent light sleep
ESP_GOTO_ON_ERROR(esp_pm_lock_create(ESP_PM_NO_LIGHT_SLEEP, 0, twai_controller_periph_signals.controllers[ctrlr_id].module_name, &node->pm_lock), err, TAG, "init power manager failed"); ESP_GOTO_ON_ERROR(esp_pm_lock_create(ESP_PM_NO_LIGHT_SLEEP, 0, twai_periph_signals[ctrlr_id].module_name, &node->pm_lock), err, TAG, "init power manager failed");
#endif //SOC_TWAI_CLK_SUPPORT_APB #endif //SOC_TWAI_CLK_SUPPORT_APB
#endif //CONFIG_PM_ENABLE #endif //CONFIG_PM_ENABLE

View File

@@ -26,7 +26,7 @@
static IRAM_ATTR bool test_driver_install_rx_cb(twai_node_handle_t handle, const twai_rx_done_event_data_t *edata, void *user_ctx) static IRAM_ATTR bool test_driver_install_rx_cb(twai_node_handle_t handle, const twai_rx_done_event_data_t *edata, void *user_ctx)
{ {
twai_frame_t rx_frame; twai_frame_t rx_frame = {0};
if (ESP_OK == twai_node_receive_from_isr(handle, &rx_frame)) { if (ESP_OK == twai_node_receive_from_isr(handle, &rx_frame)) {
ESP_EARLY_LOGI("Recv ", "id 0x%lx rtr %d", rx_frame.header.id, rx_frame.header.rtr); ESP_EARLY_LOGI("Recv ", "id 0x%lx rtr %d", rx_frame.header.id, rx_frame.header.rtr);
} }
@@ -89,7 +89,7 @@ TEST_CASE("twai install uninstall (loopback)", "[twai]")
TEST_ESP_OK(twai_node_enable(node_hdl[SOC_TWAI_CONTROLLER_NUM])); TEST_ESP_OK(twai_node_enable(node_hdl[SOC_TWAI_CONTROLLER_NUM]));
tx_frame.header.id = 0x100; tx_frame.header.id = 0x100;
TEST_ESP_OK(twai_node_transmit(node_hdl[SOC_TWAI_CONTROLLER_NUM], &tx_frame, 0)); TEST_ESP_OK(twai_node_transmit(node_hdl[SOC_TWAI_CONTROLLER_NUM], &tx_frame, 0));
twai_frame_t rx_frame; twai_frame_t rx_frame = {0};
printf("Test receive from task\n"); printf("Test receive from task\n");
TEST_ESP_ERR(ESP_ERR_INVALID_STATE, twai_node_receive_from_isr(node_hdl[SOC_TWAI_CONTROLLER_NUM], &rx_frame)); TEST_ESP_ERR(ESP_ERR_INVALID_STATE, twai_node_receive_from_isr(node_hdl[SOC_TWAI_CONTROLLER_NUM], &rx_frame));

View File

@@ -165,7 +165,7 @@ static inline void twaifd_ll_set_mode(twaifd_dev_t *hw, bool listen_only, bool s
twaifd_mode_settings_reg_t opmode = {.val = hw->mode_settings.val}; twaifd_mode_settings_reg_t opmode = {.val = hw->mode_settings.val};
opmode.stm = self_test; opmode.stm = self_test;
opmode.bmm = listen_only; (void)listen_only; // listen only is not available in this chip, see "CTU FD 2v5 errata 0v2 issue 5"
opmode.ilbp = loopback; opmode.ilbp = loopback;
hw->mode_settings.val = opmode.val; hw->mode_settings.val = opmode.val;

View File

@@ -4,6 +4,7 @@
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
#include <sys/param.h>
#include "hal/twai_hal.h" #include "hal/twai_hal.h"
#include "hal/twaifd_ll.h" #include "hal/twaifd_ll.h"
@@ -118,18 +119,25 @@ void twai_hal_format_frame(const twai_hal_trans_desc_t *trans_desc, twai_hal_fra
{ {
const twai_frame_header_t *header = trans_desc->frame.header; const twai_frame_header_t *header = trans_desc->frame.header;
int final_dlc = (header->dlc) ? header->dlc : twaifd_len2dlc(trans_desc->frame.buffer_len); int final_dlc = (header->dlc) ? header->dlc : twaifd_len2dlc(trans_desc->frame.buffer_len);
int data_len = (header->dlc) ? twaifd_dlc2len(header->dlc) : trans_desc->frame.buffer_len;
twaifd_ll_format_frame_header(header, final_dlc, frame); twaifd_ll_format_frame_header(header, final_dlc, frame);
if (!header->rtr) {
int data_len = (header->dlc) ? twaifd_dlc2len(header->dlc) : trans_desc->frame.buffer_len;
data_len = (header->fdf) ? MIN(data_len, TWAIFD_FRAME_MAX_LEN) : MIN(data_len, TWAI_FRAME_MAX_LEN);
twaifd_ll_format_frame_data(trans_desc->frame.buffer, data_len, frame); twaifd_ll_format_frame_data(trans_desc->frame.buffer, data_len, frame);
} }
}
void twai_hal_parse_frame(const twai_hal_frame_t *frame, twai_frame_header_t *header, uint8_t *buffer, uint8_t buffer_len) void twai_hal_parse_frame(const twai_hal_frame_t *frame, twai_frame_header_t *header, uint8_t *buffer, uint8_t buffer_len)
{ {
twaifd_ll_parse_frame_header(frame, header); twaifd_ll_parse_frame_header(frame, header);
if (!header->rtr) {
int frame_data_len = twaifd_dlc2len(header->dlc); int frame_data_len = twaifd_dlc2len(header->dlc);
uint8_t final_len = (frame_data_len < buffer_len) ? frame_data_len : buffer_len; // limit data_len for twai classic non-iso mode.
frame_data_len = (header->fdf) ? MIN(frame_data_len, TWAIFD_FRAME_MAX_LEN) : MIN(frame_data_len, TWAI_FRAME_MAX_LEN);
uint8_t final_len = MIN(frame_data_len, buffer_len);
twaifd_ll_parse_frame_data(frame, buffer, final_len); twaifd_ll_parse_frame_data(frame, buffer, final_len);
} }
}
void twai_hal_set_tx_buffer_and_transmit(twai_hal_context_t *hal_ctx, twai_hal_frame_t *tx_frame, uint8_t buffer_idx) void twai_hal_set_tx_buffer_and_transmit(twai_hal_context_t *hal_ctx, twai_hal_frame_t *tx_frame, uint8_t buffer_idx)
{ {

View File

@@ -1,5 +1,5 @@
/* /*
* SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD * SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD
* *
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
@@ -8,10 +8,9 @@
#include "soc/twai_periph.h" #include "soc/twai_periph.h"
#include "soc/gpio_sig_map.h" #include "soc/gpio_sig_map.h"
const twai_controller_signal_conn_t twai_controller_periph_signals = { const twai_signal_conn_t twai_periph_signals[SOC_TWAI_CONTROLLER_NUM] = {
.controllers = {
[0] = { [0] = {
.module = PERIPH_TWAI_MODULE, .module_name = "TWAI0",
.irq_id = ETS_TWAI_INTR_SOURCE, .irq_id = ETS_TWAI_INTR_SOURCE,
.tx_sig = TWAI_TX_IDX, .tx_sig = TWAI_TX_IDX,
.rx_sig = TWAI_RX_IDX, .rx_sig = TWAI_RX_IDX,
@@ -19,5 +18,4 @@ const twai_controller_signal_conn_t twai_controller_periph_signals = {
.clk_out_sig = TWAI_CLKOUT_IDX, .clk_out_sig = TWAI_CLKOUT_IDX,
.stand_by_sig = -1, .stand_by_sig = -1,
}, },
}
}; };

View File

@@ -1,5 +1,5 @@
/* /*
* SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD * SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD
* *
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
@@ -7,10 +7,9 @@
#include "soc/twai_periph.h" #include "soc/twai_periph.h"
#include "soc/gpio_sig_map.h" #include "soc/gpio_sig_map.h"
const twai_controller_signal_conn_t twai_controller_periph_signals = { const twai_signal_conn_t twai_periph_signals[SOC_TWAI_CONTROLLER_NUM] = {
.controllers = {
[0] = { [0] = {
.module = PERIPH_TWAI_MODULE, .module_name = "TWAI0",
.irq_id = ETS_TWAI_INTR_SOURCE, .irq_id = ETS_TWAI_INTR_SOURCE,
.tx_sig = TWAI_TX_IDX, .tx_sig = TWAI_TX_IDX,
.rx_sig = TWAI_RX_IDX, .rx_sig = TWAI_RX_IDX,
@@ -18,5 +17,4 @@ const twai_controller_signal_conn_t twai_controller_periph_signals = {
.clk_out_sig = TWAI_CLKOUT_IDX, .clk_out_sig = TWAI_CLKOUT_IDX,
.stand_by_sig = -1, .stand_by_sig = -1,
}, },
}
}; };

View File

@@ -1,5 +1,5 @@
/* /*
* SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD * SPDX-FileCopyrightText: 2024-2025 Espressif Systems (Shanghai) CO LTD
* *
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
@@ -7,8 +7,7 @@
#include "soc/twai_periph.h" #include "soc/twai_periph.h"
#include "soc/gpio_sig_map.h" #include "soc/gpio_sig_map.h"
const twai_controller_signal_conn_t twai_controller_periph_signals = { const twai_signal_conn_t twai_periph_signals[SOC_TWAI_CONTROLLER_NUM] = {
.controllers = {
[0] = { [0] = {
.module_name = "TWAI0", .module_name = "TWAI0",
.irq_id = ETS_TWAI0_INTR_SOURCE, .irq_id = ETS_TWAI0_INTR_SOURCE,
@@ -29,5 +28,4 @@ const twai_controller_signal_conn_t twai_controller_periph_signals = {
.clk_out_sig = TWAI1_CLKOUT_IDX, .clk_out_sig = TWAI1_CLKOUT_IDX,
.stand_by_sig = TWAI1_STANDBY_IDX, .stand_by_sig = TWAI1_STANDBY_IDX,
}, },
}
}; };

View File

@@ -1,5 +1,5 @@
/* /*
* SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD * SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD
* *
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
@@ -8,10 +8,9 @@
#include "soc/twai_reg.h" #include "soc/twai_reg.h"
#include "soc/gpio_sig_map.h" #include "soc/gpio_sig_map.h"
const twai_controller_signal_conn_t twai_controller_periph_signals = { const twai_signal_conn_t twai_periph_signals[SOC_TWAI_CONTROLLER_NUM] = {
.controllers = {
[0] = { [0] = {
.module = PERIPH_TWAI0_MODULE, .module_name = "TWAI0",
.irq_id = ETS_TWAI0_INTR_SOURCE, .irq_id = ETS_TWAI0_INTR_SOURCE,
.tx_sig = TWAI0_TX_IDX, .tx_sig = TWAI0_TX_IDX,
.rx_sig = TWAI0_RX_IDX, .rx_sig = TWAI0_RX_IDX,
@@ -20,7 +19,7 @@ const twai_controller_signal_conn_t twai_controller_periph_signals = {
.stand_by_sig = TWAI0_STANDBY_IDX, .stand_by_sig = TWAI0_STANDBY_IDX,
}, },
[1] = { [1] = {
.module = PERIPH_TWAI1_MODULE, .module_name = "TWAI1",
.irq_id = ETS_TWAI1_INTR_SOURCE, .irq_id = ETS_TWAI1_INTR_SOURCE,
.tx_sig = TWAI1_TX_IDX, .tx_sig = TWAI1_TX_IDX,
.rx_sig = TWAI1_RX_IDX, .rx_sig = TWAI1_RX_IDX,
@@ -28,7 +27,6 @@ const twai_controller_signal_conn_t twai_controller_periph_signals = {
.clk_out_sig = TWAI1_CLKOUT_IDX, .clk_out_sig = TWAI1_CLKOUT_IDX,
.stand_by_sig = TWAI1_STANDBY_IDX, .stand_by_sig = TWAI1_STANDBY_IDX,
} }
}
}; };
/** /**

View File

@@ -1,5 +1,5 @@
/* /*
* SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD * SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD
* *
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
@@ -8,10 +8,9 @@
#include "soc/twai_reg.h" #include "soc/twai_reg.h"
#include "soc/gpio_sig_map.h" #include "soc/gpio_sig_map.h"
const twai_controller_signal_conn_t twai_controller_periph_signals = { const twai_signal_conn_t twai_periph_signals[SOC_TWAI_CONTROLLER_NUM] = {
.controllers = {
[0] = { [0] = {
.module = PERIPH_TWAI0_MODULE, .module_name = "TWAI0",
.irq_id = ETS_TWAI0_INTR_SOURCE, .irq_id = ETS_TWAI0_INTR_SOURCE,
.tx_sig = TWAI_TX_IDX, .tx_sig = TWAI_TX_IDX,
.rx_sig = TWAI_RX_IDX, .rx_sig = TWAI_RX_IDX,
@@ -19,7 +18,6 @@ const twai_controller_signal_conn_t twai_controller_periph_signals = {
.clk_out_sig = TWAI_CLKOUT_IDX, .clk_out_sig = TWAI_CLKOUT_IDX,
.stand_by_sig = TWAI_STANDBY_IDX, .stand_by_sig = TWAI_STANDBY_IDX,
} }
}
}; };
/** /**

View File

@@ -1,5 +1,5 @@
/* /*
* SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD * SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD
* *
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
@@ -8,10 +8,9 @@
#include "soc/twai_reg.h" #include "soc/twai_reg.h"
#include "soc/gpio_sig_map.h" #include "soc/gpio_sig_map.h"
const twai_controller_signal_conn_t twai_controller_periph_signals = { const twai_signal_conn_t twai_periph_signals[SOC_TWAI_CONTROLLER_NUM] = {
.controllers = {
[0] = { [0] = {
.module = PERIPH_TWAI0_MODULE, .module_name = "TWAI0",
.irq_id = ETS_TWAI0_INTR_SOURCE, .irq_id = ETS_TWAI0_INTR_SOURCE,
.tx_sig = TWAI0_TX_PAD_OUT_IDX, .tx_sig = TWAI0_TX_PAD_OUT_IDX,
.rx_sig = TWAI0_RX_PAD_IN_IDX, .rx_sig = TWAI0_RX_PAD_IN_IDX,
@@ -20,7 +19,7 @@ const twai_controller_signal_conn_t twai_controller_periph_signals = {
.stand_by_sig = TWAI0_STANDBY_PAD_OUT_IDX, .stand_by_sig = TWAI0_STANDBY_PAD_OUT_IDX,
}, },
[1] = { [1] = {
.module = PERIPH_TWAI1_MODULE, .module_name = "TWAI1",
.irq_id = ETS_TWAI1_INTR_SOURCE, .irq_id = ETS_TWAI1_INTR_SOURCE,
.tx_sig = TWAI1_TX_PAD_OUT_IDX, .tx_sig = TWAI1_TX_PAD_OUT_IDX,
.rx_sig = TWAI1_RX_PAD_IN_IDX, .rx_sig = TWAI1_RX_PAD_IN_IDX,
@@ -29,7 +28,7 @@ const twai_controller_signal_conn_t twai_controller_periph_signals = {
.stand_by_sig = TWAI1_STANDBY_PAD_OUT_IDX, .stand_by_sig = TWAI1_STANDBY_PAD_OUT_IDX,
}, },
[2] = { [2] = {
.module = PERIPH_TWAI2_MODULE, .module_name = "TWAI2",
.irq_id = ETS_TWAI2_INTR_SOURCE, .irq_id = ETS_TWAI2_INTR_SOURCE,
.tx_sig = TWAI2_TX_PAD_OUT_IDX, .tx_sig = TWAI2_TX_PAD_OUT_IDX,
.rx_sig = TWAI2_RX_PAD_IN_IDX, .rx_sig = TWAI2_RX_PAD_IN_IDX,
@@ -37,7 +36,6 @@ const twai_controller_signal_conn_t twai_controller_periph_signals = {
.clk_out_sig = TWAI2_CLKOUT_PAD_OUT_IDX, .clk_out_sig = TWAI2_CLKOUT_PAD_OUT_IDX,
.stand_by_sig = TWAI2_STANDBY_PAD_OUT_IDX, .stand_by_sig = TWAI2_STANDBY_PAD_OUT_IDX,
} }
}
}; };
/** /**

View File

@@ -1,5 +1,5 @@
/* /*
* SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD * SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD
* *
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
@@ -7,10 +7,9 @@
#include "soc/twai_periph.h" #include "soc/twai_periph.h"
#include "soc/gpio_sig_map.h" #include "soc/gpio_sig_map.h"
const twai_controller_signal_conn_t twai_controller_periph_signals = { const twai_signal_conn_t twai_periph_signals[SOC_TWAI_CONTROLLER_NUM] = {
.controllers = {
[0] = { [0] = {
.module = PERIPH_TWAI_MODULE, .module_name = "TWAI0",
.irq_id = ETS_TWAI_INTR_SOURCE, .irq_id = ETS_TWAI_INTR_SOURCE,
.tx_sig = TWAI_TX_IDX, .tx_sig = TWAI_TX_IDX,
.rx_sig = TWAI_RX_IDX, .rx_sig = TWAI_RX_IDX,
@@ -18,5 +17,4 @@ const twai_controller_signal_conn_t twai_controller_periph_signals = {
.clk_out_sig = TWAI_CLKOUT_IDX, .clk_out_sig = TWAI_CLKOUT_IDX,
.stand_by_sig = -1, .stand_by_sig = -1,
}, },
}
}; };

View File

@@ -1,5 +1,5 @@
/* /*
* SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD * SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD
* *
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
@@ -7,10 +7,9 @@
#include "soc/twai_periph.h" #include "soc/twai_periph.h"
#include "soc/gpio_sig_map.h" #include "soc/gpio_sig_map.h"
const twai_controller_signal_conn_t twai_controller_periph_signals = { const twai_signal_conn_t twai_periph_signals[SOC_TWAI_CONTROLLER_NUM] = {
.controllers = {
[0] = { [0] = {
.module = PERIPH_TWAI_MODULE, .module_name = "TWAI0",
.irq_id = ETS_TWAI_INTR_SOURCE, .irq_id = ETS_TWAI_INTR_SOURCE,
.tx_sig = TWAI_TX_IDX, .tx_sig = TWAI_TX_IDX,
.rx_sig = TWAI_RX_IDX, .rx_sig = TWAI_RX_IDX,
@@ -18,5 +17,4 @@ const twai_controller_signal_conn_t twai_controller_periph_signals = {
.clk_out_sig = TWAI_CLKOUT_IDX, .clk_out_sig = TWAI_CLKOUT_IDX,
.stand_by_sig = -1, .stand_by_sig = -1,
}, },
}
}; };

View File

@@ -1,5 +1,5 @@
/* /*
* SPDX-FileCopyrightText: 2019-2024 Espressif Systems (Shanghai) CO LTD * SPDX-FileCopyrightText: 2019-2025 Espressif Systems (Shanghai) CO LTD
* *
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
@@ -21,8 +21,6 @@ extern "C" {
#if SOC_TWAI_SUPPORTED #if SOC_TWAI_SUPPORTED
typedef struct { typedef struct {
struct {
const periph_module_t module; // peripheral module
const char *module_name; // peripheral name const char *module_name; // peripheral name
const int irq_id; // interrupt source ID const int irq_id; // interrupt source ID
#if SOC_TWAI_SUPPORT_TIMESTAMP #if SOC_TWAI_SUPPORT_TIMESTAMP
@@ -33,10 +31,9 @@ typedef struct {
const int clk_out_sig; // CLK_OUT signal ID in GPIO matrix const int clk_out_sig; // CLK_OUT signal ID in GPIO matrix
const int bus_off_sig; // BUS_OFF status signal ID in GPIO matrix const int bus_off_sig; // BUS_OFF status signal ID in GPIO matrix
const int stand_by_sig; // STAND_BY signal ID in GPIO matrix const int stand_by_sig; // STAND_BY signal ID in GPIO matrix
} controllers[SOC_TWAI_CONTROLLER_NUM]; } twai_signal_conn_t;
} twai_controller_signal_conn_t;
extern const twai_controller_signal_conn_t twai_controller_periph_signals; extern const twai_signal_conn_t twai_periph_signals[SOC_TWAI_CONTROLLER_NUM];
#if SOC_PAU_SUPPORTED #if SOC_PAU_SUPPORTED
typedef struct { typedef struct {

View File

@@ -1,5 +1,5 @@
/* /*
* SPDX-FileCopyrightText: 2010-2024 Espressif Systems (Shanghai) CO LTD * SPDX-FileCopyrightText: 2010-2025 Espressif Systems (Shanghai) CO LTD
* *
* SPDX-License-Identifier: CC0-1.0 * SPDX-License-Identifier: CC0-1.0
*/ */
@@ -60,15 +60,15 @@ static SemaphoreHandle_t ctrl_task_sem;
static bool trigger_tx_error = false; static bool trigger_tx_error = false;
/* --------------------------- Tasks and Functions -------------------------- */ /* --------------------------- Tasks and Functions -------------------------- */
extern const twai_controller_signal_conn_t twai_controller_periph_signals; extern const twai_signal_conn_t twai_periph_signals[SOC_TWAI_CONTROLLER_NUM];
static void invert_tx_bits(bool enable) static void invert_tx_bits(bool enable)
{ {
if (enable) { if (enable) {
//Inverts output of TX to trigger errors //Inverts output of TX to trigger errors
esp_rom_gpio_connect_out_signal(TX_GPIO_NUM, twai_controller_periph_signals.controllers[0].tx_sig, true, false); esp_rom_gpio_connect_out_signal(TX_GPIO_NUM, twai_periph_signals[0].tx_sig, true, false);
} else { } else {
//Returns TX to default settings //Returns TX to default settings
esp_rom_gpio_connect_out_signal(TX_GPIO_NUM, twai_controller_periph_signals.controllers[0].tx_sig, false, false); esp_rom_gpio_connect_out_signal(TX_GPIO_NUM, twai_periph_signals[0].tx_sig, false, false);
} }
} }

View File

@@ -523,7 +523,7 @@ Idx Name Size VMA LMA File off Algn
CONTENTS, ALLOC, LOAD, DATA CONTENTS, ALLOC, LOAD, DATA
2 .bss 00000000 00000000 00000000 00000034 2**0 2 .bss 00000000 00000000 00000000 00000034 2**0
ALLOC ALLOC
3 .rodata.twai_controller_periph_signals 0000001c 00000000 00000000 00000034 2**2 3 .rodata.twai_periph_signals 0000001c 00000000 00000000 00000034 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA CONTENTS, ALLOC, LOAD, READONLY, DATA
4 .debug_info 00000396 00000000 00000000 00000050 2**0 4 .debug_info 00000396 00000000 00000000 00000050 2**0
CONTENTS, RELOC, READONLY, DEBUGGING, OCTETS CONTENTS, RELOC, READONLY, DEBUGGING, OCTETS