diff --git a/drivers/sensors/Kconfig b/drivers/sensors/Kconfig index 39642a7ccfc..a7e7420038f 100644 --- a/drivers/sensors/Kconfig +++ b/drivers/sensors/Kconfig @@ -807,3 +807,10 @@ config XEN1210_REGDEBUG config SENSORS_ZEROCROSS bool "Zero Cross Sensor" default n + +config SENSORS_ADT7320 + bool "Analog Devices ADT7320 Driver" + default n + select SPI + ---help--- + Enables support for the ADT7320 Driver diff --git a/drivers/sensors/Make.defs b/drivers/sensors/Make.defs index 97dd837b47a..126d9872967 100644 --- a/drivers/sensors/Make.defs +++ b/drivers/sensors/Make.defs @@ -248,6 +248,10 @@ ifeq ($(CONFIG_SENSORS_L3GD20),y) CSRCS += l3gd20.c endif +ifeq ($(CONFIG_SENSORS_ADT7320),y) + CSRCS += adt7320.c +endif + endif # CONFIG_SPI # Quadrature encoder upper half diff --git a/drivers/sensors/README.txt b/drivers/sensors/README.txt index fcc50c71488..aa8ba0e0bd9 100644 --- a/drivers/sensors/README.txt +++ b/drivers/sensors/README.txt @@ -462,3 +462,9 @@ shared worker task that collects the data. The cluster driver close() function calls the close functions of the leaf drivers. + +ADT7320 (Augusto Fraga Giachero) +======= + +The ADT7320 is a SPI temperature sensor with a temperature range of +−40°C to +150°C. diff --git a/drivers/sensors/adt7320.c b/drivers/sensors/adt7320.c new file mode 100644 index 00000000000..8829082b6c2 --- /dev/null +++ b/drivers/sensors/adt7320.c @@ -0,0 +1,650 @@ +/**************************************************************************** + * drivers/sensors/adt7320.c + * Character driver for the Analog Devices adt7320 Temperature Sensor + * + * Copyright (C) 2019, Augusto Fraga Giachero. All rights reserved. + * Copyright (C) 2011, 2013, 2016 Gregory Nutt. All rights reserved. + * Based on the LM-75 driver + * Author: Augusto Fraga Giachero + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "adt7320.h" + +#if defined(CONFIG_SPI) && defined(CONFIG_SENSORS_ADT7320) + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +#ifndef CONFIG_ADT7320_SPI_FREQUENCY +# define CONFIG_ADT7320_SPI_FREQUENCY 1000000 +#endif + +#define ADT7320_SPI_MODE (SPIDEV_MODE3) /* SPI Mode 3: CPOL=1,CPHA=1 */ + +/* Centigrade to Fahrenheit conversion: F = 9*C/5 + 32 */ + +#define B16_9DIV5 (9 * 65536 / 5) +#define B16_32 (32 * 65536) + +/**************************************************************************** + * Private + ****************************************************************************/ + +struct adt7320_dev_s +{ + FAR struct spi_dev_s *spi; /* Saved SPI driver instance */ + int spidev; + bool fahrenheit; /* true: temperature will be reported in + * fahrenheit */ +}; + +/**************************************************************************** + * Private Function Prototypes + ****************************************************************************/ + +/* SPI Helpers */ + +static void adt7320_write_reg16(FAR struct adt7320_dev_s *priv, + uint8_t reg, + uint16_t data); +static uint16_t adt7320_read_reg16(FAR struct adt7320_dev_s *priv, + uint8_t reg); +static void adt7320_write_reg8(FAR struct adt7320_dev_s *priv, + uint8_t reg, + uint8_t data); +static uint8_t adt7320_read_reg8(FAR struct adt7320_dev_s *priv, + uint8_t reg); +static int adt7320_readtemp(FAR struct adt7320_dev_s *priv, FAR b16_t *temp); + +/* Character driver methods */ + +static int adt7320_open(FAR struct file *filep); +static int adt7320_close(FAR struct file *filep); +static ssize_t adt7320_read(FAR struct file *filep, FAR char *buffer, + size_t buflen); +static ssize_t adt7320_write(FAR struct file *filep, FAR const char *buffer, + size_t buflen); +static int adt7320_ioctl(FAR struct file *filep, int cmd, unsigned long arg); + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +static const struct file_operations g_adt7320fops = +{ + adt7320_open, + adt7320_close, + adt7320_read, + adt7320_write, + NULL, + adt7320_ioctl, + NULL +}; + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: adt7320_configspi + * + * Description: + * Configure the SPI interface to match the serial interface specification + * of the ADT7320. + * + ****************************************************************************/ + +static inline void adt7320_configspi(FAR struct spi_dev_s *spi) +{ + /* Configure SPI for the ADT7320 */ + + SPI_SETMODE(spi, ADT7320_SPI_MODE); + SPI_SETBITS(spi, 8); + SPI_HWFEATURES(spi, 0); + SPI_SETFREQUENCY(spi, CONFIG_ADT7320_SPI_FREQUENCY); +} + +/**************************************************************************** + * Name: adt7320_write_reg16 + * + * Description: + * Write to a 16-bit register (ADT7320_TEMP_REG, ADT7320_TCRIT_REG, + * ADT7320_THIGH_REG or ADT7320_TLOW_REG). + * + ****************************************************************************/ + +static void adt7320_write_reg16(FAR struct adt7320_dev_s *priv, + uint8_t reg, + const uint16_t data) +{ + SPI_LOCK(priv->spi, true); + + adt7320_configspi(priv->spi); + + SPI_SELECT(priv->spi, priv->spidev, true); + + SPI_SEND(priv->spi, (reg & 0x07) << 3); + SPI_SEND(priv->spi, data >> 8); + SPI_SEND(priv->spi, data & 0xff); + + SPI_SELECT(priv->spi, priv->spidev, false); + + SPI_LOCK(priv->spi, false); +} + +/**************************************************************************** + * Name: adt7320_read_reg16 + * + * Description: + * Read a 16-bit register (ADT7320_TEMP_REG, ADT7320_TCRIT_REG, + * ADT7320_THIGH_REG or ADT7320_TLOW_REG). + * + ****************************************************************************/ + +static uint16_t adt7320_read_reg16(FAR struct adt7320_dev_s *priv, + uint8_t reg) +{ + uint8_t data[2]; + + SPI_LOCK(priv->spi, true); + + adt7320_configspi(priv->spi); + + SPI_SELECT(priv->spi, priv->spidev, true); + + SPI_SEND(priv->spi, ((reg & 0x07) << 3) | (1 << 6)); + SPI_RECVBLOCK(priv->spi, data, 2); + + SPI_SELECT(priv->spi, priv->spidev, false); + + SPI_LOCK(priv->spi, false); + + return (data[0] << 8) | data[1]; +} + +/**************************************************************************** + * Name: adt7320_write_reg8 + * + * Description: + * Write to a 8-bit register (ADT7320_STAT_REG, ADT7320_TCRIT_REG, + * ADT7320_CONF_REG, ADT7320_ID_REG or ADT7320_THYST_REG). + ****************************************************************************/ + +static void adt7320_write_reg8(FAR struct adt7320_dev_s *priv, + uint8_t reg, + const uint8_t data) +{ + SPI_LOCK(priv->spi, true); + + adt7320_configspi(priv->spi); + + SPI_SELECT(priv->spi, priv->spidev, true); + + SPI_SEND(priv->spi, (reg & 0x07) << 3); + SPI_SEND(priv->spi, data); + + SPI_SELECT(priv->spi, priv->spidev, false); + + SPI_LOCK(priv->spi, false); +} + +/**************************************************************************** + * Name: adt7320_read_reg8 + * + * Description: + * Read a 8-bit register (ADT7320_STAT_REG, ADT7320_TCRIT_REG, + * ADT7320_CONF_REG, ADT7320_ID_REG or ADT7320_THYST_REG). + ****************************************************************************/ + +static uint8_t adt7320_read_reg8(FAR struct adt7320_dev_s *priv, + uint8_t reg) +{ + uint8_t data; + + SPI_LOCK(priv->spi, true); + + adt7320_configspi(priv->spi); + + SPI_SELECT(priv->spi, priv->spidev, true); + + SPI_SEND(priv->spi, ((reg & 0x07) << 3) | (1 << 6)); + SPI_RECVBLOCK(priv->spi, &data, 1); + + SPI_SELECT(priv->spi, priv->spidev, false); + + SPI_LOCK(priv->spi, false); + + return data; +} + +/**************************************************************************** + * Name: adt7320_reset + * + * Description: + * Reset the ADT7320, you should wait at least 500us before trying to + * access the sensor again. + * + ****************************************************************************/ + +static void adt7320_reset(FAR struct adt7320_dev_s *priv) +{ + SPI_LOCK(priv->spi, true); + + adt7320_configspi(priv->spi); + + SPI_SELECT(priv->spi, priv->spidev, true); + + SPI_SEND(priv->spi, 0xff); + SPI_SEND(priv->spi, 0xff); + SPI_SEND(priv->spi, 0xff); + SPI_SEND(priv->spi, 0xff); + + SPI_SELECT(priv->spi, priv->spidev, false); + + SPI_LOCK(priv->spi, false); +} + +/**************************************************************************** + * Name: adt7320_readtemp + * + * Description: + * Read the temperature register with special scaling (ADT7320_TEMP_REG). + * + ****************************************************************************/ + +static int adt7320_readtemp(FAR struct adt7320_dev_s *priv, FAR b16_t *temp) +{ + b16_t temp16; + int16_t temp_raw; + + /* Read the raw temperature data (b16_t) */ + + temp_raw = (int16_t)adt7320_read_reg16(priv, ADT7320_TEMP_REG) & 0xfff8; + + /* Convert from 9.7 bits to 16.16 bits */ + + temp16 = (int32_t)temp_raw << 9; + + add_sensor_randomness(temp16); + + sninfo("Centigrade: %08x\n", temp16); + + /* Was fahrenheit requested? */ + + if (priv->fahrenheit) + { + /* Centigrade to Fahrenheit conversion: F = 9*C/5 + 32 */ + + temp16 = b16mulb16(temp16, B16_9DIV5) + B16_32; + sninfo("Fahrenheit: %08x\n", temp16); + } + + *temp = temp16; + return OK; +} + +/**************************************************************************** + * Name: adt7320_open + * + * Description: + * This function is called whenever the ADT7320 device is opened. + * + ****************************************************************************/ + +static int adt7320_open(FAR struct file *filep) +{ + FAR struct inode *inode = filep->f_inode; + FAR struct adt7320_dev_s *priv = inode->i_private; + + if (adt7320_read_reg8(priv, ADT7320_ID_REG) != ADT7320_ID) + { + set_errno(ENODEV); + return -ENODEV; + } + return OK; +} + +/**************************************************************************** + * Name: adt7320_close + * + * Description: + * This routine is called when the ADT7320 device is closed. + * + ****************************************************************************/ + +static int adt7320_close(FAR struct file *filep) +{ + return OK; +} + +/**************************************************************************** + * Name: adt7320_read + ****************************************************************************/ + +static ssize_t adt7320_read(FAR struct file *filep, FAR char *buffer, size_t buflen) +{ + FAR struct inode *inode = filep->f_inode; + FAR struct adt7320_dev_s *priv = inode->i_private; + FAR b16_t *ptr; + ssize_t nsamples; + int i; + int ret; + + /* How many samples were requested to get? */ + + nsamples = buflen / sizeof(b16_t); + ptr = (FAR b16_t *)buffer; + + sninfo("buflen: %d nsamples: %d\n", buflen, nsamples); + + /* Get the requested number of samples */ + + for (i = 0; i < nsamples; i++) + { + b16_t temp = 0; + + /* Read the next b16_t temperature value */ + + ret = adt7320_readtemp(priv, &temp); + if (ret < 0) + { + snerr("ERROR: adt7320_readtemp failed: %d\n", ret); + return (ssize_t)ret; + } + + /* Save the temperature value in the user buffer */ + + *ptr++ = temp; + } + + return nsamples * sizeof(b16_t); +} + +/**************************************************************************** + * Name: adt7320_write + ****************************************************************************/ + +static ssize_t adt7320_write(FAR struct file *filep, FAR const char *buffer, + size_t buflen) +{ + return -ENOSYS; +} + +/**************************************************************************** + * Name: adt7320_ioctl + * + * Description: + * Suppoted IOCTLs: + * + * SNIOC_READSTAT: Read the status register, treat arg as an + * uint8_t pointer. + * + * SNIOC_READCONF: Read the configuration register, treat arg as + * an uint8_t pointer. + * + * SNIOC_WRITECONF: Write to the configuration register, treat arg + * as an uint8_t value. + * + * SNIOC_FAHRENHEIT: Report samples in Fahrenheit, ignores arg. + * + * SNIOC_CENTIGRADE: Report samples in Celsius, ignores arg. + * + * SNIOC_READTCRIT: Read the critical temperature register, treat + * arg as an b16_t pointer. + * + * SNIOC_WRITETCRIT: Write to the critical temperature register, + * treat arg as an b16_t value. + * + * SNIOC_READTHYS: Read the hysteresis temperature register, treat + * arg as an b16_t pointer. + * + * SNIOC_WRITETHYS: Write to the hysteresis temperature register, + * treat arg as an b16_t value. + * + * SNIOC_READTLOW: Read the low temperature register, treat arg as + * an b16_t pointer. + * + * SNIOC_WRITETLOW: Write to the low temperature register, treat + * arg as an b16_t value. + * + * SNIOC_READTHIGH: Read the high temperature register, treat arg + * as an b16_t pointer. + * + * SNIOC_WRITETHIGH: Write to the high temperature register, treat + * arg as an b16_t value. + * + ****************************************************************************/ + +static int adt7320_ioctl(FAR struct file *filep, int cmd, unsigned long arg) +{ + FAR struct inode *inode = filep->f_inode; + FAR struct adt7320_dev_s *priv = inode->i_private; + int ret = OK; + + switch (cmd) + { + /* Read the status register. Arg: uint8_t* pointer */ + + case SNIOC_READSTAT: + { + FAR uint8_t *ptr = (FAR uint8_t *)((uintptr_t)arg); + DEBUGASSERT(ptr != NULL); + *ptr = adt7320_read_reg8(priv, ADT7320_STAT_REG); + } + break; + + /* Read the configuration register. Arg: uint8_t* pointer */ + + case SNIOC_READCONF: + { + FAR uint8_t *ptr = (FAR uint8_t *)((uintptr_t)arg); + DEBUGASSERT(ptr != NULL); + *ptr = adt7320_read_reg8(priv, ADT7320_CONF_REG); + } + break; + + /* Write to the configuration register. Arg: uint8_t value */ + + case SNIOC_WRITECONF: + adt7320_write_reg8(priv, ADT7320_CONF_REG, (uint8_t)arg); + break; + + /* Report samples in Fahrenheit */ + + case SNIOC_FAHRENHEIT: + priv->fahrenheit = true; + sninfo("Fahrenheit\n"); + break; + + /* Report samples in Celsius */ + + case SNIOC_CENTIGRADE: + priv->fahrenheit = false; + sninfo("Celsius\n"); + break; + + /* Read the critical temperature register. Arg: b16_t* pointer */ + + case SNIOC_READTCRIT: + { + FAR b16_t *ptr = (FAR b16_t *)((uintptr_t)arg); + int16_t temp_raw; + DEBUGASSERT(ptr != NULL); + temp_raw = adt7320_read_reg16(priv, ADT7320_TCRIT_REG); + *ptr = b8tob16(temp_raw << 1); + } + break; + + /* Write to the critical temperature register. Arg: b16_t value */ + + case SNIOC_WRITETCRIT: + adt7320_write_reg16(priv, ADT7320_TCRIT_REG, b16tob8((b16_t)arg) >> 1); + break; + + /* Read the hysteresis temperature register. Arg: b16_t* */ + + case SNIOC_READTHYS: + { + FAR b16_t *ptr = (FAR b16_t *)((uintptr_t)arg); + uint8_t tmp; + DEBUGASSERT(ptr != NULL); + tmp = adt7320_read_reg8(priv, ADT7320_THYST_REG); + *ptr = uitoub16(tmp); + } + break; + + /* Write to the hysteresis temperature register. Arg: b16_t value */ + + case SNIOC_WRITETHYS: + adt7320_write_reg8(priv, ADT7320_THYST_REG, ub16toi((b16_t)arg)); + break; + + /* Read the low temperature register. Arg: b16_t* pointer */ + + case SNIOC_READTLOW: + { + FAR b16_t *ptr = (FAR b16_t *)((uintptr_t)arg); + int16_t temp_raw; + DEBUGASSERT(ptr != NULL); + temp_raw = adt7320_read_reg16(priv, ADT7320_TLOW_REG); + *ptr = b8tob16(temp_raw << 1); + } + break; + + /* Write to the low temperature register. Arg: b16_t value */ + + case SNIOC_WRITETLOW: + adt7320_write_reg16(priv, ADT7320_TLOW_REG, b16tob8((b16_t)arg) >> 1); + break; + + /* Read the high temperature register. Arg: b16_t* pointer */ + + case SNIOC_READTHIGH: + { + FAR b16_t *ptr = (FAR b16_t *)((uintptr_t)arg); + int16_t temp_raw; + DEBUGASSERT(ptr != NULL); + temp_raw = adt7320_read_reg16(priv, ADT7320_THIGH_REG); + *ptr = b8tob16(temp_raw << 1); + } + break; + + /* Write to the high temperature register. Arg: b16_t value */ + + case SNIOC_WRITETHIGH: + adt7320_write_reg16(priv, ADT7320_THIGH_REG, b16tob8((b16_t)arg) >> 1); + break; + + default: + sninfo("Unrecognized cmd: %d\n", cmd); + ret = -ENOTTY; + break; + } + + return ret; +} + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: adt7320_register + * + * Description: + * Register the ADT7320 character device as 'devpath' + * + * Input Parameters: + * devpath - The full path to the driver to register. E.g., "/dev/temp0" + * spi - An instance of the SPI interface to use to communicate with ADT7320 + * spidev - The SPI device number used to select the correct CS line + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ****************************************************************************/ + +int adt7320_register(FAR const char *devpath, FAR struct spi_dev_s *spi, int spidev) +{ + FAR struct adt7320_dev_s *priv; + int ret; + + /* Sanity check */ + + DEBUGASSERT(spi != NULL); + + /* Initialize the ADT7320 device structure */ + + priv = (FAR struct adt7320_dev_s *)kmm_malloc(sizeof(struct adt7320_dev_s)); + if (priv == NULL) + { + snerr("ERROR: Failed to allocate instance\n"); + return -ENOMEM; + } + + priv->spi = spi; + priv->spidev = spidev; + priv->fahrenheit = false; + + /* Register the character driver */ + + ret = register_driver(devpath, &g_adt7320fops, 0666, priv); + if (ret < 0) + { + snerr("ERROR: Failed to register driver: %d\n", ret); + kmm_free(priv); + } + + /* Reset the ADT7320 SPI interface */ + + adt7320_reset(priv); + + return ret; +} +#endif /* CONFIG_SPI && CONFIG_SENSORS_ADT7320 */ diff --git a/drivers/sensors/adt7320.h b/drivers/sensors/adt7320.h new file mode 100644 index 00000000000..a5409c5c41b --- /dev/null +++ b/drivers/sensors/adt7320.h @@ -0,0 +1,54 @@ +/**************************************************************************** + * drivers/sensors/adt7320.h + * + * Copyright (C) 2019, Augusto Fraga Giachero. All rights reserved. + * Author: Augusto Fraga Giachero + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +#ifndef __DRIVERS_SENSORS_ADT7320_H +#define __DRIVERS_SENSORS_ADT7320_H + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +#define ADT7320_STAT_REG 0x00 +#define ADT7320_CONF_REG 0x01 +#define ADT7320_TEMP_REG 0x02 +#define ADT7320_ID_REG 0x03 +#define ADT7320_TCRIT_REG 0x04 +#define ADT7320_THYST_REG 0x05 +#define ADT7320_THIGH_REG 0x06 +#define ADT7320_TLOW_REG 0x07 + +#define ADT7320_ID 0xc3 + +#endif /* __DRIVERS_SENSORS_ADT7320_H */ diff --git a/include/nuttx/sensors/adt7320.h b/include/nuttx/sensors/adt7320.h new file mode 100644 index 00000000000..0b662b347ff --- /dev/null +++ b/include/nuttx/sensors/adt7320.h @@ -0,0 +1,97 @@ +/**************************************************************************** + * include/nuttx/sensors/adt7320.h + * + * Copyright (C) 2019 Augusto Fraga Giachero + * Author: Augusto Fraga Giachero + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +#ifndef __INCLUDE_NUTTX_SENSORS_ADT7320_H +#define __INCLUDE_NUTTX_SENSORS_ADT7320_H + +/**************************************************************************** + * Driver usage notes: + * + * This driver supports the Common Sensor Register Interface. + * See drivers/sensors/README.txt for details. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include +#include +#include + +#if defined(CONFIG_SPI) && defined(CONFIG_SENSORS_ADT7320) + +/**************************************************************************** + * Public Function Prototypes + ****************************************************************************/ + +#ifdef __cplusplus +#define EXTERN extern "C" +extern "C" +{ +#else +#define EXTERN extern +#endif + +/**************************************************************************** + * Name: adt7320_register + * + * Description: + * Register the ADT7320 character device as 'devpath' + * + * Input Parameters: + * devpath - The full path to the driver to register. E.g., "/dev/temp0" + * spi - An instance of the SPI interface to use to communicate with + * spidev - Number of the spi device (used to determine what chip + * should be selected). + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + ****************************************************************************/ + +int adt7320_register(FAR const char *devpath, + FAR struct spi_dev_s *spi, + int spidev); + +#undef EXTERN +#ifdef __cplusplus +} +#endif + +#endif /* CONFIG_SPI && CONFIG_SENSORS_ADT7320 && CONFIG_SPI_EXCHANGE */ +#endif /* __INCLUDE_NUTTX_SENSORS_ADT7320_H */ diff --git a/include/nuttx/sensors/ioctl.h b/include/nuttx/sensors/ioctl.h index 508be61c577..4a67a38477f 100644 --- a/include/nuttx/sensors/ioctl.h +++ b/include/nuttx/sensors/ioctl.h @@ -1,7 +1,7 @@ /************************************************************************************ * include/nuttx/sensors/ioctl.h * - * Copyright (C) 2016-2018 Gregory Nutt. All rights reserved. + * Copyright (C) 2016-2019 Gregory Nutt. All rights reserved. * Author: Alan Carvalho de Assis * * Redistribution and use in source and binary forms, with or without @@ -210,6 +210,10 @@ #define SNIOC_SET_CLEAN_INTERVAL _SNIOC(0x005d) /* Arg: uint32_t value (seconds) */ #define SNIOC_START_FAN_CLEANING _SNIOC(0x005e) /* Arg: None */ +/* IOCTL commands unique to the ADT7320 */ + +#define SNIOC_READSTAT _SNIOC(0x005f) /* Arg: uint8_t* pointer */ + /* IOCTL commands unique to the VL53L1X */ #define SNIOC_DISTANCESHORT _SNIOC(0x0100) /* Arg: None */