PeripheralDriver_Flagchip_F.../Inc/module_driver_qdt.h

375 lines
14 KiB
C

/**
* @file module_driver_qdt.h
* @author Flagchip
* @brief FC7xxx QDT driver type definition and API
* @version 2.0.0
* @date 2024-08-28
*
* SDK Version: 2.6.0
*
* @copyright Copyright (c) 2024 Flagchip Semiconductors Co., Ltd.
*
*/
/* ********************************************************************************
* Revision History:
*
* Version Date Initials CR# Descriptions
* --------- ---------- ------------ ---------- ---------------
* 0.1.0 2023-12-15 Flagchip113 N/A First version for FC7300
* 2.0.0 2024-10-12 Flagchip113 N/A Change version and release
******************************************************************************** */
#ifndef _DRIVER_MODULE_DRIVER_QDT_H_
#define _DRIVER_MODULE_DRIVER_QDT_H_
#include "HwA_qdt.h"
#if QDT_INSTANCE_COUNT > 0U
#define QDT_DEV_ERROR_REPORT STD_ON
/**
* @name SENT API Service IDs
* @brief Defines the service IDs for the FCUART module, which are used to identify different functions or services provided by the SENT layer.
* These IDs are utilized when communicating with the SENT module, enabling calls to or responses from various functions.
*
* @{
*/
#define QDT_INIT_ID 0U /**< link to "QDT_Init" API. */
#define QDT_DEINIT_ID 1U /**< link to "QDT_Deinit" API. */
#define QDT_CHANNEL_INIT_ID 2U /**< link to "QDT_Channel_Init" API. */
#define QDT_RESTART_MEASUREMENT_ID 3U /**< link to "QDT_ReStartMeasurement" API. */
#define QDT_GET_CHANNEL_FLAG_ID 4U /**< link to "QDT_GetChannelFlag" API. */
#define QDT_CLEAR_CHANNEL_FLAG_ID 5U /**< link to "QDT_ClearChannelFlag" API. */
#define QDT_GET_EDGE_NUMBER_ID 6U /**< link to "QDT_GetEdgeNumber" API. */
#define QDT_GET_CV_ID 7U /**< link to "QDT_GetCV" API. */
#define QDT_GET_REVCNT_ID 8U /**< link to "QDT_GetREVCNT" API. */
#define QDT_GET_REVCNT_HOLD_ID 9U /**< link to "QDT_GetREVCNT_HOLD" API. */
#define QDT_GET_POSCNT_ID 10U /**< link to "QDT_GetPOSCNT" API. */
#define QDT_GET_POSCNT_HOLD_ID 11U /**< link to "QDT_GetPOSCNT_HOLD" API. */
#define QDT_GET_POSDCNT_ID 12U /**< link to "QDT_GetPOSDCNT" API. */
#define QDT_GET_POSDCNT_HOLD_ID 13U /**< link to "QDT_GetPOSDCNT_HOLD" API. */
#define QDT_GET_LECNT_ID 14U /**< link to "QDT_GetLECNT" API. */
#define QDT_GET_LECNT_HOLD_ID 15U /**< link to "QDT_GetLECNT_HOLD" API. */
#define QDT_GET_POSDTMRCNT_ID 16U /**< link to "QDT_GetPOSDTMRCNT" API. */
#define QDT_GET_POSDTMRCNT_HOLD_ID 17U /**< link to "QDT_GetPOSDTMRCNT_HOLD" API. */
#define QDT_GET_SPEED_ID 18U /**< link to "QDT_GetSpeed" API. */
/** @}*/
/**
* @name SENT Dev Error Code
* @brief Error Code of calling SENT apis
*
* @{
*/
#define QDT_E_PARAM_POINTER 0x01U /**< The SENT pointer parameter is NULL. */
#define QDT_E_ALREADY_INIT 0x02U /**< The SENT has been initialized. */
#define QDT_E_UNINIT 0x03U /**< The SENT is not initialized. */
#define QDT_E_PARAM_INSTANCE 0x04U /**< The SENT instance number is out of range. */
#define QDT_E_PARAM_CHANNEL 0x05U /**< The SENT channel number is out of range. */
#define QDT_E_PARAM_GENERAL 0x06U /**< The SENT parameter is incorrect or out of range. */
#define QDT_E_PARAM_MODE 0x07U /**< The SENT mode is incorrect. */
/** @}*/
/* ################################################################################## */
/* ################################### Type define ################################## */
/**
* @brief QDT ISR callback function prototype
*
*/
typedef void (*QDT_CallbackType)(void);
/**
* @addtogroup module_driver_can
* @{
*/
typedef enum
{
QDT_READY = 0u,
QDT_INIT = 1U,
QDT_DEINIT = 2u
}QDT_StatusType;
/**
* @brief QDT operation return values
*
*/
typedef enum
{
QDT_RETURN_OK = 0x00U, /*!< The QDT operation is succeeded */
QDT_RETURN_E_NOT_OK = 0x01U, /*!< The QDT operation is failed */
QDT_RETURN_E_ALREADY_INIT = 0x02U, /*!< The QDT has been initialized. */
QDT_RETURN_E_UNINIT = 0x03U, /*!< The QDT is not initialized */
QDT_RETURN_E_PARAM = 0x04U, /*!< The QDT parameter is incorrect or out of range. */
QDT_RETURN_E_SEQUENCE = 0x05U,
QDT_RETURN_E_MODE = 0x60U
}Qdt_ReturnType;
typedef enum
{
QDT_INSTANCE_0 = 0u,
QDT_INSTANCE_1 = 1u,
QDT_INSTANCE_2 = 2u,
QDT_INSTANCE_3 = 3u,
QDT_INSTANCE_MAX = 4u
}QDT_InstanceType;
/**
* @brief QDT clock source type
*
*/
typedef enum
{
QDT_CLOCK_NONE = 0u, /**< No clock selected. */
QDT_CLOCK_INTERNAL_BUSCLK = 1u, /**< QDT input clock from bus clock. */
QDT_CLOCK_INTERNAL_PCCCLK = 2u, /**< QDT input clock from pcc clock. PCC_SEL is not 0. */
QDT_CLOCK_EXTERNAL_TCLK0 = 3u, /**< External pin input clock from QDT_TCLK0 pin. Only valid when PCC_SEL is 0. */
QDT_CLOCK_EXTERNAL_TCLK1 = 4u, /**< External pin input clock from QDT_TCLK1 pin. Only valid when PCC_SEL is 0. */
QDT_CLOCK_EXTERNAL_TCLK2 = 5u, /**< External pin input clock from QDT_TCLK2 pin. Only valid when PCC_SEL is 0. */
}QDT_ClockSourceType;
typedef enum
{
QDT_COUNTER_PRESCALE_DIV_1 = 0u,
QDT_COUNTER_PRESCALE_DIV_2 = 1u,
QDT_COUNTER_PRESCALE_DIV_4 = 2u,
QDT_COUNTER_PRESCALE_DIV_8 = 3u,
QDT_COUNTER_PRESCALE_DIV_16 = 4u,
QDT_COUNTER_PRESCALE_DIV_32 = 5u,
QDT_COUNTER_PRESCALE_DIV_64 = 6u,
QDT_COUNTER_PRESCALE_DIV_128 = 7u
}QDT_CounterPrescaleType;
typedef enum
{
QDT_FILTER_PRESCALE_DIV_1 = 0u,
QDT_FILTER_PRESCALE_DIV_2 = 1u,
QDT_FILTER_PRESCALE_DIV_3 = 2u,
QDT_FILTER_PRESCALE_DIV_4 = 3u,
QDT_FILTER_PRESCALE_DIV_5 = 4u,
QDT_FILTER_PRESCALE_DIV_6 = 5u,
QDT_FILTER_PRESCALE_DIV_7 = 6u,
QDT_FILTER_PRESCALE_DIV_8 = 7u,
QDT_FILTER_PRESCALE_DIV_9 = 8u,
QDT_FILTER_PRESCALE_DIV_10 = 9u,
QDT_FILTER_PRESCALE_DIV_11 = 10u,
QDT_FILTER_PRESCALE_DIV_12 = 11u,
QDT_FILTER_PRESCALE_DIV_13 = 12u,
QDT_FILTER_PRESCALE_DIV_14 = 13u,
QDT_FILTER_PRESCALE_DIV_15 = 14u,
QDT_FILTER_PRESCALE_DIV_16 = 15u
}QDT_FilterPrescaleType;
typedef enum
{
QDT_CHANNEL_0_PHA = 0u,
QDT_CHANNEL_1_PHB = 1u,
QDT_CHANNEL_2_PHZ = 2u,
QDT_CHANNEL_3_HOME = 3u,
QDT_CHANNEL_MAX = 4u
}QDT_ChannelIndexType;
typedef enum
{
QDT_CHANNEL_NOT_USED = 0u,
QDT_CHANNEL_IC_MODE = 1u,
//In ICM mode, pair of channels are used to measure, Only need configure the even channel
QDT_CHANNEL_ICDM_MODE = 2u,
QDT_CHANNEL_ICPM_MODE = 3u,
QDT_CHANNEL_ICENM_MODE = 4u,
QDT_CHANNEL_ICEXPENM_MODE = 5u,
QDT_CHANNEL_QUAD_MODE = 6u
}QDT_ChannelModeType;
typedef enum
{
QDT_CAPTURE_RISING_EDGE = 0u,
QDT_CAPTURE_FALLING_EDGE = 1u,
QDT_CAPTURE_BOTH_EDGE = 2u
}QDT_CaptureEdgeType;
typedef enum
{
QDT_CHANNEL_MATCH_POSCNT = 0u,
QDT_CHANNEL_MATCH_REVCNT = 1u,
QDT_CHANNEL_MATCH_DISABLE = 2u
}QDT_ChannelMatchType;
typedef struct
{
//input
uint32_t u32ClkFreq;
uint32_t u32LecntLarge;
uint32_t u32Line;
//output
float fSpeed;
}QDT_SpeedResultType;
typedef struct
{
bool bEnWDOG;
bool bEnWDOGFInt;
uint16_t u16Timeout;
QDT_CallbackType pWDOGFCallback;
}QDT_WdogConfigType;
typedef struct
{
bool bEnCVSyncTriggerMode; /**< True: Sync CV register with trigger mode. */
bool bEnSoftTriggerReset; /**< True: Allow SW event to reset POSCNT, REVCNT and POSDCNT. FALSE: SW event will only reset the POSCNT. */
bool bEnHardTriggerInput; /**< Enables hardware trigger to the synchronization and reset. */
bool bEnHardTriggerReset; /**< True: Allow HW event to reset POSCNT, REVCNT and POSDCNT. FALSE: HW event will not reset any Counter. */
bool bEnHardTriggerUpdate; /**< Allow the hardware trigger to cause an update of the POSCNTH, REVCNTH and POSDCNTH registers */
}QDT_SyncModeConfigType;
typedef struct
{
bool bEnDebugMode; /**< Debug Mode Enable. true is disable, true is enable. */
bool bEnMatchPulse; /**< true means Match Trigger pulses when a match occurs between the position counters (POS) and the corresponding channel value (CV )
false means Match Trigger pulses when the POSCNT, REVCNT, or POSDCNT are read. */
QDT_ClockSourceType eClkSrcSel; /**< Select the QDT clock source. */
QDT_CounterPrescaleType eCounterPrescale; /**< Setting the prescale of QDT counter clock frequency. */
QDT_FilterPrescaleType eFilterPrescale;
bool bEnTOFInt; /**< Timer Overflow Interrupt Enable. true is disable, false is enable. */
QDT_CallbackType pTOFCallback;
QDT_WdogConfigType tWdgConfig;
QDT_SyncModeConfigType tSyncModeConfig;
}QDT_ConfigType;
typedef struct
{
QDT_CaptureEdgeType eEdge; /**< Select which edge to capture. */
bool bFromRevCNT; /**< FALSE: capture POSCNT into the CV register, TRUE: capture REVCNT into the CV register */
bool bResetPOSCNT; /**< FALSE:QDT counter is not reset when the selected channel (n) input event is detected */
}QDT_IC_ConfigType;
typedef struct
{
bool bHighActive; /**< Indicate high /low valid of input signal. */
bool bContinueMeasure; /**< indicates whether continue to measure. */
bool bStartWIthActive; /**< TRUE: the channel starts measuring after the first edge is detected.
FALSE: the measurement starts immediately after activating the channel */
}QDT_ICDM_ConfigType;
typedef struct
{
QDT_CaptureEdgeType eEdge; /**< please don't select both edge. */
bool bContinueMeasure; /**< indicates whether continue to measure. */
bool bStartWIthActive; /**< TRUE: the channel starts measuring after the first edge is detected.
FALSE: the measurement starts immediately after activating the channel */
}QDT_ICPM_ConfigType;
typedef struct
{
QDT_CaptureEdgeType eEdge; /**< Select which edge to capture. */
uint32_t u32StartPoint;
uint32_t u32EndPoint;
bool bContinueMeasure; /**< indicates whether continue to measure. */
}QDT_ICENM_ConfigType;
typedef struct
{
QDT_CaptureEdgeType eEdge; /**< Select which edge to capture. */
uint8_t u8ExpectedNum;
bool bContinueMeasure; /**< indicates whether continue to measure. */
}QDT_ICEXPENM_ConfigType;
typedef struct
{
bool bPHANormalPolarity;
bool bPHBNormalPolarity;
bool bEnPHAPHBMode; /**< true: Phase A and phase B encoding mode. false: Count and direction encoding mode */
uint8_t u8PHAInputFilter;
uint8_t u8PHBInputFilter;
uint32_t u32PHACV;
uint32_t u32PHBCV;
QDT_ChannelMatchType ePHAMatchType;
QDT_ChannelMatchType ePHBMatchType;
}QDT_QUAD_PHAB_ConfigType;
typedef struct
{
uint8_t u8InputFilter;
uint32_t u32CV;
QDT_ChannelMatchType eMatchType;
}QDT_QUAD_PHZ_HOME_ConfigType;
typedef struct
{
QDT_ChannelIndexType eChannelIndex;
QDT_ChannelModeType eChannelMode; /**< Select Channel operation mode. */
bool bEnChannelInt;
QDT_CallbackType pChannelCallback;
union
{
QDT_IC_ConfigType tICConfig;
QDT_ICDM_ConfigType tICDMConfig;
QDT_ICPM_ConfigType tICPMConfig;
QDT_ICENM_ConfigType tICENMConfig;
QDT_ICEXPENM_ConfigType tICEXPENMConfig;
QDT_QUAD_PHAB_ConfigType tPHABQUADConfig;
QDT_QUAD_PHZ_HOME_ConfigType tPHZHOMEQUADConfig;
};
}QDT_Channel_ConfigType;
typedef struct
{
QDT_InstanceType eInstance;
QDT_StatusType eStatus;
struct
{
QDT_CallbackType pTOFCallback;
QDT_CallbackType pWDOGFCallback;
QDT_CallbackType achannelCallback[QDT_CHANNEL_MAX];
QDT_ChannelModeType aChannelMode[QDT_CHANNEL_MAX];
}tSetting;
}QDT_HandleType;
void QDT_Init(QDT_HandleType *pSentHandle, QDT_ConfigType *pConfig);
void QDT_Deinit(QDT_HandleType *pSentHandle);
void QDT_Channel_Init(QDT_HandleType *pSentHandle, QDT_Channel_ConfigType *pConfig);
void QDT_ReStartMeasurement(QDT_HandleType *pSentHandle, uint8_t u8Channel);
void QDT_GetChannelFlag(QDT_HandleType *pSentHandle, uint8_t u8Channel, bool *pSet);
void QDT_ClearChannelFlag(QDT_HandleType *pSentHandle, uint8_t u8Channel);
void QDT_GetEdgeNumber(QDT_HandleType *pSentHandle, uint8_t u8Channel, uint32_t *pNumber);
void QDT_GetCV(QDT_HandleType *pSentHandle, uint8_t u8Channel, uint32_t *pCV);
void QDT_GetREVCNT(QDT_HandleType *pSentHandle, uint32_t *pREVCNT);
void QDT_GetREVCNT_HOLD(QDT_HandleType *pSentHandle, uint32_t *pREVCNTH);
void QDT_GetPOSCNT(QDT_HandleType *pSentHandle, uint32_t *pPOSCNT);
void QDT_GetPOSCNT_HOLD(QDT_HandleType *pSentHandle, uint32_t *pPOSCNTH);
void QDT_GetPOSDCNT(QDT_HandleType *pSentHandle, uint32_t *pPOSDCNT);
void QDT_GetPOSDCNT_HOLD(QDT_HandleType *pSentHandle, uint32_t *pPOSDCNTH);
void QDT_GetLECNT(QDT_HandleType *pSentHandle, uint32_t *pLECNT);
void QDT_GetLECNT_HOLD(QDT_HandleType *pSentHandle, uint32_t *pLECNTH);
void QDT_GetPOSDTMRCNT(QDT_HandleType *pSentHandle, uint32_t *pPOSDTMRCNT);
void QDT_GetPOSDTMRCNT_HOLD(QDT_HandleType *pSentHandle, uint32_t *pPOSDTMRCNTH);
void QDT_GetSpeed(QDT_HandleType *pSentHandle, QDT_SpeedResultType *pSpeed);
void QDT_InterruptProcess(const QDT_HandleType *pSentHandle);
#endif
#endif /* _DRIVER_MODULE_DRIVER_QDT_H_ */