You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by xi...@apache.org on 2021/06/18 05:50:29 UTC

[incubator-nuttx] branch master updated: Changed the STM32 Analog Comparator driver.

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/incubator-nuttx.git


The following commit(s) were added to refs/heads/master by this push:
     new 91e82d1  Changed the STM32 Analog Comparator driver.
91e82d1 is described below

commit 91e82d159785eea71bff5379da37c2a155cd27bc
Author: Daniel P. Carvalho <da...@gmail.com>
AuthorDate: Thu Jun 17 12:32:46 2021 -0300

    Changed the STM32 Analog Comparator driver.
---
 arch/arm/src/stm32/Kconfig                         |    5 +
 arch/arm/src/stm32/hardware/stm32_comp.h           |   52 +
 arch/arm/src/stm32/hardware/stm32f33xxx_comp.h     |   14 +-
 arch/arm/src/stm32/stm32_comp.c                    | 1055 +-------------------
 arch/arm/src/stm32/stm32_comp.h                    |   10 +-
 .../src/stm32/{stm32_comp.c => stm32_comp_v1.c}    |    4 +-
 6 files changed, 82 insertions(+), 1058 deletions(-)

diff --git a/arch/arm/src/stm32/Kconfig b/arch/arm/src/stm32/Kconfig
index ad6a578..a0941c9 100644
--- a/arch/arm/src/stm32/Kconfig
+++ b/arch/arm/src/stm32/Kconfig
@@ -1553,6 +1553,7 @@ config STM32_STM32F33XX
 	select STM32_HAVE_IP_DBGMCU_V2
 	select STM32_HAVE_IP_TIMERS_V2
 	select STM32_HAVE_IP_ADC_V2
+	select STM32_HAVE_IP_COMP_V1
 	select STM32_HAVE_IP_DMA_V1
 	select STM32_HAVE_IP_I2C_V2
 
@@ -2616,6 +2617,10 @@ config STM32_HAVE_IP_ADC_V2_BASIC
 	default n
 	select STM32_HAVE_IP_ADC_V2
 
+config STM32_HAVE_IP_COMP_V1
+	bool
+	default n
+
 # These are the peripheral selections proper
 
 config STM32_ADC1
diff --git a/arch/arm/src/stm32/hardware/stm32_comp.h b/arch/arm/src/stm32/hardware/stm32_comp.h
new file mode 100644
index 0000000..b9f6903
--- /dev/null
+++ b/arch/arm/src/stm32/hardware/stm32_comp.h
@@ -0,0 +1,52 @@
+/****************************************************************************
+ * arch/arm/src/stm32/hardware/stm32_comp.h
+ *
+ * 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 __ARCH_ARM_SRC_STM32_HARDWARE_STM32_COMP_H
+#define __ARCH_ARM_SRC_STM32_HARDWARE_STM32_COMP_H
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+#include "chip.h"
+
+#ifdef CONFIG_STM32_COMP
+
+/* Include the correct COMP register definitions for
+ * selected STM32 COMP IP core:
+ */
+
+/* If more than one COMP IP ensure that only one is selected */
+
+#if defined(CONFIG_STM32_HAVE_IP_COMP_V1)
+#  if defined(CONFIG_STM32_STM32F33XX)
+#    include "stm32f33xxx_comp.h"
+#  else
+#    error "Device not supported."
+#  endif
+#else
+#  error "STM32 COMP IP not supported."
+#endif
+
+#endif /* CONFIG_STM32_COMP */
+
+#endif /* __ARCH_ARM_SRC_STM32_HARDWARE_STM32_COMP_H */
diff --git a/arch/arm/src/stm32/hardware/stm32f33xxx_comp.h b/arch/arm/src/stm32/hardware/stm32f33xxx_comp.h
index 82b742d..9ed17ed 100644
--- a/arch/arm/src/stm32/hardware/stm32f33xxx_comp.h
+++ b/arch/arm/src/stm32/hardware/stm32f33xxx_comp.h
@@ -18,8 +18,8 @@
  *
  ****************************************************************************/
 
-#ifndef __ARCH_ARM_SRC_STM32_HARDWARE_STM32_COMP_H
-#define __ARCH_ARM_SRC_STM32_HARDWARE_STM32_COMP_H
+#ifndef __ARCH_ARM_SRC_STM32_HARDWARE_STM32F33XXX_COMP_H
+#define __ARCH_ARM_SRC_STM32_HARDWARE_STM32F33XXX_COMP_H
 
 /****************************************************************************
  * Included Files
@@ -33,6 +33,14 @@
  * Pre-processor Definitions
  ****************************************************************************/
 
+/* This is implementation for STM32 COMP IP version 1. Supported devices
+ *   -  STM32F33XX
+ */
+
+#define HAVE_IP_COMP_V1 1
+
+/* TODO: Undef other STM32 COMP IP versions */
+
 /* Register Offsets *********************************************************/
 
 #define STM32_COMP2_CSR_OFFSET      0x0020      /* COMP2 Control register */
