1 #include "otsdaq-components/DAQHardware/OtsUDPFirmwareCore.h"
3 #include "otsdaq/Macros/CoutMacros.h"
4 #include "otsdaq/MessageFacility/MessageFacility.h"
10 #include <netinet/in.h>
11 #include <sys/socket.h>
25 #define UDP_CORE_BLOCK_ADDRESS ((uint64_t)(0x1) << 32)
26 #define ADDR_SELF_UPPER_IP (uint64_t)(0x0) // 24
27 #define ADDR_SELF_LOWER_IP (uint64_t)(0x1) // 8
28 #define ADDR_SELF_MAC (uint64_t)(0x2) // 40
30 #define ADDR_CTRL_DEST_IP (uint64_t)(0x3) // 32
31 #define ADDR_CTRL_DEST_MAC (uint64_t)(0x4) // 48
32 #define ADDR_CTRL_DEST_PORT (uint64_t)(0x5) // 16
34 #define ADDR_DATA_DEST_IP (uint64_t)(0x6) // 32
35 #define ADDR_DATA_DEST_MAC (uint64_t)(0x7) // 48
36 #define ADDR_DATA_DEST_PORT (uint64_t)(0x8) // 16
38 #define ADDR_BURST_MODE (uint64_t)(0x9) // 1
39 #define ADDR_CTRL_RESOLVE_MAC (uint64_t)(0xA) // 1
40 #define ADDR_DATA_RESOLVE_MAC (uint64_t)(0xB) // 1
41 #define ADDR_SELF_VERSION (uint64_t)(0x64) // 16 (read only)
42 #define ADDR_SELF_RESET (uint64_t)(0xFFFFFFFF) // 1 (write only)
47 const uint8_t OtsUDPFirmwareCore::FIFO_ADDRESS_CMD_TYPE = (1 << 3);
50 OtsUDPFirmwareCore::OtsUDPFirmwareCore(
unsigned int version)
56 OtsUDPFirmwareCore::~OtsUDPFirmwareCore(
void) {}
59 void OtsUDPFirmwareCore::init(
void) {}
62 std::string OtsUDPFirmwareCore::write(
char* address,
char* data)
65 writeAdvanced(buffer, address, data);
70 void OtsUDPFirmwareCore::write(std::string& buffer,
75 writeAdvanced(buffer, address, data, 1 , 0 , clearBuffer);
79 void OtsUDPFirmwareCore::write(std::string& buffer,
84 writeAdvanced(buffer, address, data, 0 , clearBuffer);
88 void OtsUDPFirmwareCore::write(std::string& buffer,
93 writeAdvanced(buffer, address, data, 0 , clearBuffer);
99 void OtsUDPFirmwareCore::OtsUDPFirmwareCore::writeAdvanced(std::string& buffer,
103 uint8_t commandTypeOptions,
108 __SS__ <<
"Invalid OtsUDPFirmwareCore::writeAdvanced size: " << size << std::endl;
109 __COUT_ERR__ <<
"\n" << ss.str();
113 if(buffer.size() + 2 + 8 + 8 * size > 2 + 8 + 8 * 182)
115 __SS__ <<
"Aborting. Buffer overflow attempt: " << buffer.size() <<
" + "
116 << 2 + 8 + 8 * size <<
" > " << 2 + 8 + 8 * 182 << std::endl;
117 __COUT_ERR__ <<
"\n" << ss.str();
124 unsigned int begin = buffer.length();
125 buffer.resize(buffer.length() + 2 + 8 + 8 * size,
'\0');
127 buffer[begin + 0] = 1 | commandTypeOptions;
128 buffer[begin + 1] = size;
130 std::copy_n(address,
sizeof(uint64_t), &buffer[begin + 2]);
131 for(uint8_t i = 0; i < size; ++i)
133 (
char*)&data[8 * i],
sizeof(uint64_t), &buffer[begin + 2 + 8 + 8 * i]);
155 void OtsUDPFirmwareCore::OtsUDPFirmwareCore::writeAdvanced(std::string& buffer,
156 const uint64_t& address,
159 uint8_t commandTypeOptions,
162 OtsUDPFirmwareCore::writeAdvanced(
163 buffer, (
char*)&address, data, size, commandTypeOptions, clearBuffer);
167 void OtsUDPFirmwareCore::OtsUDPFirmwareCore::writeAdvanced(std::string& buffer,
168 const uint64_t& address,
169 const uint64_t& data,
170 uint8_t commandTypeOptions,
173 OtsUDPFirmwareCore::writeAdvanced(buffer,
182 void OtsUDPFirmwareCore::OtsUDPFirmwareCore::writeAdvanced(
184 const uint64_t& address,
185 const std::vector<uint64_t>& data,
186 uint8_t commandTypeOptions,
189 OtsUDPFirmwareCore::writeAdvanced(buffer,
198 std::string OtsUDPFirmwareCore::read(
char* address)
200 __COUT__ <<
"OTS pointer based read!! " << std::endl;
202 readAdvanced(buffer, address);
207 void OtsUDPFirmwareCore::read(std::string& buffer,
char* address,
bool clearBuffer)
209 readAdvanced(buffer, address, 1 , 0 , clearBuffer);
213 void OtsUDPFirmwareCore::read(std::string& buffer, uint64_t address,
bool clearBuffer)
215 readAdvanced(buffer, address, 1 , 0 , clearBuffer);
219 void OtsUDPFirmwareCore::read(std::string& buffer, uint32_t address,
bool clearBuffer)
221 readAdvanced(buffer, address, 1 , 0 , clearBuffer);
225 void OtsUDPFirmwareCore::OtsUDPFirmwareCore::readAdvanced(std::string& buffer,
228 uint8_t commandTypeOptions,
233 __SS__ <<
"Invalid OtsUDPFirmwareCore::readAdvanced size: " << size << std::endl;
234 __COUT_ERR__ <<
"\n" << ss.str();
238 if(buffer.size() + 2 + 8 > 2 + 8 + 8 * 182)
240 __SS__ <<
"Aborting. Buffer overflow attempt: " << buffer.size() <<
" + " << 2 + 8
241 <<
" > " << 2 + 8 + 8 * 182 << std::endl;
242 __COUT_ERR__ <<
"\n" << ss.str();
249 unsigned int begin = buffer.length();
250 buffer.resize(buffer.length() + 2 + 8,
'\0');
253 (uint8_t)0 | commandTypeOptions;
254 buffer[begin + 1] = size;
257 std::copy_n(address,
sizeof(uint64_t), &buffer[begin + 2]);
273 void OtsUDPFirmwareCore::OtsUDPFirmwareCore::readAdvanced(std::string& buffer,
274 const uint64_t& address,
276 uint8_t commandTypeOptions,
279 OtsUDPFirmwareCore::readAdvanced(
280 buffer, (
char*)&address, size, commandTypeOptions, clearBuffer);
284 void OtsUDPFirmwareCore::setDataDestination(std::string& buffer,
285 const std::string& ipAddress,
292 OtsUDPFirmwareCore::write(buffer,
293 UDP_CORE_BLOCK_ADDRESS | ADDR_DATA_RESOLVE_MAC ,
301 sscanf(ipAddress.c_str(),
"%d.%d.%d.%d", &ipArr[3], &ipArr[2], &ipArr[1], &ipArr[0]);
302 for(
int i = 0; i < 4; ++i)
303 (((
char*)&ip)[i]) += ipArr[i] & 0x0FF;
305 writeDataDestinationIP(buffer, ip,
false );
306 writeDataDestinationPort(buffer, port,
false );
310 void OtsUDPFirmwareCore::setControlDestination(std::string& buffer,
311 const std::string& ipAddress,
315 OtsUDPFirmwareCore::writeAdvanced(
316 buffer, UDP_CORE_BLOCK_ADDRESS | ADDR_CTRL_RESOLVE_MAC , 1 );
319 __COUT__ <<
"ipAddress = " << ipAddress << std::endl;
322 sscanf(ipAddress.c_str(),
"%d.%d.%d.%d", &ipArr[3], &ipArr[2], &ipArr[1], &ipArr[0]);
323 for(
int i = 0; i < 4; ++i)
324 (((
char*)&ip)[i]) += ipArr[i] & 0x0FF;
326 writeControlDestinationIP(buffer, ip);
327 writeControlDestinationPort(buffer, port);
332 uint32_t OtsUDPFirmwareCore::createRegisterFromValue(std::string& ,
333 std::string& receivedValue)
335 uint32_t retVal = *((uint32_t*)(&receivedValue[2]));
344 void OtsUDPFirmwareCore::writeDataDestinationIP(std::string& buffer,
345 const uint64_t value,
348 OtsUDPFirmwareCore::writeAdvanced(
350 UDP_CORE_BLOCK_ADDRESS | ADDR_DATA_DEST_IP ,
357 void OtsUDPFirmwareCore::writeDataDestinationMAC(std::string& buffer,
358 const uint64_t value,
361 OtsUDPFirmwareCore::writeAdvanced(
363 UDP_CORE_BLOCK_ADDRESS | ADDR_DATA_DEST_MAC ,
370 void OtsUDPFirmwareCore::writeDataDestinationPort(std::string& buffer,
371 const uint64_t value,
374 OtsUDPFirmwareCore::writeAdvanced(
376 UDP_CORE_BLOCK_ADDRESS | ADDR_DATA_DEST_PORT ,
383 void OtsUDPFirmwareCore::readDataDestinationIP(std::string& buffer)
385 OtsUDPFirmwareCore::readAdvanced(
386 buffer, UDP_CORE_BLOCK_ADDRESS | ADDR_DATA_DEST_IP );
390 void OtsUDPFirmwareCore::readDataDestinationMAC(std::string& buffer)
392 OtsUDPFirmwareCore::readAdvanced(
393 buffer, UDP_CORE_BLOCK_ADDRESS | ADDR_DATA_DEST_MAC );
397 void OtsUDPFirmwareCore::readDataDestinationPort(std::string& buffer)
399 OtsUDPFirmwareCore::readAdvanced(
400 buffer, UDP_CORE_BLOCK_ADDRESS | ADDR_DATA_DEST_PORT );
404 void OtsUDPFirmwareCore::writeControlDestinationIP(std::string& buffer,
405 const uint64_t value)
407 OtsUDPFirmwareCore::writeAdvanced(
408 buffer, UDP_CORE_BLOCK_ADDRESS | ADDR_CTRL_DEST_IP , value );
412 void OtsUDPFirmwareCore::writeControlDestinationMAC(std::string& buffer,
413 const uint64_t value)
415 OtsUDPFirmwareCore::writeAdvanced(
416 buffer, UDP_CORE_BLOCK_ADDRESS | ADDR_CTRL_DEST_MAC , value );
420 void OtsUDPFirmwareCore::writeControlDestinationPort(std::string& buffer,
421 const uint64_t value)
423 OtsUDPFirmwareCore::writeAdvanced(
425 UDP_CORE_BLOCK_ADDRESS | ADDR_CTRL_DEST_PORT ,
430 void OtsUDPFirmwareCore::readControlDestinationIP(std::string& buffer)
432 OtsUDPFirmwareCore::readAdvanced(
433 buffer, UDP_CORE_BLOCK_ADDRESS | ADDR_CTRL_DEST_IP );
437 void OtsUDPFirmwareCore::readControlDestinationMAC(std::string& buffer)
439 OtsUDPFirmwareCore::readAdvanced(
440 buffer, UDP_CORE_BLOCK_ADDRESS | ADDR_CTRL_DEST_MAC );
444 void OtsUDPFirmwareCore::readControlDestinationPort(std::string& buffer)
446 OtsUDPFirmwareCore::readAdvanced(
447 buffer, UDP_CORE_BLOCK_ADDRESS | ADDR_CTRL_DEST_PORT );
451 void OtsUDPFirmwareCore::readUDPFirmwareVersion(std::string& buffer)
453 OtsUDPFirmwareCore::readAdvanced(
454 buffer, UDP_CORE_BLOCK_ADDRESS | ADDR_SELF_VERSION );
458 void OtsUDPFirmwareCore::softEthernetReset(std::string& buffer)
460 OtsUDPFirmwareCore::writeAdvanced(
461 buffer, UDP_CORE_BLOCK_ADDRESS | ADDR_SELF_RESET , 0x3 );
465 void OtsUDPFirmwareCore::hardEthernetReset(std::string& buffer)
467 OtsUDPFirmwareCore::writeAdvanced(
468 buffer, UDP_CORE_BLOCK_ADDRESS | ADDR_SELF_RESET , 0x1 );
472 void OtsUDPFirmwareCore::clearEthernetReset(std::string& buffer)
474 OtsUDPFirmwareCore::writeAdvanced(
475 buffer, UDP_CORE_BLOCK_ADDRESS | ADDR_SELF_RESET , 0 );
479 void OtsUDPFirmwareCore::startBurst(std::string& buffer)
481 __COUT__ << std::endl;
482 OtsUDPFirmwareCore::writeAdvanced(
483 buffer, UDP_CORE_BLOCK_ADDRESS | ADDR_BURST_MODE , 1 );
487 void OtsUDPFirmwareCore::stopBurst(std::string& buffer)
489 __COUT__ << std::endl;
490 OtsUDPFirmwareCore::writeAdvanced(
491 buffer, UDP_CORE_BLOCK_ADDRESS | ADDR_BURST_MODE , 0 );