#ifndef LINUX_OBC_PDEC_H_ #define LINUX_OBC_PDEC_H_ #include #include #include namespace pdec { static const uint8_t INTERFACE_ID = CLASS_ID::PDEC_HANDLER; static const ReturnValue_t ABANDONED_CLTU_RETVAL = MAKE_RETURN_CODE(0xA0); static const ReturnValue_t FRAME_DIRTY_RETVAL = MAKE_RETURN_CODE(0xA1); static const ReturnValue_t FRAME_ILLEGAL_ONE_REASON = MAKE_RETURN_CODE(0xA2); static const ReturnValue_t FRAME_ILLEGAL_MULTIPLE_REASONS = MAKE_RETURN_CODE(0xA2); static const ReturnValue_t AD_DISCARDED_LOCKOUT_RETVAL = MAKE_RETURN_CODE(0xA3); static const ReturnValue_t AD_DISCARDED_WAIT_RETVAL = MAKE_RETURN_CODE(0xA4); static const ReturnValue_t AD_DISCARDED_NS_VS = MAKE_RETURN_CODE(0xA5); //! [EXPORT] : [COMMENT] Received action message with unknown action id static const ReturnValue_t COMMAND_NOT_IMPLEMENTED = MAKE_RETURN_CODE(0xB0); static const ReturnValue_t NO_REPORT_RETVAL = MAKE_RETURN_CODE(0xA6); //! Error in version number and reserved A and B fields static const ReturnValue_t ERROR_VERSION_NUMBER_RETVAL = MAKE_RETURN_CODE(0xA7); //! Illegal combination of bypass and control command flag static const ReturnValue_t ILLEGAL_COMBINATION_RETVAL = MAKE_RETURN_CODE(0xA8); //! Spacecraft identifier did not match static const ReturnValue_t INVALID_SC_ID_RETVAL = MAKE_RETURN_CODE(0xA9); //! VC identifier bits 0 to 4 did not match static const ReturnValue_t INVALID_VC_ID_MSB_RETVAL = MAKE_RETURN_CODE(0xAA); //! VC identifier bit 5 did not match static const ReturnValue_t INVALID_VC_ID_LSB_RETVAL = MAKE_RETURN_CODE(0xAB); //! N(S) of BC or BD frame not set to all zeros static const ReturnValue_t NS_NOT_ZERO_RETVAL = MAKE_RETURN_CODE(0xAC); //! Invalid BC control command static const ReturnValue_t INVALID_BC_CC = MAKE_RETURN_CODE(0xAE); static const uint8_t SUBSYSTEM_ID = SUBSYSTEM_ID::PDEC_HANDLER; //! [EXPORT] : [COMMENT] Frame acceptance report signals an invalid frame //! P1: The frame analysis information (FrameAna field of PDEC_FAR register) //! P2: When frame declared illegal this parameter this parameter gives information about the //! reason (IReason field of the PDEC_FAR register) static const Event INVALID_TC_FRAME = MAKE_EVENT(1, severity::HIGH); //! [EXPORT] : [COMMENT] Read invalid FAR from PDEC after startup static const Event INVALID_FAR = MAKE_EVENT(2, severity::HIGH); //! [EXPORT] : [COMMENT] Carrier lock detected static const Event CARRIER_LOCK = MAKE_EVENT(3, severity::INFO); //! [EXPORT] : [COMMENT] Bit lock detected (data valid) static const Event BIT_LOCK_PDEC = MAKE_EVENT(4, severity::INFO); //! [EXPORT] : [COMMENT] Lost carrier lock static const Event LOST_CARRIER_LOCK_PDEC = MAKE_EVENT(5, severity::INFO); //! [EXPORT] : [COMMENT] Lost bit lock static const Event LOST_BIT_LOCK_PDEC = MAKE_EVENT(6, severity::INFO); //! [EXPORT] : [COMMENT] Too many IRQs over the time window of one second. P1: Allowed TCs static constexpr Event TOO_MANY_IRQS = MAKE_EVENT(7, severity::MEDIUM); static constexpr Event POLL_SYSCALL_ERROR_PDEC = event::makeEvent(SUBSYSTEM_ID, 8, severity::MEDIUM); static constexpr Event WRITE_SYSCALL_ERROR_PDEC = event::makeEvent(SUBSYSTEM_ID, 9, severity::HIGH); //! [EXPORT] : [COMMENT] Trying a PDEC reset with complete re-initialization static constexpr Event PDEC_TRYING_RESET_WITH_INIT = event::makeEvent(SUBSYSTEM_ID, 10, severity::LOW); //! [EXPORT] : [COMMENT] Trying a PDEC reset without re-initialization. static constexpr Event PDEC_TRYING_RESET_NO_INIT = event::makeEvent(SUBSYSTEM_ID, 11, severity::LOW); //! [EXPORT] : [COMMENT] Failed to pull PDEC reset to low static constexpr Event PDEC_RESET_FAILED = event::makeEvent(SUBSYSTEM_ID, 12, severity::HIGH); //! [EXPORT] : [COMMENT] Failed to open the IRQ uio file static constexpr Event OPEN_IRQ_FILE_FAILED = event::makeEvent(SUBSYSTEM_ID, 13, severity::HIGH); //! [EXPORT] : [COMMENT] PDEC initialization failed. This might also be due to the persistent //! confiuration never becoming available, for example due to SD card issues. static constexpr Event PDEC_INIT_FAILED = event::makeEvent(SUBSYSTEM_ID, 14, severity::HIGH); //! [EXPORT] : [COMMENT] The PDEC configuration area has been corrupted //! P1: The first configuration word //! P2: The second configuration word static constexpr Event PDEC_CONFIG_CORRUPTED = event::makeEvent(SUBSYSTEM_ID, 15, severity::HIGH); // Action IDs static constexpr ActionId_t PRINT_CLCW = 0; // Print PDEC monitor register static constexpr ActionId_t PRINT_PDEC_MON = 1; static constexpr ActionId_t RESET_PDEC_NO_REINIITALIZATION = 2; static constexpr ActionId_t RESET_PDEC_WITH_REINIITALIZATION = 3; enum class FrameAna_t : uint8_t { ABANDONED_CLTU, FRAME_DIRTY, FRAME_ILLEGAL, FRAME_ILLEGAL_MULTI_REASON, AD_DISCARDED_LOCKOUT, AD_DISCARDED_WAIT, AD_DISCARDED_NS_VR, FRAME_ACCEPTED }; static const uint8_t STAT_POSITION = 31; static const uint8_t FRAME_ANA_POSITION = 28; static const uint8_t IREASON_POSITION = 25; static const uint8_t NEW_FAR_RECEIVED = 0; static constexpr uint32_t NEW_FAR_MASK = 1 << 2; static constexpr uint32_t TC_ABORT_MASK = 1 << 1; static constexpr uint32_t TC_NEW_MASK = 1 << 0; static constexpr uint32_t FAR_STAT_MASK = 1UL << 31; static const uint32_t FRAME_ANA_MASK = 0x70000000; static const uint32_t IREASON_MASK = 0x0E000000; static const uint32_t TC_CHANNEL_INACTIVE = 0x0; static const uint32_t TC_CHANNEL_ACTIVE = 0x1; static const uint32_t TC_CHANNEL_TIMEDOUT = 0x2; static const uint32_t TC0_STATUS_MASK = 0x3; static const uint32_t TC1_STATUS_MASK = 0xC; static const uint32_t TC2_STATUS_MASK = 0x300; static const uint32_t TC3_STATUS_MASK = 0xC00; static const uint32_t TC4_STATUS_MASK = 0x30000; static const uint32_t TC5_STATUS_MASK = 0xc00000; // Lock register set to 1 when start sequence has been found (CLTU is beeing processed) static const uint32_t LOCK_MASK = 0xc00000; static const uint32_t TC0_STATUS_POS = 0; static const uint32_t TC1_STATUS_POS = 2; static const uint32_t TC2_STATUS_POS = 4; static const uint32_t TC3_STATUS_POS = 6; static const uint32_t TC4_STATUS_POS = 8; static const uint32_t TC5_STATUS_POS = 10; // Lock register set to 1 when start sequence has been found (CLTU is beeing processed) static const uint32_t LOCK_POS = 12; /** * UIO is 4 byte aligned. Thus offset is calculated with "true offset" / 4 * Example: PDEC_FAR = 0x2840 => Offset in virtual address space is 0xA10 */ static constexpr uint32_t PDEC_PISR_OFFSET = 0xA02; static constexpr uint32_t PDEC_PIR_OFFSET = 0xA03; static constexpr uint32_t PDEC_IMR_OFFSET = 0xA04; static const uint32_t PDEC_FAR_OFFSET = 0xA10; static const uint32_t PDEC_CLCW_OFFSET = 0xA12; static const uint32_t PDEC_BFREE_OFFSET = 0xA24; static const uint32_t PDEC_BPTR_OFFSET = 0xA25; static const uint32_t PDEC_SLEN_OFFSET = 0xA26; static const uint32_t PDEC_MON_OFFSET = 0xA27; } // namespace pdec #endif /* LINUX_OBC_PDEC_H_ */