Merge branch 'change/ldo_id_start_from_1' into 'master'

ldo: make ldo driver unit_id start from 1 (same as datasheet)

See merge request espressif/esp-idf!28318
This commit is contained in:
Armando (Dou Yiwen) 2024-01-08 16:06:31 +08:00
commit 7f8d0256c2
6 changed files with 42 additions and 27 deletions

View File

@ -31,7 +31,7 @@ typedef struct {
* @brief LDO driver initial configurations
*/
typedef struct {
int unit_id; ///< LDO unit
int unit_id; ///< LDO ID, this is aligned with datasheet, e.g. you should set this to 1, if using LDO ID 1
esp_ldo_unit_cfg_t cfg; ///< LDO unit configuration
struct {
uint32_t enable_unit: 1; ///< Enable the LDO unit after it's initialised

View File

@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2020-2023 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2020-2024 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
@ -47,22 +47,23 @@ static bool s_ldo_unit_needs_claim(const esp_ldo_unit_init_cfg_t *init_config);
esp_ldo_unit_handle_t esp_ldo_init_unit_early(const esp_ldo_unit_init_cfg_t *init_config)
{
assert(init_config);
assert(init_config->unit_id < LDO_LL_UNIT_NUM);
assert(ldo_ll_is_valid_ldo_id(init_config->unit_id));
ldo_unit_ctx_t *unit = &s_ctx.units[init_config->unit_id];
int unit_id = LDO_ID2UNIT(init_config->unit_id);
ldo_unit_ctx_t *unit = &s_ctx.units[unit_id];
bool needs_claim = s_ldo_unit_needs_claim(init_config);
bool success_claim = false;
if (needs_claim) {
success_claim = s_ldo_unit_claim(init_config->unit_id);
success_claim = s_ldo_unit_claim(unit_id);
assert(success_claim);
unit->unit_id = init_config->unit_id;
unit->unit_id = unit_id;
unit->voltage_mv = init_config->cfg.voltage_mv;
unit->spinlock = (portMUX_TYPE)portMUX_INITIALIZER_UNLOCKED;
ldo_ll_set_output_voltage_mv(init_config->unit_id, init_config->cfg.voltage_mv);
ldo_ll_set_output_voltage_mv(unit_id, init_config->cfg.voltage_mv);
if (init_config->flags.enable_unit) {
ldo_ll_enable(init_config->unit_id, true);
ldo_ll_enable(unit_id, true);
unit->enabled = true;
}
} else {
@ -78,28 +79,29 @@ esp_ldo_unit_handle_t esp_ldo_init_unit_early(const esp_ldo_unit_init_cfg_t *ini
esp_err_t esp_ldo_init_unit(const esp_ldo_unit_init_cfg_t *init_config, esp_ldo_unit_handle_t *ret_unit)
{
ESP_RETURN_ON_FALSE(init_config && ret_unit, ESP_ERR_INVALID_ARG, TAG, "invalid argument: null pointer");
ESP_RETURN_ON_FALSE(init_config->unit_id < LDO_LL_UNIT_NUM, ESP_ERR_INVALID_ARG, TAG, "invalid unit");
ESP_RETURN_ON_FALSE(ldo_ll_is_valid_ldo_id(init_config->unit_id), ESP_ERR_INVALID_ARG, TAG, "invalid ldo id");
ldo_unit_ctx_t *unit = &s_ctx.units[init_config->unit_id];
int unit_id = LDO_ID2UNIT(init_config->unit_id);
ldo_unit_ctx_t *unit = &s_ctx.units[unit_id];
bool needs_claim = s_ldo_unit_needs_claim(init_config);
bool success_claim = false;
if (needs_claim) {
success_claim = s_ldo_unit_claim(init_config->unit_id);
ESP_RETURN_ON_FALSE(success_claim, ESP_ERR_NOT_FOUND, TAG, "ldo%d is already in use", init_config->unit_id + 1);
unit->unit_id = init_config->unit_id;
success_claim = s_ldo_unit_claim(unit_id);
ESP_RETURN_ON_FALSE(success_claim, ESP_ERR_NOT_FOUND, TAG, "ldo%d is already in use", init_config->unit_id);
unit->unit_id = unit_id;
unit->voltage_mv = init_config->cfg.voltage_mv;
unit->spinlock = (portMUX_TYPE)portMUX_INITIALIZER_UNLOCKED;
ldo_ll_set_output_voltage_mv(init_config->unit_id, init_config->cfg.voltage_mv);
ldo_ll_set_output_voltage_mv(unit_id, init_config->cfg.voltage_mv);
if (init_config->flags.enable_unit) {
ldo_ll_enable(init_config->unit_id, true);
ldo_ll_enable(unit_id, true);
unit->enabled = true;
}
ESP_LOGD(TAG, "new ldo unit%d is created", unit->unit_id);
ESP_LOGD(TAG, "new ldo %d is created", unit->unit_id + 1);
} else {
bool same_voltage = init_config->cfg.voltage_mv == unit->voltage_mv;
ESP_RETURN_ON_FALSE(same_voltage, ESP_ERR_INVALID_ARG, TAG, "not same voltage, cannot share ldo%d", init_config->unit_id + 1);
ESP_LOGD(TAG, "new ldo unit%d is shared", unit->unit_id);
ESP_RETURN_ON_FALSE(same_voltage, ESP_ERR_INVALID_ARG, TAG, "not same voltage, cannot share ldo%d", init_config->unit_id);
ESP_LOGD(TAG, "new ldo %d is shared", unit->unit_id + 1);
}
portENTER_CRITICAL(&unit->spinlock);
@ -195,8 +197,9 @@ static bool s_ldo_unit_free(uint32_t unit)
static bool s_ldo_unit_needs_claim(const esp_ldo_unit_init_cfg_t *init_config)
{
bool needs_claim = false;
int unit_id = LDO_ID2UNIT(init_config->unit_id);
if (s_ctx.units[init_config->unit_id].ref_cnt == 0) {
if (s_ctx.units[unit_id].ref_cnt == 0) {
needs_claim = true;
} else {
if (!init_config->flags.shared_ldo) {

View File

@ -19,7 +19,7 @@ void esp_ldo_vdd_psram_early_init(void)
{
if (CONFIG_ESP_VDD_PSRAM_LDO_ID != -1) {
esp_ldo_unit_init_cfg_t unit_cfg = {
.unit_id = LDO_ID2UNIT(CONFIG_ESP_VDD_PSRAM_LDO_ID),
.unit_id = CONFIG_ESP_VDD_PSRAM_LDO_ID,
.cfg = {
.voltage_mv = CONFIG_ESP_VDD_PSRAM_LDO_VOLTAGE_MV,
},

View File

@ -50,8 +50,9 @@ TEST_CASE("LDO unit output", "[LDO][mannual][ignore]")
esp_ldo_unit_init_cfg_t early_unit_cfg = {
.unit_id = LDO_UNIT_2,
.cfg = {
.voltage_mv = 2500,
.voltage_mv = 1800,
},
.flags.shared_ldo = true,
.flags.enable_unit = true,
};
esp_ldo_unit_handle_t early_unit2 = esp_ldo_init_unit_early(&early_unit_cfg);

View File

@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2023-2024 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
@ -54,6 +54,17 @@ extern "C" {
*/
#define LDO_ID2UNIT(ldo_id) ((ldo_id) - 1)
/**
* @brief Check if a LDO ID is valid
*
* @return True for valid
*/
__attribute__((always_inline))
static inline bool ldo_ll_is_valid_ldo_id(int ldo_id)
{
return ((ldo_id > 0) && (ldo_id <= LDO_LL_UNIT_NUM));
}
/**
* @brief Enable a LDO
*

View File

@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2020-2023 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2020-2024 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
@ -17,10 +17,10 @@ extern "C" {
* @note See datasheet to know LDO, alias includes but not least to `VFB/VOn`
*/
typedef enum {
LDO_UNIT_1, ///< LDO 1
LDO_UNIT_2, ///< LDO 2
LDO_UNIT_3, ///< LDO 3
LDO_UNIT_4, ///< LDO 4
LDO_UNIT_1 = 1, ///< LDO 1
LDO_UNIT_2, ///< LDO 2
LDO_UNIT_3, ///< LDO 3
LDO_UNIT_4, ///< LDO 4
} ldo_unit_t;
#ifdef __cplusplus