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 3a5963f26c..8bd4377013 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 ad70573110..b211fda970 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 d9868820da..2e875fff2a 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 3ce79ec676..5f4547f98c 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 9471a2e0a7..faaaa36c58 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 c07de91ebe..e53cfcf713 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 80de859887..7384316f9f 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 052ca08596..9757e52f6e 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); } } }