mirror of
https://github.com/espressif/esp-idf
synced 2025-03-09 17:19:09 -04:00
fix(gpio): patched esp_rom_gpio_connect_out_signal for esp32 and esp32s2
The original ROM function enabled output for the pad first, and then connected the signal This could result in an undesired level change at the pad Closes https://github.com/espressif/esp-idf/issues/12826
This commit is contained in:
parent
a1da3ac136
commit
d555ea2b00
@ -19,7 +19,8 @@ else()
|
||||
"patches/esp_rom_uart.c"
|
||||
"patches/esp_rom_spiflash.c"
|
||||
"patches/esp_rom_regi2c.c"
|
||||
"patches/esp_rom_efuse.c")
|
||||
"patches/esp_rom_efuse.c"
|
||||
"patches/esp_rom_gpio.c")
|
||||
|
||||
if(CONFIG_HEAP_TLSF_USE_ROM_IMPL AND (CONFIG_ESP_ROM_TLSF_CHECK_PATCH OR CONFIG_HEAP_TLSF_CHECK_PATCH))
|
||||
# This file shall be included in the build if TLSF in ROM is activated
|
||||
|
@ -1,16 +1,8 @@
|
||||
// Copyright 2010-2020 Espressif Systems (Shanghai) PTE LTD
|
||||
//
|
||||
// Licensed 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.
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2010-2024 Espressif Systems (Shanghai) CO LTD
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
@ -74,6 +66,7 @@ void esp_rom_gpio_connect_in_signal(uint32_t gpio_num, uint32_t signal_idx, bool
|
||||
* @brief Combine a peripheral signal which tagged as output attribute with a GPIO.
|
||||
*
|
||||
* @note There's no limitation on the number of signals that a GPIO can combine with.
|
||||
* @note Internally, the signal will be connected first, then output will be enabled on the pad.
|
||||
*
|
||||
* @param gpio_num GPIO number
|
||||
* @param signal_idx Peripheral signal index (tagged as output attribute)
|
||||
|
28
components/esp_rom/patches/esp_rom_gpio.c
Normal file
28
components/esp_rom/patches/esp_rom_gpio.c
Normal file
@ -0,0 +1,28 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
#include "sdkconfig.h"
|
||||
#include "esp_attr.h"
|
||||
#include "esp_rom_gpio.h"
|
||||
#include "soc/gpio_reg.h"
|
||||
|
||||
#if CONFIG_IDF_TARGET_ESP32 || CONFIG_IDF_TARGET_ESP32S2
|
||||
// On such targets, the ROM code for this function enabled output for the pad first, and then connected the signal
|
||||
// This could result in an undesired glitch at the pad
|
||||
IRAM_ATTR void esp_rom_gpio_connect_out_signal(uint32_t gpio_num, uint32_t signal_idx, bool out_inv, bool oen_inv)
|
||||
{
|
||||
uint32_t value = signal_idx << GPIO_FUNC0_OUT_SEL_S;
|
||||
if (out_inv) {
|
||||
value |= GPIO_FUNC0_OUT_INV_SEL_M;
|
||||
}
|
||||
if (oen_inv) {
|
||||
value |= GPIO_FUNC0_OEN_INV_SEL_M;
|
||||
}
|
||||
REG_WRITE(GPIO_FUNC0_OUT_SEL_CFG_REG + (gpio_num * 4), value);
|
||||
|
||||
REG_WRITE(GPIO_ENABLE_W1TS_REG, (1 << gpio_num));
|
||||
}
|
||||
#endif
|
@ -564,7 +564,6 @@ components/esp_rom/include/esp32s3/rom/sha.h
|
||||
components/esp_rom/include/esp32s3/rom/tjpgd.h
|
||||
components/esp_rom/include/esp32s3/rom/uart.h
|
||||
components/esp_rom/include/esp_rom_crc.h
|
||||
components/esp_rom/include/esp_rom_gpio.h
|
||||
components/esp_rom/include/esp_rom_uart.h
|
||||
components/esp_rom/include/linux/soc/reset_reasons.h
|
||||
components/esp_rom/linux/esp_rom_crc.c
|
||||
|
Loading…
x
Reference in New Issue
Block a user