@@ -105,4 +113,4 @@
 #define COMP_CSR_OUT                (1 << 30)                     /* Bit 30: comparator output */
 #define COMP_CSR_LOCK               (1 << 31)                     /* Bit 31: comparator lock */
 
-#endif                          /* __ARCH_ARM_SRC_STM32_HARDWARE_STM32_COMP_H */
+#endif                          /* __ARCH_ARM_SRC_STM32_HARDWARE_STM32F33XXX_COMP_H */
diff --git a/arch/arm/src/stm32/stm32_comp.c b/arch/arm/src/stm32/stm32_comp.c
index 6b379ae..38f31a5 100644
--- a/arch/arm/src/stm32/stm32_comp.c
+++ b/arch/arm/src/stm32/stm32_comp.c
@@ -24,1055 +24,20 @@
 
 #include <nuttx/config.h>
 
-#include <stdint.h>
-#include <errno.h>
-#include <assert.h>
-#include <debug.h>
-
-#include <arch/board/board.h>
-#include <nuttx/analog/comp.h>
-#include <nuttx/analog/ioctl.h>
-
 #include "chip.h"
-#include "stm32_gpio.h"
-#include "stm32_comp.h"
-
-/* Some COMP peripheral must be enabled */
-
-/* Up to 7 comparators in STM32F3 Series */
-
-#if defined(CONFIG_STM32_COMP1) || defined(CONFIG_STM32_COMP2) || \
-    defined(CONFIG_STM32_COMP3) || defined(CONFIG_STM32_COMP4) || \
-    defined(CONFIG_STM32_COMP5) || defined(CONFIG_STM32_COMP6) || \
-    defined(CONFIG_STM32_COMP7)
-
-#ifndef CONFIG_STM32_SYSCFG
-#  error "SYSCFG clock enable must be set"
-#endif
-
-/* @TODO: support for STM32F30XX and STM32F37XX comparators */
-
-#if defined(CONFIG_STM32_STM32F30XX) || defined(CONFIG_STM32_STM32F33XX) || \
-    defined(CONFIG_STM32_STM32F37XX)
-
-/* Currently only STM32F33XX supported */
-
-#if defined(CONFIG_STM32_STM32F30XX) || defined(CONFIG_STM32_STM32F37XX)
-#  error "Not supported yet"
-#endif
-
-#if defined(CONFIG_STM32_STM32F33XX)
-#  if defined(CONFIG_STM32_COMP1) || defined(CONFIG_STM32_COMP3) || \
-      defined(CONFIG_STM32_COMP5) || defined(CONFIG_STM32_COMP7)
-#    error "STM32F33 supports only COMP2, COMP4 and COMP6"
-#  endif
-#endif
-
-/****************************************************************************
- * Pre-processor Definitions
- ****************************************************************************/
-
-/* COMP2 default configuration **********************************************/
-
-#ifdef CONFIG_STM32_COMP2
-#  ifndef COMP2_BLANLKING
-#    define COMP2_BLANKING COMP_BLANKING_DEFAULT
-#  endif
-#  ifndef COMP2_POL
-#    define COMP2_POL COMP_BLANKING_DEFAULT
-#  endif
-#  ifndef COMP2_INM
-#    define COMP2_INM COMP_INM_DEFAULT
-#  endif
-#  ifndef COMP2_OUTSEL
-#    define COMP2_OUTSEL COMP_OUTSEL_DEFAULT
-#  endif
-#  ifndef COMP2_LOCK
-#    define COMP2_LOCK COMP_LOCK_DEFAULT
-#  endif
-#  ifndef GPIO_COMP2_INM
-#    warning "GPIO_COMP2_INM not selected. Set default value to GPIO_COMP2_INM1"
-#    define GPIO_COMP2_INM GPIO_COMP4_INM_1
-#  endif
-#endif
-
-/* COMP4 default configuration **********************************************/
-
-#ifdef CONFIG_STM32_COMP4
-#  ifndef COMP4_BLANLKING
-#    define COMP4_BLANKING COMP_BLANKING_DEFAULT
-#  endif
-#  ifndef COMP4_POL
-#    define COMP4_POL COMP_BLANKING_DEFAULT
-#  endif
-#  ifndef COMP4_INM
-#    define COMP4_INM COMP_INM_DEFAULT
-#  endif
-#  ifndef COMP4_OUTSEL
-#    define COMP4_OUTSEL COMP_OUTSEL_DEFAULT
-#  endif
-#  ifndef COMP4_LOCK
-#    define COMP4_LOCK COMP_LOCK_DEFAULT
-#  endif
-#  ifndef GPIO_COMP4_INM
-#    warning "GPIO_COMP4_INM not selected. Set default value to GPIO_COMP4_INM1"
-#    define GPIO_COMP4_INM GPIO_COMP4_INM_1
-#  endif
-#endif
-
-/* COMP6 default configuration **********************************************/
-
-#ifdef CONFIG_STM32_COMP6
-#  ifndef COMP6_BLANLKING
-#    define COMP6_BLANKING COMP_BLANKING_DEFAULT
-#  endif
-#  ifndef COMP6_POL
-#    define COMP6_POL COMP_BLANKING_DEFAULT
-#  endif
-#  ifndef COMP6_INM
-#    define COMP6_INM COMP_INM_DEFAULT
-#  endif
-#  ifndef COMP6_OUTSEL
-#    define COMP6_OUTSEL COMP_OUTSEL_DEFAULT
-#  endif
-#  ifndef COMP6_LOCK
-#    define COMP6_LOCK COMP_LOCK_DEFAULT
-#  endif
-#  ifndef GPIO_COMP6_INM
-#    warning "GPIO_COMP6_INM not selected. Set default value to GPIO_COMP6_INM1"
-#    define GPIO_COMP6_INM GPIO_COMP6_INM_1
-#  endif
-#endif
-
-/****************************************************************************
- * Private Types
- ****************************************************************************/
-
-/* This structure describes the configuration of one COMP device */
-
-struct stm32_comp_s
-{
-  uint8_t blanking;             /* Blanking source */
-  uint8_t pol;                  /* Output polarity */
-  uint8_t inm;                  /* Inverting input selection */
-  uint8_t out;                  /* Comparator output */
-  uint8_t lock;                 /* Comparator Lock */
-  uint32_t csr;                 /* Control and status register */
-#ifndef CONFIG_STM32_STM32F33XX
-  uint8_t mode;                 /* Comparator mode */
-  uint8_t hyst;                 /* Comparator hysteresis */
-                                /* @TODO: Window mode + INP selection */
-#endif
-};
-
-/****************************************************************************
- * Private Function Prototypes
- ****************************************************************************/
-
-/* COMP Register access */
-
-static inline void comp_modify_csr(FAR struct stm32_comp_s *priv,
-                                   uint32_t clearbits, uint32_t setbits);
-static inline uint32_t comp_getreg_csr(FAR struct stm32_comp_s *priv);
-static inline void comp_putreg_csr(FAR struct stm32_comp_s *priv,
-                                   uint32_t value);
-static bool stm32_complock_get(FAR struct stm32_comp_s *priv);
-static int stm32_complock(FAR struct stm32_comp_s *priv, bool lock);
-
-/* COMP Driver Methods */
 
