118 lines
4.9 KiB
C++
118 lines
4.9 KiB
C++
#ifndef LINUX_OBC_PDEC_H_
|
|
#define LINUX_OBC_PDEC_H_
|
|
|
|
#include <fsfw/action/ActionMessage.h>
|
|
|
|
#include <cstdint>
|
|
|
|
namespace pdec {
|
|
|
|
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);
|
|
|
|
// 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_ */
|