/************************************************************************** * * Copyright (c) 2019-2022 Diality Inc. - All Rights Reserved. * * THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, IN PART OR IN * WHOLE, WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. * * @file CPLD.c * * @author (last) Dara Navaei * @date (last) 21-Sep-2022 * * @author (original) Dara Navaei * @date (original) 05-Nov-2019 * ***************************************************************************/ #include "gio.h" #include "mibspi.h" #include "het.h" #include "CPLD.h" #include "SystemCommMessages.h" #include "TaskPriority.h" #include "WatchdogMgmt.h" /** * @addtogroup CPLD * @{ */ // ********** private definitions ********** #define WD_PET_GIO_PORT_PIN 1U ///< Watchdog pet GPIO pin number. #define WD_EXP_GIO_PORT_PIN 0U ///< Watchdog expired GPIO pin number. #define LED_CLEAN_RGB_1_SPI5_PORT_MASK (uint32)((uint32)1U << PIN_CLK) ///< Lamp Clean_LED1 GPIO port mask (SPI5/CLK(100) - re-purposed as output GPIO). #define LED_CLEAN_RGB_2_SPI5_PORT_MASK (uint32)((uint32)1U << PIN_SIMO) ///< Lamp Clean_LED2 GPIO port mask (SPI5/SIMO(99) - re-purposed as output GPIO). #define LED_FAULT_ALARM_SPI5_PORT_MASK (uint32)((uint32)1U << PIN_SOMI) ///< Fault Alarm Red LED GPIO port mask (SPI5/SOMI(98) - re-purposed as output GPIO). #define AUDIO_ALARM_HET_PORT_MASK (uint32)((uint32)1U << PIN_HET_8) ///< Alarm Audio GPIO port mask (HET[8](106) - re-purposed as output GPIO). #define CLR_CLEAN_LED() {mibspiREG5->PC3 &= ~LED_CLEAN_RGB_1_SPI5_PORT_MASK \ & ~LED_CLEAN_RGB_2_SPI5_PORT_MASK;} ///< Clean LED off. #define CLEAN_LED_ORANGE() {mibspiREG5->PC3 |= LED_CLEAN_RGB_1_SPI5_PORT_MASK; \ mibspiREG5->PC3 &= ~LED_CLEAN_RGB_2_SPI5_PORT_MASK;} ///< Clean LED Orange. #define CLEAN_LED_YELLOW() {mibspiREG5->PC3 &= ~LED_CLEAN_RGB_1_SPI5_PORT_MASK; \ mibspiREG5->PC3 |= LED_CLEAN_RGB_2_SPI5_PORT_MASK;} ///< Clean LED Yellow. #define CLEAN_LED_BLUE() {mibspiREG5->PC3 |= LED_CLEAN_RGB_1_SPI5_PORT_MASK \ | LED_CLEAN_RGB_2_SPI5_PORT_MASK;} ///< Clean LED Blue. #define CLR_FAULT_LED() {mibspiREG5->PC3 &= ~LED_FAULT_ALARM_SPI5_PORT_MASK;} ///< Fault LED Off #define SET_FAULT_LED() {mibspiREG5->PC3 |= LED_FAULT_ALARM_SPI5_PORT_MASK;} ///< Fault LED On (CPLD will do flashing) #define SET_AUDIO_ALARM() {hetREG1->DOUT |= AUDIO_ALARM_HET_PORT_MASK;} ///< Set CPLD Audio Alarm. #define CLR_AUDIO_ALARM() {hetREG1->DOUT &= ~AUDIO_ALARM_HET_PORT_MASK;} ///< Clear CPLD Audio Alarm. #define GET_WD_EXP() ( PIN_SIGNAL_STATE_T )( gioGetBit( gioPORTB, WD_EXP_GIO_PORT_PIN ) ) ///< Get watchdog expired pin state macro. #define TGL_WD_PET() gioToggleBit( gioPORTB, WD_PET_GIO_PORT_PIN ) ///< Toggle watchdog GPIO macro. #define SET_WD_PET() gioSetBit( gioPORTB, WD_PET_GIO_PORT_PIN, PIN_SIGNAL_HIGH ) ///< Set watchdog GPIO macro. #define CLR_WD_PET() gioSetBit( gioPORTB, WD_PET_GIO_PORT_PIN, PIN_SIGNAL_LOW ) ///< Clear watchdog GPIO macro. // ********** private data ********** CPLD_STATUS_T cpldStatus = { 0, 0, 0, CPLD_CLEAN_LED_OFF }; // ********** private function prototypes ********** /*********************************************************************//** * @brief * The initCPLD function initializes the CPLD module. * @details Inputs: none * @details Outputs: CPLD module signal outputs set to initial states. * @return none *************************************************************************/ void initCPLD( void ) { // initialize watchdog pet output low (inactive) CLR_WD_PET(); // initialize alarm lamp color LED outputs low (off) CLR_CLEAN_LED(); CLR_FAULT_LED(); CLR_AUDIO_ALARM(); cpldStatus.wdog = getCPLDWatchdogExpired(); cpldStatus.clean_led = CPLD_CLEAN_LED_OFF; cpldStatus.fault_led = 0; cpldStatus.audio = 0; } /*********************************************************************//** * @brief * The toggleCPLDWatchdog function toggles the watchdog pet signal to CPLD. * @details Inputs: none * @details Outputs: watchdog pet signal toggled. * @return none *************************************************************************/ void toggleCPLDWatchdog( void ) { TGL_WD_PET(); } /*********************************************************************//** * @brief * The getCPLDWatchdogExpired function determines the current signal level * on the watchdog expired pin from the CPLD. * @details Inputs: Signal from CPLD on watchdog expired pin. * @details Outputs: none * @return level (LOW or HIGH) *************************************************************************/ PIN_SIGNAL_STATE_T getCPLDWatchdogExpired( void ) { PIN_SIGNAL_STATE_T level = GET_WD_EXP(); return level; } /*********************************************************************//** * @brief * The setCPLDCleanLEDColor function sets the Clean LED color to CPLD defined value. * @details Inputs: none * @details Outputs: Clean LED signal set to given level. * @param color enum CPLD_CLEAN_LED_COLORS#if 0 * _T * @return none *************************************************************************/ void setCPLDCleanLEDColor( CPLD_CLEAN_LED_COLORS_T color ) { switch ( color ) { case CPLD_CLEAN_LED_ORANGE: CLEAN_LED_ORANGE(); break; case CPLD_CLEAN_LED_YELLOW: CLEAN_LED_YELLOW(); break; case CPLD_CLEAN_LED_BLUE: CLEAN_LED_BLUE(); break; case CPLD_CLEAN_LED_OFF: CLR_CLEAN_LED(); break; default: CLR_CLEAN_LED(); SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_INVALID_LED_COLOR_SELECTED, color ) color = CPLD_CLEAN_LED_OFF; break; } cpldStatus.clean_led = color; } /*********************************************************************//** * @brief * The setCPLDFaultLED function sets the alarm LED signal on CPLD to given level. * @details Inputs: none * @details Outputs: alarm LED signal set to given level. * @param level LOW or HIGH * @param fault BOOL * @return none *************************************************************************/ void setCPLDFaultLED( PIN_SIGNAL_STATE_T level, BOOL fault ) { if ( level == PIN_SIGNAL_HIGH ) { SET_FAULT_LED(); } else { CLR_FAULT_LED(); } cpldStatus.fault_led = fault; // Use fault for LED State because it flashes } /*********************************************************************//** * @brief * The setCPLDFaultAudio function sets the alarm audio signal on CPLD to given level. * @details Inputs: none * @details Outputs: alarm audio signal set to given level. * @param level LOW or HIGH * @return none *************************************************************************/ void setCPLDFaultAudio( PIN_SIGNAL_STATE_T level ) { if ( level == PIN_SIGNAL_HIGH ) { SET_AUDIO_ALARM(); } else { CLR_AUDIO_ALARM(); } cpldStatus.audio = level; } /*********************************************************************//** * @brief * The getCPLDStatus function gets the CPLD Status. * @details Inputs: none * @details Outputs: none. * @param status struct pointer * @return updated status pointer *************************************************************************/ void getCPLDStatus( CPLD_STATUS_T *status ) { // Watchdog status needs to be read. Others are updated on change. cpldStatus.wdog = getCPLDWatchdogExpired(); status->wdog = cpldStatus.wdog; status->audio = cpldStatus.audio; status->clean_led = cpldStatus.clean_led; status->fault_led = cpldStatus.fault_led; } /*********************************************************************//** * @brief * The broadcastCPLDStatus function broadcasts the CPLD Status. * @details Inputs: cpldStatus * @details Outputs: none * @return none *************************************************************************/ void broadcastCPLDStatus( void ) { getCPLDStatus( &cpldStatus ); broadcastData( MSG_ID_DG_CPLD_STATUS, COMM_BUFFER_OUT_CAN_DG_BROADCAST, (U08*)&cpldStatus, sizeof( CPLD_STATUS_T ) ); } /**@}*/