-static void comp_shutdown(FAR struct comp_dev_s *dev);
-static int comp_setup(FAR struct comp_dev_s *dev);
-static int comp_read(FAR struct comp_dev_s *dev);
-static int comp_ioctl(FAR struct comp_dev_s *dev, int cmd,
-                      unsigned long arg);
+/* This file is only a thin shell that includes the correct COMP
+ * implementation. At this moment only STM32 COMP IP version 1 device is
+ * suportted.
+ *   - STM32 COMP IP version 1: SMT32F33XX
+ */
 
-/* Initialization */
-
-static int stm32_compconfig(FAR struct stm32_comp_s *priv);
-static int stm32_compenable(FAR struct stm32_comp_s *priv, bool enable);
-
-/****************************************************************************
- * Private Data
- ****************************************************************************/
-
-static const struct comp_ops_s g_compops =
-{
-  .ao_shutdown  = comp_shutdown,
-  .ao_setup     = comp_setup,
-  .ao_read      = comp_read,
-  .ao_ioctl     = comp_ioctl,
-};
-
-#ifdef CONFIG_STM32_COMP1
-static struct stm32_comp_s g_comp1priv =
-{
-  .blanking  = COMP1_BLANKING,
-  .pol  = COMP1_POL,
-  .inm  = COMP1_INM,
-  .out  = COMP1_OUTSEL,
-  .lock = COMP1_LOCK,
-  .csr  = STM32_COMP1_CSR,
-#ifndef CONFIG_STM32_STM32F33XX
-  .mode = COMP1_MODE,
-  .hyst = COMP1_HYST,
-#endif
-};
-
-static struct comp_dev_s g_comp1dev =
-{
-  .ad_ops  = &g_compops,
-  .ad_priv = &g_comp1priv,
-};
-#endif
-
-#ifdef CONFIG_STM32_COMP2
-static struct stm32_comp_s g_comp2priv =
-{
-  .blanking  = COMP2_BLANKING,
-  .pol  = COMP2_POL,
-  .inm  = COMP2_INM,
-  .out  = COMP2_OUTSEL,
-  .lock = COMP2_LOCK,
-  .csr  = STM32_COMP2_CSR,
-#ifndef CONFIG_STM32_STM32F33XX
-  .mode = COMP2_MODE,
-  .hyst = COMP2_HYST,
-#endif
-};
-
-static struct comp_dev_s g_comp2dev =
-{
-  .ad_ops  = &g_compops,
-  .ad_priv = &g_comp2priv,
-};
-#endif
-
-#ifdef CONFIG_STM32_COMP3
-static struct stm32_comp_s g_comp3priv =
-{
-  .blanking  = COMP3_BLANKING,
-  .pol  = COMP3_POL,
-  .inm  = COMP3_INM,
-  .out  = COMP3_OUTSEL,
-  .lock = COMP3_LOCK,
-  .csr  = STM32_COMP3_CSR,
-#ifndef CONFIG_STM32_STM32F33XX
-  .mode = COMP3_MODE,
-  .hyst = COMP3_HYST,
-#endif
-};
-
-static struct comp_dev_s g_comp3dev =
-{
-  .ad_ops  = &g_compops,
-  .ad_priv = &g_comp3priv,
-};
-#endif
-
-#ifdef CONFIG_STM32_COMP4
-static struct stm32_comp_s g_comp4priv =
-{
-  .blanking  = COMP4_BLANKING,
-  .pol  = COMP4_POL,
-  .inm  = COMP4_INM,
-  .out  = COMP4_OUTSEL,
-  .lock = COMP4_LOCK,
-  .csr  = STM32_COMP4_CSR,
-#ifndef CONFIG_STM32_STM32F33XX
-  .mode = COMP4_MODE,
-  .hyst = COMP4_HYST,
-#endif
-};
-
-static struct comp_dev_s g_comp4dev =
-{
-  .ad_ops  = &g_compops,
-  .ad_priv = &g_comp4priv,
-};
-#endif
-
-#ifdef CONFIG_STM32_COMP5
-static struct stm32_comp_s g_comp5priv =
-{
-  .blanking  = COMP5_BLANKING,
-  .pol  = COMP5_POL,
-  .inm  = COMP5_INM,
-  .out  = COMP5_OUTSEL,
-  .lock = COMP5_LOCK,
-  .csr  = STM32_COMP5_CSR,
-#ifndef CONFIG_STM32_STM32F33XX
-  .mode = COMP5_MODE,
-  .hyst = COMP5_HYST,
-#endif
-};
-
-static struct comp_dev_s g_comp5dev =
-{
-  .ad_ops  = &g_compops,
-  .ad_priv = &g_comp5priv,
-};
-#endif
-
-#ifdef CONFIG_STM32_COMP6
-static struct stm32_comp_s g_comp6priv =
-{
-  .blanking  = COMP6_BLANKING,
-  .pol  = COMP6_POL,
-  .inm  = COMP6_INM,
-  .out  = COMP6_OUTSEL,
-  .lock = COMP6_LOCK,
-  .csr  = STM32_COMP6_CSR,
-#ifndef CONFIG_STM32_STM32F33XX
-  .mode = COMP6_MODE,
-  .hyst = COMP6_HYST,
-#endif
-};
-
-static struct comp_dev_s g_comp6dev =
-{
-  .ad_ops  = &g_compops,
-  .ad_priv = &g_comp6priv,
-};
-#endif
-
-#ifdef CONFIG_STM32_COMP7
-static struct stm32_comp_s g_comp7priv =
-{
-  .blanking  = COMP7_BLANKING,
-  .pol  = COMP7_POL,
-  .inm  = COMP7_INM,
-  .out  = COMP7_OUTSEL,
-  .lock = COMP7_LOCK,
-  .csr  = STM32_COMP7_CSR,
-#ifndef CONFIG_STM32_STM32F33XX
-  .mode = COMP7_MODE,
-  .hyst = COMP7_HYST,
-#endif
-};
-
-static struct comp_dev_s g_comp7dev =
-{
-  .ad_ops  = &g_compops,
-  .ad_priv = &g_comp7priv,
-};
+#if defined(CONFIG_STM32_HAVE_IP_COMP_V1)
+#  include "stm32_comp_v1.c"
+#else
+#  error "STM32 COMP IP version not supported."
 #endif
 
 /****************************************************************************
  * Private Functions
- ****************************************************************************/
-
-/****************************************************************************
- * Name: comp_modify_csr
- *
- * Description:
- *   Modify the value of a 32-bit COMP CSR register (not atomic).
- *
- * Input Parameters:
- *   priv   - A reference to the COMP structure
- *   clrbits - The bits to clear
- *   setbits - The bits to set
- *
- * Returned Value:
- *   None
- *
- ****************************************************************************/
-
-static inline void comp_modify_csr(FAR struct stm32_comp_s *priv,
-                                   uint32_t clearbits, uint32_t setbits)
-{
-  uint32_t csr = priv->csr;
-
-  modifyreg32(csr, clearbits, setbits);
-}
-
-/****************************************************************************
- * Name: comp_getreg_csr
- *
- * Description:
- *   Read the value of an COMP CSR register
- *
- * Input Parameters:
- *   priv   - A reference to the COMP structure
- *
- * Returned Value:
- *   The current contents of the COMP CSR register
- *
- ****************************************************************************/
-
-static inline uint32_t comp_getreg_csr(FAR struct stm32_comp_s *priv)
-{
-  uint32_t csr = priv->csr;
-
-  return getreg32(csr);
-}
-
-/****************************************************************************
- * Name: comp_putreg_csr
- *
- * Description:
- *   Write a value to an COMP register.
- *
- * Input Parameters:
- *   priv   - A reference to the COMP structure
- *   value  - The value to write to the COMP CSR register
- *
- * Returned Value:
- *   None
- *
- ****************************************************************************/
-
-static inline void comp_putreg_csr(FAR struct stm32_comp_s *priv,
-                                   uint32_t value)
-{
-  uint32_t csr = priv->csr;
-
-  putreg32(value, csr);
-}
-
-/****************************************************************************
- * Name: stm32_comp_complock_get
- *
- * Description:
- *   Get COMP lock bit state
- *
- * Input Parameters:
- *   priv   - A reference to the COMP structure
- *
- * Returned Value:
- *   True if COMP locked, false if not locked
- *
- ****************************************************************************/
-
-static bool stm32_complock_get(FAR struct stm32_comp_s *priv)
-{
-  uint32_t regval;
-
-  regval = comp_getreg_csr(priv);
-
-  return (((regval & COMP_CSR_LOCK) == 0) ? false : true);
-}
-
-/****************************************************************************
- * Name: stm32_complock
- *
- * Description:
- *   Lock comparator CSR register
- *
- * Input Parameters:
- *   priv   - A reference to the COMP structure
- *   enable - lock flag
- *
- * Returned Value:
- *  0 on success, a negated errno value on failure
- *
- ****************************************************************************/
-
-static int stm32_complock(FAR struct stm32_comp_s *priv, bool lock)
-{
-  bool current;
-
-  current = stm32_complock_get(priv);
-
-  if (current)
-    {
-      if (lock == false)
-        {
-          aerr("ERROR: COMP LOCK can be cleared only by a system reset\n");
-
-          return -EPERM;
-        }
-    }
-  else
-    {
-      if (lock == true)
-        {
-          comp_modify_csr(priv, 0, COMP_CSR_LOCK);
-
-          priv->lock = COMP_LOCK_RO;
-        }
-    }
-
-  return OK;
-}
-
-/****************************************************************************
- * Name: stm32_compconfig
- *
- * Description:
- *   Configure comparator and used I/Os
- *
- * Input Parameters:
- *   priv   - A reference to the COMP structure
- *
- * Returned Value:
- *  0 on success, a negated errno value on failure
- *
- * REVISIT: Where to config comparator output pin ?
- *
- ****************************************************************************/
-
-static int stm32_compconfig(FAR struct stm32_comp_s *priv)
-{
-  uint32_t regval = 0;
-  int index;
-
-  /* Get comparator index */
-
-  switch (priv->csr)
-    {
-#ifdef CONFIG_STM32_COMP1
-    case STM32_COMP1_CSR:
-      index = 1;
-      break;
-#endif
-
-#ifdef CONFIG_STM32_COMP2
-    case STM32_COMP2_CSR:
-      index = 2;
-      break;
-#endif
-
-#ifdef CONFIG_STM32_COMP3
-    case STM32_COMP3_CSR:
-      index = 3;
-      break;
-#endif
-
-#ifdef CONFIG_STM32_COMP4
-    case STM32_COMP4_CSR:
-      index = 4;
-      break;
-#endif
-
-#ifdef CONFIG_STM32_COMP5
-    case STM32_COMP5_CSR:
-      index = 5;
-      break;
-#endif
-
-#ifdef CONFIG_STM32_COMP6
-    case STM32_COMP6_CSR:
-      index = 6;
-      break;
-#endif
-
-#ifdef CONFIG_STM32_COMP7
-    case STM32_COMP7_CSR:
-      index = 7;
-      break;
-#endif
-
-    default:
-      return -EINVAL;
-    }
-
-  /* Configure non inverting input */
-
-  switch (index)
-    {
-#ifdef CONFIG_STM32_COMP1
-    case 1:
-      stm32_configgpio(GPIO_COMP1_INP);
-      break;
-#endif
-
-#ifdef CONFIG_STM32_COMP2
-    case 2:
-      stm32_configgpio(GPIO_COMP2_INP);
-      break;
-#endif
-
-#ifdef CONFIG_STM32_COMP3
-    case 3:
-      stm32_configgpio(GPIO_COMP3_INP);
-      break;
-#endif
-
-#ifdef CONFIG_STM32_COMP4
-    case 4:
-      stm32_configgpio(GPIO_COMP4_INP);
-      break;
-#endif
-
-#ifdef CONFIG_STM32_COMP5
-    case 5:
-      stm32_configgpio(GPIO_COMP5_INP);
-      break;
-#endif
-
-#ifdef CONFIG_STM32_COMP6
-    case 6:
-      stm32_configgpio(GPIO_COMP6_INP);
-      break;
-#endif
-
-#ifdef CONFIG_STM32_COMP7
-    case 7:
-      stm32_configgpio(GPIO_COMP7_INP);
-      break;
-#endif
-
-    default:
-      return -EINVAL;
-    }
-
-  /* Set Comparator inverting input */
-
-  switch (priv->inm)
-    {
-    case COMP_INMSEL_1P4VREF:
-      regval |= COMP_CSR_INMSEL_1P4VREF;
-      break;
-
-    case COMP_INMSEL_1P2VREF:
-      regval |= COMP_CSR_INMSEL_1P2VREF;
-      break;
-
-    case COMP_INMSEL_3P4VREF:
-      regval |= COMP_CSR_INMSEL_3P4VREF;
-      break;
-
-    case COMP_INMSEL_VREF:
-      regval |= COMP_CSR_INMSEL_VREF;
-      break;
-
-    case COMP_INMSEL_DAC1CH1:
-      regval |= COMP_CSR_INMSEL_DAC1CH1;
-      break;
-
-    case COMP_INMSEL_DAC1CH2:
-      regval |= COMP_CSR_INMSEL_DAC1CH2;
-      break;
-
-    case COMP_INMSEL_PIN:
-      {
-        /* INMSEL PIN configuration dependent on COMP index */
-
-        switch (index)
-          {
-            /* TODO: Inverting input pin configuration for COMP1/3/5/7 */
-
-#ifdef CONFIG_STM32_COMP2
-          case 2:
-            {
-              /* COMP2_INM can be PA2 or PA4 */
-
-              stm32_configgpio(GPIO_COMP2_INM);
-              regval |= (GPIO_COMP2_INM == GPIO_COMP2_INM_1 ?
-                         COMP_CSR_INMSEL_PA2 : COMP_CSR_INMSEL_PA4);
-              break;
-            }
-#endif
-
-#ifdef CONFIG_STM32_COMP4
-          case 4:
-            {
-              /* COMP4_INM can be PB2 or PA4 */
-
-              stm32_configgpio(GPIO_COMP4_INM);
-              regval |= (GPIO_COMP4_INM == GPIO_COMP4_INM_1 ?
-                         COMP_CSR_INMSEL_PB2 : COMP_CSR_INMSEL_PA4);
-              break;
-            }
-#endif
-
-#ifdef CONFIG_STM32_COMP6
-          case 6:
-            {
-              /* COMP6_INM can be PB15 or PA4 */
-
-              stm32_configgpio(GPIO_COMP6_INM);
-              regval |= (GPIO_COMP6_INM == GPIO_COMP6_INM_1 ?
-                         COMP_CSR_INMSEL_PB15 : COMP_CSR_INMSEL_PA4);
-              break;
-            }
-#endif
-
-          default :
-            return -EINVAL;
-          }
-
-        break;
-      }
-
-    default:
-      return -EINVAL;
-    }
-
-  /* Set Comparator output selection */
-
-  switch (priv->out)
-    {
-    case COMP_OUTSEL_NOSEL:
-      regval |= COMP_CSR_OUTSEL_NOSEL;
-      break;
-
-    case COMP_OUTSEL_BRKACTH:
-      regval |= COMP_CSR_OUTSEL_BRKACTH;
-      break;
-
-    case COMP_OUTSEL_BRK2:
-      regval |= COMP_CSR_OUTSEL_BRK2;
-      break;
-
-    case COMP_OUTSEL_T1OCC:
-      regval |= COMP_CSR_OUTSEL_T1OCC;
-      break;
-
-    case COMP_OUTSEL_T3CAP3:
-      regval |= COMP_CSR_OUTSEL_T3CAP3;
-      break;
-
-    case COMP_OUTSEL_T2CAP2:
-      regval |= COMP_CSR_OUTSEL_T2CAP2;
-      break;
-
-    case COMP_OUTSEL_T1CAP1:
-      regval |= COMP_CSR_OUTSEL_T1CAP1;
-      break;
-
-    case COMP_OUTSEL_T2CAP4:
-      regval |= COMP_CSR_OUTSEL_T2CAP4;
-      break;
-
-    case COMP_OUTSEL_T15CAP2:
-      regval |= COMP_CSR_OUTSEL_T15CAP2;
-      break;
-
-    case COMP_OUTSEL_T2OCC:
-      if (index == 2)
-        {
-          regval |= COMP2_CSR_OUTSEL_T2OCC;
-        }
-      else if (index == 6)
-        {
-          regval |= COMP6_CSR_OUTSEL_T2OCC;
-        }
-
-      break;
-
-    case COMP_OUTSEL_T16OCC:
-      regval |= COMP_CSR_OUTSEL_T16OCC;
-      break;
-
-    case COMP_OUTSEL_T3CAP1:
-      regval |= COMP_CSR_OUTSEL_T3CAP1;
-      break;
-
-    case COMP_OUTSEL_T15OCC:
-      regval |= COMP_CSR_OUTSEL_T15OCC;
-      break;
-
-    case COMP_OUTSEL_T16CAP1:
-      regval |= COMP_CSR_OUTSEL_T16CAP1;
-      break;
-
-    case COMP_OUTSEL_T3OCC:
-      regval |= COMP_CSR_OUTSEL_T3OCC;
-      break;
-
-    default:
-      return -EINVAL;
-    }
-
-  /* Set Comparator output polarity */
-
-  regval |= (priv->pol == COMP_POL_INVERTED ? COMP_CSR_POL : 0);
-
-  /* Set Comparator output blanking source */
-
-  switch (priv->blanking)
-    {
-    case COMP_BLANKING_DIS:
-      regval |= COMP_CSR_BLANKING_DIS;
-      break;
-
-    case COMP_BLANKING_T1OC5:
-      regval |= COMP_CSR_BLANKING_T1OC5;
-      break;
-
-    case COMP_BLANKING_T3OC4:
-      regval |= COMP_CSR_BLANKING_T3OC4;
-      break;
-
-    case COMP_BLANKING_T2OC3:
-      regval |= COMP_CSR_BLANKING_T2OC3;
-      break;
-
-    case COMP_BLANKING_T15OC1:
-      regval |= COMP_CSR_BLANKING_T15OC1;
-      break;
-
-    case COMP_BLANKING_T2OC4:
-      regval |= COMP_CSR_BLANKING_T2OC4;
-      break;
-
-    case COMP_BLANKING_T15OC2:
-      regval |= COMP_CSR_BLANKING_T15OC1;
-      break;
-
-    default:
-      return -EINVAL;
-    }
-
-  /* Save CSR register */
-
-  comp_putreg_csr(priv, regval);
-
-  /* Enable Comparator */
-
-  stm32_compenable(priv, true);
-
-  /* Lock Comparator if needed */
-
-  if (priv->lock == COMP_LOCK_RO)
-    {
-      stm32_complock(priv, true);
-    }
-
-  return OK;
-}
-
-/****************************************************************************
- * Name: stm32_compenable
- *
- * Description:
- *   Enable/disable comparator
- *
- * Input Parameters:
- *   priv   - A reference to the COMP structure
- *   enable - enable/disable flag
- *
- * Returned Value:
- *  0 on success, a negated errno value on failure
- *
- ****************************************************************************/
-
-static int stm32_compenable(FAR struct stm32_comp_s *priv, bool enable)
-{
-  bool lock;
-
-  ainfo("enable: %d\n", enable ? 1 : 0);
-
-  lock = stm32_complock_get(priv);
-
-  if (lock)
-    {
-      aerr("ERROR: Comparator locked!\n");
-
-      return -EPERM;
-    }
-  else
-    {
-      if (enable)
-        {
-          /* Enable the COMP */
-
-          comp_modify_csr(priv, 0, COMP_CSR_COMPEN);
-        }
-      else
-        {
-          /* Disable the COMP */
-
-          comp_modify_csr(priv, COMP_CSR_COMPEN, 0);
-        }
-    }
-
-  return OK;
-}
-
-/****************************************************************************
- * Name: adc_setup
- *
- * Description:
- *   Configure the COMP. This method is called the first time that the COMP
- *   device is opened.  This will occur when the port is first opened.
- *   This setup includes configuring and attaching COMP interrupts.
- *   Interrupts are all disabled upon return.
- *
- * Input Parameters:
- *
- * Returned Value:
- *
- ****************************************************************************/
-
-static int comp_setup(FAR struct comp_dev_s *dev)
-{
-#warning "Missing logic"
-
-  return OK;
-}
-
-/****************************************************************************
- * Name: comp_shutdown
- *
- * Description:
- *   Disable the COMP.  This method is called when the COMP device is closed.
- *   This method reverses the operation the setup method.
- *   Works only if COMP device is not locked.
- *
- * Input Parameters:
- *
- * Returned Value:
- *   None
- *
- ****************************************************************************/
-
-static void comp_shutdown(FAR struct comp_dev_s *dev)
-{
-#warning "Missing logic"
-}
-
-/****************************************************************************
- * Name: comp_read
- *
- * Description:
- *  Get the COMP output state.
- *
- * Input Parameters:
- *
- * Returned Value:
- *   0 if output is low (non-inverting input below inverting input),
- *   1 if output is high (non inverting input above inverting input).
- *
- ****************************************************************************/
-
-static int comp_read(FAR struct comp_dev_s *dev)
-{
-  FAR struct stm32_comp_s *priv;
-  uint32_t regval;
-
-  priv = dev->ad_priv;
-  regval = comp_getreg_csr(priv);
-
-  return (((regval & COMP_CSR_OUT) == 0) ? 0 : 1);
-}
-
-/****************************************************************************
- * Name: comp_ioctl
- *
- * Description:
- *   All ioctl calls will be routed through this method.
- *
- * Input Parameters:
- *   dev - pointer to device structure used by the driver
- *   cmd - command
- *   arg - arguments passed with command
- *
- * Returned Value:
- *   Zero on success; a negated errno value on failure.
- *
- ****************************************************************************/
-
-static int comp_ioctl(FAR struct comp_dev_s *dev, int cmd, unsigned long arg)
-{
-#warning "Missing logic"
-  return -ENOTTY;
-}
-
-/****************************************************************************
- * Public Functions
- ****************************************************************************/
-
-/****************************************************************************
- * Name: stm32_compinitialize
- *
- * Description:
- *   Initialize the COMP.
- *
- * Input Parameters:
- *   intf - The COMP interface number.
- *
- * Returned Value:
- *   Valid COMP device structure reference on success; a NULL on failure.
- *
- * Assumptions:
- *   1. Clock to the COMP block has enabled,
- *   2. Board-specific logic has already configured
- *
- ****************************************************************************/
-
-FAR struct comp_dev_s *stm32_compinitialize(int intf)
-{
-  FAR struct comp_dev_s   *dev;
-  FAR struct stm32_comp_s *comp;
-  int ret;
-
-  switch (intf)
-    {
-#ifdef CONFIG_STM32_COMP1
-    case 1:
-      ainfo("COMP1 selected\n");
-      dev = &g_comp1dev;
-      break;
-#endif
-
-#ifdef CONFIG_STM32_COMP2
-    case 2:
-      ainfo("COMP2 selected\n");
-      dev = &g_comp2dev;
-      break;
-#endif
-
-#ifdef CONFIG_STM32_COMP3
-    case 3:
-      ainfo("COMP3 selected\n");
-      dev = &g_comp3dev;
-      break;
-#endif
-
-#ifdef CONFIG_STM32_COMP4
-    case 4:
-      ainfo("COMP4 selected\n");
-      dev = &g_comp4dev;
-      break;
-#endif
-
-#ifdef CONFIG_STM32_COMP5
-    case 5:
-      ainfo("COMP5 selected\n");
-      dev = &g_comp5dev;
-      break;
-#endif
-
-#ifdef CONFIG_STM32_COMP6
-    case 6:
-      ainfo("COMP6 selected\n");
-      dev = &g_comp6dev;
-      break;
-#endif
-
-#ifdef CONFIG_STM32_COMP7
-    case 7:
-      ainfo("COMP7 selected\n");
-      dev = &g_comp7dev;
-      break;
-#endif
-
-    default:
-      aerr("ERROR: No COMP interface defined\n");
-      return NULL;
-    }
-
-  /* Configure selected comparator */
-
-  comp = dev->ad_priv;
-
-  ret = stm32_compconfig(comp);
-  if (ret < 0)
-    {
-      aerr("ERROR: Failed to initialize COMP%d: %d\n", intf, ret);
-      return NULL;
-    }
-
-  return dev;
-}
-
-#endif /* CONFIG_STM32_STM32F30XX || CONFIG_STM32_STM32F33XX ||
-        * CONFIG_STM32_STM32F37XX
-        */
-
-#endif /* CONFIG_STM32_COMP2 || CONFIG_STM32_COMP4 ||
-        * CONFIG_STM32_COMP6
-        */
+ ****************************************************************************/
\ No newline at end of file
diff --git a/arch/arm/src/stm32/stm32_comp.h b/arch/arm/src/stm32/stm32_comp.h
index 5bf7be8..1212911 100644
--- a/arch/arm/src/stm32/stm32_comp.h
+++ b/arch/arm/src/stm32/stm32_comp.h
@@ -29,15 +29,9 @@
 
 #include "chip.h"
 
