summaryrefslogtreecommitdiff
path: root/nuttx/arch/arm/src/stm32/stm32_adc.c
diff options
context:
space:
mode:
authorpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2011-12-12 01:04:53 +0000
committerpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2011-12-12 01:04:53 +0000
commit94ca4e731c42413360ea2b91f571d6421da5a7df (patch)
tree0bf63bf4cdbfba3803b0d41cc27d8811372829f8 /nuttx/arch/arm/src/stm32/stm32_adc.c
parent7ddf452e7db12c964d0db4bc2959faae40e69061 (diff)
downloadpx4-nuttx-94ca4e731c42413360ea2b91f571d6421da5a7df.tar.gz
px4-nuttx-94ca4e731c42413360ea2b91f571d6421da5a7df.tar.bz2
px4-nuttx-94ca4e731c42413360ea2b91f571d6421da5a7df.zip
Add a skeleton for an STM32 ADC driver
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@4162 42af7a65-404d-4744-a932-0658087f49c3
Diffstat (limited to 'nuttx/arch/arm/src/stm32/stm32_adc.c')
-rw-r--r--nuttx/arch/arm/src/stm32/stm32_adc.c382
1 files changed, 382 insertions, 0 deletions
diff --git a/nuttx/arch/arm/src/stm32/stm32_adc.c b/nuttx/arch/arm/src/stm32/stm32_adc.c
new file mode 100644
index 000000000..db88fa881
--- /dev/null
+++ b/nuttx/arch/arm/src/stm32/stm32_adc.c
@@ -0,0 +1,382 @@
+/****************************************************************************
+ * arch/arm/src/stm32/stm32_adc.c
+ *
+ * Copyright (C) 2011 Gregory Nutt. All rights reserved.
+ * Author: Li Zhuoyi <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.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+#include <stdio.h>
+#include <sys/types.h>
+#include <stdint.h>
+#include <stdbool.h>
+#include <semaphore.h>
+#include <errno.h>
+#include <debug.h>
+
+#include <arch/board/board.h>
+#include <nuttx/arch.h>
+#include <nuttx/analog/adc.h>
+
+#include "up_internal.h"
+#include "up_arch.h"
+
+#include "chip.h"
+#include "stm32_internal.h"
+#include "stm32_adc.h"
+
+#ifdef CONFIG_ADC
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+/* Configuration ************************************************************/
+/* Up to 3 ADC interfaces are supported */
+
+#if STM32_NADC < 3
+# undef CONFIG_STM32_ADC3
+#endif
+
+#if STM32_NADC < 2
+# undef CONFIG_STM32_ADC2
+#endif
+
+#if STM32_NADC < 1
+# undef CONFIG_STM32_ADC1
+#endif
+
+#if defined(CONFIG_STM32_ADC1) || defined(CONFIG_STM32_ADC2) || defined(CONFIG_STM32_ADC3)
+
+/****************************************************************************
+ * Private Types
+ ****************************************************************************/
+
+struct stm32_dev_s
+{
+ int irq;
+# warning "Missing logic"
+};
+
+/****************************************************************************
+ * Private Function Prototypes
+ ****************************************************************************/
+/* ADC Interrupt Handler */
+
+static int adc_interrupt(int irq, void *context);
+
+/* ADC Driver Methods */
+
+static void adc_reset(FAR struct adc_dev_s *dev);
+static int adc_setup(FAR struct adc_dev_s *dev);
+static void adc_shutdown(FAR struct adc_dev_s *dev);
+static void adc_rxint(FAR struct adc_dev_s *dev, bool enable);
+static int adc_ioctl(FAR struct adc_dev_s *dev, int cmd, unsigned long arg);
+static int adc_interrupt(int irq, void *context);
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+static const struct adc_ops_s g_adcops =
+{
+ .ao_reset = adc_reset,
+ .ao_setup = adc_setup,
+ .ao_shutdown = adc_shutdown,
+ .ao_rxint = adc_rxint,
+ .ao_ioctl = adc_ioctl,
+};
+
+#ifdef CONFIG_STM32_ADC1
+static struct stm32_dev_s g_adcpriv1 =
+{
+#ifdef CONFIG_STM32_STM32F10XX
+ .irq = STM32_IRQ_ADC12;
+#else
+ .irq = STM32_IRQ_ADC;
+#endif
+# warning "Missing logic"
+};
+
+static struct adc_dev_s g_adcdev1 =
+{
+ .ad_ops = &g_adcops,
+ .ad_priv= &g_adcpriv1
+};
+#endif
+
+#ifdef CONFIG_STM32_ADC2
+static struct stm32_dev_s g_adcpriv2 =
+{
+#ifdef CONFIG_STM32_STM32F10XX
+ .irq = STM32_IRQ_ADC12;
+#else
+ .irq = STM32_IRQ_ADC;
+#endif
+# warning "Missing logic"
+};
+
+static struct adc_dev_s g_adcdev2 =
+{
+ .ad_ops = &g_adcops
+ .ad_priv= &g_adcpriv2
+};
+
+#endif
+
+#ifdef CONFIG_STM32_ADC3
+static struct stm32_dev_s g_adcpriv3 =
+{
+#ifdef CONFIG_STM32_STM32F10XX
+ .irq = STM32_IRQ_ADC3;
+#else
+ .irq = STM32_IRQ_ADC;
+#endif
+# warning "Missing logic"
+};
+
+static struct adc_dev_s g_adcdev3 =
+{
+ .ad_ops = &g_adcops,
+ .ad_priv= &g_adcpriv3
+};
+
+#endif
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: adc_interrupt
+ *
+ * Description:
+ * ADC interrupt handler.
+ *
+ * Input Parameters:
+ *
+ * Returned Value:
+ *
+ ****************************************************************************/
+
+static int adc_interrupt(int irq, void *context)
+{
+ FAR struct stm32_dev_s *priv;
+ uint32_t regval;
+
+ /* Determine which ADC caused the interrupt */
+# warning "Missing logic"
+
+ /* Handle the ADC interrupt */
+# warning "Missing logic"
+ return OK;
+}
+
+/****************************************************************************
+ * Name: adc_reset
+ *
+ * Description:
+ * Reset the ADC device. Called early to initialize the hardware. This
+ * is called, before ao_setup() and on error conditions.
+ *
+ * Input Parameters:
+ *
+ * Returned Value:
+ *
+ ****************************************************************************/
+
+static void adc_reset(FAR struct adc_dev_s *dev)
+{
+ FAR struct stm32_dev_s *priv = (FAR struct stm32_dev_s *)dev->ad_priv;
+ irqstate_t flags;
+ uint32_t regval;
+
+ flags = irqsave();
+
+# warning "Missing logic"
+
+ irqrestore(flags);
+}
+
+/****************************************************************************
+ * Name: adc_setup
+ *
+ * Description:
+ * 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.
+ *
+ * Input Parameters:
+ *
+ * Returned Value:
+ *
+ ****************************************************************************/
+
+static int adc_setup(FAR struct adc_dev_s *dev)
+{
+ FAR struct stm32_dev_s *priv = (FAR struct stm32_dev_s *)dev->ad_priv;
+ int ret;
+
+ /* Attach the ADC interrupt */
+
+ ret = irq_attach(priv->irq, adc_interrupt);
+ if (ret == OK)
+ {
+ /* Initialize the ADC data structures */
+#warning "Missing logic"
+
+ /* Enable the ADC interrupt */
+
+ up_enable_irq(priv->irq);
+ }
+ return ret;
+}
+
+/****************************************************************************
+ * Name: adc_shutdown
+ *
+ * Description:
+ * Disable the ADC. This method is called when the ADC device is closed.
+ * This method reverses the operation the setup method.
+ *
+ * Input Parameters:
+ *
+ * Returned Value:
+ *
+ ****************************************************************************/
+
+static void adc_shutdown(FAR struct adc_dev_s *dev)
+{
+ FAR struct stm32_dev_s *priv = (FAR struct stm32_dev_s *)dev->ad_priv;
+
+ /* Disable ADC interrupts and detach the ADC interrupt handler */
+
+ up_disable_irq(priv->irq);
+ irq_detach(priv->irq);
+
+ /* Disable and reset the ADC module */
+#warning "Missing logic"
+}
+
+/****************************************************************************
+ * Name: adc_rxint
+ *
+ * Description:
+ * Call to enable or disable RX interrupts.
+ *
+ * Input Parameters:
+ *
+ * Returned Value:
+ *
+ ****************************************************************************/
+
+static void adc_rxint(FAR struct adc_dev_s *dev, bool enable)
+{
+ FAR struct stm32_dev_s *priv = (FAR struct stm32_dev_s *)dev->ad_priv;
+
+ if (enable)
+ {
+#warning "Missing logic"
+ }
+ else
+ {
+#warning "Missing logic"
+ }
+}
+
+/****************************************************************************
+ * Name: adc_ioctl
+ *
+ * Description:
+ * All ioctl calls will be routed through this method.
+ *
+ * Input Parameters:
+ *
+ * Returned Value:
+ *
+ ****************************************************************************/
+
+static int adc_ioctl(FAR struct adc_dev_s *dev, int cmd, unsigned long arg)
+{
+ return -ENOTTY;
+}
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: up_adcinitialize
+ *
+ * Description:
+ * Initialize the adc
+ *
+ * Returned Value:
+ * Valid can device structure reference on succcess; a NULL on failure
+ *
+ ****************************************************************************/
+
+struct adc_dev_s *up_adcinitialize(int intf)
+{
+#ifdef CONFIG_STM32_ADC1
+ if (intf == 1)
+ {
+ return &g_adcdev1;
+ }
+ else
+#endif
+#ifdef CONFIG_STM32_ADC2
+ if (intf == 2)
+ {
+ return &g_adcdev2;
+ }
+ else
+#endif
+#ifdef CONFIG_STM32_ADC3
+ if (intf == 3)
+ {
+ return &g_adcdev3;
+ }
+ else
+#endif
+ {
+ return NULL;
+ }
+}
+
+#endif /* CONFIG_STM32_ADC || CONFIG_STM32_ADC2 || CONFIG_STM32_ADC3 */
+#endif /* CONFIG_ADC */
+