66
77#include "esp_twai.h"
88#include "esp_twai_onchip.h"
9+ #include "soc/gpio_sig_map.h"
910#include "esp_private/twai_interface.h"
1011#include "esp_private/twai_utils.h"
1112#include "twai_private.h"
@@ -127,27 +128,25 @@ static esp_err_t _node_config_io(twai_onchip_ctx_t *node, const twai_onchip_node
127128 uint64_t reserve_mask = BIT64 (node_config -> io_cfg .tx );
128129
129130 // Set RX pin
130- gpio_input_enable (node_config -> io_cfg .rx );
131131 gpio_set_pull_mode (node_config -> io_cfg .rx , GPIO_PULLUP_ONLY ); // pullup to avoid noise if no connection to transceiver
132- gpio_func_sel (node_config -> io_cfg .rx , PIN_FUNC_GPIO );
133- esp_rom_gpio_connect_in_signal (node_config -> io_cfg .rx , twai_controller_periph_signals .controllers [node -> ctrlr_id ].rx_sig , false);
132+ gpio_matrix_input (node_config -> io_cfg .rx , twai_periph_signals [node -> ctrlr_id ].rx_sig , false);
134133
135134 // Set TX pin
136- gpio_func_sel (node_config -> io_cfg .tx , PIN_FUNC_GPIO );
137- esp_rom_gpio_connect_out_signal (node_config -> io_cfg .tx , twai_controller_periph_signals .controllers [node -> ctrlr_id ].tx_sig , false, false);
135+ // If enable_listen_only, disconnect twai signal, and output high to avoid any influence to bus
136+ gpio_set_level (node_config -> io_cfg .tx , 1 );
137+ int tx_sig = (node_config -> flags .enable_listen_only ) ? SIG_GPIO_OUT_IDX : twai_periph_signals [node -> ctrlr_id ].tx_sig ;
138+ gpio_matrix_output (node_config -> io_cfg .tx , tx_sig , false, false);
138139
139140 //Configure output clock pin (Optional)
140141 if (GPIO_IS_VALID_OUTPUT_GPIO (node_config -> io_cfg .quanta_clk_out )) {
141142 reserve_mask |= BIT64 (node_config -> io_cfg .quanta_clk_out );
142- gpio_func_sel (node_config -> io_cfg .quanta_clk_out , PIN_FUNC_GPIO );
143- 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);
143+ gpio_matrix_output (node_config -> io_cfg .quanta_clk_out , twai_periph_signals [node -> ctrlr_id ].clk_out_sig , false, false);
144144 }
145145
146146 //Configure bus status pin (Optional)
147147 if (GPIO_IS_VALID_OUTPUT_GPIO (node_config -> io_cfg .bus_off_indicator )) {
148148 reserve_mask |= BIT64 (node_config -> io_cfg .bus_off_indicator );
149- gpio_func_sel (node_config -> io_cfg .bus_off_indicator , PIN_FUNC_GPIO );
150- 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);
149+ gpio_matrix_output (node_config -> io_cfg .bus_off_indicator , twai_periph_signals [node -> ctrlr_id ].bus_off_sig , false, false);
151150 }
152151
153152 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
163162
164163static void _node_release_io (twai_onchip_ctx_t * node )
165164{
166- esp_rom_gpio_connect_in_signal (GPIO_MATRIX_CONST_ONE_INPUT , twai_controller_periph_signals . controllers [node -> ctrlr_id ].rx_sig , false);
165+ esp_rom_gpio_connect_in_signal (GPIO_MATRIX_CONST_ONE_INPUT , twai_periph_signals [node -> ctrlr_id ].rx_sig , false);
167166 esp_gpio_revoke (node -> gpio_reserved );
168167 for (; node -> gpio_reserved > 0 ;) {
169168 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
615614 ESP_GOTO_ON_FALSE (node -> tx_mount_queue , ESP_ERR_NO_MEM , err , TAG , "no_mem" );
616615 uint32_t intr_flags = TWAI_INTR_ALLOC_FLAGS ;
617616 intr_flags |= (node_config -> intr_priority > 0 ) ? BIT (node_config -> intr_priority ) : ESP_INTR_FLAG_LOWMED ;
618- 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 ),
617+ ESP_GOTO_ON_ERROR (esp_intr_alloc (twai_periph_signals [ctrlr_id ].irq_id , intr_flags , _node_isr_main , (void * )node , & node -> intr_hdl ),
619618 err , TAG , "Alloc interrupt failed" );
620619
621620 // 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
638637#if CONFIG_PM_ENABLE
639638#if SOC_TWAI_CLK_SUPPORT_APB
640639 // DFS can change APB frequency. So add lock to prevent sleep and APB freq from changing
641- 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" );
640+ 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" );
642641#else // XTAL
643642 // XTAL freq can be closed in light sleep, so we need to create a lock to prevent light sleep
644- 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" );
643+ 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" );
645644#endif //SOC_TWAI_CLK_SUPPORT_APB
646645#endif //CONFIG_PM_ENABLE
647646
0 commit comments