fix(gpio): oe control by register only take effect when func sel is GPIO

This commit is contained in:
Song Ruo Jing
2025-11-11 14:32:35 +08:00
parent 7bb3b130ce
commit 222d81976a
12 changed files with 17 additions and 14 deletions

View File

@@ -207,7 +207,8 @@ esp_err_t gpio_output_disable(gpio_num_t gpio_num)
{
GPIO_CHECK(GPIO_IS_VALID_GPIO(gpio_num), "GPIO number error", ESP_ERR_INVALID_ARG);
gpio_hal_output_disable(gpio_context.gpio_hal, gpio_num);
gpio_hal_set_output_enable_ctrl(gpio_context.gpio_hal, gpio_num, false, false); // so that output disable could take effect
gpio_hal_set_output_enable_ctrl(gpio_context.gpio_hal, gpio_num, false, false); // so that output disable could always take effect when func sel is GPIO
gpio_hal_func_sel(gpio_context.gpio_hal, gpio_num, PIN_FUNC_GPIO); // otherwise the oe can only be controlled by peripheral
return ESP_OK;
}
@@ -216,6 +217,7 @@ esp_err_t gpio_output_enable(gpio_num_t gpio_num)
GPIO_CHECK(GPIO_IS_VALID_OUTPUT_GPIO(gpio_num), "GPIO output gpio_num error", ESP_ERR_INVALID_ARG);
gpio_hal_matrix_out_default(gpio_context.gpio_hal, gpio_num); // No peripheral output signal routed to the pin, just as a simple GPIO output
gpio_hal_output_enable(gpio_context.gpio_hal, gpio_num);
gpio_hal_func_sel(gpio_context.gpio_hal, gpio_num, PIN_FUNC_GPIO); // otherwise the oe can only be controlled by peripheral
return ESP_OK;
}
@@ -1052,9 +1054,10 @@ esp_err_t gpio_dump_io_configuration(FILE *out_stream, uint64_t io_bit_mask)
#endif
// When the IO is used as a simple GPIO output, oe signal can only be controlled by the oe register
// When the IO is not used as a simple GPIO output, oe signal could be controlled by the peripheral
// When the IO connects to a peripheral signal through GPIO Matrix, oe signal can be controlled by the peripheral or the oe register (switch by oe_ctrl_by_periph)
// When the IO connects to a peripheral signal through IOMUX, oe signal can only be controlled by the peripheral
const char *oe_str = oe ? "1" : "0";
if (sig_out != SIG_GPIO_OUT_IDX && oe_ctrl_by_periph) {
if (fun_sel != PIN_FUNC_GPIO || oe_ctrl_by_periph) {
oe_str = "[periph_sig_ctrl]";
}

View File

@@ -711,7 +711,7 @@ static inline void gpio_ll_iomux_func_sel(uint32_t pin_name, uint32_t func)
}
/**
* @brief Configure the source of output enable signal for the GPIO pin.
* @brief Configure the source of output enable signal for the pad (only takes effect if func sel is selected to be GPIO).
*
* @param hw Peripheral GPIO hardware instance address.
* @param gpio_num GPIO number of the pad.

View File

@@ -513,7 +513,7 @@ static inline void gpio_ll_iomux_func_sel(uint32_t pin_name, uint32_t func)
}
/**
* @brief Configure the source of output enable signal for the GPIO pin.
* @brief Configure the source of output enable signal for the pad (only takes effect if func sel is selected to be GPIO).
*
* @param hw Peripheral GPIO hardware instance address.
* @param gpio_num GPIO number of the pad.

View File

@@ -503,7 +503,7 @@ static inline void gpio_ll_iomux_func_sel(uint32_t pin_name, uint32_t func)
}
/**
* @brief Configure the source of output enable signal for the GPIO pin.
* @brief Configure the source of output enable signal for the pad (only takes effect if func sel is selected to be GPIO).
*
* @param hw Peripheral GPIO hardware instance address.
* @param gpio_num GPIO number of the pad.

View File

@@ -489,7 +489,7 @@ static inline void gpio_ll_iomux_in(gpio_dev_t *hw, uint32_t gpio, uint32_t sign
}
/**
* @brief Configure the source of output enable signal for the GPIO pin.
* @brief Configure the source of output enable signal for the pad (only takes effect if func sel is selected to be GPIO).
*
* @param hw Peripheral GPIO hardware instance address.
* @param gpio_num GPIO number of the pad.

View File

@@ -475,7 +475,7 @@ static inline void gpio_ll_iomux_func_sel(uint32_t pin_name, uint32_t func)
}
/**
* @brief Configure the source of output enable signal for the GPIO pin.
* @brief Configure the source of output enable signal for the pad (only takes effect if func sel is selected to be GPIO).
*
* @param hw Peripheral GPIO hardware instance address.
* @param gpio_num GPIO number of the pad.

View File

@@ -521,7 +521,7 @@ static inline void gpio_ll_func_sel(gpio_dev_t *hw, uint8_t gpio_num, uint32_t f
}
/**
* @brief Configure the source of output enable signal for the GPIO pin.
* @brief Configure the source of output enable signal for the pad (only takes effect if func sel is selected to be GPIO).
*
* @param hw Peripheral GPIO hardware instance address.
* @param gpio_num GPIO number of the pad.

View File

@@ -538,7 +538,7 @@ static inline void gpio_ll_func_sel(gpio_dev_t *hw, uint8_t gpio_num, uint32_t f
}
/**
* @brief Configure the source of output enable signal for the GPIO pin.
* @brief Configure the source of output enable signal for the pad (only takes effect if func sel is selected to be GPIO).
*
* @param hw Peripheral GPIO hardware instance address.
* @param gpio_num GPIO number of the pad.

View File

@@ -658,7 +658,7 @@ static inline void gpio_ll_func_sel(gpio_dev_t *hw, uint8_t gpio_num, uint32_t f
}
/**
* @brief Configure the source of output enable signal for the GPIO pin.
* @brief Configure the source of output enable signal for the pad (only takes effect if func sel is selected to be GPIO).
*
* @param hw Peripheral GPIO hardware instance address.
* @param gpio_num GPIO number of the pad.

View File

@@ -525,7 +525,7 @@ static inline void gpio_ll_iomux_func_sel(uint32_t pin_name, uint32_t func)
}
/**
* @brief Configure the source of output enable signal for the GPIO pin.
* @brief Configure the source of output enable signal for the pad (only takes effect if func sel is selected to be GPIO).
*
* @param hw Peripheral GPIO hardware instance address.
* @param gpio_num GPIO number of the pad.

View File

@@ -517,7 +517,7 @@ static inline void gpio_ll_iomux_func_sel(uint32_t pin_name, uint32_t func)
}
/**
* @brief Configure the source of output enable signal for the GPIO pin.
* @brief Configure the source of output enable signal for the pad (only takes effect if func sel is selected to be GPIO).
*
* @param hw Peripheral GPIO hardware instance address.
* @param gpio_num GPIO number of the pad.

View File

@@ -172,7 +172,7 @@ void gpio_hal_intr_disable(gpio_hal_context_t *hal, uint32_t gpio_num);
#define gpio_hal_output_enable(hal, gpio_num) gpio_ll_output_enable((hal)->dev, gpio_num)
/**
* @brief Configure the source of output enable signal for the GPIO pin.
* @brief Configure the source of output enable signal for the pad (only takes effect if func sel is selected to be GPIO).
*
* @param hal Context of the HAL layer
* @param gpio_num GPIO number