PeripheralDriver_Flagchip_F.../Src/module_driver_lu.c

232 lines
9.3 KiB
C

/**
* @file module_driver_lu.c
* @author Flagchip032
* @brief LU driver source code
* @version 2.0.0
* @date 2024-11-10
*
* SDK Version: 2.6.0
*
* @copyright Copyright (c) 2024 Flagchip Semiconductors Co., Ltd.
*
* @details
*/
/********************************************************************************
* Revision History:
* Version Date Initials CR# Descriptions
* --------- ---------- ------------ ---------- ---------------
* 2.0.0 2024-04-20 Flagchip032 N/A First version
*********************************************************************************/
#include "module_driver_lu.h"
#if LU_INSTANCE_COUNT > 0U
static LU_Type *const p_LUTables[LU_INSTANCE_COUNT] = LU_BASE_PTRS;
#ifndef LU_DEV_ERROR_REPORT
#define LU_DEV_ERROR_REPORT STD_ON
#endif
#if LU_DEV_ERROR_REPORT == STD_ON
#define LU_ReportDevError(func, error) ReportDevError(LU_MODULE_ID, func, error)
#endif
/**
* @brief Initialize Lu instance
*
* @param pInitStruct Lu initialization structure
*
* @return LU return type
*/
LU_StatusType LU_Init(LU_InstanceType eInstance,const LU_ConfigType *const pInitStruct)
{
LU_StatusType eRet = LU_STATUS_SUCCESS;
#if LU_DEV_ERROR_REPORT == STD_ON
if (eInstance >= LU_INSTANCE_COUNT)
{
LU_ReportDevError(LU_INIT_ID, LU_E_PARAM_INSTANCE);
}
else if (pInitStruct == NULL)
{
LU_ReportDevError(LU_INIT_ID, LU_E_PARAM_NULLPTR);
}
else
{
#endif
LU_Type *const p_LU=p_LUTables[eInstance];
uint32_t u32TempReg = 0U, u32TempCfg = 0U;
if (NULL == pInitStruct)
{
eRet = LU_STATUS_PARAM_INVALID;
}
else
{
/* set AOI0 value */
LU_HWA_ConfigAOI0(p_LU,pInitStruct->eLgNum, 0U);
/* set AOI1 value */
LU_HWA_ConfigAOI1(p_LU,pInitStruct->eLgNum, 0U);
/* set CTRL value */
LU_HWA_ConfigCtrl(p_LU,pInitStruct->eLgNum, 0U);
/* set FILT value */
LU_HWA_ConfigFilter(p_LU,pInitStruct->eLgNum, 0U);
u32TempCfg = (uint32_t)0U |
LU_AOI_IN_CFG(LU_AOI_IN_N_A, pInitStruct->tAoi0Config.tIn0Config.eInNACfg) |
LU_AOI_IN_CFG(LU_AOI_IN_N_B, pInitStruct->tAoi0Config.tIn0Config.eInNBCfg) |
LU_AOI_IN_CFG(LU_AOI_IN_N_C, pInitStruct->tAoi0Config.tIn0Config.eInNCCfg) |
LU_AOI_IN_CFG(LU_AOI_IN_N_D, pInitStruct->tAoi0Config.tIn0Config.eInNDCfg);
u32TempReg = (uint32_t)0U | LU_AOI_IN_N_CFG(LU_AOI_IN_0, u32TempCfg);
u32TempCfg = (uint32_t)0U |
LU_AOI_IN_CFG(LU_AOI_IN_N_A, pInitStruct->tAoi0Config.tIn1Config.eInNACfg) |
LU_AOI_IN_CFG(LU_AOI_IN_N_B, pInitStruct->tAoi0Config.tIn1Config.eInNBCfg) |
LU_AOI_IN_CFG(LU_AOI_IN_N_C, pInitStruct->tAoi0Config.tIn1Config.eInNCCfg) |
LU_AOI_IN_CFG(LU_AOI_IN_N_D, pInitStruct->tAoi0Config.tIn1Config.eInNDCfg);
u32TempReg |= LU_AOI_IN_N_CFG(LU_AOI_IN_1, u32TempCfg);
u32TempCfg = (uint32_t)0U |
LU_AOI_IN_CFG(LU_AOI_IN_N_A, pInitStruct->tAoi0Config.tIn2Config.eInNACfg) |
LU_AOI_IN_CFG(LU_AOI_IN_N_B, pInitStruct->tAoi0Config.tIn2Config.eInNBCfg) |
LU_AOI_IN_CFG(LU_AOI_IN_N_C, pInitStruct->tAoi0Config.tIn2Config.eInNCCfg) |
LU_AOI_IN_CFG(LU_AOI_IN_N_D, pInitStruct->tAoi0Config.tIn2Config.eInNDCfg);
u32TempReg |= LU_AOI_IN_N_CFG(LU_AOI_IN_2, u32TempCfg);
u32TempCfg = (uint32_t)0U |
LU_AOI_IN_CFG(LU_AOI_IN_N_A, pInitStruct->tAoi0Config.tIn3Config.eInNACfg) |
LU_AOI_IN_CFG(LU_AOI_IN_N_B, pInitStruct->tAoi0Config.tIn3Config.eInNBCfg) |
LU_AOI_IN_CFG(LU_AOI_IN_N_C, pInitStruct->tAoi0Config.tIn3Config.eInNCCfg) |
LU_AOI_IN_CFG(LU_AOI_IN_N_D, pInitStruct->tAoi0Config.tIn3Config.eInNDCfg);
u32TempReg |= LU_AOI_IN_N_CFG(LU_AOI_IN_3, u32TempCfg);
/* set AOI0 value */
LU_HWA_ConfigAOI0(p_LU,pInitStruct->eLgNum, u32TempReg);
u32TempCfg = (uint32_t)0U |
LU_AOI_IN_CFG(LU_AOI_IN_N_A, pInitStruct->tAoi1Config.tIn0Config.eInNACfg) |
LU_AOI_IN_CFG(LU_AOI_IN_N_B, pInitStruct->tAoi1Config.tIn0Config.eInNBCfg) |
LU_AOI_IN_CFG(LU_AOI_IN_N_C, pInitStruct->tAoi1Config.tIn0Config.eInNCCfg) |
LU_AOI_IN_CFG(LU_AOI_IN_N_D, pInitStruct->tAoi1Config.tIn0Config.eInNDCfg);
u32TempReg = (uint32_t)0U | LU_AOI_IN_N_CFG(LU_AOI_IN_0, u32TempCfg);
u32TempCfg = (uint32_t)0U |
LU_AOI_IN_CFG(LU_AOI_IN_N_A, pInitStruct->tAoi1Config.tIn1Config.eInNACfg) |
LU_AOI_IN_CFG(LU_AOI_IN_N_B, pInitStruct->tAoi1Config.tIn1Config.eInNBCfg) |
LU_AOI_IN_CFG(LU_AOI_IN_N_C, pInitStruct->tAoi1Config.tIn1Config.eInNCCfg) |
LU_AOI_IN_CFG(LU_AOI_IN_N_D, pInitStruct->tAoi1Config.tIn1Config.eInNDCfg);
u32TempReg |= LU_AOI_IN_N_CFG(LU_AOI_IN_1, u32TempCfg);
u32TempCfg = (uint32_t)0U |
LU_AOI_IN_CFG(LU_AOI_IN_N_A, pInitStruct->tAoi1Config.tIn2Config.eInNACfg) |
LU_AOI_IN_CFG(LU_AOI_IN_N_B, pInitStruct->tAoi1Config.tIn2Config.eInNBCfg) |
LU_AOI_IN_CFG(LU_AOI_IN_N_C, pInitStruct->tAoi1Config.tIn2Config.eInNCCfg) |
LU_AOI_IN_CFG(LU_AOI_IN_N_D, pInitStruct->tAoi1Config.tIn2Config.eInNDCfg);
u32TempReg |= LU_AOI_IN_N_CFG(LU_AOI_IN_2, u32TempCfg);
u32TempCfg = (uint32_t)0U |
LU_AOI_IN_CFG(LU_AOI_IN_N_A, pInitStruct->tAoi1Config.tIn3Config.eInNACfg) |
LU_AOI_IN_CFG(LU_AOI_IN_N_B, pInitStruct->tAoi1Config.tIn3Config.eInNBCfg) |
LU_AOI_IN_CFG(LU_AOI_IN_N_C, pInitStruct->tAoi1Config.tIn3Config.eInNCCfg) |
LU_AOI_IN_CFG(LU_AOI_IN_N_D, pInitStruct->tAoi1Config.tIn3Config.eInNDCfg);
u32TempReg |= LU_AOI_IN_N_CFG(LU_AOI_IN_3, u32TempCfg);
/* set AOI1 value */
LU_HWA_ConfigAOI1(p_LU,pInitStruct->eLgNum, u32TempReg);
/* force bypass mode */
LU_HWA_SetLgBypassControl(p_LU,pInitStruct->eLgNum, pInitStruct->eAoiMode);
/* set Flip-Flop mode configure */
LU_HWA_SetLgFlipFlopMode(p_LU,pInitStruct->eLgNum, pInitStruct->eFFMode);
u32TempCfg = 0U;
if (pInitStruct->tSyncCtrl.bInputNA)
{
u32TempCfg |= LU_SYNC_CONTROL_INPUT_N(LU_INPUT_N_A, 1U);
}
if (pInitStruct->tSyncCtrl.bInputNB)
{
u32TempCfg |= LU_SYNC_CONTROL_INPUT_N(LU_INPUT_N_B, 1U);
}
if (pInitStruct->tSyncCtrl.bInputNC)
{
u32TempCfg |= LU_SYNC_CONTROL_INPUT_N(LU_INPUT_N_C, 1U);
}
if (pInitStruct->tSyncCtrl.bInputND)
{
u32TempCfg |= LU_SYNC_CONTROL_INPUT_N(LU_INPUT_N_D, 1U);
}
/* set LG inputs synchronous control */
LU_HWA_SetLgInputsSyncCtrl(p_LU,pInitStruct->eLgNum, u32TempCfg);
if (LU_JKFF_MODE == pInitStruct->eFFMode)
{
/* set LG output feedback override control */
LU_HWA_SetLgFeedbackOverrideCtrl(p_LU,pInitStruct->eLgNum, pInitStruct->eFbMode);
}
if (LU_OUTPUT_INIT_DISABLE > pInitStruct->eFFInitValue)
{
if (LU_OUTPUT_INIT_ONE == pInitStruct->eFFInitValue)
{
/* Configure the output of flip-flop as "1" */
LU_HWA_ConfigFlipFlopTo1(p_LU,pInitStruct->eLgNum);
}
else
{
/* Configure the output of flip-flop as "0" */
LU_HWA_ConfigFlipFlopTo0(p_LU,pInitStruct->eLgNum);
}
/* Flip-Flop initial output enable control */
LU_HWA_EnableControlFlipFlopInitOutput(p_LU,pInitStruct->eLgNum);
}
/* set input filter sample count for AOI0 */
LU_HWA_SetAOI0InputFilterSampleCount(p_LU,pInitStruct->eLgNum, (uint32_t)pInitStruct->u8Aoi0FiltCnt);
/* set input filter sample period for AOI0 */
LU_HWA_SetAOI0InputFilterSamplePeriod(p_LU,pInitStruct->eLgNum, (uint32_t)pInitStruct->u8Aoi0Period);
/* set input filter sample count for AOI1 */
LU_HWA_SetAOI1InputFilterSampleCount(p_LU,pInitStruct->eLgNum, (uint32_t)pInitStruct->u8Aoi1FiltCnt);
/* set input filter sample period for AOI0 */
LU_HWA_SetAOI1InputFilterSamplePeriod(p_LU,pInitStruct->eLgNum, (uint32_t)pInitStruct->u8Aoi1Period);
}
#if LU_DEV_ERROR_REPORT == STD_ON
}
#endif
return eRet;
}
/**
* @brief De-initialize Lu instance
* @param pInitStruct Lu initialization structure
*
*/
void LU_Deinit(LU_InstanceType eInstance)
{
#if LU_DEV_ERROR_REPORT == STD_ON
if (eInstance >= LU_INSTANCE_COUNT)
{
LU_ReportDevError(LU_DEINIT_ID, LU_E_PARAM_INSTANCE);
}
else
{
#endif
LU_Type *const p_LU=p_LUTables[eInstance] ;
uint8_t u8Index = 0U;
for (u8Index = 0U; u8Index < (uint8_t)LG_CNT; u8Index++)
{
/* set AOI0 value */
LU_HWA_ConfigAOI0(p_LU,(LU_LgType)u8Index, 0U);
/* set AOI1 value */
LU_HWA_ConfigAOI1(p_LU,(LU_LgType)u8Index, 0U);
/* set CTRL value */
LU_HWA_ConfigCtrl(p_LU,(LU_LgType)u8Index, 0U);
/* set FILT value */
LU_HWA_ConfigFilter(p_LU,(LU_LgType)u8Index, 0U);
}
#if LU_DEV_ERROR_REPORT == STD_ON
}
#endif
}
#endif