236 lines
7.2 KiB
C
236 lines
7.2 KiB
C
/**
|
|
* @file module_driver_tpu.c
|
|
* @author Flagchip099
|
|
* @brief FC7xxx TPU driver source code
|
|
* @version 2.0.0
|
|
* @date 2024-1-12
|
|
*
|
|
* 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 Flagchip099 N/A First version for FC7300
|
|
* 2.0.0 2024-10-12 Flagchip099 N/A Change version and release
|
|
******************************************************************************** */
|
|
|
|
#ifndef MODULE_DRIVER_TPU_H
|
|
#define MODULE_DRIVER_TPU_H
|
|
|
|
/* ----------------------------------------------------------------------------
|
|
-- TPU_H Peripheral Access Layer
|
|
---------------------------------------------------------------------------- */
|
|
|
|
#include "HwA_tpuh.h"
|
|
#include "HwA_tpue.h"
|
|
|
|
#if TPU_INSTANCE_COUNT > 0U
|
|
|
|
#include "HwA_scm.h"
|
|
|
|
#define TPU_TCR1_MAXVALUE 0xFFFFFFU
|
|
#define TPU_CHANNEL_NUM 32U
|
|
|
|
extern void RTT_Printf(char *fmt, ...);
|
|
#define DEBUG_INFO(str, ...) RTT_Printf(str, ##__VA_ARGS__)
|
|
|
|
/**
|
|
* @brief TPU event callback function prototype
|
|
*
|
|
*/
|
|
typedef void (*TPU_EventCallbackType)(void* arg);
|
|
|
|
typedef void (*TPU_TCR1OverflowCallbackType)(void* arg);
|
|
|
|
typedef void (*TPU_TCR2OverflowCallbackType)(void* arg);
|
|
|
|
typedef void (*TPU_HSACallbackType)(void* arg);
|
|
|
|
typedef enum
|
|
{
|
|
TPU_DutyMeasurementActiveHigh = 0x0U,
|
|
TPU_DutyMeasurementActiveLow = 0x1U,
|
|
TPU_PeriodMeasurement = 0x2U,
|
|
} TPU_MeasureModeType;
|
|
|
|
typedef enum
|
|
{
|
|
TPU_CHANNEL_0 = 0U,
|
|
TPU_CHANNEL_1 = 1U,
|
|
TPU_CHANNEL_2 = 2U,
|
|
TPU_CHANNEL_3 = 3U,
|
|
TPU_CHANNEL_4 = 4U,
|
|
TPU_CHANNEL_5 = 5U,
|
|
TPU_CHANNEL_6 = 6U,
|
|
TPU_CHANNEL_7 = 7U,
|
|
TPU_CHANNEL_8 = 8U,
|
|
TPU_CHANNEL_9 = 9U,
|
|
TPU_CHANNEL_10 = 10U,
|
|
TPU_CHANNEL_11 = 11U,
|
|
TPU_CHANNEL_12 = 12U,
|
|
TPU_CHANNEL_13 = 13U,
|
|
TPU_CHANNEL_14 = 14U,
|
|
TPU_CHANNEL_15 = 15U,
|
|
TPU_CHANNEL_16 = 16U,
|
|
TPU_CHANNEL_17 = 17U,
|
|
TPU_CHANNEL_18 = 18U,
|
|
TPU_CHANNEL_19 = 19U,
|
|
TPU_CHANNEL_20 = 20U,
|
|
TPU_CHANNEL_21 = 21U,
|
|
TPU_CHANNEL_22 = 22U,
|
|
TPU_CHANNEL_23 = 23U,
|
|
TPU_CHANNEL_24 = 24U,
|
|
TPU_CHANNEL_25 = 25U,
|
|
TPU_CHANNEL_26 = 26U,
|
|
TPU_CHANNEL_27 = 27U,
|
|
TPU_CHANNEL_28 = 28U,
|
|
TPU_CHANNEL_29 = 29U,
|
|
TPU_CHANNEL_30 = 30U,
|
|
TPU_CHANNEL_31 = 31U,
|
|
TPU_CHANNEL_MAX = TPU_E_CH_COUNT
|
|
} TPU_ChannelType;
|
|
|
|
/** TPU_H - Register Layout Typedef */
|
|
|
|
/** @brief ETPU config type */
|
|
|
|
typedef struct
|
|
{
|
|
TPUE_TimeBaseSelctionType eTBS1; /**< modulate 0 value */
|
|
TPUE_TimeBaseSelctionType eTBS2; /**< modulate 1 value */
|
|
bool bPwmUseTCR1; /**< modulate 2 value */
|
|
bool bPwmUseTCR2; /**< modulate 3 value */
|
|
uint32_t u32ActiveTime;
|
|
uint32_t u32PeriodTime;
|
|
bool bActiveHigh;
|
|
} TPU_PwmCfgType;
|
|
|
|
/**
|
|
* @brief Structure defining the configuration parameters for a TPU capture module.
|
|
*
|
|
* This structure contains all necessary parameters to configure the operation of a TPU capture module,
|
|
* including period time, measurement mode, input type, and timing details.
|
|
*/
|
|
|
|
typedef struct
|
|
{
|
|
uint32_t u32PeriodTime; /**< Period time in milliseconds. */
|
|
TPU_MeasureModeType eMeasureMode; /**< Measurement mode (continuous or single shot). */
|
|
TPUE_IPACType eInputType; /**< Input type (e.g., AC, DC). */
|
|
uint32_t u32SampleTime; /**< Sample time in milliseconds. */
|
|
uint32_t u32ActiveTime; /**< Active time in milliseconds. */
|
|
uint32_t LastTime; /**< Last measured time. */
|
|
uint32_t StartTime; /**< Start time of the capture. */
|
|
} TPU_CaptureCfgType;
|
|
|
|
/**
|
|
* @brief The interrupt configurations of the Tpu channel
|
|
*
|
|
*/
|
|
typedef struct
|
|
{
|
|
bool bEventIntEn; /*!< Enable interrupt after match */
|
|
bool bTCR1OverFlowEventIntEn; /*!< Enable interrupt after TCR1 OverFlow */
|
|
bool bTCR2OverFlowEventIntEn; /*!< Enable interrupt after TCR2 OverFlow */
|
|
TPU_EventCallbackType pEventNotify; /*!< transfer complete notification */
|
|
TPU_HSACallbackType pHSANotify; /*!< HSA notification */
|
|
void *pEventdata;
|
|
void *pHSAdata;
|
|
void *pTCR1OVFdata;
|
|
void *pTCR2OVFdata;
|
|
TPU_TCR1OverflowCallbackType pTCR1OverflowNotify;
|
|
TPU_TCR2OverflowCallbackType pTCR2OverflowNotify;
|
|
TPUH_ChTrigCFGType eChTrigType;
|
|
} TPU_InterruptCfgType;
|
|
|
|
/**
|
|
* @brief The structure of the TPU processing handle
|
|
*
|
|
*/
|
|
typedef struct
|
|
{
|
|
struct
|
|
{
|
|
struct
|
|
{
|
|
void *pEventdata[TPU_E_CH_COUNT];
|
|
void *pHSAdata[TPU_E_CH_COUNT];
|
|
void *pTCR1OVFdata;
|
|
void *pTCR2OVFdata;
|
|
void (*pTPU_EventCallback[TPU_E_CH_COUNT])(void *arg); /*!< channel event interrupt callback */
|
|
void (*pTPU_HSACallback[TPU_E_CH_COUNT])(void *arg); /*!< channel hsa interrupt callback */
|
|
void (*pTPU_TCR1OverFlowCallback)(void *arg);
|
|
void (*pTPU_TCR2OverFlowCallback)(void *arg);
|
|
} callback;
|
|
} tSettings;
|
|
} TPU_InstanceHandleType;
|
|
|
|
typedef struct
|
|
{
|
|
struct
|
|
{
|
|
uint8_t u8Channel; /*!< TPU Channel*/
|
|
TPU_InstanceHandleType *pInstance;
|
|
TPU_PwmCfgType* pPwmcfg;
|
|
TPU_CaptureCfgType* pCapcfg;
|
|
} tSettings;
|
|
struct
|
|
{
|
|
uint32_t u32PwmNextEdge;
|
|
uint32_t u32PwmLastFrame;
|
|
bool bMeasActivePeriodComplete;
|
|
}tStatus;
|
|
} TPU_HandleType;
|
|
|
|
void TPU_InitChannelInterrupt(TPU_InstanceHandleType* pTpuInstanceHandle, TPU_HandleType* pTpuHandle, const TPU_InterruptCfgType *const pInterruptCfg);
|
|
|
|
void TPU_PwmModeInit(TPU_HandleType* pTpuHandle, const TPU_PwmCfgType *const p_etpu_config);
|
|
|
|
void TPU_PwmServiceReq(TPU_HandleType* pTpuHandle, uint32_t u32ActiveTime, uint32_t u32Period);
|
|
|
|
void TPU_CaptureModeInit(TPU_HandleType* pTpuHandle, const TPU_CaptureCfgType *const p_etpu_config);
|
|
|
|
void TPU_StartChannel(void);
|
|
|
|
void TPU_SetHSR(TPU_HandleType* pTpuHandle, uint8_t u8HSRIdx);
|
|
|
|
void TPU_SendHSR(TPU_HandleType* pTpuHandle);
|
|
|
|
uint8_t TPU_GetHSA(TPU_HandleType* pTpuHandle);
|
|
|
|
void TPU_InitChannelHSAInterrupt(TPU_InstanceHandleType* pTpuInstanceHandle, TPU_HandleType* pTpuHandle, const TPU_InterruptCfgType *const pInterruptCfg);
|
|
|
|
void TPU_EnableSubSystem(void);
|
|
|
|
void TPU_EnableEventTrigDma(TPU_HandleType* pTpuHandle);
|
|
|
|
void TPU_CaptureMeasPeriodServiceReq(TPU_HandleType* pTpuHandle, TPU_CaptureCfgType *p_etpu_config);
|
|
|
|
void TPU_CaptureMeasActivePeriodServiceReq(TPU_HandleType* pTpuHandle, TPU_CaptureCfgType *p_etpu_config);
|
|
|
|
void TPU_DeInit(void);
|
|
|
|
void TPU_Init(void);
|
|
|
|
void TPU_EnableFlexcoreTrigDma(TPU_HandleType* pTpuHandle);
|
|
|
|
void TPU_EnableEventTrigTrgSel(TPU_HandleType* pTpuHandle, const TPU_InterruptCfgType *const pInterruptCfg);
|
|
|
|
void TPU_Event_IRQHandler(TPU_InstanceHandleType* pTpuInstanceHandle, uint8_t u8MinChannel, uint8_t u8MaxChannel);
|
|
|
|
void TPU_Overflow_IRQHandler(TPU_InstanceHandleType* pTpuInstanceHandle);
|
|
|
|
/*!
|
|
* @}
|
|
*/ /* end of group TPU_H_Peripheral_Access_Layer */
|
|
|
|
#endif
|
|
|
|
#endif /* #ifndef MODULE_DRIVER_TPU_H */
|