This is an automated email from the ASF dual-hosted git repository. xiaoxiang pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/nuttx.git
commit 929f9ccfa295b8c2975d059f6001eb80cfa012ca Author: Eren Terzioglu <[email protected]> AuthorDate: Fri Oct 4 16:26:31 2024 +0300 esp32[c3|c6|h2]: Add UORB support for internal temperature sensor --- arch/risc-v/src/common/espressif/Kconfig | 13 ++ .../src/common/espressif/esp_temperature_sensor.c | 242 ++++++++++++++++++--- .../configs/temperature_sensor/defconfig | 50 +++++ .../configs/temperature_sensor/defconfig | 52 +++++ .../configs/temperature_sensor/defconfig | 51 +++++ 5 files changed, 380 insertions(+), 28 deletions(-) diff --git a/arch/risc-v/src/common/espressif/Kconfig b/arch/risc-v/src/common/espressif/Kconfig index de91632e4a..0b1c7c5540 100644 --- a/arch/risc-v/src/common/espressif/Kconfig +++ b/arch/risc-v/src/common/espressif/Kconfig @@ -1779,10 +1779,23 @@ endmenu # ESPRESSIF_BROWNOUT_DET menu "Internal Temperature Sensor Configuration" depends on ESPRESSIF_TEMP +config ESPRESSIF_TEMP_UORB + bool "Internal Temperature Sensor UORB Interface" + default n + ---help--- + Enables work with the UORB or Character Device interface. + If not set, the Character Device is used by default. + config ESPRESSIF_TEMP_PATH string "Internal Temperature Sensor Path" + depends on !ESPRESSIF_TEMP_UORB default "dev/temp" +config ESPRESSIF_TEMP_PATH_DEVNO + int "Internal Temperature Sensor Path Device Number" + depends on ESPRESSIF_TEMP_UORB + default 0 + endmenu # ESPRESSIF_TEMP endif # ARCH_CHIP_ESPRESSIF diff --git a/arch/risc-v/src/common/espressif/esp_temperature_sensor.c b/arch/risc-v/src/common/espressif/esp_temperature_sensor.c index 214c752c41..246f15bd1c 100644 --- a/arch/risc-v/src/common/espressif/esp_temperature_sensor.c +++ b/arch/risc-v/src/common/espressif/esp_temperature_sensor.c @@ -23,6 +23,7 @@ ****************************************************************************/ #include <nuttx/config.h> +#include <nuttx/nuttx.h> #ifdef CONFIG_ESPRESSIF_TEMP #include <stdio.h> @@ -42,6 +43,9 @@ #include <nuttx/can/can.h> #include <nuttx/signal.h> #include <nuttx/arch.h> +#ifdef CONFIG_ESPRESSIF_TEMP_UORB +#include <nuttx/sensors/sensor.h> +#endif #include "riscv_internal.h" #include "espressif/esp_temperature_sensor.h" @@ -63,6 +67,8 @@ * Pre-processor Definitions ****************************************************************************/ +#define ESP_TEMP_MIN_INTERVAL 30000 + /**************************************************************************** * Private Types ****************************************************************************/ @@ -79,14 +85,19 @@ enum esp_tempstate_e struct esp_temp_priv_s { +#ifndef CONFIG_ESPRESSIF_TEMP_UORB const struct file_operations *ops; /* Standard file operations */ +#endif const temperature_sensor_attribute_t *tsens_attribute; /* Attribute struct of the common layer */ struct esp_temp_sensor_config_t cfg; /* Configuration struct of the common layer */ temperature_sensor_clk_src_t clk_src; /* Clock source to use */ int module; /* Peripheral module */ int refs; /* Reference count */ mutex_t lock; /* Mutual exclusion mutex */ - +#ifdef CONFIG_ESPRESSIF_TEMP_UORB + struct sensor_lowerhalf_s lower; /* Lower half sensor driver. */ + uint32_t interval; /* Sensor acquisition interval. */ +#endif /* Temperature sensor work state (see enum esp_tempstate_e) */ volatile enum esp_tempstate_e tempstate; @@ -110,9 +121,25 @@ static void esp_temp_sensor_register(struct esp_temp_priv_s *priv); static int esp_temperature_sensor_install(struct esp_temp_priv_s *priv, struct esp_temp_sensor_config_t cfg); static void esp_temperature_sensor_uninstall(struct esp_temp_priv_s *priv); -static int esp_temperature_sensor_get_celsius(struct file *filep, - char *buffer, - size_t buflen); +static int esp_temperature_sensor_get_celsius(struct esp_temp_priv_s *priv, + int *buffer); +#ifdef CONFIG_ESPRESSIF_TEMP_UORB +static int esp_temperature_sensor_set_interval( + struct sensor_lowerhalf_s *lower, + struct file *filep, + uint32_t *period_us); +static int esp_temperature_sensor_activate( + struct sensor_lowerhalf_s *lower, + struct file *filep, + bool enable); +static int esp_temperature_sensor_fetch(struct sensor_lowerhalf_s *lower, + struct file *filep, + char *buffer, size_t buflen); +#else +static int esp_temperature_sensor_read(struct file *filep, + char *buffer, + size_t buflen); +#endif /* CONFIG_ESPRESSIF_TEMP_UORB */ /**************************************************************************** * Private Data @@ -120,17 +147,28 @@ static int esp_temperature_sensor_get_celsius(struct file *filep, static float g_delta_t = NAN; +#ifndef CONFIG_ESPRESSIF_TEMP_UORB static const struct file_operations g_esp_temp_sensor_fops = { NULL, /* open */ NULL, /* close */ - esp_temperature_sensor_get_celsius, /* read */ + esp_temperature_sensor_read, /* read */ NULL, /* write */ }; +#else +static const struct sensor_ops_s g_esp_temp_sensor_sops = +{ + .activate = esp_temperature_sensor_activate, /* Enable/disable sensor. */ + .fetch = esp_temperature_sensor_fetch, + .set_interval = esp_temperature_sensor_set_interval, /* Set output data period. */ +}; +#endif /* CONFIG_ESPRESSIF_TEMP_UORB */ struct esp_temp_priv_s esp_temp_priv = { +#ifndef CONFIG_ESPRESSIF_TEMP_UORB .ops = &g_esp_temp_sensor_fops, +#endif .tsens_attribute = NULL, .cfg = { @@ -140,6 +178,13 @@ struct esp_temp_priv_s esp_temp_priv = .module = PERIPH_TEMPSENSOR_MODULE, .refs = 0, .lock = NXMUTEX_INITIALIZER, +#ifdef CONFIG_ESPRESSIF_TEMP_UORB + .lower = + { + 0 + }, + .interval = ESP_TEMP_MIN_INTERVAL, +#endif .tempstate = 0, }; @@ -230,7 +275,7 @@ static int temperature_sensor_choose_best_range(struct esp_temp_priv_s *priv) if (priv->tsens_attribute == NULL) { - syslog(LOG_ERR, "Out of testing range"); + snerr("Out of testing range"); return ERROR; } @@ -256,12 +301,12 @@ static int temperature_sensor_read_delta_t(void) { if (esp_efuse_rtc_calib_get_tsens_val(&g_delta_t) != OK) { - syslog(LOG_WARNING, "Calibration failed"); + snwarn("Calibration failed"); g_delta_t = 0; return ERROR; } - syslog(LOG_INFO, "delta_T = %f", g_delta_t); + sninfo("delta_T = %f", g_delta_t); return OK; } @@ -340,8 +385,7 @@ static void esp_temperature_sensor_disable(struct esp_temp_priv_s *priv) * Name: esp_temp_sensor_register * * Description: - * This function registers the internal temperature sensor to - * /dev/temp driver. + * This function registers the internal temperature sensor. * * Input Parameters: * priv - Pointer to the internal driver state structure. @@ -353,8 +397,12 @@ static void esp_temperature_sensor_disable(struct esp_temp_priv_s *priv) static void esp_temp_sensor_register(struct esp_temp_priv_s *priv) { +#ifndef CONFIG_ESPRESSIF_TEMP_UORB register_driver(CONFIG_ESPRESSIF_TEMP_PATH, &g_esp_temp_sensor_fops, 0666, priv); +#else + sensor_register(&priv->lower, CONFIG_ESPRESSIF_TEMP_PATH_DEVNO); +#endif /* CONFIG_ESPRESSIF_TEMP_UORB */ } /**************************************************************************** @@ -365,7 +413,7 @@ static void esp_temp_sensor_register(struct esp_temp_priv_s *priv) * * Input Parameters: * priv - Pointer to the internal driver state structure. - * cfg - Configuration of measurement range for the temperature sensor + * cfg - Configuration of measurement range for the temperature sensor * * Returned Value: * Returns OK on success; a negated errno value on failure @@ -382,7 +430,7 @@ static int esp_temperature_sensor_install(struct esp_temp_priv_s *priv, ret = temperature_sensor_attribute_table_sort(); if (ret < 0) { - syslog(LOG_ERR, "Table sort failed"); + snerr("Table sort failed"); goto err; } @@ -391,7 +439,7 @@ static int esp_temperature_sensor_install(struct esp_temp_priv_s *priv, ret = temperature_sensor_choose_best_range(priv); if (ret < 0) { - syslog(LOG_ERR, "Cannot select the correct range"); + snerr("Cannot select the correct range"); goto err; } @@ -435,40 +483,36 @@ static void esp_temperature_sensor_uninstall(struct esp_temp_priv_s *priv) * Read temperature sensor data that is converted to degrees Celsius. * * Input Parameters: - * filep - The pointer of file, represents each user using the sensor + * priv - Pointer to the internal driver state structure. * buffer - Buffer to save temperature sensor value in degrees Celsius - * buflen - Length of the buffer * * Returned Value: * Returns OK on success; a negated errno value on failure * ****************************************************************************/ -static int esp_temperature_sensor_get_celsius(struct file *filep, - char *buffer, - size_t buflen) +static int esp_temperature_sensor_get_celsius(struct esp_temp_priv_s *priv, + int *buffer) { uint32_t tsens_out; - struct inode *inode = filep->f_inode; - struct esp_temp_priv_s *priv = inode->i_private; - int *out = (int *)buffer; + float *out = (float *)buffer; nxmutex_lock(&priv->lock); if (priv == NULL) { - syslog(LOG_WARNING, "Temperature sensor has not been installed"); + snwarn("Temperature sensor has not been installed"); goto err; } esp_temperature_sensor_enable(priv); if (priv->tempstate != TEMP_SENSOR_ENABLE) { - syslog(LOG_WARNING, "Temperature sensor not enabled"); + snwarn("Temperature sensor not enabled"); goto err; } tsens_out = temperature_sensor_ll_get_raw_value(); - syslog(LOG_INFO, "Temperature sensor raw value: %ld", tsens_out); + sninfo("Temperature sensor raw value: %ld", tsens_out); *out = temperature_sensor_parse_raw_value(tsens_out, priv->tsens_attribute->offset); @@ -477,7 +521,7 @@ static int esp_temperature_sensor_get_celsius(struct file *filep, if (*out < priv->tsens_attribute->range_min || *out > priv->tsens_attribute->range_max) { - syslog(LOG_WARNING, "Temperature sensor value is out of range"); + snwarn("Temperature sensor value is out of range"); goto err; } @@ -489,6 +533,142 @@ err: return ERROR; } +#ifndef CONFIG_ESPRESSIF_TEMP_UORB +/**************************************************************************** + * Name: esp_temperature_sensor_read + * + * Description: + * Read temperature sensor data that is converted to degrees Celsius. + * + * Input Parameters: + * filep - The pointer of file, represents each user using the sensor + * buffer - Buffer to save temperature sensor value in degrees Celsius + * buflen - Length of the buffer + * + * Returned Value: + * Returns OK on success; a negated errno value on failure + * + ****************************************************************************/ + +static int esp_temperature_sensor_read(struct file *filep, + char *buffer, + size_t buflen) +{ + struct inode *inode = filep->f_inode; + struct esp_temp_priv_s *priv = inode->i_private; + + return esp_temperature_sensor_get_celsius(priv, (int *)buffer); +} +#else +static int esp_temperature_sensor_fetch(struct sensor_lowerhalf_s *lower, + struct file *filep, + char *buffer, size_t buflen) +{ + struct esp_temp_priv_s *priv = + container_of (lower, struct esp_temp_priv_s, lower); + + int ret; + struct sensor_temp temp; + float val = 0.0; + + if (buflen != sizeof(temp)) + { + return -EINVAL; + } + + esp_temperature_sensor_get_celsius(priv, (int *)&val); + sninfo("temp = %d\n", (int)val); + + temp.timestamp = sensor_get_timestamp(); + temp.temperature = (int)val; + + memcpy(buffer, &temp, sizeof(temp)); + + return buflen; +} + +/**************************************************************************** + * Name: esp_temperature_sensor_set_interval + * + * Description: + * Set the sensor output data period in microseconds for a given sensor. + * If *period_us < min_delay it will be replaced by min_delay. + * + * Input Parameters: + * lower - The instance of lower half sensor driver. + * filep - The pointer of file, represents each user using the sensor. + * period_us - The time between report data, in us. It may by overwrite + * by lower half driver. + * + * Returned Value: + * Return OK(0) if the driver was success; A negated errno + * value is returned on any failure. + * + ****************************************************************************/ + +static int esp_temperature_sensor_set_interval( + struct sensor_lowerhalf_s *lower, + struct file *filep, + uint32_t *period_us) +{ + struct esp_temp_priv_s *priv = (struct esp_temp_priv_s *)lower; + + if (*period_us < ESP_TEMP_MIN_INTERVAL) + { + priv->interval = ESP_TEMP_MIN_INTERVAL; + *period_us = priv->interval; + } + else + { + priv->interval = *period_us; + } + + return OK; +} + +/**************************************************************************** + * Name: esp_temperature_sensor_activate + * + * Description: + * Enable or disable sensor device. when enable sensor, sensor will + * work in current mode(if not set, use default mode). when disable + * sensor, it will disable sense path and stop convert. + * + * Input Parameters: + * lower - The instance of lower half sensor driver. + * filep - The pointer of file, represents each user using the sensor. + * enable - true(enable) and false(disable). + * + * Returned Value: + * Return OK(0) if the driver was success; A negated errno + * value is returned on any failure. + * + ****************************************************************************/ + +static int esp_temperature_sensor_activate( + struct sensor_lowerhalf_s *lower, + struct file *filep, + bool enable) +{ + struct esp_temp_priv_s *priv = (struct esp_temp_priv_s *)lower; + + /* Set accel output data rate. */ + + if (enable) + { + esp_temperature_sensor_enable(priv); + } + else + { + /* Set suspend mode to sensors. */ + + esp_temperature_sensor_disable(priv); + } + + return OK; +} +#endif /* CONFIG_ESPRESSIF_TEMP_UORB */ + /**************************************************************************** * Public Functions ****************************************************************************/ @@ -518,7 +698,7 @@ int esp_temperature_sensor_initialize(struct esp_temp_sensor_config_t cfg) if (priv->refs++ != 0) { nxmutex_unlock(&priv->lock); - syslog(LOG_INFO, "Temperature sensor previously initialized." + sninfo("Temperature sensor previously initialized." "Handler: %p\n", priv); } else @@ -526,16 +706,22 @@ int esp_temperature_sensor_initialize(struct esp_temp_sensor_config_t cfg) ret = esp_temperature_sensor_install(priv, cfg); if (ret != OK) { - syslog(LOG_ERR, "Temperature sensor initialization failed!"); + snerr("Temperature sensor initialization failed!"); nxmutex_unlock(&priv->lock); return ret; } } +#ifdef CONFIG_ESPRESSIF_TEMP_UORB + priv->lower.ops = &g_esp_temp_sensor_sops; + priv->lower.type = SENSOR_TYPE_AMBIENT_TEMPERATURE; + priv->interval = ESP_TEMP_MIN_INTERVAL; +#endif + esp_temp_sensor_register(priv); nxmutex_unlock(&priv->lock); - syslog(LOG_INFO, "Temperature sensor initialized! Handler: %p\n", priv); + sninfo("Temperature sensor initialized! Handler: %p\n", priv); return OK; } diff --git a/boards/risc-v/esp32c3/esp32c3-generic/configs/temperature_sensor/defconfig b/boards/risc-v/esp32c3/esp32c3-generic/configs/temperature_sensor/defconfig new file mode 100644 index 0000000000..6d44677aa9 --- /dev/null +++ b/boards/risc-v/esp32c3/esp32c3-generic/configs/temperature_sensor/defconfig @@ -0,0 +1,50 @@ +# +# This file is autogenerated: PLEASE DO NOT EDIT IT. +# +# You can use "make menuconfig" to make any modifications to the installed .config file. +# You can then do "make savedefconfig" to generate a new defconfig file that includes your +# modifications. +# +# CONFIG_NSH_ARGCAT is not set +# CONFIG_NSH_CMDOPT_HEXDUMP is not set +CONFIG_ARCH="risc-v" +CONFIG_ARCH_BOARD="esp32c3-generic" +CONFIG_ARCH_BOARD_COMMON=y +CONFIG_ARCH_BOARD_ESP32C3_GENERIC=y +CONFIG_ARCH_CHIP="esp32c3" +CONFIG_ARCH_CHIP_ESP32C3_GENERIC=y +CONFIG_ARCH_INTERRUPTSTACK=1536 +CONFIG_ARCH_RISCV=y +CONFIG_ARCH_STACKDUMP=y +CONFIG_BOARDCTL_RESET=y +CONFIG_BOARD_LOOPSPERMSEC=15000 +CONFIG_BUILTIN=y +CONFIG_DEV_ZERO=y +CONFIG_ESPRESSIF_TEMP=y +CONFIG_ESPRESSIF_TEMP_UORB=y +CONFIG_FS_PROCFS=y +CONFIG_IDLETHREAD_STACKSIZE=2048 +CONFIG_INIT_ENTRYPOINT="nsh_main" +CONFIG_INTELHEX_BINARY=y +CONFIG_LIBC_PERROR_STDOUT=y +CONFIG_LIBC_STRERROR=y +CONFIG_NFILE_DESCRIPTORS_PER_BLOCK=6 +CONFIG_NSH_ARCHINIT=y +CONFIG_NSH_BUILTIN_APPS=y +CONFIG_NSH_FILEIOSIZE=512 +CONFIG_NSH_READLINE=y +CONFIG_NSH_STRERROR=y +CONFIG_PREALLOC_TIMERS=0 +CONFIG_RR_INTERVAL=200 +CONFIG_SCHED_BACKTRACE=y +CONFIG_SCHED_WAITPID=y +CONFIG_SENSORS=y +CONFIG_START_DAY=29 +CONFIG_START_MONTH=11 +CONFIG_START_YEAR=2019 +CONFIG_SYSTEM_DUMPSTACK=y +CONFIG_SYSTEM_NSH=y +CONFIG_TESTING_GETPRIME=y +CONFIG_TESTING_OSTEST=y +CONFIG_TESTING_SENSORTEST=y +CONFIG_UART0_SERIAL_CONSOLE=y diff --git a/boards/risc-v/esp32c6/esp32c6-devkitc/configs/temperature_sensor/defconfig b/boards/risc-v/esp32c6/esp32c6-devkitc/configs/temperature_sensor/defconfig new file mode 100644 index 0000000000..1a49dc9fe9 --- /dev/null +++ b/boards/risc-v/esp32c6/esp32c6-devkitc/configs/temperature_sensor/defconfig @@ -0,0 +1,52 @@ +# +# This file is autogenerated: PLEASE DO NOT EDIT IT. +# +# You can use "make menuconfig" to make any modifications to the installed .config file. +# You can then do "make savedefconfig" to generate a new defconfig file that includes your +# modifications. +# +# CONFIG_NSH_ARGCAT is not set +# CONFIG_NSH_CMDOPT_HEXDUMP is not set +CONFIG_ARCH="risc-v" +CONFIG_ARCH_BOARD="esp32c6-devkitc" +CONFIG_ARCH_BOARD_COMMON=y +CONFIG_ARCH_BOARD_ESP32C6_DEVKITC=y +CONFIG_ARCH_CHIP="esp32c6" +CONFIG_ARCH_CHIP_ESP32C6=y +CONFIG_ARCH_CHIP_ESP32C6WROOM1=y +CONFIG_ARCH_INTERRUPTSTACK=2048 +CONFIG_ARCH_RISCV=y +CONFIG_ARCH_STACKDUMP=y +CONFIG_BOARDCTL_RESET=y +CONFIG_BOARD_LOOPSPERMSEC=15000 +CONFIG_BUILTIN=y +CONFIG_DEV_ZERO=y +CONFIG_ESPRESSIF_ESP32C6=y +CONFIG_ESPRESSIF_TEMP=y +CONFIG_ESPRESSIF_TEMP_UORB=y +CONFIG_FS_PROCFS=y +CONFIG_IDLETHREAD_STACKSIZE=2048 +CONFIG_INIT_ENTRYPOINT="nsh_main" +CONFIG_INTELHEX_BINARY=y +CONFIG_LIBC_PERROR_STDOUT=y +CONFIG_LIBC_STRERROR=y +CONFIG_NFILE_DESCRIPTORS_PER_BLOCK=6 +CONFIG_NSH_ARCHINIT=y +CONFIG_NSH_BUILTIN_APPS=y +CONFIG_NSH_FILEIOSIZE=512 +CONFIG_NSH_READLINE=y +CONFIG_NSH_STRERROR=y +CONFIG_PREALLOC_TIMERS=0 +CONFIG_RR_INTERVAL=200 +CONFIG_SCHED_BACKTRACE=y +CONFIG_SCHED_WAITPID=y +CONFIG_SENSORS=y +CONFIG_START_DAY=29 +CONFIG_START_MONTH=11 +CONFIG_START_YEAR=2019 +CONFIG_SYSTEM_DUMPSTACK=y +CONFIG_SYSTEM_NSH=y +CONFIG_TESTING_GETPRIME=y +CONFIG_TESTING_OSTEST=y +CONFIG_TESTING_SENSORTEST=y +CONFIG_UART0_SERIAL_CONSOLE=y diff --git a/boards/risc-v/esp32h2/esp32h2-devkit/configs/temperature_sensor/defconfig b/boards/risc-v/esp32h2/esp32h2-devkit/configs/temperature_sensor/defconfig new file mode 100644 index 0000000000..7707721b1b --- /dev/null +++ b/boards/risc-v/esp32h2/esp32h2-devkit/configs/temperature_sensor/defconfig @@ -0,0 +1,51 @@ +# +# This file is autogenerated: PLEASE DO NOT EDIT IT. +# +# You can use "make menuconfig" to make any modifications to the installed .config file. +# You can then do "make savedefconfig" to generate a new defconfig file that includes your +# modifications. +# +# CONFIG_NSH_ARGCAT is not set +# CONFIG_NSH_CMDOPT_HEXDUMP is not set +CONFIG_ARCH="risc-v" +CONFIG_ARCH_BOARD="esp32h2-devkit" +CONFIG_ARCH_BOARD_COMMON=y +CONFIG_ARCH_BOARD_ESP32H2_DEVKIT=y +CONFIG_ARCH_CHIP="esp32h2" +CONFIG_ARCH_CHIP_ESP32H2=y +CONFIG_ARCH_INTERRUPTSTACK=2048 +CONFIG_ARCH_RISCV=y +CONFIG_ARCH_STACKDUMP=y +CONFIG_BOARDCTL_RESET=y +CONFIG_BOARD_LOOPSPERMSEC=15000 +CONFIG_BUILTIN=y +CONFIG_DEV_ZERO=y +CONFIG_ESPRESSIF_ESP32H2=y +CONFIG_ESPRESSIF_TEMP=y +CONFIG_ESPRESSIF_TEMP_UORB=y +CONFIG_FS_PROCFS=y +CONFIG_IDLETHREAD_STACKSIZE=2048 +CONFIG_INIT_ENTRYPOINT="nsh_main" +CONFIG_INTELHEX_BINARY=y +CONFIG_LIBC_PERROR_STDOUT=y +CONFIG_LIBC_STRERROR=y +CONFIG_NFILE_DESCRIPTORS_PER_BLOCK=6 +CONFIG_NSH_ARCHINIT=y +CONFIG_NSH_BUILTIN_APPS=y +CONFIG_NSH_FILEIOSIZE=512 +CONFIG_NSH_READLINE=y +CONFIG_NSH_STRERROR=y +CONFIG_PREALLOC_TIMERS=0 +CONFIG_RR_INTERVAL=200 +CONFIG_SCHED_BACKTRACE=y +CONFIG_SCHED_WAITPID=y +CONFIG_SENSORS=y +CONFIG_START_DAY=29 +CONFIG_START_MONTH=11 +CONFIG_START_YEAR=2019 +CONFIG_SYSTEM_DUMPSTACK=y +CONFIG_SYSTEM_NSH=y +CONFIG_TESTING_GETPRIME=y +CONFIG_TESTING_OSTEST=y +CONFIG_TESTING_SENSORTEST=y +CONFIG_UART0_SERIAL_CONSOLE=y
