diff --git a/components/driver/gpio.c b/components/driver/gpio.c index 7245dc4c9..07bf69885 100644 --- a/components/driver/gpio.c +++ b/components/driver/gpio.c @@ -91,9 +91,19 @@ esp_err_t gpio_set_intr_type(gpio_num_t gpio_num, gpio_int_type_t intr_type) return ESP_OK; } +static void gpio_intr_status_clr(gpio_num_t gpio_num) +{ + if (gpio_num < 32) { + GPIO.status_w1tc = BIT(gpio_num); + } else { + GPIO.status1_w1tc.intr_st = BIT(gpio_num - 32); + } +} + static esp_err_t gpio_intr_enable_on_core (gpio_num_t gpio_num, uint32_t core_id) { GPIO_CHECK(GPIO_IS_VALID_GPIO(gpio_num), "GPIO number error", ESP_ERR_INVALID_ARG); + gpio_intr_status_clr(gpio_num); if (core_id == 0) { GPIO.pin[gpio_num].int_ena = GPIO_PRO_CPU_INTR_ENA; //enable pro cpu intr } else { @@ -111,6 +121,7 @@ esp_err_t gpio_intr_disable(gpio_num_t gpio_num) { GPIO_CHECK(GPIO_IS_VALID_GPIO(gpio_num), "GPIO number error", ESP_ERR_INVALID_ARG); GPIO.pin[gpio_num].int_ena = 0; //disable GPIO intr + gpio_intr_status_clr(gpio_num); return ESP_OK; } @@ -249,7 +260,11 @@ esp_err_t gpio_config(const gpio_config_t *pGPIOConfig) } do { io_reg = GPIO_PIN_MUX_REG[io_num]; - if (((gpio_pin_mask >> io_num) & BIT(0)) && io_reg) { + if (((gpio_pin_mask >> io_num) & BIT(0))) { + if (!io_reg) { + ESP_LOGE(GPIO_TAG, "IO%d is not a valid GPIO",io_num); + return ESP_ERR_INVALID_ARG; + } if(RTC_GPIO_IS_VALID_GPIO(io_num)){ rtc_gpio_deinit(io_num); } diff --git a/components/driver/include/driver/gpio.h b/components/driver/include/driver/gpio.h index 5c47b5777..bc8436491 100644 --- a/components/driver/include/driver/gpio.h +++ b/components/driver/include/driver/gpio.h @@ -249,13 +249,13 @@ esp_err_t gpio_config(const gpio_config_t *pGPIOConfig); /** * @brief Reset an gpio to default state (select gpio function, enable pullup and disable input and output). - * + * * @param gpio_num GPIO number. - * + * * @note This function also configures the IOMUX for this pin to the GPIO * function, and disconnects any other peripheral output configured via GPIO * Matrix. - * + * * @return Always return ESP_OK. */ esp_err_t gpio_reset_pin(gpio_num_t gpio_num); diff --git a/components/driver/test/test_gpio.c b/components/driver/test/test_gpio.c index 442b5b130..20962e36f 100644 --- a/components/driver/test/test_gpio.c +++ b/components/driver/test/test_gpio.c @@ -13,13 +13,16 @@ #include "freertos/task.h" #include "freertos/queue.h" +#define WAKE_UP_IGNORE 1 // gpio_wakeup function development is not completed yet, set it deprecated. #define GPIO_OUTPUT_IO 18 // default output GPIO #define GPIO_INPUT_IO 19 // default input GPIO #define GPIO_OUTPUT_MAX GPIO_NUM_34 static volatile int disable_intr_times = 0; // use this to calculate how many times it go into interrupt static volatile int level_intr_times = 0; // use this to get how many times the level interrupt happened static volatile int edge_intr_times = 0; // use this to get how many times the edge interrupt happened +#if !WAKE_UP_IGNORE static bool wake_up_result = false; // use this to judge the wake up event happen or not +#endif /** * do some initialization operation in this function @@ -70,6 +73,7 @@ static void gpio_isr_level_handler2(void* arg) ets_printf("GPIO[%d] intr, val: %d, level_intr_times = %d\n", gpio_num, gpio_get_level(gpio_num), level_intr_times); } +#if !WAKE_UP_IGNORE // get result of waking up or not static void sleep_wake_up(void *arg) { @@ -92,7 +96,7 @@ static void trigger_wake_up(void *arg) gpio_set_level(GPIO_OUTPUT_IO, 1); vTaskDelay(100 / portTICK_RATE_MS); } - +#endif static void prompt_to_continue(const char* str) { @@ -465,6 +469,7 @@ TEST_CASE("GPIO repeate call service and isr has no memory leak test","[gpio][te TEST_ASSERT_INT32_WITHIN(size, esp_get_free_heap_size(), 100); } +#if !WAKE_UP_IGNORE //this function development is not completed yet, set it ignored TEST_CASE("GPIO wake up enable and disenable test", "[gpio][ignore]") { @@ -479,6 +484,7 @@ TEST_CASE("GPIO wake up enable and disenable test", "[gpio][ignore]") vTaskDelay(100 / portTICK_RATE_MS); TEST_ASSERT_FALSE(wake_up_result); } +#endif // this case need the resistance to pull up the voltage or pull down the voltage // ignored because the voltage needs to be tested with multimeter