diff --git a/tests/periph/uart_locate_pins/Makefile b/tests/periph/uart_locate_pins/Makefile new file mode 100644 index 0000000000..473992aec1 --- /dev/null +++ b/tests/periph/uart_locate_pins/Makefile @@ -0,0 +1,17 @@ +BOARD ?= nucleo-f767zi + +# This needs to be here so that this app's `soft_uart_params.h` is found used +# of the one in $(RIOTBASE)/drivers/soft_uart/include. +INCLUDES += -I$(abspath $(CURDIR))/include + +include ../Makefile.periph_common + +USEMODULE += soft_uart +USEMODULE += fmt +# we do not need stdio +USEMODULE += stdio_null + +# We do not need multi-threading for this app +DISBALE_MODULE += core_thread + +include $(RIOTBASE)/Makefile.include diff --git a/tests/periph/uart_locate_pins/README.md b/tests/periph/uart_locate_pins/README.md new file mode 100644 index 0000000000..07d94aec01 --- /dev/null +++ b/tests/periph/uart_locate_pins/README.md @@ -0,0 +1,5 @@ +# Utility to locate GPIO pins + +This application bit-bangs the name of every GPIO pin via `soft_uart` on each +GPIO. Connect an UART adapter to one pin at a time configured at symbol rate +of 9600 Bd and check the output to know which pin you are connected to. diff --git a/tests/periph/uart_locate_pins/include/soft_uart_params.h b/tests/periph/uart_locate_pins/include/soft_uart_params.h new file mode 100644 index 0000000000..083bef1892 --- /dev/null +++ b/tests/periph/uart_locate_pins/include/soft_uart_params.h @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2024 Marian Buschsieweke + * + * This file is subject to the terms and conditions of the GNU Lesser + * General Public License v2.1. See the file LICENSE in the top level + * directory for more details. + */ + +/** + * @ingroup tests_periph_uart_locate_pins + * @{ + * + * @file + * @brief Override "soft_uart_params.h" to conserve memory when + * changing the pin configuration + * + * @author Marian Buschsieweke + * + * @} + */ + +#ifndef SOFT_UART_PARAMS_H +#define SOFT_UART_PARAMS_H + +#include "soft_uart.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Sotware UART port descriptor array + */ +extern soft_uart_conf_t soft_uart_config[]; + +#define SOFT_UART_NUMOF 1 + +#ifdef __cplusplus +} +#endif + +#endif /* SOFT_UART_PARAMS_H */ +/** @} */ diff --git a/tests/periph/uart_locate_pins/main.c b/tests/periph/uart_locate_pins/main.c new file mode 100644 index 0000000000..eeed7b9cd2 --- /dev/null +++ b/tests/periph/uart_locate_pins/main.c @@ -0,0 +1,82 @@ +/* + * Copyright (C) 2024 Marian Buschsieweke + * + * This file is subject to the terms and conditions of the GNU Lesser + * General Public License v2.1. See the file LICENSE in the top level + * directory for more details. + */ + +/** + * @ingroup tests + * @defgroup tests_periph_uart_locate_pins + * @{ + * + * @file + * @brief Test application to figure out pin mapping via UART + * + * @author Marian Buschsieweke + * + * @} + */ +#include + +#include "container.h" +#include "fmt.h" +#include "macros/units.h" +#include "periph/gpio.h" +#include "periph/timer.h" +#include "soft_uart.h" + +#ifndef UART_SYMBOL_RATE +# define UART_SYMBOL_RATE 9600 +#endif + +/* Adapt this list of pins to detect as needed. You may want to not use all + * pins, e.g. pins connected to crystals, etc. may not react friendly to be + * used as output */ +static const struct { + uint8_t port_num; + uint8_t pin_num; +} pins[] = { + { + .port_num = 0, + .pin_num = 0, + }, +}; + +soft_uart_conf_t soft_uart_config[] = { + { + .tx_pin = GPIO_UNDEF, + .rx_pin = GPIO_UNDEF, + .tx_timer = TIMER_DEV(0), + .timer_freq = MHZ(1), + }, +}; + +int main(void) +{ + while (1) { + for (unsigned i = 0; i < ARRAY_SIZE(pins); i++) { + gpio_t pin = GPIO_PIN(pins[i].port_num, pins[i].pin_num); + soft_uart_config[0].tx_pin = pin; + soft_uart_init(0, UART_SYMBOL_RATE, NULL, NULL); + static char buf[32]; + char *pos = buf; + *pos++ = 'P'; + pos += fmt_u16_dec(pos, pins[i].port_num); + *pos++ = '.'; + pos += fmt_u16_dec(pos, pins[i].pin_num); + *pos++ = ' '; + *pos++ = '/'; + *pos++ = ' '; + *pos++ = 'P'; + *pos++ = (char)((int)'A' + (int)pins[i].port_num); + pos += fmt_u16_dec(pos, pins[i].pin_num); + *pos++ = '\n'; + + soft_uart_write(0, (void *)buf, (size_t)pos - (size_t)buf); + soft_uart_poweroff(0); + } + } + return 0; +}