From 9ad6abb081fc75dc8a2bb9faafa57cef09bbf40c Mon Sep 17 00:00:00 2001 From: "Martine S. Lenders" Date: Thu, 21 Nov 2024 13:17:19 +0100 Subject: [PATCH 1/6] saul: initial import of saul_bat_voltage module --- drivers/Makefile.dep | 5 ++ drivers/include/saul/bat_voltage.h | 53 +++++++++++++++ drivers/saul/Makefile | 3 + drivers/saul/bat_voltage_saul.c | 45 +++++++++++++ .../init_devs/auto_init_saul_bat_voltage.c | 66 +++++++++++++++++++ drivers/saul/init_devs/init.c | 4 ++ features.yaml | 2 + makefiles/features_existing.inc.mk | 1 + makefiles/pseudomodules.inc.mk | 1 + 9 files changed, 180 insertions(+) create mode 100644 drivers/include/saul/bat_voltage.h create mode 100644 drivers/saul/bat_voltage_saul.c create mode 100644 drivers/saul/init_devs/auto_init_saul_bat_voltage.c diff --git a/drivers/Makefile.dep b/drivers/Makefile.dep index 35afb62c1fe9..97362cb6fead 100644 --- a/drivers/Makefile.dep +++ b/drivers/Makefile.dep @@ -264,6 +264,11 @@ ifneq (,$(filter ws281x_%,$(USEMODULE))) USEMODULE += ws281x endif +ifneq (,$(filter saul_bat_voltage,$(USEMODULE))) + FEATURES_REQUIRED += periph_adc + FEATURES_REQUIRED += board_bat_voltage +endif + ifneq (,$(filter saul_adc,$(USEMODULE))) FEATURES_REQUIRED += periph_adc endif diff --git a/drivers/include/saul/bat_voltage.h b/drivers/include/saul/bat_voltage.h new file mode 100644 index 000000000000..ff92638ea18b --- /dev/null +++ b/drivers/include/saul/bat_voltage.h @@ -0,0 +1,53 @@ +/* + * Copyright (C) 2024 TU Dresden + * + * 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 drivers_saul + * @{ + * + * @file + * @brief Parameter definitions for mapping battery voltage to SAUL + * + * @author Martine S. Lenders + */ + +#ifndef SAUL_BAT_VOLTAGE_H +#define SAUL_BAT_VOLTAGE_H + +#include + +#include "periph/adc.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief SAUL battery voltage configuration values + */ +typedef struct { + const char *name; /**< name of the device connected to this pin */ + int8_t phydat_scale; /**< Phydat scale of the resulting voltage */ + adc_t line; /**< ADC line to initialize and expose */ + adc_res_t res; /**< ADC resolution */ + /** + * @brief Conversion function to convert raw ADC data to voltage + * + * @param[in] adc_sample The raw ADC sample. + * + * @return Voltage value for phydat. + */ + int16_t (*convert)(int32_t adc_sample); +} saul_bat_voltage_params_t; + +#ifdef __cplusplus +} +#endif + +#endif /* SAUL_BAT_VOLTAGE_H */ +/** @} */ diff --git a/drivers/saul/Makefile b/drivers/saul/Makefile index 0e9946400cc2..e5d9b717dc47 100644 --- a/drivers/saul/Makefile +++ b/drivers/saul/Makefile @@ -3,6 +3,9 @@ SRC = saul.c saul_str.c ifneq (,$(filter saul_gpio,$(USEMODULE))) SRC += gpio_saul.c endif +ifneq (,$(filter saul_bat_voltage,$(USEMODULE))) + SRC += bat_voltage_saul.c +endif ifneq (,$(filter saul_adc,$(USEMODULE))) SRC += adc_saul.c endif diff --git a/drivers/saul/bat_voltage_saul.c b/drivers/saul/bat_voltage_saul.c new file mode 100644 index 000000000000..f28383925194 --- /dev/null +++ b/drivers/saul/bat_voltage_saul.c @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2024 TU Dresden + * + * 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 drivers_saul + * @{ + * + * @file + * @brief SAUL wrapper to gauge battery voltage. + * + * Adafruit Feather-type boards typically have an ADC pin exposed to read + * the battery voltage. + * + * @author Martine S. Lenders + * + * @} + */ + +#include + +#include "saul.h" +#include "saul/bat_voltage.h" +#include "phydat.h" +#include "periph/adc.h" + +static int read_adc(const void *dev, phydat_t *res) +{ + const saul_bat_voltage_params_t *params = *((const saul_bat_voltage_params_t **)dev); + int32_t sample = adc_sample(params->line, params->res); + res->val[0] = params->convert(sample); + res->unit = UNIT_V; + res->scale = params->phydat_scale; + return 1; +} + +const saul_driver_t bat_voltage_saul_driver = { + .read = read_adc, + .write = saul_write_notsup, + .type = SAUL_SENSE_VOLTAGE, +}; diff --git a/drivers/saul/init_devs/auto_init_saul_bat_voltage.c b/drivers/saul/init_devs/auto_init_saul_bat_voltage.c new file mode 100644 index 000000000000..091bef3dfcca --- /dev/null +++ b/drivers/saul/init_devs/auto_init_saul_bat_voltage.c @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2024 TU Dresden + * + * 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 sys_auto_init_saul + * @{ + * + * @file + * @brief Auto initialization of mapping battery voltage to SAUL + * + * @author Martine S. Lenders + * + * @} + */ + +#include "log.h" +#include "saul_reg.h" +#include "saul/bat_voltage.h" +#include "bat_voltage_params.h" + +/** + * @brief Define the number of configured sensors + */ +#define SAUL_BAT_VOLTAGE_NUMOF ARRAY_SIZE(saul_bat_voltage_params) + +/** + * @brief Allocate memory for pointers to the BAT voltage parameter structs + * + * We use this extra level of indirection to be able to keep the saul_bat_voltage_params + * array const and residing in ROM. + */ +static const saul_bat_voltage_params_t *saul_bat_voltages[SAUL_BAT_VOLTAGE_NUMOF]; + +/** + * @brief Memory for the registry entries + */ +static saul_reg_t saul_reg_entries[SAUL_BAT_VOLTAGE_NUMOF]; + +/** + * @brief Reference the driver struct + */ +extern saul_driver_t bat_voltage_saul_driver; + +void auto_init_saul_bat_voltage(void) +{ + for (unsigned i = 0; i < SAUL_BAT_VOLTAGE_NUMOF; i++) { + const saul_bat_voltage_params_t *p = &saul_bat_voltage_params[i]; + saul_bat_voltages[i] = p; + + printf("[auto_init_saul] initializing BAT voltage #%u\n", i); + + saul_reg_entries[i].dev = &saul_bat_voltages[i]; + saul_reg_entries[i].name = p->name; + saul_reg_entries[i].driver = &bat_voltage_saul_driver; + /* initialize the ADC line */ + adc_init(p->line); + /* add to registry */ + saul_reg_add(&(saul_reg_entries[i])); + } +} diff --git a/drivers/saul/init_devs/init.c b/drivers/saul/init_devs/init.c index bfb4d10ead7e..53e39e9698bc 100644 --- a/drivers/saul/init_devs/init.c +++ b/drivers/saul/init_devs/init.c @@ -31,6 +31,10 @@ void saul_init_devs(void) extern void auto_init_saul_adc(void); auto_init_saul_adc(); } + if (IS_USED(MODULE_SAUL_BAT_VOLTAGE)) { + extern void auto_init_saul_bat_voltage(void); + auto_init_saul_bat_voltage(); + } if (IS_USED(MODULE_SAUL_GPIO)) { extern void auto_init_gpio(void); auto_init_gpio(); diff --git a/features.yaml b/features.yaml index f40c454a95f0..ca514dbb3f3f 100644 --- a/features.yaml +++ b/features.yaml @@ -796,6 +796,8 @@ groups: - title: Platform Specific help: Things specific to a single MCU family / MCU vendor features: + - name: board_bat_voltage + help: Measures battery voltage based on ADC sampling. - name: periph_ics help: An NXP Kinetis Internal Clock Source Controller (ICS peripheral) is present. diff --git a/makefiles/features_existing.inc.mk b/makefiles/features_existing.inc.mk index fc1c34926bee..4aecbb59841a 100644 --- a/makefiles/features_existing.inc.mk +++ b/makefiles/features_existing.inc.mk @@ -42,6 +42,7 @@ FEATURES_EXISTING := \ ble_nimble_netif \ ble_phy_2mbit \ ble_phy_coded \ + board_bat_voltage \ bootloader_stm32 \ can_rx_mailbox \ cortexm_fpu \ diff --git a/makefiles/pseudomodules.inc.mk b/makefiles/pseudomodules.inc.mk index c6cb490c27d0..253086ed4d6e 100644 --- a/makefiles/pseudomodules.inc.mk +++ b/makefiles/pseudomodules.inc.mk @@ -374,6 +374,7 @@ PSEUDOMODULES += fortuna_reseed PSEUDOMODULES += riotboot_% PSEUDOMODULES += rtt_cmd PSEUDOMODULES += saul_adc +PSEUDOMODULES += saul_bat_voltage PSEUDOMODULES += saul_default PSEUDOMODULES += saul_gpio PSEUDOMODULES += saul_nrf_temperature From c862ec903947eacbb8f0419ce45237b21cc6935b Mon Sep 17 00:00:00 2001 From: "Martine S. Lenders" Date: Thu, 21 Nov 2024 13:18:13 +0100 Subject: [PATCH 2/6] feather-nrf52840-sense: add support for saul_bat_voltage --- boards/feather-nrf52840-sense/Makefile.dep | 1 + .../feather-nrf52840-sense/Makefile.features | 1 + boards/feather-nrf52840-sense/bat_voltage.c | 35 ++++++++++++ .../include/bat_voltage_params.h | 56 +++++++++++++++++++ 4 files changed, 93 insertions(+) create mode 100644 boards/feather-nrf52840-sense/bat_voltage.c create mode 100644 boards/feather-nrf52840-sense/include/bat_voltage_params.h diff --git a/boards/feather-nrf52840-sense/Makefile.dep b/boards/feather-nrf52840-sense/Makefile.dep index c52f9ec66bc7..d9c149fcf972 100644 --- a/boards/feather-nrf52840-sense/Makefile.dep +++ b/boards/feather-nrf52840-sense/Makefile.dep @@ -4,6 +4,7 @@ ifneq (,$(filter saul_default,$(USEMODULE))) USEMODULE += lis3mdl USEMODULE += lsm6dsxx USEMODULE += saul_gpio + USEMODULE += saul_bat_voltage USEMODULE += sht3x USEMODULE += ws281x endif diff --git a/boards/feather-nrf52840-sense/Makefile.features b/boards/feather-nrf52840-sense/Makefile.features index 1f4969f6d974..2c7233be62b4 100644 --- a/boards/feather-nrf52840-sense/Makefile.features +++ b/boards/feather-nrf52840-sense/Makefile.features @@ -1,6 +1,7 @@ CPU_MODEL = nrf52840xxaa # Put defined MCU peripherals here (in alphabetical order) +FEATURES_PROVIDED += board_bat_voltage FEATURES_PROVIDED += periph_i2c FEATURES_PROVIDED += periph_spi FEATURES_PROVIDED += periph_uart diff --git a/boards/feather-nrf52840-sense/bat_voltage.c b/boards/feather-nrf52840-sense/bat_voltage.c new file mode 100644 index 000000000000..8a0e3440ba23 --- /dev/null +++ b/boards/feather-nrf52840-sense/bat_voltage.c @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2024 TU Dresden + * + * 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 boards_feather-nrf52840 + * @ingroup saul_bat_voltage + * @{ + * @file + * @brief Implementation of battery voltage convert function + * + * @author Martine S. Lenders + * + * @} + */ + +#ifdef MODULE_SAUL_BAT_VOLTAGE +#include "saul/bat_voltage.h" + +int16_t saul_bat_voltage_convert(int32_t adc_sample) +{ + /* See + * https://learn.adafruit.com/introducing-the-adafruit-nrf52840-feather/power-management-2 + * + * but the reference voltage is actually 3.3V (determined empirically)... + * we return in millivolt so we set the reference voltage to 3300 + * instead of 3.3 */ + return (int16_t)((adc_sample * 2L * 3300L) / 1024L); +} + +#endif /* MODULE_SAUL_BAT_VOLTAGE */ diff --git a/boards/feather-nrf52840-sense/include/bat_voltage_params.h b/boards/feather-nrf52840-sense/include/bat_voltage_params.h new file mode 100644 index 000000000000..77ee05c8c2a8 --- /dev/null +++ b/boards/feather-nrf52840-sense/include/bat_voltage_params.h @@ -0,0 +1,56 @@ +/* + * Copyright (C) 2024 TU Dresden + * + * 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 boards_feather-nrf52840-sense + * @{ + * + * @file + * @brief Configuration of SAUL mapped battery voltage information + * + * @author Martine S. Lenders + */ + +#ifndef BAT_VOLTAGE_PARAMS_H +#define BAT_VOLTAGE_PARAMS_H + +#include "saul/bat_voltage.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Conversion function to convert ADC sample to battery voltage + * + * @param[in] adc_sample The raw ADC sample. + * + * @return Voltage value for phydat. + */ +int16_t saul_bat_voltage_convert(int32_t adc_sample); + +/** + * @brief Battery voltage configuration + */ +static const saul_bat_voltage_params_t saul_bat_voltage_params[] = +{ + { + .name = "BAT", + .phydat_scale = -3, + .line = ADC_LINE(5), + .res = ADC_RES_10BIT, + .convert = saul_bat_voltage_convert, + }, +}; + +#ifdef __cplusplus +} +#endif + +#endif /* BAT_VOLTAGE_PARAMS_H */ +/** @} */ From 7698aca566e2fc465733a6027209fcfa126d71dd Mon Sep 17 00:00:00 2001 From: "Martine S. Lenders" Date: Thu, 21 Nov 2024 13:20:53 +0100 Subject: [PATCH 3/6] feather-nrf52840: add support for saul_bat_voltage --- boards/feather-nrf52840/Makefile.dep | 1 + boards/feather-nrf52840/Makefile.features | 1 + boards/feather-nrf52840/bat_voltage.c | 35 ++++++++++++ .../include/bat_voltage_params.h | 56 +++++++++++++++++++ 4 files changed, 93 insertions(+) create mode 100644 boards/feather-nrf52840/bat_voltage.c create mode 100644 boards/feather-nrf52840/include/bat_voltage_params.h diff --git a/boards/feather-nrf52840/Makefile.dep b/boards/feather-nrf52840/Makefile.dep index 8e0754d06dba..8bd26bc979d5 100644 --- a/boards/feather-nrf52840/Makefile.dep +++ b/boards/feather-nrf52840/Makefile.dep @@ -1,5 +1,6 @@ ifneq (,$(filter saul_default,$(USEMODULE))) USEMODULE += saul_gpio + USEMODULE += saul_bat_voltage USEMODULE += ws281x endif diff --git a/boards/feather-nrf52840/Makefile.features b/boards/feather-nrf52840/Makefile.features index 1f4969f6d974..2c7233be62b4 100644 --- a/boards/feather-nrf52840/Makefile.features +++ b/boards/feather-nrf52840/Makefile.features @@ -1,6 +1,7 @@ CPU_MODEL = nrf52840xxaa # Put defined MCU peripherals here (in alphabetical order) +FEATURES_PROVIDED += board_bat_voltage FEATURES_PROVIDED += periph_i2c FEATURES_PROVIDED += periph_spi FEATURES_PROVIDED += periph_uart diff --git a/boards/feather-nrf52840/bat_voltage.c b/boards/feather-nrf52840/bat_voltage.c new file mode 100644 index 000000000000..8a0e3440ba23 --- /dev/null +++ b/boards/feather-nrf52840/bat_voltage.c @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2024 TU Dresden + * + * 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 boards_feather-nrf52840 + * @ingroup saul_bat_voltage + * @{ + * @file + * @brief Implementation of battery voltage convert function + * + * @author Martine S. Lenders + * + * @} + */ + +#ifdef MODULE_SAUL_BAT_VOLTAGE +#include "saul/bat_voltage.h" + +int16_t saul_bat_voltage_convert(int32_t adc_sample) +{ + /* See + * https://learn.adafruit.com/introducing-the-adafruit-nrf52840-feather/power-management-2 + * + * but the reference voltage is actually 3.3V (determined empirically)... + * we return in millivolt so we set the reference voltage to 3300 + * instead of 3.3 */ + return (int16_t)((adc_sample * 2L * 3300L) / 1024L); +} + +#endif /* MODULE_SAUL_BAT_VOLTAGE */ diff --git a/boards/feather-nrf52840/include/bat_voltage_params.h b/boards/feather-nrf52840/include/bat_voltage_params.h new file mode 100644 index 000000000000..3f4532e2d48d --- /dev/null +++ b/boards/feather-nrf52840/include/bat_voltage_params.h @@ -0,0 +1,56 @@ +/* + * Copyright (C) 2024 TU Dresden + * + * 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 boards_feather-nrf52840 + * @{ + * + * @file + * @brief Configuration of SAUL mapped battery voltage information + * + * @author Martine S. Lenders + */ + +#ifndef BAT_VOLTAGE_PARAMS_H +#define BAT_VOLTAGE_PARAMS_H + +#include "saul/bat_voltage.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Conversion function to convert ADC sample to battery voltage + * + * @param[in] adc_sample The raw ADC sample. + * + * @return Voltage value for phydat. + */ +int16_t saul_bat_voltage_convert(int32_t adc_sample); + +/** + * @brief Battery voltage configuration + */ +static const saul_bat_voltage_params_t saul_bat_voltage_params[] = +{ + { + .name = "BAT", + .phydat_scale = -3, + .line = ADC_LINE(5), + .res = ADC_RES_10BIT, + .convert = saul_bat_voltage_convert, + }, +}; + +#ifdef __cplusplus +} +#endif + +#endif /* BAT_VOLTAGE_PARAMS_H */ +/** @} */ From d892c2cc8f180a561a0daa93e12d2e821c889580 Mon Sep 17 00:00:00 2001 From: "Martine S. Lenders" Date: Thu, 21 Nov 2024 13:29:21 +0100 Subject: [PATCH 4/6] common/particle-mesh: add support for saul_bat_voltage --- boards/common/particle-mesh/Makefile.dep | 1 + boards/common/particle-mesh/Makefile.features | 1 + boards/common/particle-mesh/bat_voltage.c | 31 ++++++++++ .../include/bat_voltage_params.h | 56 +++++++++++++++++++ 4 files changed, 89 insertions(+) create mode 100644 boards/common/particle-mesh/bat_voltage.c create mode 100644 boards/common/particle-mesh/include/bat_voltage_params.h diff --git a/boards/common/particle-mesh/Makefile.dep b/boards/common/particle-mesh/Makefile.dep index c5047b30c17f..158a72ecdf40 100644 --- a/boards/common/particle-mesh/Makefile.dep +++ b/boards/common/particle-mesh/Makefile.dep @@ -1,5 +1,6 @@ ifneq (,$(filter saul_default,$(USEMODULE))) USEMODULE += saul_gpio + USEMODULE += saul_bat_voltage USEMODULE += saul_pwm endif diff --git a/boards/common/particle-mesh/Makefile.features b/boards/common/particle-mesh/Makefile.features index f8ac8aa3c339..f622beb887a6 100644 --- a/boards/common/particle-mesh/Makefile.features +++ b/boards/common/particle-mesh/Makefile.features @@ -1,6 +1,7 @@ CPU_MODEL = nrf52840xxaa # Put defined MCU peripherals here (in alphabetical order) +FEATURES_PROVIDED += board_bat_voltage FEATURES_PROVIDED += periph_i2c FEATURES_PROVIDED += periph_pwm FEATURES_PROVIDED += periph_spi diff --git a/boards/common/particle-mesh/bat_voltage.c b/boards/common/particle-mesh/bat_voltage.c new file mode 100644 index 000000000000..a9626036c2e5 --- /dev/null +++ b/boards/common/particle-mesh/bat_voltage.c @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2024 TU Dresden + * + * 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 boards_feather-nrf52840 + * @ingroup saul_bat_voltage + * @{ + * @file + * @brief Implementation of battery voltage convert function + * + * @author Martine S. Lenders + * + * @} + */ + +#ifdef MODULE_SAUL_BAT_VOLTAGE +#include "saul/bat_voltage.h" + +int16_t saul_bat_voltage_convert(int32_t adc_sample) +{ + /* See https://community.particle.io/t/can-argon-or-xenon-read-the-battery-state/45554/6 + * and https://docs.particle.io/assets/images/xenon/schematic-main.png */ + return (int16_t)((adc_sample * 33L * 1403L) / 10000L); +} + +#endif /* MODULE_SAUL_BAT_VOLTAGE */ diff --git a/boards/common/particle-mesh/include/bat_voltage_params.h b/boards/common/particle-mesh/include/bat_voltage_params.h new file mode 100644 index 000000000000..ed48cdeabd79 --- /dev/null +++ b/boards/common/particle-mesh/include/bat_voltage_params.h @@ -0,0 +1,56 @@ +/* + * Copyright (C) 2024 TU Dresden + * + * 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 boards_common_particle-mesh + * @{ + * + * @file + * @brief Configuration of SAUL mapped battery voltage information + * + * @author Martine S. Lenders + */ + +#ifndef BAT_VOLTAGE_PARAMS_H +#define BAT_VOLTAGE_PARAMS_H + +#include "saul/bat_voltage.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Conversion function to convert ADC sample to battery voltage + * + * @param[in] adc_sample The raw ADC sample. + * + * @return Voltage value for phydat. + */ +int16_t saul_bat_voltage_convert(int32_t adc_sample); + +/** + * @brief Battery voltage configuration + */ +static const saul_bat_voltage_params_t saul_bat_voltage_params[] = +{ + { + .name = "BAT", + .phydat_scale = -3, + .line = ADC_LINE(3), + .res = ADC_RES_10BIT, + .convert = saul_bat_voltage_convert, + }, +}; + +#ifdef __cplusplus +} +#endif + +#endif /* BAT_VOLTAGE_PARAMS_H */ +/** @} */ From c39b69759d679d80ffb36f1f288a620da6320d10 Mon Sep 17 00:00:00 2001 From: Martine Lenders Date: Fri, 29 Nov 2024 12:32:13 +0100 Subject: [PATCH 5/6] features_yaml2mx: make feature list page easily linkable from doc --- dist/tools/features_yaml2mx/features_yaml2mx.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/tools/features_yaml2mx/features_yaml2mx.py b/dist/tools/features_yaml2mx/features_yaml2mx.py index 14f15c5e65ca..104e05dcaa10 100755 --- a/dist/tools/features_yaml2mx/features_yaml2mx.py +++ b/dist/tools/features_yaml2mx/features_yaml2mx.py @@ -103,7 +103,7 @@ def write_mdfile(outfile, yaml_path, parsed): :type parsed: dict """ outfile.write(f"""\ -# List of Features (Features as Build System Enties) +# List of Features (Features as Build System Enties) {{#feature-list}}