-const char trbnet_version[] = "$Revision: 3.0 $";
+const char trbnet_version[] = "$Revision: 4.0 $";
#include <stdlib.h>
#include <signal.h>
/* Channel Registers */
/* Registers inside Virtex FPGA -> TRBnet endpoint (channel N) */
-#define CHANNEL_N_START_WRITE 0x0100
+#define CHANNEL_N_SENDER_CONTROL 0x0100
#define CHANNEL_N_TARGET_ADDRESS 0x0101
#define CHANNEL_N_SENDER_ERROR 0x0102
#define CHANNEL_N_SENDER_DATA 0x0103
-#define CHANNEL_N_SENDER_FIFO_STATUS 0x0104
#define CHANNEL_N_SENDER_STATUS 0x010f
#define CHANNEL_N_RECEIVER_DATA 0x0203
#define CHANNEL_N_RECEIVER_FIFO_STATUS 0x0204
#define CHANNEL_0_TARGET_ADDRESS 0x0111
#define CHANNEL_0_SENDER_ERROR 0x0112
#define CHANNEL_0_SENDER_DATA 0x0113
-#define CHANNEL_0_SENDER_FIFO_STATUS 0x0114
#define CHANNEL_0_SENDER_TRIGGER_INFO 0x0115
#define CHANNEL_0_SENDER_STATUS 0x011f
#define CHANNEL_0_RECEIVER_DATA 0x0213
#define CHANNEL_1_TARGET_ADDRESS 0x0131
#define CHANNEL_1_SENDER_ERROR 0x0132
#define CHANNEL_1_SENDER_DATA 0x0133
-#define CHANNEL_1_SENDER_FIFO_STATUS 0x0134
#define CHANNEL_1_SENDER_STATUS 0x013f
#define CHANNEL_1_RECEIVER_DATA 0x0233
#define CHANNEL_1_RECEIVER_FIFO_STATUS 0x0234
#define CHANNEL_2_TARGET_ADDRESS 0x0151
#define CHANNEL_2_SENDER_ERROR 0x0152
#define CHANNEL_2_SENDER_DATA 0x0153
-#define CHANNEL_2_SENDER_FIFO_STATUS 0x0154
#define CHANNEL_2_SENDER_STATUS 0x015f
#define CHANNEL_2_RECEIVER_DATA 0x0253
#define CHANNEL_2_RECEIVER_FIFO_STATUS 0x0254
#define CHANNEL_3_TARGET_ADDRESS 0x0171
#define CHANNEL_3_SENDER_ERROR 0x0172
#define CHANNEL_3_SENDER_DATA 0x0173
-#define CHANNEL_3_SENDER_FIFO_STATUS 0x0174
#define CHANNEL_3_SENDER_STATUS 0x017f
#define CHANNEL_3_RECEIVER_DATA 0x0273
#define CHANNEL_3_RECEIVER_FIFO_STATUS 0x0274
}
/* Build package and start transfer */
+#ifndef PEXOR
write32_to_FPGA(CHANNEL_3_TARGET_ADDRESS, trb_address);
+#endif
write32_to_FPGA(CHANNEL_3_SENDER_ERROR, 0x00000000);
write32_to_FPGA(CHANNEL_3_SENDER_DATA, reg_address);
write32_to_FPGA(CHANNEL_3_SENDER_DATA, 0x00000000);
write32_to_FPGA(CHANNEL_3_SENDER_DATA, 0x00000000);
write32_to_FPGA(CHANNEL_3_SENDER_DATA, 0x00000000);
+#ifndef PEXOR
write32_to_FPGA(CHANNEL_3_SENDER_CONTROL, CMD_REGISTER_READ);
+#else
+ write32_to_FPGA(CHANNEL_3_SENDER_CONTROL,
+ (uint32_t)trb_address << 16 | CMD_REGISTER_READ);
+#endif
/* DEBUG INFO */
if (trb_debug > 0) {
}
/* Build package and start transfer */
+#ifndef PEXOR
write32_to_FPGA(CHANNEL_3_TARGET_ADDRESS, trb_address);
+#endif
write32_to_FPGA(CHANNEL_3_SENDER_ERROR, 0x00000000);
write32_to_FPGA(CHANNEL_3_SENDER_DATA, reg_address);
write32_to_FPGA(CHANNEL_3_SENDER_DATA, 0x00000000);
write32_to_FPGA(CHANNEL_3_SENDER_DATA, 0x00000000);
write32_to_FPGA(CHANNEL_3_SENDER_DATA, 0x00000000);
+#ifndef PEXOR
write32_to_FPGA(CHANNEL_3_SENDER_CONTROL, CMD_REGISTER_READ);
-
+#else
+ write32_to_FPGA(CHANNEL_3_SENDER_CONTROL,
+ (uint32_t)trb_address << 16 | CMD_REGISTER_READ);
+#endif
+
/* DEBUG INFO */
if (trb_debug > 0) {
fprintf(stderr, "CMD_REGISTER_READ started.\n");
}
/* Build package and start transfer */
+#ifndef PEXOR
write32_to_FPGA(CHANNEL_3_TARGET_ADDRESS, trb_address);
+#endif
write32_to_FPGA(CHANNEL_3_SENDER_ERROR, 0x00000000);
write32_to_FPGA(CHANNEL_3_SENDER_DATA, reg_address);
write32_to_FPGA(CHANNEL_3_SENDER_DATA, length);
write32_to_FPGA(CHANNEL_3_SENDER_DATA, 0x00000000);
write32_to_FPGA(CHANNEL_3_SENDER_DATA, 0x00000000);
+#ifndef PEXOR
write32_to_FPGA(CHANNEL_3_SENDER_CONTROL, CMD_REGISTER_READ_MEM);
-
+#else
+ write32_to_FPGA(CHANNEL_3_SENDER_CONTROL,
+ (uint32_t)trb_address << 16 | CMD_REGISTER_READ_MEM);
+#endif
+
/* DEBUG INFO */
if (trb_debug > 0) {
fprintf(stderr, "CMD_REGISTER_READ_MEM started.\n");
}
/* Build package and start transfer */
+#ifndef PEXOR
write32_to_FPGA(CHANNEL_3_TARGET_ADDRESS, trb_address);
+#endif
write32_to_FPGA(CHANNEL_3_SENDER_ERROR, 0x00000000);
write32_to_FPGA(CHANNEL_3_SENDER_DATA, reg_address);
write32_to_FPGA(CHANNEL_3_SENDER_DATA, length);
write32_to_FPGA(CHANNEL_3_SENDER_DATA, 0x00000000);
write32_to_FPGA(CHANNEL_3_SENDER_DATA, 0x00000000);
+#ifndef PEXOR
write32_to_FPGA(CHANNEL_3_SENDER_CONTROL, CMD_REGISTER_READ_MEM);
+#else
+ write32_to_FPGA(CHANNEL_3_SENDER_CONTROL,
+ (uint32_t)trb_address << 16 | CMD_REGISTER_READ_MEM);
+#endif
/* DEBUG INFO */
if (trb_debug > 0) {
}
/* Build package */
+#ifndef PEXOR
write32_to_FPGA(CHANNEL_3_TARGET_ADDRESS, trb_address);
+#endif
write32_to_FPGA(CHANNEL_3_SENDER_ERROR, 0x00000000);
write32_to_FPGA(CHANNEL_3_SENDER_DATA, reg_address);
write32_to_FPGA(CHANNEL_3_SENDER_DATA, (value >> 16) & 0xffff);
write32_to_FPGA(CHANNEL_3_SENDER_DATA, value & 0xffff);
write32_to_FPGA(CHANNEL_3_SENDER_DATA, 0x00000000);
+#ifndef PEXOR
write32_to_FPGA(CHANNEL_3_SENDER_CONTROL, CMD_REGISTER_WRITE);
+#else
+ write32_to_FPGA(CHANNEL_3_SENDER_CONTROL,
+ (uint32_t)trb_address << 16 | CMD_REGISTER_WRITE);
+#endif
/* DEBUG INFO */
if (trb_debug > 0) {
}
/* Build package */
+#ifndef PEXOR
write32_to_FPGA(CHANNEL_3_TARGET_ADDRESS, trb_address);
+#endif
write32_to_FPGA(CHANNEL_3_SENDER_ERROR, 0x00000000);
if (option == 0) {
write32_to_FPGA(CHANNEL_3_SENDER_DATA, reg_address + ctr);
write32_to_FPGA(CHANNEL_3_SENDER_DATA, data[ctr] & 0xffff);
write32_to_FPGA(CHANNEL_3_SENDER_DATA, 0x00000000);
}
+#ifndef PEXOR
write32_to_FPGA(CHANNEL_3_SENDER_CONTROL, CMD_REGISTER_WRITE_MEM);
+#else
+ write32_to_FPGA(CHANNEL_3_SENDER_CONTROL,
+ (uint32_t)trb_address << 16 | CMD_REGISTER_WRITE_MEM);
+#endif
/* DEBUG INFO */
if (trb_debug > 0) {
}
/* Build package and start transfer */
+#ifndef PEXOR
write32_to_FPGA(CHANNEL_3_TARGET_ADDRESS, trb_address);
+#endif
write32_to_FPGA(CHANNEL_3_SENDER_ERROR, 0x00000000);
write32_to_FPGA(CHANNEL_3_SENDER_DATA, NET_READUNIQUEID);
write32_to_FPGA(CHANNEL_3_SENDER_DATA, 0x00000000);
write32_to_FPGA(CHANNEL_3_SENDER_DATA, 0x00000000);
write32_to_FPGA(CHANNEL_3_SENDER_DATA, 0x00000000);
+#ifndef PEXOR
write32_to_FPGA(CHANNEL_3_SENDER_CONTROL, CMD_NETADMINISTRATION);
+#else
+ write32_to_FPGA(CHANNEL_3_SENDER_CONTROL,
+ (uint32_t)trb_address << 16 | CMD_NETADMINISTRATION);
+#endif
/* DEBUG INFO */
if (trb_debug > 0) {
}
/* Build package and start transfer */
+#ifndef PEXOR
write32_to_FPGA(CHANNEL_3_TARGET_ADDRESS, 0xffff); /* always broadcast */
+#endif
write32_to_FPGA(CHANNEL_3_SENDER_ERROR, 0x00000000);
write32_to_FPGA(CHANNEL_3_SENDER_DATA, NET_SETADDRESS);
write32_to_FPGA(CHANNEL_3_SENDER_DATA, (uint16_t)(uid));
write32_to_FPGA(CHANNEL_3_SENDER_DATA, endpoint);
write32_to_FPGA(CHANNEL_3_SENDER_DATA, trb_address);
write32_to_FPGA(CHANNEL_3_SENDER_DATA, 0x00000000);
+#ifndef PEXOR
write32_to_FPGA(CHANNEL_3_SENDER_CONTROL, CMD_NETADMINISTRATION);
-
+#else
+ write32_to_FPGA(CHANNEL_3_SENDER_CONTROL,
+ (uint32_t)trb_address << 16 | CMD_NETADMINISTRATION);
+#endif
/* DEBUG INFO */
if (trb_debug > 0) {
fprintf(stderr, "CMD_SETADDRESS started.\n");
write32_to_FPGA(CHANNEL_0_SENDER_TRIGGER_INFO, (trg_info >> 8) & 0xffff);
/* Prepare slowcontrol channel */
+#ifndef PEXOR
write32_to_FPGA(CHANNEL_3_TARGET_ADDRESS, 0x0000fffb); /* RICH Subnet only */
+#endif
write32_to_FPGA(CHANNEL_3_SENDER_ERROR, 0x00000000);
write32_to_FPGA(CHANNEL_3_SENDER_DATA, 0x0020);
write32_to_FPGA(CHANNEL_3_SENDER_DATA, 0x00000000 | (0x01 << trg_input));