Skip to content

Commit

Permalink
Merge pull request #21008 from maribu/backport/2024.10/cpu/sam0_commo…
Browse files Browse the repository at this point in the history
…n/gpio_ll/fix-gpio_get_port

cpu/sam0_common/periph_gpio_ll: fix gpio_get_port() and gpio_ll_query_conf() [backport 2024.10]
  • Loading branch information
benpicco authored Nov 19, 2024
2 parents 660a3e6 + 779aaed commit 88e6a42
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 2 deletions.
10 changes: 9 additions & 1 deletion cpu/sam0_common/include/gpio_ll_arch.h
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,15 @@ static inline void gpio_ll_switch_dir_input(gpio_port_t port, uword_t inputs)

static inline gpio_port_t gpio_get_port(gpio_t pin)
{
return (gpio_port_t)(pin & ~(0x1f));
/* GPIO LL and legacy GPIO API may disagree on what is the GPIO base
* address if one is using the IOBUS and the other is using the APB for
* access. In this case, we need to do impedance matching by adding the
* offset. */
const uintptr_t gpio_ll_base = GPIO_PORT_0;
const uintptr_t gpio_legacy_base = GPIO_PIN(0, 0) & ~(0x1f);
uintptr_t addr = (pin & ~(0x1f));

return addr + (gpio_ll_base - gpio_legacy_base);
}

static inline uint8_t gpio_get_pin_num(gpio_t pin)
Expand Down
7 changes: 6 additions & 1 deletion cpu/sam0_common/periph/gpio_ll.c
Original file line number Diff line number Diff line change
Expand Up @@ -204,7 +204,12 @@ gpio_conf_t gpio_ll_query_conf(gpio_port_t port, uint8_t pin)
}
}

result.initial_value = iobus->OUT.reg & pin_mask;
if (result.state == GPIO_INPUT) {
result.initial_value = (gpio_ll_read(port) >> pin) & 1UL;
}
else {
result.initial_value = (gpio_ll_read_output(port) >> pin) & 1UL;
}

return result;
}
Expand Down

0 comments on commit 88e6a42

Please sign in to comment.