-#ifdef CONFIG_STM32_COMP
+#include "hardware/stm32_comp.h"
 
-#if defined(CONFIG_STM32_STM32F30XX)
-#  error "COMP support for STM32F30XX not implemented yet"
-#elif defined(CONFIG_STM32_STM32F33XX)
-#  include "hardware/stm32f33xxx_comp.h"
-#elif defined(CONFIG_STM32_STM32F37XX)
-#  error "COMP support for STM32F37XX not implemented yet"
-#endif
+#ifdef CONFIG_STM32_COMP
 
 /****************************************************************************
  * Pre-processor definitions
diff --git a/arch/arm/src/stm32/stm32_comp.c b/arch/arm/src/stm32/stm32_comp_v1.c
similarity index 99%
copy from arch/arm/src/stm32/stm32_comp.c
copy to arch/arm/src/stm32/stm32_comp_v1.c
index 6b379ae..c8b658f 100644
--- a/arch/arm/src/stm32/stm32_comp.c
+++ b/arch/arm/src/stm32/stm32_comp_v1.c
@@ -1,5 +1,5 @@
 /****************************************************************************
- * arch/arm/src/stm32/stm32_comp.c
+ * arch/arm/src/stm32/stm32_comp_v1.c
  *
  * Licensed to the Apache Software Foundation (ASF) under one or more
  * contributor license agreements.  See the NOTICE file distributed with
@@ -92,7 +92,7 @@
 #  endif
 #  ifndef GPIO_COMP2_INM
 #    warning "GPIO_COMP2_INM not selected. Set default value to GPIO_COMP2_INM1"
-#    define GPIO_COMP2_INM GPIO_COMP4_INM_1
+#    define GPIO_COMP2_INM GPIO_COMP2_INM_1
 #  endif
 #endif