/************************************************************************** * * Copyright (c) 2024-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 GPIO.c * * @author (last) Sean * @date (last) 07-Aug-2024 * * @author (original) Sean * @date (original) 07-Aug-2024 * ***************************************************************************/ #include "gio.h" #include "mibspi.h" #include "reg_het.h" #include "GPIO.h" /** * @addtogroup GPIO * @{ */ // ********** private definitions ********** #define SAFETY_SHUTDOWN_POST_TIMEOUT_MS 500 ///< Safety shutdown POST test timeout (in ms). #define SAFETY_SHUTDOWN_RECOVERY_TIME_MS 500 ///< After safety shutdown POST test, wait this long (in ms) to recover before moving on. #define MAX_24V_LEVEL_ON_SAFETY_SHUTDOWN 5.0F ///< Maximum voltage on 24V line when safety shutdown asserted. #define MIN_24V_LEVEL_ON_SAFETY_RECOVER 22.6F ///< Minimum voltage on 24V line when safety shutdown is recovered. #define MIN_BACKUP_ALARM_CURRENT_MA 200.0F ///< Minimum backup alarm audio current (in mA) detected when safety shutdown asserted. #define MAX_BACKUP_ALARM_CURRENT_MA 10.0F ///< Maximum backup alarm audio current (in mA) detected when safety shutdown is recovered. #define SAFETY_POST_24V_INITIAL 0 ///< Safety shutdown POST failed because 24V was out before safety line pulled. #define SAFETY_POST_24V_NOT_CUT 1 ///< Safety shutdown POST failed because 24V was not cut when safety line pulled. #define SAFETY_POST_NO_24V_RESTORE 2 ///< Safety shutdown POST failed because 24V was not restored when safety line reset. // GIO port A pin assignments for pins connected to CPLD #define OFF_BUTTON_GIO_PORT_PIN 0U ///< GPIO pin ID on port A for off button input signal. #define STOP_BUTTON_GIO_PORT_PIN 1U ///< GPIO pin ID on port A for stop button input signal. // GIO port B pin assignments for pins connected to CPLD #define OFF_REQUEST_GIO_PORT_PIN 0U ///< GPIO pin ID on port B for power off request output signal. #define WD_PET_GIO_PORT_PIN 1U ///< GPIO pin ID on port B for watchdog pet output signal. #define SAFE_GIO_PORT_PIN 2U ///< GPIO pin ID on port B for safety shutdown input signal. #define SAFETY_GIO_PORT_PIN 3U ///< GPIO pin ID on port B for safety shutdown output signal // MIBSPI5 port pin assignments for pins connected to CPLD #define GREEN_SPI5_PORT_MASK 0x00000200 ///< (CLK - re-purposed as output GPIO) for green alarm lamp signal. #define BLUE_SPI5_PORT_MASK 0x00000400 ///< (SIMO[0] - re-purposed as output GPIO) for blue alarm lamp signal. #define RED_SPI5_PORT_MASK 0x00000800 ///< (SOMI[0] - re-purposed as output GPIO) for red alarm lamp signal. #define AC_PRESENT_SPI5_PORT_MASK 0x00000001 ///< (NCS[0] - re-purposed as output GPIO) for AC present signal. // MIBSPI3 port pin assignments for pins connected to CPLD #define BACKUP_AUDIO_ENABLE_SPI3_PORT_MASK 0x00000001 ///< (NCS[0] - re-purposed as output GPIO for backup alarm audio enable. // CPLD pin I/O macros #define GET_OFF() (PIN_SIGNAL_STATE_T)(gioGetBit(gioPORTA, OFF_BUTTON_GIO_PORT_PIN)) ///< Macro to get off button signal state. #define GET_STOP() (PIN_SIGNAL_STATE_T)(gioGetBit(gioPORTA, STOP_BUTTON_GIO_PORT_PIN)) ///< Macro to get stop button signal state. #define GET_SAFETY() (PIN_SIGNAL_STATE_T)(gioGetBit(gioPORTB, SAFE_GIO_PORT_PIN)) ///< Macro to get watchdog expired signal state. #define GET_AC_PRESENT() (PIN_SIGNAL_STATE_T)(mibspiREG5->PC2 & AC_PRESENT_SPI5_PORT_MASK) ///< Macro to get A/C power present signal state. #define TGL_WD_PET() gioToggleBit( gioPORTB, WD_PET_GIO_PORT_PIN ) ///< Macro to toggle watchdog pet signal state. #define TGL_OFF_REQ() gioToggleBit( gioPORTB, OFF_REQUEST_GIO_PORT_PIN) ///< Macro to toggle power off request signal state. #define SET_WD_PET() gioSetBit( gioPORTB, WD_PET_GIO_PORT_PIN, PIN_SIGNAL_HIGH ) ///< Macro to set watchdog pet signal state high. #define SET_OFF_REQ() gioSetBit( gioPORTB, OFF_REQUEST_GIO_PORT_PIN, PIN_SIGNAL_HIGH ) ///< Macro to set power off request signal state high. #define SET_GREEN() {mibspiREG5->PC3 |= GREEN_SPI5_PORT_MASK;} ///< Macro to set green alarm lamp signal state high. #define SET_BLUE() {mibspiREG5->PC3 |= BLUE_SPI5_PORT_MASK;} ///< Macro to set blue alarm lamp signal state high. #define SET_RED() {mibspiREG5->PC3 |= RED_SPI5_PORT_MASK;} ///< Macro to set red alarm lamp signal state high. #define CLR_WD_PET() gioSetBit( gioPORTB, WD_PET_GIO_PORT_PIN, PIN_SIGNAL_LOW ) ///< Macro to set watchdog pet signal state low. #define CLR_OFF_REQ() gioSetBit( gioPORTB, OFF_REQUEST_GIO_PORT_PIN, PIN_SIGNAL_LOW ) ///< Macro to set power off request signal state low. #define CLR_GREEN() {mibspiREG5->PC3 &= ~GREEN_SPI5_PORT_MASK;} ///< Macro to set green alarm lamp signal state low. #define CLR_BLUE() {mibspiREG5->PC3 &= ~BLUE_SPI5_PORT_MASK;} ///< Macro to set blue alarm lamp signal state low. #define CLR_RED() {mibspiREG5->PC3 &= ~RED_SPI5_PORT_MASK;} ///< Macro to set red alarm lamp signal state low. // CPLD pin I/O macros #define SET_SAFETY_SHUTDOWN() gioSetBit( gioPORTB, SAFETY_GIO_PORT_PIN, PIN_SIGNAL_HIGH ) ///< Macro to set safety shutdown signal state high. #define CLR_SAFETY_SHUTDOWN() gioSetBit( gioPORTB, SAFETY_GIO_PORT_PIN, PIN_SIGNAL_LOW ) ///< Macro to set safety shutdown signal state low. // Backup alarm audio enable/disable macros #define SET_BACKUP_AUDIO_ENABLE() {mibspiREG3->PC3 |= BACKUP_AUDIO_ENABLE_SPI3_PORT_MASK;} ///< Macro to enable backup alarm audio. #define CLR_BACKUP_AUDIO_ENABLE() {mibspiREG3->PC3 &= ~BACKUP_AUDIO_ENABLE_SPI3_PORT_MASK;} ///< Macro to disable backup alarm audio. /*********************************************************************//** * @brief * The toggleWatchdogPetSignal function toggles the watchdog pet output * signal on its GPIO pin. * @details \b Inputs: none * @details \b Outputs: Watchdog pet output signal toggled * @return none *************************************************************************/ void toggleWatchdogPetSignal( void ) { TGL_WD_PET(); } /*********************************************************************//** * @brief * The setWatchdogPetSignal function sets the watchdog pet output * signal on its GPIO pin to HIGH. * @details \b Inputs: none * @details \b Outputs: Watchdog pet output signal set high * @return none *************************************************************************/ void setWatchdogPetSignal( void ) { SET_WD_PET(); } /*********************************************************************//** * @brief * The clrWatchdogPetSignal function sets the watchdog pet output * signal on its GPIO pin to LOW. * @details \b Inputs: none * @details \b Outputs: Watchdog pet output signal set low * @return none *************************************************************************/ void clrWatchdogPetSignal( void ) { CLR_WD_PET(); } /*********************************************************************//** * @brief * The togglePowerOffRequestSignal function toggles the power off output * signal on its GPIO pin. * @details \b Inputs: none * @details \b Outputs: Power off output signal toggled * @return none *************************************************************************/ void togglePowerOffRequestSignal( void ) { TGL_OFF_REQ(); } /*********************************************************************//** * @brief * The setPowerOffRequestSignal function sets the power off output * signal on its GPIO pin to HIGH. * @details \b Inputs: none * @details \b Outputs: Power off output signal set high * @return none *************************************************************************/ void setPowerOffRequestSignal( void ) { SET_OFF_REQ(); } /*********************************************************************//** * @brief * The clrPowerOffRequestSignal function sets the power off output * signal on its GPIO pin to LOW. * @details \b Inputs: none * @details \b Outputs: Power off output signal set low * @return none *************************************************************************/ void clrPowerOffRequestSignal( void ) { CLR_OFF_REQ(); } /*********************************************************************//** * @brief * The getACPowerPresentSignal function gets the AC power present input * signal currently seen on its GPIO pin. * @details \b Inputs: AC power present input signal * @details \b Outputs: none * @return AC power present input signal *************************************************************************/ PIN_SIGNAL_STATE_T getACPowerPresentSignal( void ) { PIN_SIGNAL_STATE_T signal = GET_AC_PRESENT(); return signal; } /*********************************************************************//** * @brief * The setAlarmLampGreenSignal function sets the alarm lamp green output * signal on its GPIO pin to HIGH. * @details \b Inputs: none * @details \b Outputs: Alarm lamp green output signal set high * @return none *************************************************************************/ void setAlarmLampGreenSignal( void ) { SET_GREEN(); } /*********************************************************************//** * @brief * The setAlarmLampBlueSignal function sets the alarm lamp blue output * signal on its GPIO pin to HIGH. * @details \b Inputs: none * @details \b Outputs: Alarm lamp blue output signal set high * @return none *************************************************************************/ void setAlarmLampBlueSignal( void ) { SET_BLUE(); } /*********************************************************************//** * @brief * The setAlarmLampRedSignal function sets the alarm lamp red output * signal on its GPIO pin to HIGH. * @details \b Inputs: none * @details \b Outputs: Alarm lamp red output signal set high * @return none *************************************************************************/ void setAlarmLampRedSignal( void ) { SET_RED(); } /*********************************************************************//** * @brief * The clrAlarmLampGreenSignal function sets the alarm lamp green output * signal on its GPIO pin to LOW. * @details \b Inputs: none * @details \b Outputs: Alarm lamp green output signal set low * @return none *************************************************************************/ void clrAlarmLampGreenSignal( void ) { CLR_GREEN(); } /*********************************************************************//** * @brief * The clrAlarmLampBlueSignal function sets the alarm lamp blue output * signal on its GPIO pin to LOW. * @details \b Inputs: none * @details \b Outputs: Alarm lamp blue output signal set low * @return none *************************************************************************/ void clrAlarmLampBlueSignal( void ) { CLR_BLUE(); } /*********************************************************************//** * @brief * The clrAlarmLampRedSignal function sets the alarm lamp red output * signal on its GPIO pin to LOW. * @details \b Inputs: none * @details \b Outputs: Alarm lamp red output signal set low * @return none *************************************************************************/ void clrAlarmLampRedSignal( void ) { CLR_RED(); } /*********************************************************************//** * @brief * The setSafetyShutdownSignal function sets the safety shutdown output * signal on its GPIO pin to HIGH. * @details \b Inputs: none * @details \b Outputs: Safety shutdown output signal set high * @return none *************************************************************************/ void setSafetyShutdownSignal( void ) { SET_SAFETY_SHUTDOWN(); } /*********************************************************************//** * @brief * The clrSafetyShutdownSignal function sets the safety shutdown output * signal on its GPIO pin to LOW. * @details \b Inputs: none * @details \b Outputs: Safety shutdown output signal set low * @return none *************************************************************************/ void clrSafetyShutdownSignal( void ) { CLR_SAFETY_SHUTDOWN(); } /*********************************************************************//** * @brief * The getSafetySignal function gets the safety shutdown input signal * currently seen on its GPIO pin. * @details \b Inputs: Safety shutdown input signal * @details \b Outputs: none * @return Safety shutdown input signal *************************************************************************/ PIN_SIGNAL_STATE_T getSafetySignal( void ) { PIN_SIGNAL_STATE_T signal = GET_SAFETY(); return signal; } /*********************************************************************//** * @brief * The getOffButtonSignal function gets the off button input signal * currently seen on its GPIO pin. * @details \b Inputs: Off button input signal * @details \b Outputs: none * @return Off button input signal *************************************************************************/ PIN_SIGNAL_STATE_T getOffButtonSignal( void ) { PIN_SIGNAL_STATE_T signal = GET_OFF(); return signal; } /*********************************************************************//** * @brief * The getStopButtonSignal function gets the stop button input signal * currently seen on its GPIO pin. * @details \b Inputs: stop button input signal * @details \b Outputs: none * @return Stop button input signal *************************************************************************/ PIN_SIGNAL_STATE_T getStopButtonSignal( void ) { PIN_SIGNAL_STATE_T signal = GET_STOP(); return signal; } /*********************************************************************//** * @brief * The setAlarmBuzzerSignal function sets the alarm buzzer output signal * on its GPIO pin to HIGH. * @details \b Inputs: none * @details \b Outputs: Alarm buzzer output signal set high * @return none *************************************************************************/ void setAlarmBuzzerSignal( void ) { SET_BACKUP_AUDIO_ENABLE() } /*********************************************************************//** * @brief * The clrAlarmBuzzerSignal function sets the alarm buzzer output signal * on its GPIO pin to LOW. * @details \b Inputs: none * @details \b Outputs: Alarm buzzer output signal set low * @return none *************************************************************************/ void clrAlarmBuzzerSignal( void ) { CLR_BACKUP_AUDIO_ENABLE() } /**@}*/