5555#include "soc/rmt_periph.h"
5656#include "soc/soc_caps.h"
5757#include "esp_clk_tree.h"
58+ #include "esp_private/esp_clk_tree_common.h"
5859
5960#include "esp_rmt.h"
6061
@@ -427,8 +428,7 @@ static void rmt_module_enable(void)
427428 rmt_ll_reset_register (0 );
428429 }
429430
430- periph_module_reset (PERIPH_RMT_MODULE );
431- periph_module_enable (PERIPH_RMT_MODULE );
431+ rmt_ll_mem_power_by_pmu (g_rmtdev_common .hal .regs );
432432 g_rmtdev_common .rmt_module_enabled = true;
433433 }
434434
@@ -804,6 +804,7 @@ static int rmt_internal_config(rmt_dev_t *dev,
804804 bool carrier_en = rmt_param -> tx_config .carrier_en ;
805805 uint32_t rmt_source_clk_hz ;
806806 irqstate_t flags ;
807+ int ret = OK ;
807808
808809 if (!rmt_is_channel_number_valid (channel , mode ))
809810 {
@@ -834,19 +835,34 @@ static int rmt_internal_config(rmt_dev_t *dev,
834835 esp_clk_tree_src_get_freq_hz ((soc_module_clk_t )RMT_BASECLK_XTAL ,
835836 ESP_CLK_TREE_SRC_FREQ_PRECISION_CACHED ,
836837 & rmt_source_clk_hz );
837- rmt_ll_set_group_clock_src (dev , channel ,
838- (rmt_clock_source_t )RMT_BASECLK_XTAL ,
839- 1 , 0 , 0 );
838+ ret = esp_clk_tree_enable_src ((soc_module_clk_t )RMT_BASECLK_XTAL ,
839+ true);
840+ if (ret != ESP_OK )
841+ {
842+ rmterr ("Failed to enable XTAL clock source: %d" , ret );
843+ return - EPERM ;
844+ }
845+
846+ RMT_CLOCK_SRC_ATOMIC ()
847+ {
848+ rmt_ll_set_group_clock_src (dev , channel ,
849+ (rmt_clock_source_t )RMT_BASECLK_XTAL ,
850+ 1 , 0 , 0 );
851+ }
852+
840853#elif SOC_RMT_SUPPORT_REF_TICK
841854
842855 /* clock src: REF_CLK */
843856
844857 esp_clk_tree_src_get_freq_hz ((soc_module_clk_t )RMT_BASECLK_REF ,
845858 ESP_CLK_TREE_SRC_FREQ_PRECISION_CACHED ,
846859 & rmt_source_clk_hz );
847- rmt_ll_set_group_clock_src (dev , channel ,
848- (rmt_clock_source_t )RMT_BASECLK_REF ,
849- 1 , 0 , 0 );
860+ RMT_CLOCK_SRC_ATOMIC ()
861+ {
862+ rmt_ll_set_group_clock_src (dev , channel ,
863+ (rmt_clock_source_t )RMT_BASECLK_REF ,
864+ 1 , 0 , 0 );
865+ }
850866#else
851867#error "No clock source is aware of DFS"
852868#endif
@@ -858,9 +874,20 @@ static int rmt_internal_config(rmt_dev_t *dev,
858874 esp_clk_tree_src_get_freq_hz ((soc_module_clk_t )RMT_BASECLK_DEFAULT ,
859875 ESP_CLK_TREE_SRC_FREQ_PRECISION_CACHED ,
860876 & rmt_source_clk_hz );
861- rmt_ll_set_group_clock_src (dev , channel ,
862- (rmt_clock_source_t )RMT_BASECLK_DEFAULT ,
863- 1 , 0 , 0 );
877+ ret = esp_clk_tree_enable_src ((soc_module_clk_t )RMT_BASECLK_DEFAULT ,
878+ true);
879+ if (ret != ESP_OK )
880+ {
881+ rmterr ("Failed to enable XTAL clock source: %d" , ret );
882+ return - EPERM ;
883+ }
884+
885+ RMT_CLOCK_SRC_ATOMIC ()
886+ {
887+ rmt_ll_set_group_clock_src (dev , channel ,
888+ (rmt_clock_source_t )RMT_BASECLK_DEFAULT ,
889+ 1 , 0 , 0 );
890+ }
864891 }
865892
866893 RMT_CLOCK_SRC_ATOMIC ()
@@ -1006,7 +1033,7 @@ static int rmt_internal_config(rmt_dev_t *dev,
10061033 threshold , filter_cnt );
10071034 }
10081035
1009- return OK ;
1036+ return ret ;
10101037}
10111038
10121039/****************************************************************************
@@ -1262,6 +1289,10 @@ static int IRAM_ATTR rmt_driver_isr_default(int irq, void *context,
12621289 {
12631290 item_len = item_len - p_rmt -> rx_item_start_idx ;
12641291 }
1292+ else
1293+ {
1294+ item_len = p_rmt -> rx_item_start_idx - item_len ;
1295+ }
12651296
12661297 /* Check for RX buffer max length */
12671298
@@ -1876,12 +1907,16 @@ static struct rmt_dev_s
18761907
18771908 if (g_rx_channel != RMT_CHANNEL_MAX && g_tx_channel != RMT_CHANNEL_MAX )
18781909 {
1910+ uint32_t tx_sig =
1911+ rmt_periph_signals .groups [0 ].channels [g_tx_channel ].tx_sig ;
1912+ uint32_t rx_sig =
1913+ rmt_periph_signals .groups [0 ].channels [g_rx_channel ].rx_sig ;
18791914 esp_configgpio (config .gpio_num , OUTPUT | INPUT );
18801915 esp_gpio_matrix_out (config .gpio_num ,
1881- RMT_SIG_OUT0_IDX + g_tx_channel ,
1916+ tx_sig ,
18821917 0 , 0 );
18831918 esp_gpio_matrix_in (config .gpio_num ,
1884- RMT_SIG_IN0_IDX + g_rx_channel ,
1919+ rx_sig ,
18851920 0 );
18861921 rmtwarn ("RX channel %d and TX channel %d are used in loop test "
18871922 "mode\n" , g_rx_channel , g_tx_channel );
0 commit comments