From f3c1106c9eba00a0cdf7104b63f29196e976d9e3 Mon Sep 17 00:00:00 2001 From: Benjamin Valentin Date: Sat, 13 Feb 2021 23:37:02 +0100 Subject: [PATCH] cpu/nrf52: add SAUL driver for VDDH sensor --- cpu/nrf52/Makefile.dep | 4 ++ .../saul/init_devs/auto_init_saul_nrf_vddh.c | 62 +++++++++++++++++++ drivers/saul/init_devs/init.c | 4 ++ makefiles/pseudomodules.inc.mk | 1 + 4 files changed, 71 insertions(+) create mode 100644 drivers/saul/init_devs/auto_init_saul_nrf_vddh.c diff --git a/cpu/nrf52/Makefile.dep b/cpu/nrf52/Makefile.dep index b42cbfc6bc..0b74fcdc54 100644 --- a/cpu/nrf52/Makefile.dep +++ b/cpu/nrf52/Makefile.dep @@ -22,5 +22,9 @@ ifneq (,$(filter periph_uart_nonblocking,$(USEMODULE))) USEMODULE += tsrb endif +ifneq (,$(filter saul_nrf_vddh,$(USEMODULE))) + FEATURES_REQUIRED += periph_adc +endif + include $(RIOTCPU)/nrf5x_common/Makefile.dep include $(RIOTCPU)/cortexm_common/Makefile.dep diff --git a/drivers/saul/init_devs/auto_init_saul_nrf_vddh.c b/drivers/saul/init_devs/auto_init_saul_nrf_vddh.c new file mode 100644 index 0000000000..3d939e9c03 --- /dev/null +++ b/drivers/saul/init_devs/auto_init_saul_nrf_vddh.c @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2021 ML!PA Consulting GmbH + * + * 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 internal voltage sensor directly mapped to SAUL reg + * + * @author Benjamin Valentin + * + * @} + */ + +#include "cpu.h" +#include "log.h" +#include "saul_reg.h" +#include "saul/periph.h" +#include "periph/adc.h" + +static int _read_voltage(const void *dev, phydat_t *res) +{ + (void)dev; + + /* GPIO reference voltage / external output supply voltage in high voltage mode */ + const uint8_t vref_deci_volt[] = { 18, 21, 24, 27, 30, 33, 0, 18 }; + uint8_t idx = NRF_UICR->REGOUT0 & UICR_REGOUT0_VOUT_Msk; + + int raw = adc_sample(NRF52_VDDHDIV5, ADC_RES_12BIT) * 5 * vref_deci_volt[idx] * 100; + res->val[0] = raw >> 12; + res->unit = UNIT_V; + res->scale = -3; + + return 1; +} + +static saul_driver_t nrf_vddh_saul_driver = { + .read = _read_voltage, + .write = saul_notsup, + .type = SAUL_SENSE_VOLTAGE, +}; + +void auto_init_nrf_vddh(void) +{ + static saul_reg_t saul_reg_entry = { + .dev = NULL, + .name = "NRF_VDDH", + .driver = &nrf_vddh_saul_driver, + }; + + adc_init(NRF52_VDDHDIV5); + + /* add to registry */ + saul_reg_add(&(saul_reg_entry)); +} diff --git a/drivers/saul/init_devs/init.c b/drivers/saul/init_devs/init.c index bf97cd30ba..186709e131 100644 --- a/drivers/saul/init_devs/init.c +++ b/drivers/saul/init_devs/init.c @@ -43,6 +43,10 @@ void saul_init_devs(void) extern void auto_init_nrf_temperature(void); auto_init_nrf_temperature(); } + if (IS_USED(MODULE_SAUL_NRF_VDDH)) { + extern void auto_init_nrf_vddh(void); + auto_init_nrf_vddh(); + } if (IS_USED(MODULE_AD7746)) { extern void auto_init_ad7746(void); auto_init_ad7746(); diff --git a/makefiles/pseudomodules.inc.mk b/makefiles/pseudomodules.inc.mk index 7359f60862..7cab6a8aa1 100644 --- a/makefiles/pseudomodules.inc.mk +++ b/makefiles/pseudomodules.inc.mk @@ -121,6 +121,7 @@ PSEUDOMODULES += saul_adc PSEUDOMODULES += saul_default PSEUDOMODULES += saul_gpio PSEUDOMODULES += saul_nrf_temperature +PSEUDOMODULES += saul_nrf_vddh PSEUDOMODULES += saul_pwm PSEUDOMODULES += scanf_float PSEUDOMODULES += sched_cb