/*
  ******************************************************************************
  * @file    HAL_OPA.h
  * @version V1.0.0
  * @date    2020
  * @brief   Header file of OPA HAL module.
  ******************************************************************************
*/
#ifndef __HAL_OPA_H__
#define __HAL_OPA_H__

#include "ACM32Fxx_HAL.h"

/** @defgroup OPAx Index
  * @{
  */
#define OPA1        (0x01)
#define OPA2        (0x02)
#define OPA3        (0x03)

/****************  Bit definition for OPA_CR1 and OPA_CR2 register  **************************/
#define OPA_CSR_VINPSEL_POS                    (20U)
#define OPA_CSR_VINPSEL_MASK                   (BIT23|BIT22|BIT21|BIT20)
#define OPA_CSR_VINMSEL_POS                    (16U)
#define OPA_CSR_VINMSEL_MASK                   (BIT19|BIT18|BIT17|BIT16)
#define OPA_CSR_TRIM_HIGH_POS                  (9U)
#define OPA_CSR_TRIM_HIGH_MASK                 (BIT13|BIT12|BIT11|BIT10|BIT9)
#define OPA_CSR_TRIM_LOW_POS                   (4U)
#define OPA_CSR_TRIM_LOW_MASK                  (BIT8|BIT7|BIT6|BIT5|BIT4)
#define OPA_CSR_CAL_OUT                        (BIT3)
#define OPA_CSR_CAL_H                          (BIT2)
#define OPA_CSR_CAL_L                          (BIT1)
#define OPA_CSR_EN                             (BIT0)

/**
  * @brief  OPA Configuration Structure definition
  */
typedef struct
{
    uint8_t            OpaX;        /*!< Specify witch opa be selected */
    uint8_t            VinPSel;     /*!< Specify the opa VINP vin p select */
    uint8_t            VinMSel;     /*!< Specify the opa VINM vin m select */
    uint8_t            TrimEn;      /*!< Specify if the opa auto trim */
}OPA_InitTypeDef;

/**
  * @brief  OPA handle Structure definition
  */
typedef struct
{
  OPA_TypeDef       *Instance;       /*!< Register base address    */
  OPA_InitTypeDef   Init;            /*!< OPA required parameters */
} OPA_HandleTypeDef;


#define OPA_CSR_VINPSEL_0               (0U)
#define OPA_CSR_VINPSEL_1               (1U)

#define OPA_CSR_VINMSEL_0               (0U)
#define OPA_CSR_VINMSEL_1               (1U)

#define OPA_CSR1_VINPSEL_PA4            (0U)
#define OPA_CSR1_VINPSEL_PB6            (1U)

#define OPA_CSR1_VINMSEL_PB5            (0U)
#define OPA_CSR1_VINMSEL_PD5            (1U)

#define OPA_CSR2_VINPSEL_PB3            (0U)
#define OPA_CSR2_VINPSEL_PB4            (1U)

#define OPA_CSR2_VINMSEL_PB1            (0U)
#define OPA_CSR2_VINMSEL_PD4            (1U)

#define OPA_CSR3_VINPSEL_PA7            (0U)
#define OPA_CSR3_VINPSEL_PB2            (1U)

#define OPA_CSR3_VINMSEL_PA5            (0U)
#define OPA_CSR3_VINMSEL_PC4            (1U)

#define OPA_CSR_TRIM_DISABLE           (0U)
#define OPA_CSR_TRIM_ENABLE            (1U)

/******************************** OPA Instances *******************************/
#define IS_OPA_ALL_INSTANCE(INSTANCE)      (((INSTANCE) == OPA))

/******************************** OPA OPAX definition*******************************/
#define IS_OPA_ALL_OPAX(_OPAX)             (((_OPAX) == OPA1) || \
                                            ((_OPAX) == OPA2) || \
                                            ((_OPAX) == OPA3))

/******************************** OPA VINP select definition*******************************/
#define IS_OPA_ALL_VINP(VINPSEL)           (((VINPSEL) == OPA_CSR_VINPSEL_0) || \
                                            ((VINPSEL) == OPA_CSR_VINPSEL_1))

/******************************** OPA VINM select definition*******************************/
#define IS_OPA_ALL_VINM(VINMSEL)           (((VINMSEL) == OPA_CSR_VINMSEL_0) || \
                                            ((VINMSEL) == OPA_CSR_VINMSEL_1))

/******************************** OPA trim enable definition*******************************/
#define IS_OPA_ALL_TRIM(_TRIM)             (((_TRIM) == OPA_CSR_TRIM_DISABLE) || \
                                            ((_TRIM) == OPA_CSR_TRIM_ENABLE))

/* Function : HAL_OPA */
void HAL_OPA_MspInit(OPA_HandleTypeDef* hopa);
void HAL_OPA_MspDeInit(OPA_HandleTypeDef* hopa);
HAL_StatusTypeDef HAL_OPA_Init(OPA_HandleTypeDef* hopa);
HAL_StatusTypeDef HAL_OPA_DeInit(OPA_HandleTypeDef* hopa);
HAL_StatusTypeDef HAL_OPA_Enable(OPA_HandleTypeDef* hopa);
HAL_StatusTypeDef HAL_OPA_Disable(OPA_HandleTypeDef* hopa);

#endif