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
This commit is contained in:
morris
2024-11-07 16:27:55 +08:00
parent ec8de8a1f9
commit a5fee4b8cc
10 changed files with 28 additions and 28 deletions

View File

@ -498,15 +498,15 @@ static inline void gpio_ll_set_level(gpio_dev_t *hw, uint32_t gpio_num, uint32_t
{ {
if (level) { if (level) {
if (gpio_num < 32) { if (gpio_num < 32) {
hw->out_w1ts = (1 << gpio_num); hw->out_w1ts = 1 << gpio_num;
} else { } else {
HAL_FORCE_MODIFY_U32_REG_FIELD(hw->out1_w1ts, data, (1 << (gpio_num - 32))); hw->out1_w1ts.val = 1 << (gpio_num - 32);
} }
} else { } else {
if (gpio_num < 32) { if (gpio_num < 32) {
hw->out_w1tc = (1 << gpio_num); hw->out_w1tc = 1 << gpio_num;
} else { } else {
HAL_FORCE_MODIFY_U32_REG_FIELD(hw->out1_w1tc, data, (1 << (gpio_num - 32))); hw->out1_w1tc.val = 1 << (gpio_num - 32);
} }
} }
} }

View File

@ -330,9 +330,9 @@ __attribute__((always_inline))
static inline void gpio_ll_set_level(gpio_dev_t *hw, uint32_t gpio_num, uint32_t level) static inline void gpio_ll_set_level(gpio_dev_t *hw, uint32_t gpio_num, uint32_t level)
{ {
if (level) { if (level) {
hw->out_w1ts.out_w1ts = (1 << gpio_num); hw->out_w1ts.val = 1 << gpio_num;
} else { } else {
hw->out_w1tc.out_w1tc = (1 << gpio_num); hw->out_w1tc.val = 1 << gpio_num;
} }
} }

View File

@ -339,9 +339,9 @@ __attribute__((always_inline))
static inline void gpio_ll_set_level(gpio_dev_t *hw, uint32_t gpio_num, uint32_t level) static inline void gpio_ll_set_level(gpio_dev_t *hw, uint32_t gpio_num, uint32_t level)
{ {
if (level) { if (level) {
hw->out_w1ts.out_w1ts = (1 << gpio_num); hw->out_w1ts.val = 1 << gpio_num;
} else { } else {
hw->out_w1tc.out_w1tc = (1 << gpio_num); hw->out_w1tc.val = 1 << gpio_num;
} }
} }

View File

@ -360,9 +360,9 @@ __attribute__((always_inline))
static inline void gpio_ll_set_level(gpio_dev_t *hw, uint32_t gpio_num, uint32_t level) static inline void gpio_ll_set_level(gpio_dev_t *hw, uint32_t gpio_num, uint32_t level)
{ {
if (level) { if (level) {
hw->out_w1ts.out_w1ts = (1 << gpio_num); hw->out_w1ts.val = 1 << gpio_num;
} else { } else {
hw->out_w1tc.out_w1tc = (1 << gpio_num); hw->out_w1tc.val = 1 << gpio_num;
} }
} }

View File

@ -332,9 +332,9 @@ __attribute__((always_inline))
static inline void gpio_ll_set_level(gpio_dev_t *hw, uint32_t gpio_num, uint32_t level) static inline void gpio_ll_set_level(gpio_dev_t *hw, uint32_t gpio_num, uint32_t level)
{ {
if (level) { if (level) {
hw->out_w1ts.out_w1ts = (1 << gpio_num); hw->out_w1ts.val = 1 << gpio_num;
} else { } else {
hw->out_w1tc.out_w1tc = (1 << gpio_num); hw->out_w1tc.val = 1 << gpio_num;
} }
} }

View File

@ -356,9 +356,9 @@ __attribute__((always_inline))
static inline void gpio_ll_set_level(gpio_dev_t *hw, uint32_t gpio_num, uint32_t level) static inline void gpio_ll_set_level(gpio_dev_t *hw, uint32_t gpio_num, uint32_t level)
{ {
if (level) { if (level) {
hw->out_w1ts.out_w1ts = (1 << gpio_num); hw->out_w1ts.val = 1 << gpio_num;
} else { } else {
hw->out_w1tc.out_w1tc = (1 << gpio_num); hw->out_w1tc.val = 1 << gpio_num;
} }
} }

View File

@ -377,9 +377,9 @@ __attribute__((always_inline))
static inline void gpio_ll_set_level(gpio_dev_t *hw, gpio_num_t gpio_num, uint32_t level) static inline void gpio_ll_set_level(gpio_dev_t *hw, gpio_num_t gpio_num, uint32_t level)
{ {
if (level) { if (level) {
hw->out_w1ts.out_w1ts = (1 << gpio_num); hw->out_w1ts.val = 1 << gpio_num;
} else { } else {
hw->out_w1tc.out_w1tc = (1 << gpio_num); hw->out_w1tc.val = 1 << gpio_num;
} }
} }

View File

@ -400,15 +400,15 @@ static inline void gpio_ll_set_level(gpio_dev_t *hw, uint32_t gpio_num, uint32_t
{ {
if (level) { if (level) {
if (gpio_num < 32) { if (gpio_num < 32) {
hw->out_w1ts.out_w1ts = (1 << gpio_num); hw->out_w1ts.val = 1 << gpio_num;
} else { } else {
hw->out1_w1ts.out1_w1ts = (1 << (gpio_num - 32)); hw->out1_w1ts.val = 1 << (gpio_num - 32);
} }
} else { } else {
if (gpio_num < 32) { if (gpio_num < 32) {
hw->out_w1tc.out_w1tc = (1 << gpio_num); hw->out_w1tc.val = 1 << gpio_num;
} else { } else {
hw->out1_w1tc.out1_w1tc = (1 << (gpio_num - 32)); hw->out1_w1tc.val = 1 << (gpio_num - 32);
} }
} }
} }

View File

@ -338,15 +338,15 @@ static inline void gpio_ll_set_level(gpio_dev_t *hw, uint32_t gpio_num, uint32_t
{ {
if (level) { if (level) {
if (gpio_num < 32) { if (gpio_num < 32) {
hw->out_w1ts = (1 << gpio_num); hw->out_w1ts = 1 << gpio_num;
} else { } else {
hw->out1_w1ts.data = (1 << (gpio_num - 32)); hw->out1_w1ts.val = 1 << (gpio_num - 32);
} }
} else { } else {
if (gpio_num < 32) { if (gpio_num < 32) {
hw->out_w1tc = (1 << gpio_num); hw->out_w1tc = 1 << gpio_num;
} else { } else {
hw->out1_w1tc.data = (1 << (gpio_num - 32)); hw->out1_w1tc.val = 1 << (gpio_num - 32);
} }
} }
} }

View File

@ -354,15 +354,15 @@ static inline void gpio_ll_set_level(gpio_dev_t *hw, uint32_t gpio_num, uint32_t
{ {
if (level) { if (level) {
if (gpio_num < 32) { if (gpio_num < 32) {
hw->out_w1ts = (1 << gpio_num); hw->out_w1ts = 1 << gpio_num;
} else { } else {
hw->out1_w1ts.data = (1 << (gpio_num - 32)); hw->out1_w1ts.val = 1 << (gpio_num - 32);
} }
} else { } else {
if (gpio_num < 32) { if (gpio_num < 32) {
hw->out_w1tc = (1 << gpio_num); hw->out_w1tc = 1 << gpio_num;
} else { } else {
hw->out1_w1tc.data = (1 << (gpio_num - 32)); hw->out1_w1tc.val = 1 << (gpio_num - 32);
} }
} }
} }