diff options
author | Gregory Nutt <gnutt@nuttx.org> | 2014-12-16 08:16:53 -0600 |
---|---|---|
committer | Gregory Nutt <gnutt@nuttx.org> | 2014-12-16 08:16:53 -0600 |
commit | 08be24e16d857b79c0e3ac7e3f6beb6c114d0662 (patch) | |
tree | c150c40575cf68ac8795019a9cf04dd7bbed2d45 /nuttx/drivers/sensors/adxl345.h | |
parent | 8db1b5542eade3ec3f0e20fd8ab1fd748cb2886c (diff) | |
download | px4-nuttx-08be24e16d857b79c0e3ac7e3f6beb6c114d0662.tar.gz px4-nuttx-08be24e16d857b79c0e3ac7e3f6beb6c114d0662.tar.bz2 px4-nuttx-08be24e16d857b79c0e3ac7e3f6beb6c114d0662.zip |
Add ADXL345 accelerometer driver. From Alan Carvalho de Assis
Diffstat (limited to 'nuttx/drivers/sensors/adxl345.h')
-rw-r--r-- | nuttx/drivers/sensors/adxl345.h | 198 |
1 files changed, 198 insertions, 0 deletions
diff --git a/nuttx/drivers/sensors/adxl345.h b/nuttx/drivers/sensors/adxl345.h new file mode 100644 index 000000000..e2a06cea9 --- /dev/null +++ b/nuttx/drivers/sensors/adxl345.h @@ -0,0 +1,198 @@ +/******************************************************************************************** + * drivers/sensors/adxl345.h + * + * Copyright (C) 2014 Alan Carvalho de Assis + * Author: Alan Carvalho de Assis <acassis@gmail.com> + * using ADXL345 driver as template reference + * Author: Gregory Nutt <gnutt@nuttx.org> + * + * 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_ADXL345_H +#define __DRIVERS_SENSORS_ADXL345_H + +/******************************************************************************************** + * Included Files + ********************************************************************************************/ + +#include <nuttx/config.h> + +#include <semaphore.h> + +#include <nuttx/wdog.h> +#include <nuttx/clock.h> +#include <nuttx/wqueue.h> +#include <nuttx/sensors/adxl345.h> + +#if defined(CONFIG_SENSORS_ADXL345) + +/******************************************************************************************** + * Pre-Processor Definitions + ********************************************************************************************/ + +#ifdef CONFIG_ADXL345_I2C +# error "Only the ADXL345 SPI interface is supported by this driver" +#endif + +/* Driver support ***************************************************************************/ +/* This format is used to construct the /dev/accel[n] device driver path. It defined here + * so that it will be used consistently in all places. + */ + +#define DEV_FORMAT "/dev/accel%d" +#define DEV_NAMELEN 16 + +/* Driver flags */ + +#define ADXL345_STAT_INITIALIZED 1 /* Device has been initialized */ + +/******************************************************************************************** + * Public Types + ********************************************************************************************/ +/* This defines type of events */ + +enum adxl345_event +{ + DATA_READY = 0, /* New data available */ + SINGLE_TAP, /* A tap event detected */ + DOUBLE_TAP, /* A double tap event detected */ + ACTIVITY, /* Activity detected */ + INACTIVITY, /* Inactivity detected */ + FREE_FAL, /* Free fall event */ + WATERMARK, /* Number samples in FIFO is equal to sample bits */ + OVERRUN, /* New data replaced unread data */ +}; + +/* This defines operating mode */ + +enum adxl345_mode +{ + BYPASS_MODE = 0, /* Bypass FIFO, then it remain empty */ + FIFO_MODE, /* Sampled data are put in FIFO, up to 32 samples */ + STREAM_MODE, /* Sampled data are put in FIFO, when full remove old samples */ + TRIGGER_MODE /* Similar to Stream Mode, but when Trigger event happen FIFO freeze */ +}; + +/* This structure describes the results of one ADXL345 sample */ + +struct adxl345_sample_s +{ + uint16_t data_x; /* Measured X-axis acceleration */ + uint16_t data_y; /* Measured Y-axis acceleration */ + uint8_t data_z; /* Measured Z-axis acceleration */ +}; + +/* This structure represents the state of the ADXL345 driver */ + +struct adxl345_dev_s +{ + /* Common fields */ + + FAR struct adxl345_config_s *config; /* Board configuration data */ + sem_t exclsem; /* Manages exclusive access to this structure */ +#ifdef CONFIG_ADXL345_SPI + FAR struct spi_dev_s *spi; /* Saved SPI driver instance */ +#else + FAR struct i2c_dev_s *i2c; /* Saved I2C driver instance */ +#endif + + uint8_t status; /* See ADXL345_STAT_* definitions */ + struct work_s work; /* Supports the interrupt handling "bottom half" */ + +#ifdef CONFIG_ADXL345_REFCNT + uint8_t crefs; /* Number of times the device has been opened */ +#endif + uint8_t nwaiters; /* Number of threads waiting for ADXL345 data */ + + uint16_t ofsx; /* Offset X value */ + uint16_t ofsy; /* Offset Y value */ + uint16_t ofsz; /* Offset Z value */ + sem_t waitsem; /* Used to wait for the availability of data */ + + struct work_s timeout; /* Supports timeout work */ + struct adxl345_sample_s sample; /* Last sampled accelerometer data */ + + /* The following is a list if poll structures of threads waiting for + * driver events. The 'struct pollfd' reference for each open is also + * retained in the f_priv field of the 'struct file'. + */ + +#ifndef CONFIG_DISABLE_POLL + struct pollfd *fds[CONFIG_ADXL345_NPOLLWAITERS]; +#endif +}; + +/******************************************************************************************** + * Public Function Prototypes + ********************************************************************************************/ + +/******************************************************************************************** + * Name: adxl345_getreg8 + * + * Description: + * Read from an 8-bit ADXL345 register + * + ********************************************************************************************/ + +uint8_t adxl345_getreg8(FAR struct adxl345_dev_s *priv, uint8_t regaddr); + +/******************************************************************************************** + * Name: adxl345_putreg8 + * + * Description: + * Write a value to an 8-bit ADXL345 register + * + ********************************************************************************************/ + +void adxl345_putreg8(FAR struct adxl345_dev_s *priv, uint8_t regaddr, uint8_t regval); + +/******************************************************************************************** + * Name: adxl345_getreg16 + * + * Description: + * Read 16-bits of data from an ADXL345 register + * + ********************************************************************************************/ + +uint16_t adxl345_getreg16(FAR struct adxl345_dev_s *priv, uint8_t regaddr); + +/******************************************************************************************** + * Name: adxl345_accworker + * + * Description: + * Handle accelerometer interrupt events (this function actually executes in the context of + * the worker thread). + * + ********************************************************************************************/ + +void adxl345_accworker(FAR struct adxl345_dev_s *priv, uint8_t intsta) weak_function; + +#endif /* CONFIG_SENSORS_ADXL345 */ +#endif /* __DRIVERS_SENSORS_ADXL345_H */ |