//***************************************************************************** // (C) Automotive Lighting Reutlingen GmbH // Tuebinger Strasse 123, 72762 Reutlingen, Germany // // Automotive Lighting Reutlingen GmbH owns all the rights to this work. // This work shall not be copied, reproduced, used, modified, transferred // or its information shall not be disclosed without the prior written // authorization of Automotive Lighting Reutlingen GmbH. //***************************************************************************** //----------------------------------------------------------------------------- /// \file CddBts7200.c /// /// \brief Specific code for Bts7200 hardware /// /// \author ZHAO, Kai ALDE-RT/EES6 //----------------------------------------------------------------------------- //============================================================================= // Includes //============================================================================= // standard includes #include #include // module API (include path) #include #include #include #include #include // module includes (relative to API) #include <../Cfg/CddBts7200_Cfg.h> #include <../Cfg/CddBts7200_Router.h> #include <../Gen/CddBts7200_Types.h> //============================================================================= // Defines and Typedef //============================================================================= //============================================================================= // Static variable declarations //============================================================================= //----------------------------------------------------------------------------- // Start definitions of non initialized boolean variables //----------------------------------------------------------------------------- #define ctadCddSwi_START_SEC_VAR_NO_INIT_BOOLEAN #include <../Cfg/CddBts7200_MemMap.h> STATIC_AL boolean CddBts7200_boEftValid; STATIC_AL boolean CddBts7200_boCodMDataValid; STATIC_AL uint8 DiagValWaitTime = 0U; #define ctadCddSwi_STOP_SEC_VAR_NO_INIT_BOOLEAN #include <../Cfg/CddBts7200_MemMap.h> //----------------------------------------------------------------------------- // End definitions of non initialized boolean variables //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- // Start definitions of non initialized structures and unions or arrays variables //----------------------------------------------------------------------------- #define ctadCddSwi_START_SEC_VAR_NO_INIT_UNSPECIFIED #include <../Cfg/CddBts7200_MemMap.h> STATIC_AL tisCddBts7200_States CddBts7200_States[CFG_BTS7200_OUTPUTS_CNT]; #define ctadCddSwi_STOP_SEC_VAR_NO_INIT_UNSPECIFIED #include <../Cfg/CddBts7200_MemMap.h> //----------------------------------------------------------------------------- // End definitions of non initialized structures and unions or arrays variables //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- // Start definitions of const initialized structures and unions or arrays variables //----------------------------------------------------------------------------- /*#define ctadCddSwi_START_SEC_CONST_ROM_UNSPECIFIED*/ #define ctadCddSwi_START_SEC_CONST_UNSPECIFIED //for UAP BSW #include <../Cfg/CddBts7200_MemMap.h> STATIC_AL CONST_AL tCddSwiSetTgt_Router CddBts7200_SetTgtFuncList[CFG_BTS7200_OUTPUTS_CNT] = DrvBts7200SetTgt_FuncRouteList; STATIC_AL CONST_AL tCddSwiGetDiagVal_Router CddBts7200_GetDiagFuncList[CFG_BTS7200_OUTPUTS_CNT] = DrvBts7200GetDiagVal_FuncRouteList; /*#define ctadCddSwi_STOP_SEC_CONST_ROM_UNSPECIFIED*/ #define ctadCddSwi_STOP_SEC_CONST_UNSPECIFIED //for UAP BSW #include <../Cfg/CddBts7200_MemMap.h> //----------------------------------------------------------------------------- // End definitions of const initialized structures and unions or arrays variables //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- // Start definitions of initialized structures and unions or arrays variables //----------------------------------------------------------------------------- #define ctadCddSwi_START_SEC_VAR_INIT_UNSPECIFIED #include <../Cfg/CddBts7200_MemMap.h> STATIC_AL uint16 CddBts7200_aShort2GndThreshold[CFG_BTS7200_OUTPUTS_CNT] = { CFG_CDD_BTS7200_CH1_SHORT2GND_THRESHOLD, CFG_CDD_BTS7200_CH2_SHORT2GND_THRESHOLD, CFG_CDD_BTS7200_CH3_SHORT2GND_THRESHOLD, }; STATIC_AL uint16 CddBts7200_aShort2VbatThreshold[CFG_BTS7200_OUTPUTS_CNT] = { CFG_CDD_BTS7200_CH1_SHORT2VBAT_THRESHOLD, CFG_CDD_BTS7200_CH2_SHORT2VBAT_THRESHOLD, CFG_CDD_BTS7200_CH3_SHORT2VBAT_THRESHOLD, }; STATIC_AL uint16 CddBts7200_aOpenLoadThreshold[CFG_BTS7200_OUTPUTS_CNT] = { CFG_CDD_BTS7200_CH1_OPENLOAD_THRESHOLD, CFG_CDD_BTS7200_CH2_OPENLOAD_THRESHOLD, CFG_CDD_BTS7200_CH3_OPENLOAD_THRESHOLD, }; STATIC_AL const uint16 CddBts7200_aCurrentFactor[CFG_BTS7200_OUTPUTS_CNT] = { CFG_CDD_BTS7200_CURRENT_FACTOR_HSS1_2, CFG_CDD_BTS7200_CURRENT_FACTOR_HSS1_2, CFG_CDD_BTS7200_CURRENT_FACTOR_HSS3 }; #define ctadCddSwi_STOP_SEC_VAR_INIT_UNSPECIFIED #include <../Cfg/CddBts7200_MemMap.h> //----------------------------------------------------------------------------- // End definitions of initialized structures and unions or arrays variables //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- // Start declaration or definitions of functions //----------------------------------------------------------------------------- #define ctadCddSwi_START_SEC_CODE #include <../Cfg/CddBts7200_MemMap.h> //============================================================================= // Function prototypes //============================================================================= STATIC_AL void CddBts7200_ReadDiagVal(void); STATIC_AL void CddBts7200_Diag_CheckAllErrors(void); STATIC_AL void CddBts7200_CheckOpenload(uint32 ulChIdx); STATIC_AL void CddBts7200_CheckShort2GND(uint32 ulChIdx); STATIC_AL void CddBts7200_CheckShort2VBAT(uint32 ulChIdx); STATIC_AL void CddBts7200_GetCodingData(void); //============================================================================= // Macros //============================================================================= //============================================================================= // Function definitions //============================================================================= //----------------------------------------------------------------------------- /// \brief CddBts7200_Init /// /// \descr intialisation /// /// \param ulChipIdx /// /// \return void //----------------------------------------------------------------------------- void CddBts7200_Init(const uint32 ulChipIdx) { (void)ulChipIdx; // read the EFT data CddBts7200_boEftValid = CddEft_DataValid(); if (CddBts7200_boEftValid == TRUE) { // Initialize the hardware // set SEN DrvBts7200EnableHssSense(TRUE); for (uint8 i = 0; i < CFG_BTS7200_OUTPUTS_CNT; i++) { CddBts7200_States[i].eHwState = (CDDBTS7200_ECUVARCFG_aHSS_Type(i) != 0u) ? HSS_SUPPORT : HSS_NOSUPPORT; } } else { for (uint8 i = 0; i < CFG_BTS7200_OUTPUTS_CNT; i++) { CddBts7200_States[i].eHwState = HSS_NOEFT; } } } //----------------------------------------------------------------------------- /// \brief CddBts7200_GetCodingData /// /// \descr Get Coding Data /// /// \param void /// /// \return void //----------------------------------------------------------------------------- STATIC_AL void CddBts7200_GetCodingData(void) { CddBts7200_aOpenLoadThreshold[0] = COD_HSS_DIAG_HSS1_OPENLOAD_THRESHOLD; CddBts7200_aOpenLoadThreshold[1] = COD_HSS_DIAG_HSS2_OPENLOAD_THRESHOLD; CddBts7200_aOpenLoadThreshold[2] = COD_HSS_DIAG_HSS3_OPENLOAD_THRESHOLD; CddBts7200_aShort2GndThreshold[0] = COD_HSS_DIAG_HSS1_SHORT_TO_GND_THRESHOLD; CddBts7200_aShort2GndThreshold[1] = COD_HSS_DIAG_HSS2_SHORT_TO_GND_THRESHOLD; CddBts7200_aShort2GndThreshold[2] = COD_HSS_DIAG_HSS3_SHORT_TO_GND_THRESHOLD; CddBts7200_aShort2VbatThreshold[0] = COD_HSS_DIAG_HSS1_SHORT_TO_UBAT_THRESHOLD; CddBts7200_aShort2VbatThreshold[1] = COD_HSS_DIAG_HSS2_SHORT_TO_UBAT_THRESHOLD; CddBts7200_aShort2VbatThreshold[2] = COD_HSS_DIAG_HSS3_SHORT_TO_UBAT_THRESHOLD; } //----------------------------------------------------------------------------- /// \brief CddBts7200_Cycle10ms /// /// \descr cyclic behaviour /// /// \param void /// /// \return void //----------------------------------------------------------------------------- void CddBts7200_Cycle10ms(void) { if (CddBts7200_boEftValid == TRUE) { // read Coding data status if (CddBts7200_boCodMDataValid == FALSE) { CddBts7200_boCodMDataValid = CddSwi_GetCodMDataStatus(); if (CddBts7200_boCodMDataValid != FALSE) { CddBts7200_GetCodingData(); } } // read the ADC value CddBts7200_ReadDiagVal(); // evaluate the ADC value CddBts7200_Diag_CheckAllErrors(); } } //----------------------------------------------------------------------------- /// \brief CddBts7200_SetTgt /// /// \descr set target value on HSS channel /// /// \param ulChipIdx /// \param ulChnIdx /// \param unTagVal /// /// \return void //----------------------------------------------------------------------------- void CddBts7200_SetTgt(const uint32 ulChipIdx, const uint32 ulOutIdx, const uint16 unTgtVal) { if (CddBts7200_States[ulChipIdx+ ulOutIdx].eHwState == HSS_SUPPORT) { // pfIoHwAbUserSetTgt FuncSetTgt; CddBts7200_States[ulChipIdx + ulOutIdx].unTgtVal = unTgtVal; // evaluate the target value and set the output if (unTgtVal == CDDSWI_TGTVAL_32768) /*32768: 100%*/ { // set output to High; CddBts7200_SetTgtFuncList[ulChipIdx + ulOutIdx].IoHwAbUSerSetTgtFunc(unTgtVal); CddBts7200_States[ulChipIdx + ulOutIdx].unActVal = unTgtVal; } else if (unTgtVal == 0u) { // set output to Low; CddBts7200_SetTgtFuncList[ulChipIdx + ulOutIdx].IoHwAbUSerSetTgtFunc(unTgtVal); CddBts7200_States[ulChipIdx + ulOutIdx].unActVal = unTgtVal; } else { // do nothing } } } //----------------------------------------------------------------------------- /// \brief CddBts7200_GetState /// /// \descr return switch state on HSS channel /// /// \param ulChipIdx /// \param ulChnIdx /// /// \return tisCddDrvStatus //----------------------------------------------------------------------------- tisCddDrvStatus CddBts7200_GetState(const uint32 ulChipIdx, const uint32 ulOutIdx) { tisCddDrvStatus tSwitchStatus; if (CddBts7200_States[ulChipIdx + ulOutIdx].eHwState == HSS_SUPPORT) { tSwitchStatus.unActVal = CddBts7200_States[ulChipIdx + ulOutIdx].unActVal; tSwitchStatus.eOpenLoad = CddBts7200_States[ulChipIdx + ulOutIdx].tErrOpenload; tSwitchStatus.eShortGND = CddBts7200_States[ulChipIdx + ulOutIdx].tErrShort2GND; tSwitchStatus.eShortVBAT = CddBts7200_States[ulChipIdx + ulOutIdx].tErrShort2VBAT; tSwitchStatus.unActCurrent = CddBts7200_States[ulChipIdx + ulOutIdx].unCurrent; tSwitchStatus.eHwState = HSS_SUPPORT; } else if (CddBts7200_States[ulChipIdx + ulOutIdx].eHwState == HSS_NOEFT) { tSwitchStatus.eHwState = HSS_NOEFT; } else if (CddBts7200_States[ulChipIdx + ulOutIdx].eHwState == HSS_NOSUPPORT) { tSwitchStatus.eHwState = HSS_NOSUPPORT; } else { tSwitchStatus.eHwState = HSS_SNA; } return tSwitchStatus; } //----------------------------------------------------------------------------- /// \brief CddBts7200_ReadDiagVal /// /// \descr read the diagnose value from IoHwAbUser /// /// \param void /// /// \return void //----------------------------------------------------------------------------- STATIC_AL void CddBts7200_ReadDiagVal(void) { tiu32Voltage_mV unDiagVal; for (uint8 i = 0; i < CFG_BTS7200_OUTPUTS_CNT; i++) { if (CddBts7200_States[i].eHwState == HSS_SUPPORT) { CddBts7200_GetDiagFuncList[i].IoHwAbUSerGetDiagValFunc(&unDiagVal); CddBts7200_States[i].unDiagVal = (uint16) unDiagVal; // calculate the current CddBts7200_States[i].unCurrent = (uint16)(unDiagVal * CddBts7200_aCurrentFactor[i] / CFG_CDD_BTS7200_CURRENT_RSENES); } } } //----------------------------------------------------------------------------- /// \brief CddBts7200_Diag_CheckAllErrors /// /// \descr check all the error types: openload, shortcoil to GND, shortcoil to VBAT /// /// \param void /// /// \return void //----------------------------------------------------------------------------- STATIC_AL void CddBts7200_Diag_CheckAllErrors(void) { for (uint8 i = 0; i < CFG_BTS7200_OUTPUTS_CNT; i++) { if (CddBts7200_States[i].eHwState == HSS_SUPPORT) { CddBts7200_CheckOpenload(i); CddBts7200_CheckShort2GND(i); CddBts7200_CheckShort2VBAT(i); } } } //----------------------------------------------------------------------------- /// \brief CddBts7200_CheckOpenload /// /// \descr check openload /// /// \param void /// /// \return void //----------------------------------------------------------------------------- STATIC_AL void CddBts7200_CheckOpenload(uint32 ulChIdx) { boolean StartDiag = FALSE; if (CddBts7200_aOpenLoadThreshold[ulChIdx] > 0) { if ((CddBts7200_States[ulChIdx].unTgtVal == 32768u) && (CddBts7200_aOpenLoadThreshold[ulChIdx] > 0)) { if (CddBts7200_States[ulChIdx].unDiagVal < CddBts7200_aOpenLoadThreshold[ulChIdx]) { if (CddBts7200_States[ulChIdx].tErrShort2VBAT == ERR_NO) { CddBts7200_States[ulChIdx].tErrOpenload = ERR_YES; } } else { CddBts7200_States[ulChIdx].tErrOpenload = ERR_NO; CddBts7200_States[ulChIdx].tErrShort2VBAT = ERR_NO; } } else { if (CddBts7200_States[ulChIdx].tErrOpenload == ERR_YES) { CddBts7200_States[ulChIdx].tErrOpenload = ERR_YES; } else { CddBts7200_States[ulChIdx].tErrOpenload = ERR_SNA; } } } else { CddBts7200_States[ulChIdx].tErrOpenload = ERR_DISABLED; } } //----------------------------------------------------------------------------- /// \brief CddBts7200_CheckShort2GND /// /// \descr check shortcoil to GND /// /// \param void /// /// \return void //----------------------------------------------------------------------------- STATIC_AL void CddBts7200_CheckShort2GND(uint32 ulChIdx) { if (CddBts7200_aShort2GndThreshold[ulChIdx] > 0) { if (CddBts7200_States[ulChIdx].unTgtVal == 32768u) { if (CddBts7200_States[ulChIdx].unDiagVal > CddBts7200_aShort2GndThreshold[ulChIdx]) { CddBts7200_States[ulChIdx].tErrShort2GND = ERR_YES; } else { CddBts7200_States[ulChIdx].tErrShort2GND = ERR_NO; } } else { if (CddBts7200_States[ulChIdx].tErrShort2GND == ERR_YES) { CddBts7200_States[ulChIdx].tErrShort2GND = ERR_YES; } else { CddBts7200_States[ulChIdx].tErrShort2GND = ERR_SNA; } } } else { CddBts7200_States[ulChIdx].tErrShort2GND = ERR_DISABLED; } } //----------------------------------------------------------------------------- /// \brief CddBts7200_CheckShort2VBAT /// /// \descr check shortcoil to VBAT /// /// \param void /// /// \return void //----------------------------------------------------------------------------- STATIC_AL void CddBts7200_CheckShort2VBAT(uint32 ulChIdx) { if (CddBts7200_aShort2VbatThreshold[ulChIdx] > 0) { if (CddBts7200_States[ulChIdx].unTgtVal == 0u) { if (CddBts7200_States[ulChIdx].unDiagVal > CddBts7200_aShort2VbatThreshold[ulChIdx]) { CddBts7200_States[ulChIdx].tErrShort2VBAT = ERR_YES; } else { CddBts7200_States[ulChIdx].tErrShort2VBAT = ERR_NO; } } } else { CddBts7200_States[ulChIdx].tErrShort2VBAT = ERR_DISABLED; } } //----------------------------------------------------------------------------- /// \brief CddBts7200_DeInit /// /// \descr intialisation /// /// \param ulChipIdx /// /// \return void //----------------------------------------------------------------------------- void CddBts7200_DeInit(const uint32 ulChipIdx) { (void)ulChipIdx; if (CddBts7200_boEftValid == TRUE) { // Deinitialize the hardware // set SEN to 0 DrvBts7200EnableHssSense(FALSE); // switch the output off for (uint8 i = 0; i < CFG_BTS7200_OUTPUTS_CNT; i++) { CddBts7200_SetTgtFuncList[i].IoHwAbUSerSetTgtFunc(0); } } } #define ctadCddSwi_STOP_SEC_CODE #include <../Cfg/CddBts7200_MemMap.h> //----------------------------------------------------------------------------- // End declaration or definitions of functions //-----------------------------------------------------------------------------