This is an automated email from the ASF dual-hosted git repository.
xiaoxiang781216 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git
The following commit(s) were added to refs/heads/master by this push:
new c4f641991ae arch/risc-v: add LDO source for Espressif devices
c4f641991ae is described below
commit c4f641991ae5a3edda9ddbfa5a7d3e76e8ae87e5
Author: Filipe Cavalcanti <[email protected]>
AuthorDate: Mon Jul 27 15:41:40 2026 -0300
arch/risc-v: add LDO source for Espressif devices
Adds LDO support for RISC-V Espressif devices. In general, should
only affect ESP32-P4 on a few boards.
ESP32-P4 has 4 channels of low-dropout voltage regulators, which
are programmable. Can be used to power external devices.
Signed-off-by: Filipe Cavalcanti <[email protected]>
---
arch/risc-v/src/common/espressif/esp_ldo.c | 125 +++++++++++++++++++++++++++++
arch/risc-v/src/common/espressif/esp_ldo.h | 116 ++++++++++++++++++++++++++
2 files changed, 241 insertions(+)
diff --git a/arch/risc-v/src/common/espressif/esp_ldo.c
b/arch/risc-v/src/common/espressif/esp_ldo.c
new file mode 100644
index 00000000000..cd308114d98
--- /dev/null
+++ b/arch/risc-v/src/common/espressif/esp_ldo.c
@@ -0,0 +1,125 @@
+/****************************************************************************
+ * arch/risc-v/src/common/espressif/esp_ldo.c
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership. The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+#include <string.h>
+#include <nuttx/debug.h>
+
+#include "soc/soc_caps.h"
+#include "esp_ldo.h"
+#include "hal/ldo_ll.h"
+#include "esp_ldo_regulator.h"
+
+#ifndef CONFIG_ARCH_CHIP_ESP32P4
+# error "ESP LDO Control usable for ESP32-P4 only"
+#endif
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: esp_ldo_channel_acquire
+ *
+ * Description:
+ * Acquire an on-chip LDO regulator channel and enable its output at the
+ * requested voltage.
+ *
+ * Input Parameters:
+ * config - Channel description. chan_id and voltage_mv are inputs;
+ * handler receives the channel handle on success.
+ *
+ * Returned Value:
+ * Zero (OK) is returned on success; -EIO is returned if the channel
+ * could not be acquired.
+ *
+ ****************************************************************************/
+
+int esp_ldo_channel_acquire(struct esp_ldo_config_t *config)
+{
+ esp_ldo_channel_handle_t ldo_chan = NULL;
+ esp_ldo_channel_config_t chan_cfg;
+ esp_err_t err;
+
+ DEBUGASSERT(config != NULL);
+
+ memset(&chan_cfg, 0, sizeof(chan_cfg));
+ chan_cfg.chan_id = config->chan_id;
+ chan_cfg.voltage_mv = config->voltage_mv;
+ chan_cfg.flags.adjustable = false;
+
+ err = esp_ldo_acquire_channel(&chan_cfg, &ldo_chan);
+ if (err != ESP_OK)
+ {
+ _err("acquire channel failed: %d\n", (int)err);
+ return -EIO;
+ }
+
+ config->handler = (void *)ldo_chan;
+
+ return OK;
+}
+
+/****************************************************************************
+ * Name: esp_ldo_channel_release
+ *
+ * Description:
+ * Release a channel previously acquired with
+ * esp_ldo_channel_acquire().
+ *
+ * Input Parameters:
+ * config - The same structure passed to esp_ldo_channel_acquire(). Its
+ * handler field is cleared on success.
+ *
+ * Returned Value:
+ * Zero (OK) is returned on success; -EINVAL if the channel was not
+ * acquired, or -EIO if the release failed.
+ *
+ ****************************************************************************/
+
+int esp_ldo_channel_release(struct esp_ldo_config_t *config)
+{
+ esp_err_t err;
+
+ DEBUGASSERT(config != NULL);
+
+ if (config->handler == NULL)
+ {
+ return -EINVAL;
+ }
+
+ err = esp_ldo_release_channel((esp_ldo_channel_handle_t)config->handler);
+ if (err != ESP_OK)
+ {
+ _err("release channel failed: %d\n", (int)err);
+ return -EIO;
+ }
+
+ config->handler = NULL;
+
+ return OK;
+}
diff --git a/arch/risc-v/src/common/espressif/esp_ldo.h
b/arch/risc-v/src/common/espressif/esp_ldo.h
new file mode 100644
index 00000000000..a8c20b972fa
--- /dev/null
+++ b/arch/risc-v/src/common/espressif/esp_ldo.h
@@ -0,0 +1,116 @@
+/****************************************************************************
+ * arch/risc-v/src/common/espressif/esp_ldo.h
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership. The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+#ifndef __ARCH_RISCV_SRC_COMMON_ESPRESSIF_ESP_LDO_H
+#define __ARCH_RISCV_SRC_COMMON_ESPRESSIF_ESP_LDO_H
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+#include <stdbool.h>
+#include <stdint.h>
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Types
+ ****************************************************************************/
+
+/* Description of an on-chip LDO regulator channel. The channel ID and the
+ * output voltage are board/schematic dependent and must be provided by the
+ * caller. Only ESP32-P4 provides these regulators.
+ */
+
+struct esp_ldo_config_t
+{
+ uint8_t chan_id; /* LDO channel ID, e.g. 3 for LDO_VO3 */
+ uint16_t voltage_mv; /* Output voltage, in millivolts */
+ void *handler; /* Opaque channel handle, set by acquire */
+};
+
+/****************************************************************************
+ * Public Function Prototypes
+ ****************************************************************************/
+
+#ifndef __ASSEMBLY__
+
+#ifdef __cplusplus
+#define EXTERN extern "C"
+extern "C"
+{
+#else
+#define EXTERN extern
+#endif
+
+/****************************************************************************
+ * Name: esp_ldo_channel_acquire
+ *
+ * Description:
+ * Acquire an on-chip LDO regulator channel and enable its output at the
+ * requested voltage. The channel is configured as non-adjustable, so the
+ * same channel may be acquired more than once by different consumers.
+ *
+ * Input Parameters:
+ * config - Channel description. chan_id and voltage_mv are inputs;
+ * handler receives the channel handle on success and must be
+ * preserved for the matching esp_ldo_channel_release() call.
+ *
+ * Returned Value:
+ * Zero (OK) is returned on success; -EIO is returned if the channel
+ * could not be acquired.
+ *
+ ****************************************************************************/
+
+int esp_ldo_channel_acquire(struct esp_ldo_config_t *config);
+
+/****************************************************************************
+ * Name: esp_ldo_channel_release
+ *
+ * Description:
+ * Release a channel previously acquired with
+ * esp_ldo_channel_acquire(). The regulator output is turned off once the
+ * last consumer of the channel releases it.
+ *
+ * Input Parameters:
+ * config - The same structure passed to esp_ldo_channel_acquire(). Its
+ * handler field is cleared on success.
+ *
+ * Returned Value:
+ * Zero (OK) is returned on success; -EINVAL if the channel was not
+ * acquired, or -EIO if the release failed.
+ *
+ ****************************************************************************/
+
+int esp_ldo_channel_release(struct esp_ldo_config_t *config);
+
+#undef EXTERN
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __ASSEMBLY__ */
+#endif /* __ARCH_RISCV_SRC_COMMON_ESPRESSIF_ESP_LDO_H */