RMM API 2.0.0
Loading...
Searching...
No Matches
RMMRegisterAccess.h
1#pragma once
2
3#include <arpa/inet.h>
4#include <sys/socket.h>
5#include <unistd.h>
6
7#include <algorithm>
8#include <cstdint>
9#include <cstring>
10#include <functional>
11#include <iomanip>
12#include <iostream>
13#include <list>
14#include <memory>
15#include <sstream>
16#include <stdexcept>
17#include <string>
18#include <vector>
19
20#include "RMMException.h"
21#include "RMMLog.h"
22#include "RMMMaps.h"
23#include "RMMParams.h"
24#include "RMMUtils.h"
25#include "RegMutex.h"
26
27#define MAX_NODES 192
28#define I2C_MUTEX_SCTL_ID 1 // one-hot value (RMM microblaze is 2, RMM Power readout is 4)
29#define I2C_MUTEX_IDLE_ID 0
30
37struct RMMResult {
38 uint32_t value;
39 rmmStatus status;
45 RMMResult(uint32_t val, rmmStatus stats = rmmSuccess) : value(val), status(stats) {}
46};
47
58 public:
59 RMMRegisterAccess(const std::string &serverIP, int serverPort);
61
76
77 std::unordered_map<RegisterTag, std::unordered_map<std::string, uint32_t>> fillAllAddressMaps();
78 std::list<std::string> getAllRegMaps();
79 void addRegMapMutexes(FENRegMap map);
80 unsigned int addRegsMutexes(std::list<std::string> regs, bool critic = true);
81 bool addRegMutex(std::string reg, std::string tag = "NoTag", bool critic = true);
82 RegLockGuard regLockGuard(std::string reg, std::string tag = "NoTag");
83 std::string addrLookUp(const std::string &name, RegisterTag tag = RegisterTag::ALL);
84 RMMResult feaFwRegRead(const std::string &reg_name, int ring_id, int node_id, const std::string &tag = "");
85 RMMResult feaFwRegWrite(const std::string &reg_name, int ring_id, int node_id, uint32_t data,
86 const std::string &tag = "");
87 RMMResult regRead(const std::string &regName, RegisterTag tag = RegisterTag::ALL);
88 void regAssert(const std::string &reg_name, uint32_t exp_data, RegisterTag tag = RegisterTag::ALL);
89 RMMResult regWrite(const std::string &regName, uint32_t data, RegisterTag tag = RegisterTag::ALL);
90 rmmStatus regPoll(const std::string &regName, uint32_t expData, double pollDelay = 1.0, uint32_t timeout = 0,
91 RegisterTag regTag = RegisterTag::ALL, std::function<bool(uint32_t)> stopCondition = nullptr,
92 std::function<bool()> checkStop = nullptr);
93 RMMResult fieldRead(const std::string &reg, RegisterTag tag, int bitBegin, int bitWidth);
94 RMMResult fieldRead(uint32_t reg, int bitBegin, int bitWidth);
95 RMMResult fieldWrite(const std::string &reg, RegisterTag tag, int bitBegin, int bitWidth, uint32_t data);
96 RMMResult fieldWrite(uint32_t reg, int bitBegin, int bitWidth, uint32_t data);
97 rmmStatus i2cWriteByte(int i2c_addr, uint32_t data);
98 rmmStatus i2cWrite8bReg(int i2c_addr, int reg_addr, uint32_t data);
99 rmmStatus i2cWrite16bReg(int i2c_addr, int reg_addr, uint32_t data);
100 uint32_t i2cRead8bRegSi570(int i2c_addr, int reg_addr);
101 RMMResult regMaskWrite(const std::string &regName, uint32_t data, uint32_t mask, RegisterTag tag = RegisterTag::ALL);
102 rmmStatus i2cDelay(uint32_t delay);
103 RMMResult rawRead(const std::string &addr); // move to private after
104 RMMResult rawWrite(const std::string &addr, uint32_t data);
105
107
108 void requestStop();
109 void resetStop();
110 bool isStopRequested() const;
111
112 bool isLegacyFW() const;
113
114 private:
115 enum class I2C_CMD {
116 WRITE_ONE_BYTE = 1,
117 WRITE_TWO_BYTES = 2,
118 WRITE_THREE_BYTES = 3,
119 READ_BYTE = 4,
120 READ_TWO_BYTES = 5,
121 DELAY = 6,
122 READ_BYTE_SI570 = 7
123 };
124
125 int sock;
126 RegMutex regMutex;
127 std::recursive_mutex i2cMut;
128 struct sockaddr_in serverAddr;
129 std::atomic<uint32_t> requestCount{0};
130 std::atomic<uint32_t> replyCount{0};
131 std::mutex soft_mutex;
132 std::atomic<bool> _legacyFW{false};
133 std::unordered_map<RegisterTag, std::unordered_map<std::string, uint32_t>> addressMaps;
134 std::unordered_map<int, std::map<int, std::unordered_map<std::string, uint32_t>>> feaFwAddressMaps;
135
136 struct ReplyData {
137 std::string header;
138 std::string addr;
139 std::string data;
140 std::string status;
141 };
142 void i2cClaimMutex(uint32_t id = I2C_MUTEX_SCTL_ID, double poll_delay = 1.0, int poll_attempts_timeout = -1);
143 void i2cReleaseMutex();
144 rmmStatus i2cSendWaitDone();
145 std::string sendSlowControlPacket(const std::string &pkt);
146 bool isTimeout(std::string sent_data, std::string ans);
147 RMMResult parseReplayRecvData(const std::string sent_data, const std::string rec_data);
148 rmmStatus checkProtocolReply(std::string sent, std::string received);
149
150 uint32_t getFrontendRegAddress(const std::string &reg_name, int ring, int node);
151
152 std::vector<int> whichBitsAreSet(int data);
153
154 sockaddr_in socketConnect(const std::string &server_ip, int server_port);
155 bool sendMessage(const char *message, size_t length);
156 std::vector<uint8_t> receiveBinaryMessage();
157 rmmStatus setSocketTimeout(int seconds, int microseconds);
158
159 std::atomic<bool> _stopRequested{false};
160
161 RMMResult fieldReadImpl(std::function<RMMResult()> readFunc, int bitBegin, int bitWidth);
162 RMMResult fieldWriteImpl(std::function<RMMResult()> readFunc, std::function<RMMResult(uint32_t)> writeFunc,
163 int bitBegin, int bitWidth, std::string reg, uint32_t data);
164
165 bool defineFwVersion();
166
167 friend class I2CMutex;
168};
169
170using RegisterTag = RMMRegisterAccess::RegisterTag;
Class for managing and writing log messages to different log levels and files.
Definition RMMLog.h:47
void addRegMapMutexes(FENRegMap map)
Calls regMutex addMap.
Definition RMMRegisterAccess.cpp:57
RMMResult regMaskWrite(const std::string &regName, uint32_t data, uint32_t mask, RegisterTag tag=RegisterTag::ALL)
Writes a value to a register using a bitmask.
Definition RMMRegisterAccess.cpp:649
RMMResult feaFwRegWrite(const std::string &reg_name, int ring_id, int node_id, uint32_t data, const std::string &tag="")
Write in a front-end register, calculating the ring/node offset.
Definition RMMRegisterAccess.cpp:204
RMMResult regRead(const std::string &regName, RegisterTag tag=RegisterTag::ALL)
Reads a register value by its name from the register map.
Definition RMMRegisterAccess.cpp:228
std::list< std::string > getAllRegMaps()
returns a list of shared pointers to current address maps.
Definition RMMRegisterAccess.cpp:120
uint32_t i2cRead8bRegSi570(int i2c_addr, int reg_addr)
Reads from an 8bit register at an I2C address (Si570 only).
Definition RMMRegisterAccess.cpp:620
RMMResult feaFwRegRead(const std::string &reg_name, int ring_id, int node_id, const std::string &tag="")
Read a front-end register, calculating the ring/node offset.
Definition RMMRegisterAccess.cpp:184
void resetStop()
Resets the stop request flag, allowing operations to continue.
Definition RMMRegisterAccess.cpp:1015
std::unordered_map< RegisterTag, std::unordered_map< std::string, uint32_t > > fillAllAddressMaps()
Fill all address maps.
Definition RMMRegisterAccess.cpp:83
void regAssert(const std::string &reg_name, uint32_t exp_data, RegisterTag tag=RegisterTag::ALL)
Check a register matches an expected value, or throw a ValueError exception.
Definition RMMRegisterAccess.cpp:248
rmmStatus regPoll(const std::string &regName, uint32_t expData, double pollDelay=1.0, uint32_t timeout=0, RegisterTag regTag=RegisterTag::ALL, std::function< bool(uint32_t)> stopCondition=nullptr, std::function< bool()> checkStop=nullptr)
Polls a named register until it matches the expected value, or stops based on a custom stop condition...
Definition RMMRegisterAccess.cpp:309
RMMResult rawWrite(const std::string &addr, uint32_t data)
Performs a write operation to a register address.
Definition RMMRegisterAccess.cpp:710
void requestStop()
Requests to stop ongoing operations.
Definition RMMRegisterAccess.cpp:1010
rmmStatus i2cDelay(uint32_t delay)
Use the I2C controller to time a delay.
Definition RMMRegisterAccess.cpp:666
RegLockGuard regLockGuard(std::string reg, std::string tag="NoTag")
returns a lock guard object for that register mutex.
Definition RMMRegisterAccess.cpp:62
RMMResult rawRead(const std::string &addr)
Performs a read operation from a register address.
Definition RMMRegisterAccess.cpp:688
bool isLegacyFW() const
Checks if the FW version is legagy (Non UDP Core version).
Definition RMMRegisterAccess.cpp:1029
RMMResult fieldWrite(const std::string &reg, RegisterTag tag, int bitBegin, int bitWidth, uint32_t data)
Writes a field to a register in the RMM space using a register name.
Definition RMMRegisterAccess.cpp:469
RMMLog rmmLog
Log handler for RMMRegisterAccess messages.
Definition RMMRegisterAccess.h:106
RegisterTag
Enum class representing different register tags.
Definition RMMRegisterAccess.h:68
@ CTRL
Control register.
Definition RMMRegisterAccess.h:69
@ TIME
Time register.
Definition RMMRegisterAccess.h:71
@ CMAC
CMAC register (Used only by nonUDP FW version)
Definition RMMRegisterAccess.h:73
@ ALL
All registers.
Definition RMMRegisterAccess.h:74
@ ENG
Engineering register.
Definition RMMRegisterAccess.h:70
@ RING_MST
Ring master register.
Definition RMMRegisterAccess.h:72
RMMResult regWrite(const std::string &regName, uint32_t data, RegisterTag tag=RegisterTag::ALL)
Writes a value to a named register.
Definition RMMRegisterAccess.cpp:272
std::string addrLookUp(const std::string &name, RegisterTag tag=RegisterTag::ALL)
Retrieves the address of a register from the address map.
Definition RMMRegisterAccess.cpp:143
rmmStatus i2cWrite8bReg(int i2c_addr, int reg_addr, uint32_t data)
Writes to an 8bit register at an I2C address.
Definition RMMRegisterAccess.cpp:575
bool addRegMutex(std::string reg, std::string tag="NoTag", bool critic=true)
Calls regMutex addReg.
Definition RMMRegisterAccess.cpp:76
RMMResult fieldRead(const std::string &reg, RegisterTag tag, int bitBegin, int bitWidth)
Reads a field from a register in the RMM space using a register name.
Definition RMMRegisterAccess.cpp:399
unsigned int addRegsMutexes(std::list< std::string > regs, bool critic=true)
Calls regMutex addRegs.
Definition RMMRegisterAccess.cpp:69
rmmStatus i2cWrite16bReg(int i2c_addr, int reg_addr, uint32_t data)
Writes to a 16bit register at an I2C address.
Definition RMMRegisterAccess.cpp:598
~RMMRegisterAccess()
Destructor of the RMMRegisterAccess.
Definition RMMRegisterAccess.cpp:49
bool isStopRequested() const
Checks if a stop request has been issued.
Definition RMMRegisterAccess.cpp:1022
rmmStatus i2cWriteByte(int i2c_addr, uint32_t data)
Writes a single byte to an I2C address.
Definition RMMRegisterAccess.cpp:553
RMMRegisterAccess(const std::string &serverIP, int serverPort)
Constructor of the RMMRegisterAccess instance.
Definition RMMRegisterAccess.cpp:33
A class that stores a map of mutexes, one for each register address. Each mutex can be locked or unlo...
Definition RegMutex.h:24
Struct to represent the result of an RMM register operation.
Definition RMMRegisterAccess.h:37
rmmStatus status
The status of the register operation.
Definition RMMRegisterAccess.h:39
uint32_t value
The value read from the register.
Definition RMMRegisterAccess.h:38
RMMResult(uint32_t val, rmmStatus stats=rmmSuccess)
Constructs an RMMResult instance.
Definition RMMRegisterAccess.h:45