forked from espressif/esp-idf
refactor(rmt): define retention module in the soc layer
This commit is contained in:
@@ -75,7 +75,7 @@ rmt_group_t *rmt_acquire_group_handle(int group_id)
|
|||||||
rmt_ll_reset_register(group_id);
|
rmt_ll_reset_register(group_id);
|
||||||
}
|
}
|
||||||
#if RMT_USE_RETENTION_LINK
|
#if RMT_USE_RETENTION_LINK
|
||||||
sleep_retention_module_t module = RMT_LL_SLEEP_RETENTION_MODULE_ID(group_id);
|
sleep_retention_module_t module = rmt_reg_retention_info[group_id].module;
|
||||||
sleep_retention_module_init_param_t init_param = {
|
sleep_retention_module_init_param_t init_param = {
|
||||||
.cbs = {
|
.cbs = {
|
||||||
.create = {
|
.create = {
|
||||||
@@ -85,9 +85,7 @@ rmt_group_t *rmt_acquire_group_handle(int group_id)
|
|||||||
},
|
},
|
||||||
.depends = BIT(SLEEP_RETENTION_MODULE_CLOCK_SYSTEM)
|
.depends = BIT(SLEEP_RETENTION_MODULE_CLOCK_SYSTEM)
|
||||||
};
|
};
|
||||||
if (sleep_retention_module_init(module, &init_param) == ESP_OK) {
|
if (sleep_retention_module_init(module, &init_param) != ESP_OK) {
|
||||||
group->sleep_retention_module = module;
|
|
||||||
} else {
|
|
||||||
// even though the sleep retention module init failed, RMT driver should still work, so just warning here
|
// even though the sleep retention module init failed, RMT driver should still work, so just warning here
|
||||||
ESP_LOGW(TAG, "init sleep retention failed %d, power domain may be turned off during sleep", group_id);
|
ESP_LOGW(TAG, "init sleep retention failed %d, power domain may be turned off during sleep", group_id);
|
||||||
}
|
}
|
||||||
@@ -147,11 +145,12 @@ void rmt_release_group_handle(rmt_group_t *group)
|
|||||||
|
|
||||||
if (do_deinitialize) {
|
if (do_deinitialize) {
|
||||||
#if RMT_USE_RETENTION_LINK
|
#if RMT_USE_RETENTION_LINK
|
||||||
if (group->sleep_retention_module) {
|
sleep_retention_module_t module = rmt_reg_retention_info[group_id].module;
|
||||||
if (group->retention_link_created) {
|
if (sleep_retention_get_created_modules() & BIT(module)) {
|
||||||
sleep_retention_module_free(group->sleep_retention_module);
|
sleep_retention_module_free(module);
|
||||||
}
|
}
|
||||||
sleep_retention_module_deinit(group->sleep_retention_module);
|
if (sleep_retention_get_inited_modules() & BIT(module)) {
|
||||||
|
sleep_retention_module_deinit(module);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
free(group);
|
free(group);
|
||||||
@@ -303,24 +302,21 @@ static esp_err_t rmt_create_sleep_retention_link_cb(void *arg)
|
|||||||
{
|
{
|
||||||
rmt_group_t *group = (rmt_group_t *)arg;
|
rmt_group_t *group = (rmt_group_t *)arg;
|
||||||
int group_id = group->group_id;
|
int group_id = group->group_id;
|
||||||
sleep_retention_module_t module = group->sleep_retention_module;
|
|
||||||
esp_err_t err = sleep_retention_entries_create(rmt_reg_retention_info[group_id].regdma_entry_array,
|
esp_err_t err = sleep_retention_entries_create(rmt_reg_retention_info[group_id].regdma_entry_array,
|
||||||
rmt_reg_retention_info[group_id].array_size,
|
rmt_reg_retention_info[group_id].array_size,
|
||||||
REGDMA_LINK_PRI_RMT, module);
|
REGDMA_LINK_PRI_RMT, rmt_reg_retention_info[group_id].module);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
void rmt_create_retention_module(rmt_group_t *group)
|
void rmt_create_retention_module(rmt_group_t *group)
|
||||||
{
|
{
|
||||||
sleep_retention_module_t module = group->sleep_retention_module;
|
int group_id = group->group_id;
|
||||||
|
sleep_retention_module_t module = rmt_reg_retention_info[group_id].module;
|
||||||
_lock_acquire(&s_platform.mutex);
|
_lock_acquire(&s_platform.mutex);
|
||||||
if (group->retention_link_created == false) {
|
if ((sleep_retention_get_inited_modules() & BIT(module)) && !(sleep_retention_get_created_modules() & BIT(module))) {
|
||||||
if (sleep_retention_module_allocate(module) != ESP_OK) {
|
if (sleep_retention_module_allocate(module) != ESP_OK) {
|
||||||
// even though the sleep retention module create failed, RMT driver should still work, so just warning here
|
// even though the sleep retention module create failed, RMT driver should still work, so just warning here
|
||||||
ESP_LOGW(TAG, "create retention link failed, power domain can't be turned off");
|
ESP_LOGW(TAG, "create retention link failed, power domain won't be turned off during sleep");
|
||||||
} else {
|
|
||||||
group->retention_link_created = true;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_lock_release(&s_platform.mutex);
|
_lock_release(&s_platform.mutex);
|
||||||
|
@@ -119,10 +119,6 @@ struct rmt_group_t {
|
|||||||
rmt_rx_channel_t *rx_channels[SOC_RMT_RX_CANDIDATES_PER_GROUP]; // array of RMT RX channels
|
rmt_rx_channel_t *rx_channels[SOC_RMT_RX_CANDIDATES_PER_GROUP]; // array of RMT RX channels
|
||||||
rmt_sync_manager_t *sync_manager; // sync manager, this can be extended into an array if there're more sync controllers in one RMT group
|
rmt_sync_manager_t *sync_manager; // sync manager, this can be extended into an array if there're more sync controllers in one RMT group
|
||||||
int intr_priority; // RMT interrupt priority
|
int intr_priority; // RMT interrupt priority
|
||||||
#if RMT_USE_RETENTION_LINK
|
|
||||||
sleep_retention_module_t sleep_retention_module; // sleep retention module
|
|
||||||
bool retention_link_created; // mark if the retention link is created
|
|
||||||
#endif
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct rmt_channel_t {
|
struct rmt_channel_t {
|
||||||
|
@@ -38,8 +38,6 @@ extern "C" {
|
|||||||
#define RMT_LL_MAX_FILTER_VALUE 255
|
#define RMT_LL_MAX_FILTER_VALUE 255
|
||||||
#define RMT_LL_MAX_IDLE_VALUE 32767
|
#define RMT_LL_MAX_IDLE_VALUE 32767
|
||||||
|
|
||||||
#define RMT_LL_SLEEP_RETENTION_MODULE_ID(group_id) (SLEEP_RETENTION_MODULE_RMT0)
|
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
RMT_LL_MEM_OWNER_SW = 0,
|
RMT_LL_MEM_OWNER_SW = 0,
|
||||||
RMT_LL_MEM_OWNER_HW = 1,
|
RMT_LL_MEM_OWNER_HW = 1,
|
||||||
|
@@ -38,8 +38,6 @@ extern "C" {
|
|||||||
#define RMT_LL_MAX_FILTER_VALUE 255
|
#define RMT_LL_MAX_FILTER_VALUE 255
|
||||||
#define RMT_LL_MAX_IDLE_VALUE 32767
|
#define RMT_LL_MAX_IDLE_VALUE 32767
|
||||||
|
|
||||||
#define RMT_LL_SLEEP_RETENTION_MODULE_ID(group_id) (SLEEP_RETENTION_MODULE_RMT0)
|
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
RMT_LL_MEM_OWNER_SW = 0,
|
RMT_LL_MEM_OWNER_SW = 0,
|
||||||
RMT_LL_MEM_OWNER_HW = 1,
|
RMT_LL_MEM_OWNER_HW = 1,
|
||||||
|
@@ -38,8 +38,6 @@ extern "C" {
|
|||||||
#define RMT_LL_MAX_FILTER_VALUE 255
|
#define RMT_LL_MAX_FILTER_VALUE 255
|
||||||
#define RMT_LL_MAX_IDLE_VALUE 32767
|
#define RMT_LL_MAX_IDLE_VALUE 32767
|
||||||
|
|
||||||
#define RMT_LL_SLEEP_RETENTION_MODULE_ID(group_id) (SLEEP_RETENTION_MODULE_RMT0)
|
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
RMT_LL_MEM_OWNER_SW = 0,
|
RMT_LL_MEM_OWNER_SW = 0,
|
||||||
RMT_LL_MEM_OWNER_HW = 1,
|
RMT_LL_MEM_OWNER_HW = 1,
|
||||||
|
@@ -33,8 +33,6 @@ extern "C" {
|
|||||||
#define RMT_LL_EVENT_TX_MASK(channel) (RMT_LL_EVENT_TX_DONE(channel) | RMT_LL_EVENT_TX_THRES(channel) | RMT_LL_EVENT_TX_LOOP_END(channel))
|
#define RMT_LL_EVENT_TX_MASK(channel) (RMT_LL_EVENT_TX_DONE(channel) | RMT_LL_EVENT_TX_THRES(channel) | RMT_LL_EVENT_TX_LOOP_END(channel))
|
||||||
#define RMT_LL_EVENT_RX_MASK(channel) (RMT_LL_EVENT_RX_DONE(channel) | RMT_LL_EVENT_RX_THRES(channel))
|
#define RMT_LL_EVENT_RX_MASK(channel) (RMT_LL_EVENT_RX_DONE(channel) | RMT_LL_EVENT_RX_THRES(channel))
|
||||||
|
|
||||||
#define RMT_LL_SLEEP_RETENTION_MODULE_ID(group_id) (SLEEP_RETENTION_MODULE_RMT0)
|
|
||||||
|
|
||||||
#define RMT_LL_MAX_LOOP_COUNT_PER_BATCH 1023
|
#define RMT_LL_MAX_LOOP_COUNT_PER_BATCH 1023
|
||||||
#define RMT_LL_MAX_FILTER_VALUE 255
|
#define RMT_LL_MAX_FILTER_VALUE 255
|
||||||
#define RMT_LL_MAX_IDLE_VALUE 32767
|
#define RMT_LL_MAX_IDLE_VALUE 32767
|
||||||
|
@@ -60,6 +60,7 @@ static const regdma_entries_config_t rmt_regdma_entries[] = {
|
|||||||
|
|
||||||
const rmt_reg_retention_info_t rmt_reg_retention_info[SOC_RMT_GROUPS] = {
|
const rmt_reg_retention_info_t rmt_reg_retention_info[SOC_RMT_GROUPS] = {
|
||||||
[0] = {
|
[0] = {
|
||||||
|
.module = SLEEP_RETENTION_MODULE_RMT0,
|
||||||
.regdma_entry_array = rmt_regdma_entries,
|
.regdma_entry_array = rmt_regdma_entries,
|
||||||
.array_size = ARRAY_SIZE(rmt_regdma_entries)
|
.array_size = ARRAY_SIZE(rmt_regdma_entries)
|
||||||
},
|
},
|
||||||
|
@@ -60,6 +60,7 @@ static const regdma_entries_config_t rmt_regdma_entries[] = {
|
|||||||
|
|
||||||
const rmt_reg_retention_info_t rmt_reg_retention_info[SOC_RMT_GROUPS] = {
|
const rmt_reg_retention_info_t rmt_reg_retention_info[SOC_RMT_GROUPS] = {
|
||||||
[0] = {
|
[0] = {
|
||||||
|
.module = SLEEP_RETENTION_MODULE_RMT0,
|
||||||
.regdma_entry_array = rmt_regdma_entries,
|
.regdma_entry_array = rmt_regdma_entries,
|
||||||
.array_size = ARRAY_SIZE(rmt_regdma_entries)
|
.array_size = ARRAY_SIZE(rmt_regdma_entries)
|
||||||
},
|
},
|
||||||
|
@@ -60,6 +60,7 @@ static const regdma_entries_config_t rmt_regdma_entries[] = {
|
|||||||
|
|
||||||
const rmt_reg_retention_info_t rmt_reg_retention_info[SOC_RMT_GROUPS] = {
|
const rmt_reg_retention_info_t rmt_reg_retention_info[SOC_RMT_GROUPS] = {
|
||||||
[0] = {
|
[0] = {
|
||||||
|
.module = SLEEP_RETENTION_MODULE_RMT0,
|
||||||
.regdma_entry_array = rmt_regdma_entries,
|
.regdma_entry_array = rmt_regdma_entries,
|
||||||
.array_size = ARRAY_SIZE(rmt_regdma_entries)
|
.array_size = ARRAY_SIZE(rmt_regdma_entries)
|
||||||
},
|
},
|
||||||
|
@@ -76,6 +76,7 @@ static const regdma_entries_config_t rmt_regdma_entries[] = {
|
|||||||
|
|
||||||
const rmt_reg_retention_info_t rmt_reg_retention_info[SOC_RMT_GROUPS] = {
|
const rmt_reg_retention_info_t rmt_reg_retention_info[SOC_RMT_GROUPS] = {
|
||||||
[0] = {
|
[0] = {
|
||||||
|
.module = SLEEP_RETENTION_MODULE_RMT0,
|
||||||
.regdma_entry_array = rmt_regdma_entries,
|
.regdma_entry_array = rmt_regdma_entries,
|
||||||
.array_size = ARRAY_SIZE(rmt_regdma_entries)
|
.array_size = ARRAY_SIZE(rmt_regdma_entries)
|
||||||
},
|
},
|
||||||
|
@@ -10,6 +10,10 @@
|
|||||||
#include "soc/periph_defs.h"
|
#include "soc/periph_defs.h"
|
||||||
#include "soc/regdma.h"
|
#include "soc/regdma.h"
|
||||||
|
|
||||||
|
#if SOC_RMT_SUPPORT_SLEEP_RETENTION
|
||||||
|
#include "soc/retention_periph_defs.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
@@ -32,6 +36,7 @@ extern const rmt_signal_conn_t rmt_periph_signals;
|
|||||||
|
|
||||||
#if SOC_RMT_SUPPORT_SLEEP_RETENTION
|
#if SOC_RMT_SUPPORT_SLEEP_RETENTION
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
periph_retention_module_t module;
|
||||||
const regdma_entries_config_t *regdma_entry_array;
|
const regdma_entries_config_t *regdma_entry_array;
|
||||||
uint32_t array_size;
|
uint32_t array_size;
|
||||||
} rmt_reg_retention_info_t;
|
} rmt_reg_retention_info_t;
|
||||||
|
Reference in New Issue
Block a user