Skip to content

Commit 78b7cc7

Browse files
tmediccilinguini1
authored andcommitted
risc-v/espressif/rmt: Update common source code functions
Updates the common source code for the RMT peripheral used by Espressif's RISC-Vs SoCs. This enables newer SoCs to be supported in the future while maintaining backwards compatibility. Signed-off-by: Tiago Medicci Serrano <tiago.medicci@espressif.com>
1 parent 0f29e13 commit 78b7cc7

File tree

1 file changed

+49
-14
lines changed

1 file changed

+49
-14
lines changed

arch/risc-v/src/common/espressif/esp_rmt.c

Lines changed: 49 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
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

Comments
 (0)