Index: firmware/App/Drivers/CPLD.c =================================================================== diff -u -rea562263f55f20589a8512da8c00be33a8f239b5 -r7d4711edd7b40cd3e29f43e766f79a8a09586fe9 --- firmware/App/Drivers/CPLD.c (.../CPLD.c) (revision ea562263f55f20589a8512da8c00be33a8f239b5) +++ firmware/App/Drivers/CPLD.c (.../CPLD.c) (revision 7d4711edd7b40cd3e29f43e766f79a8a09586fe9) @@ -1,113 +1,232 @@ -/************************************************************************** - * - * Copyright (c) 2019-2020 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 - * - * @date 20-Sep-2019 - * @author S. Nash - * - * @brief Monitor/Controller for the CPLD (Complex Programmable Logic Device). - * - **************************************************************************/ +/************************************************************************** +* +* Copyright (c) 2019-2024 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) Michael Garthwaite +* @date (last) 08-Mar-2023 +* +* @author (original) Dara Navaei +* @date (original) 05-Nov-2019 +* +***************************************************************************/ #include "gio.h" -#include "mibspi.h" +#include "mibspi.h" +#include "het.h" -#include "WatchdogMgmt.h" -#include "CPLD.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. -// GIO port B pin assignments for pins connected to CPLD -#define OFF_REQUEST_GIO_PORT_PIN 0U -#define WD_PET_GIO_PORT_PIN 1U -#define WD_EXP_GIO_PORT_PIN 2U - -// CPLD pin I/O macros -#define GET_WD_EXP() ( PIN_SIGNAL_STATE_T )( gioGetBit( gioPORTB, WD_EXP_GIO_PORT_PIN ) ) - -#define TGL_WD_PET() gioToggleBit( gioPORTB, WD_PET_GIO_PORT_PIN ) -#define SET_WD_PET() gioSetBit( gioPORTB, WD_PET_GIO_PORT_PIN, PIN_SIGNAL_HIGH ) - -#define CLR_WD_PET() gioSetBit( gioPORTB, WD_PET_GIO_PORT_PIN, PIN_SIGNAL_LOW ) - -#ifdef RM46_EVAL_BOARD_TARGET - // for RM46 eval board, user button B uses the MIBSPI1_nCS[4] pin, so need to re-purpose that pin as GPIO to see the button - #define USER_BUTTON_MASK 0x00000010 // (nCS[4] - #define GET_USER_BUTTON() ( PIN_SIGNAL_STATE_T )( ( ( mibspiREG1->PC2 & USER_BUTTON_MASK ) == 0 ? PIN_SIGNAL_LOW : PIN_SIGNAL_HIGH ) ) - PIN_SIGNAL_STATE_T getUserButtonState( void ) - { - PIN_SIGNAL_STATE_T result = GET_USER_BUTTON(); - - return result; - } - // for RM46 eval board, user LED A uses the same GPIO pin that CPLD uses for watchdog pet. Had to disable watchdog pet to use as LED. - void setUserLED( BOOL on ) - { - if ( on == TRUE ) - { - SET_WD_PET(); - } - else - { - CLR_WD_PET(); - } - } - - void toggleUserLED() - { - TGL_WD_PET(); - } - -#endif - -/************************************************************************* - * @brief initCPLD +#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 - * Outputs : CPLD module signal outputs set to initial states. - * @param none + * @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(); -} -/************************************************************************* - * @brief toggleCPLDWatchdog + // 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 - * Outputs : watchdog pet signal toggled. - * @param level : none + * @details Inputs: none + * @details Outputs: watchdog pet signal toggled. * @return none - *************************************************************************/ + *************************************************************************/ void toggleCPLDWatchdog( void ) { TGL_WD_PET(); } - -/************************************************************************* - * @brief getCPLDWatchdogExpired - * The getCPLDWatchdogExpired function determines the current signal level \n + +/*********************************************************************//** + * @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. - * Outputs : none - * @param none - * @return level : (LOW or HIGH) + * @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_DATA, COMM_BUFFER_OUT_CAN_DG_BROADCAST, (U08*)&cpldStatus, sizeof( CPLD_STATUS_T ) ); +} + +/**@}*/