339 lines
12 KiB
C
339 lines
12 KiB
C
/****************************************************************************
|
|
* include/nuttx/analog/adc.h
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*
|
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
|
* contributor license agreements. See the NOTICE file distributed with
|
|
* this work for additional information regarding copyright ownership. The
|
|
* ASF licenses this file to you under the Apache License, Version 2.0 (the
|
|
* "License"); you may not use this file except in compliance with the
|
|
* License. You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
* License for the specific language governing permissions and limitations
|
|
* under the License.
|
|
*
|
|
****************************************************************************/
|
|
|
|
#ifndef __INCLUDE_NUTTX_ANALOG_ADC_H
|
|
#define __INCLUDE_NUTTX_ANALOG_ADC_H
|
|
|
|
/****************************************************************************
|
|
* Included Files
|
|
****************************************************************************/
|
|
|
|
#include <nuttx/config.h>
|
|
#include <nuttx/compiler.h>
|
|
|
|
#include <poll.h>
|
|
#include <sys/types.h>
|
|
#include <stdint.h>
|
|
#include <stdbool.h>
|
|
|
|
#include <nuttx/fs/fs.h>
|
|
#include <nuttx/mutex.h>
|
|
#include <nuttx/semaphore.h>
|
|
#include <nuttx/spi/spi.h>
|
|
#include <nuttx/i2c/i2c_master.h>
|
|
|
|
/****************************************************************************
|
|
* Pre-processor Definitions
|
|
****************************************************************************/
|
|
|
|
/* Default configuration settings that may be overridden in the NuttX
|
|
* configuration file. The configured size is limited to 65535 to fit into
|
|
* a uint16_t.
|
|
*/
|
|
|
|
#if !defined(CONFIG_ADC_FIFOSIZE)
|
|
# define CONFIG_ADC_FIFOSIZE 8
|
|
#elif CONFIG_ADC_FIFOSIZE > 65535
|
|
# undef CONFIG_ADC_FIFOSIZE
|
|
# define CONFIG_ADC_FIFOSIZE 65535
|
|
#endif
|
|
|
|
#if !defined(CONFIG_ADC_NPOLLWAITERS)
|
|
# define CONFIG_ADC_NPOLLWAITERS 2
|
|
#endif
|
|
|
|
#define ADC_RESET(dev) ((dev)->ad_ops->ao_reset(dev))
|
|
#define ADC_SETUP(dev) ((dev)->ad_ops->ao_setup(dev))
|
|
#define ADC_SHUTDOWN(dev) ((dev)->ad_ops->ao_shutdown(dev))
|
|
#define ADC_RXINT(dev,enable) ((dev)->ad_ops->ao_rxint((dev),(enable)))
|
|
#define ADC_IOCTL(dev,cmd,arg) ((dev)->ad_ops->ao_ioctl((dev),(cmd),(arg)))
|
|
|
|
/****************************************************************************
|
|
* Public Types
|
|
****************************************************************************/
|
|
|
|
/* These are callbacks to notify the upper-half driver of ADC events */
|
|
|
|
struct adc_dev_s;
|
|
struct adc_callback_s
|
|
{
|
|
/* This method is called from the lower half, platform-specific ADC logic
|
|
* when new ADC sample data is available.
|
|
*
|
|
* Input Parameters:
|
|
* dev - The ADC device structure that was previously registered by
|
|
* adc_register()
|
|
* ch - And ID for the ADC channel number that generated the data
|
|
* data - The actual converted data from the channel.
|
|
*
|
|
* Returned Value:
|
|
* Zero on success; a negated errno value on failure.
|
|
*/
|
|
|
|
CODE int (*au_receive)(FAR struct adc_dev_s *dev, uint8_t ch,
|
|
int32_t data);
|
|
|
|
/* This method is called from the lower half, platform-specific ADC logic
|
|
* when new ADC sample data is available,
|
|
* enable transfer all data at once .
|
|
*
|
|
* Input Parameters:
|
|
* dev - The ADC device structure that was previously registered by
|
|
* adc_register()
|
|
* channel - Pointer to the channel lists buffer
|
|
* data - Pointer to the DMA buffer.
|
|
* count - Number of data elements in the channelbuffer and databuffer.
|
|
*
|
|
* Returned Value:
|
|
* Zero on success; a negated errno value on failure.
|
|
*/
|
|
|
|
CODE int (*au_receive_batch)(FAR struct adc_dev_s *dev,
|
|
FAR const uint8_t *channel,
|
|
FAR const uint32_t *data,
|
|
size_t count);
|
|
|
|
/* This method is called from the lower half, platform-specific ADC logic
|
|
* when an overrun appeared to free / reset upper half.
|
|
*
|
|
* Input Parameters:
|
|
* dev - The ADC device structure that was previously registered by
|
|
* adc_register()
|
|
*
|
|
* Returned Value:
|
|
* Zero on success; a negated errno value on failure.
|
|
*/
|
|
|
|
CODE int (*au_reset)(FAR struct adc_dev_s *dev);
|
|
};
|
|
|
|
/* This describes on ADC message */
|
|
|
|
begin_packed_struct struct adc_msg_s
|
|
{
|
|
uint8_t am_channel; /* The 8-bit ADC Channel */
|
|
int32_t am_data; /* ADC convert result (4 bytes) */
|
|
} end_packed_struct;
|
|
|
|
/* This describes a FIFO of ADC messages */
|
|
|
|
struct adc_fifo_s
|
|
{
|
|
sem_t af_sem; /* Counting semaphore */
|
|
uint16_t af_head; /* Index to the head [IN] index in the circular buffer */
|
|
uint16_t af_tail; /* Index to the tail [OUT] index in the circular buffer */
|
|
/* Circular buffer of ADC messages */
|
|
FAR uint8_t *af_channel;
|
|
FAR uint32_t *af_data;
|
|
uint16_t af_fifosize;
|
|
};
|
|
|
|
/* This structure defines all of the operations provided by the architecture
|
|
* specific logic. All fields must be provided with non-NULL function
|
|
* pointers by the caller of adc_register().
|
|
*/
|
|
|
|
struct adc_dev_s;
|
|
struct adc_ops_s
|
|
{
|
|
/* Bind the upper-half driver callbacks to the lower-half implementation.
|
|
* This must be called early in order to receive ADC event notifications.
|
|
*/
|
|
|
|
CODE int (*ao_bind)(FAR struct adc_dev_s *dev,
|
|
FAR const struct adc_callback_s *callback);
|
|
|
|
/* Reset the ADC device. Called early to initialize the hardware. This
|
|
* is called, before ao_setup() and on error conditions.
|
|
*/
|
|
|
|
CODE void (*ao_reset)(FAR struct adc_dev_s *dev);
|
|
|
|
/* Configure the ADC. This method is called the first time that the ADC
|
|
* device is opened. This will occur when the port is first opened.
|
|
* This setup includes configuring and attaching ADC interrupts.
|
|
* Interrupts are all disabled upon return.
|
|
*/
|
|
|
|
CODE int (*ao_setup)(FAR struct adc_dev_s *dev);
|
|
|
|
/* Disable the ADC. This method is called when the ADC device is closed.
|
|
* This method reverses the operation of the setup method.
|
|
*/
|
|
|
|
CODE void (*ao_shutdown)(FAR struct adc_dev_s *dev);
|
|
|
|
/* Call to enable or disable RX interrupts */
|
|
|
|
CODE void (*ao_rxint)(FAR struct adc_dev_s *dev, bool enable);
|
|
|
|
/* All ioctl calls will be routed through this method */
|
|
|
|
CODE int (*ao_ioctl)(FAR struct adc_dev_s *dev, int cmd,
|
|
unsigned long arg);
|
|
};
|
|
|
|
/* This is the device structure used by the driver. The caller of
|
|
* adc_register() must allocate and initialize this structure. The calling
|
|
* logic needs to set all fields to zero except:
|
|
*
|
|
* The elements of 'ad_ops', and 'ad_priv'
|
|
*
|
|
* The common logic will initialize all semaphores.
|
|
*/
|
|
|
|
struct adc_dev_s
|
|
{
|
|
/* Fields provided by lower half ADC logic */
|
|
|
|
FAR const struct adc_ops_s *ad_ops; /* Arch-specific operations */
|
|
FAR void *ad_priv; /* Used by the arch-specific logic */
|
|
|
|
#ifdef CONFIG_ADC
|
|
/* Fields managed by common upper half ADC logic */
|
|
|
|
uint8_t ad_ocount; /* The number of times the device has been opened */
|
|
uint8_t ad_nrxwaiters; /* Number of threads waiting to enqueue a message */
|
|
mutex_t ad_closelock; /* Locks out new opens while close is in progress */
|
|
sem_t ad_recvsem; /* Used to wakeup user waiting for space in ad_recv.buffer */
|
|
struct adc_fifo_s ad_recv; /* Describes receive FIFO */
|
|
bool ad_isovr; /* Flag to indicate an ADC overrun */
|
|
|
|
/* The following is a list of 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'.
|
|
*/
|
|
|
|
FAR struct pollfd *fds[CONFIG_ADC_NPOLLWAITERS];
|
|
#endif /* CONFIG_ADC */
|
|
};
|
|
|
|
/****************************************************************************
|
|
* Public Function Prototypes
|
|
****************************************************************************/
|
|
|
|
#if defined(__cplusplus)
|
|
extern "C"
|
|
{
|
|
#endif
|
|
|
|
/****************************************************************************
|
|
* "Upper-Half" ADC Driver Interfaces
|
|
****************************************************************************/
|
|
|
|
/****************************************************************************
|
|
* Name: adc_register
|
|
*
|
|
* Description:
|
|
* Register a ADC driver. This function binds an instance of a "lower half"
|
|
* ADC driver with the "upper half" ADC device and registers that device
|
|
* so that can be used by application code.
|
|
*
|
|
* Input Parameters:
|
|
* path - The full path to the driver to be registers in the NuttX pseudo-
|
|
* filesystem. The recommended convention is to name all PWM drivers
|
|
* as "/dev/adc", "/dev/adc1", etc. where the driver path differs only
|
|
* in the "minor" number at the end of the device name.
|
|
* dev - A pointer to an instance of lower half ADC driver. This instance
|
|
* is bound to the upper half ADC driver and must persists as long as the
|
|
* upper half driver driver persists.
|
|
*
|
|
* Returned Value:
|
|
* Zero on success; a negated errno value on failure.
|
|
*
|
|
****************************************************************************/
|
|
|
|
int adc_register(FAR const char *path, FAR struct adc_dev_s *dev);
|
|
|
|
/****************************************************************************
|
|
* Platform-Independent "Lower Half" ADC Driver Interfaces
|
|
****************************************************************************/
|
|
|
|
/****************************************************************************
|
|
* Name: up_ads1255initialize
|
|
*
|
|
* Description:
|
|
* Initialize the TI ADS 125X lower half driver
|
|
*
|
|
****************************************************************************/
|
|
|
|
FAR struct adc_dev_s *up_ads1255initialize(FAR struct spi_dev_s *spi,
|
|
unsigned int devno);
|
|
|
|
/****************************************************************************
|
|
* Name: lmp92001_adc_initialize
|
|
*
|
|
* Description:
|
|
* Initialize ADC
|
|
*
|
|
* Input Parameters:
|
|
* I2C Port number
|
|
* Device address
|
|
*
|
|
* Returned Value:
|
|
* Valid LM92001 device structure reference on success; a NULL on failure
|
|
*
|
|
****************************************************************************/
|
|
|
|
FAR struct adc_dev_s *lmp92001_adc_initialize(FAR struct i2c_master_s *i2c,
|
|
uint8_t addr);
|
|
|
|
/****************************************************************************
|
|
* Name: ads7828_initialize
|
|
*
|
|
* Description:
|
|
* Initialize ADC
|
|
*
|
|
* Input Parameters:
|
|
* i2c - Pointer to a valid I2C master struct.
|
|
* addr - I2C device address.
|
|
*
|
|
* Returned Value:
|
|
* Valid ADS7828 device structure reference on success; a NULL on failure
|
|
*
|
|
****************************************************************************/
|
|
|
|
FAR struct adc_dev_s *ads7828_initialize(FAR struct i2c_master_s *i2c,
|
|
uint8_t addr);
|
|
|
|
/****************************************************************************
|
|
* Name: max1161x_initialize
|
|
*
|
|
* Description:
|
|
* Initialize ADC
|
|
*
|
|
* Input Parameters:
|
|
* i2c - Pointer to a valid I2C master struct.
|
|
*
|
|
* Returned Value:
|
|
* Valid MX1161X device structure reference on success; a NULL on failure
|
|
*
|
|
****************************************************************************/
|
|
|
|
FAR struct adc_dev_s *max1161x_initialize(FAR struct i2c_master_s *i2c);
|
|
|
|
#if defined(__cplusplus)
|
|
}
|
|
#endif
|
|
|
|
#endif /* __INCLUDE_NUTTX_ANALOG_ADC_H */
|