From 9fba786b4714fc4ba35b049ada1427a081c0e896 Mon Sep 17 00:00:00 2001 From: morris Date: Thu, 7 Nov 2024 16:27:55 +0800 Subject: [PATCH] fix(gpio): improve set level performance by avoid "read-modify-write" operation. The registers designed to be write only. Related to https://github.com/espressif/esp-idf/issues/14674 --- components/hal/esp32/include/hal/gpio_ll.h | 8 ++++---- components/hal/esp32c2/include/hal/gpio_ll.h | 4 ++-- components/hal/esp32c3/include/hal/gpio_ll.h | 4 ++-- components/hal/esp32c6/include/hal/gpio_ll.h | 4 ++-- components/hal/esp32h2/include/hal/gpio_ll.h | 4 ++-- components/hal/esp32p4/include/hal/gpio_ll.h | 8 ++++---- components/hal/esp32s2/include/hal/gpio_ll.h | 8 ++++---- components/hal/esp32s3/include/hal/gpio_ll.h | 8 ++++---- 8 files changed, 24 insertions(+), 24 deletions(-) diff --git a/components/hal/esp32/include/hal/gpio_ll.h b/components/hal/esp32/include/hal/gpio_ll.h index 3a5963f26ce..8bd43770130 100644 --- a/components/hal/esp32/include/hal/gpio_ll.h +++ b/components/hal/esp32/include/hal/gpio_ll.h @@ -483,15 +483,15 @@ static inline void gpio_ll_set_level(gpio_dev_t *hw, uint32_t gpio_num, uint32_t { if (level) { if (gpio_num < 32) { - hw->out_w1ts = (1 << gpio_num); + hw->out_w1ts = 1 << gpio_num; } else { - HAL_FORCE_MODIFY_U32_REG_FIELD(hw->out1_w1ts, data, (1 << (gpio_num - 32))); + hw->out1_w1ts.val = 1 << (gpio_num - 32); } } else { if (gpio_num < 32) { - hw->out_w1tc = (1 << gpio_num); + hw->out_w1tc = 1 << gpio_num; } else { - HAL_FORCE_MODIFY_U32_REG_FIELD(hw->out1_w1tc, data, (1 << (gpio_num - 32))); + hw->out1_w1tc.val = 1 << (gpio_num - 32); } } } diff --git a/components/hal/esp32c2/include/hal/gpio_ll.h b/components/hal/esp32c2/include/hal/gpio_ll.h index ad705731104..b211fda9700 100644 --- a/components/hal/esp32c2/include/hal/gpio_ll.h +++ b/components/hal/esp32c2/include/hal/gpio_ll.h @@ -314,9 +314,9 @@ __attribute__((always_inline)) static inline void gpio_ll_set_level(gpio_dev_t *hw, uint32_t gpio_num, uint32_t level) { if (level) { - hw->out_w1ts.out_w1ts = (1 << gpio_num); + hw->out_w1ts.val = 1 << gpio_num; } else { - hw->out_w1tc.out_w1tc = (1 << gpio_num); + hw->out_w1tc.val = 1 << gpio_num; } } diff --git a/components/hal/esp32c3/include/hal/gpio_ll.h b/components/hal/esp32c3/include/hal/gpio_ll.h index d9868820dad..2e875fff2ad 100644 --- a/components/hal/esp32c3/include/hal/gpio_ll.h +++ b/components/hal/esp32c3/include/hal/gpio_ll.h @@ -326,9 +326,9 @@ __attribute__((always_inline)) static inline void gpio_ll_set_level(gpio_dev_t *hw, uint32_t gpio_num, uint32_t level) { if (level) { - hw->out_w1ts.out_w1ts = (1 << gpio_num); + hw->out_w1ts.val = 1 << gpio_num; } else { - hw->out_w1tc.out_w1tc = (1 << gpio_num); + hw->out_w1tc.val = 1 << gpio_num; } } diff --git a/components/hal/esp32c6/include/hal/gpio_ll.h b/components/hal/esp32c6/include/hal/gpio_ll.h index 3ce79ec6760..5f4547f98c4 100644 --- a/components/hal/esp32c6/include/hal/gpio_ll.h +++ b/components/hal/esp32c6/include/hal/gpio_ll.h @@ -320,9 +320,9 @@ __attribute__((always_inline)) static inline void gpio_ll_set_level(gpio_dev_t *hw, uint32_t gpio_num, uint32_t level) { if (level) { - hw->out_w1ts.out_w1ts = (1 << gpio_num); + hw->out_w1ts.val = 1 << gpio_num; } else { - hw->out_w1tc.out_w1tc = (1 << gpio_num); + hw->out_w1tc.val = 1 << gpio_num; } } diff --git a/components/hal/esp32h2/include/hal/gpio_ll.h b/components/hal/esp32h2/include/hal/gpio_ll.h index 9471a2e0a7c..faaaa36c587 100644 --- a/components/hal/esp32h2/include/hal/gpio_ll.h +++ b/components/hal/esp32h2/include/hal/gpio_ll.h @@ -363,9 +363,9 @@ __attribute__((always_inline)) static inline void gpio_ll_set_level(gpio_dev_t *hw, gpio_num_t gpio_num, uint32_t level) { if (level) { - hw->out_w1ts.out_w1ts = (1 << gpio_num); + hw->out_w1ts.val = 1 << gpio_num; } else { - hw->out_w1tc.out_w1tc = (1 << gpio_num); + hw->out_w1tc.val = 1 << gpio_num; } } diff --git a/components/hal/esp32p4/include/hal/gpio_ll.h b/components/hal/esp32p4/include/hal/gpio_ll.h index c07de91ebef..e53cfcf7131 100644 --- a/components/hal/esp32p4/include/hal/gpio_ll.h +++ b/components/hal/esp32p4/include/hal/gpio_ll.h @@ -386,15 +386,15 @@ static inline void gpio_ll_set_level(gpio_dev_t *hw, uint32_t gpio_num, uint32_t { if (level) { if (gpio_num < 32) { - hw->out_w1ts.out_w1ts = (1 << gpio_num); + hw->out_w1ts.val = 1 << gpio_num; } else { - hw->out1_w1ts.out1_w1ts = (1 << (gpio_num - 32)); + hw->out1_w1ts.val = 1 << (gpio_num - 32); } } else { if (gpio_num < 32) { - hw->out_w1tc.out_w1tc = (1 << gpio_num); + hw->out_w1tc.val = 1 << gpio_num; } else { - hw->out1_w1tc.out1_w1tc = (1 << (gpio_num - 32)); + hw->out1_w1tc.val = 1 << (gpio_num - 32); } } } diff --git a/components/hal/esp32s2/include/hal/gpio_ll.h b/components/hal/esp32s2/include/hal/gpio_ll.h index 80de8598877..7384316f9f9 100644 --- a/components/hal/esp32s2/include/hal/gpio_ll.h +++ b/components/hal/esp32s2/include/hal/gpio_ll.h @@ -326,15 +326,15 @@ static inline void gpio_ll_set_level(gpio_dev_t *hw, uint32_t gpio_num, uint32_t { if (level) { if (gpio_num < 32) { - hw->out_w1ts = (1 << gpio_num); + hw->out_w1ts = 1 << gpio_num; } else { - hw->out1_w1ts.data = (1 << (gpio_num - 32)); + hw->out1_w1ts.val = 1 << (gpio_num - 32); } } else { if (gpio_num < 32) { - hw->out_w1tc = (1 << gpio_num); + hw->out_w1tc = 1 << gpio_num; } else { - hw->out1_w1tc.data = (1 << (gpio_num - 32)); + hw->out1_w1tc.val = 1 << (gpio_num - 32); } } } diff --git a/components/hal/esp32s3/include/hal/gpio_ll.h b/components/hal/esp32s3/include/hal/gpio_ll.h index 052ca08596c..9757e52f6e8 100644 --- a/components/hal/esp32s3/include/hal/gpio_ll.h +++ b/components/hal/esp32s3/include/hal/gpio_ll.h @@ -342,15 +342,15 @@ static inline void gpio_ll_set_level(gpio_dev_t *hw, uint32_t gpio_num, uint32_t { if (level) { if (gpio_num < 32) { - hw->out_w1ts = (1 << gpio_num); + hw->out_w1ts = 1 << gpio_num; } else { - hw->out1_w1ts.data = (1 << (gpio_num - 32)); + hw->out1_w1ts.val = 1 << (gpio_num - 32); } } else { if (gpio_num < 32) { - hw->out_w1tc = (1 << gpio_num); + hw->out_w1tc = 1 << gpio_num; } else { - hw->out1_w1tc.data = (1 << (gpio_num - 32)); + hw->out1_w1tc.val = 1 << (gpio_num - 32); } } }