12 #include <sys/types.h>
15 #include <sys/ioctl.h>
17 #include <sys/socket.h>
19 #include <net/ethernet.h>
20 #include <netinet/in.h>
21 #include <netpacket/packet.h>
57 unsigned char dest_addr[6];
58 unsigned char src_addr[6];
59 unsigned short protocol;
60 unsigned short content_length;
61 unsigned char buffer_number;
62 unsigned char admin_message;
63 unsigned short packet_serial;
71 map<int, fadc_packet *> packets;
74 bool start_packet_seen;
75 bool stop_packet_seen;
86 if(errno != EWOULDBLOCK && errno != EAGAIN) {
87 perror(
"receivePackets");
100 int board_number = pkt->
src_addr[5];
106 if(content_length > 1500) {
107 printf(
"board %d length %d buffer %d admin %d serial %d\n",
108 board_number, content_length, buffer_number,
109 admin_message, packet_serial);
113 if(admin_message & 0x1) {
117 if(admin_message & 0x2) {
148 bool missing =
false;
152 if(!
board[
i].start_packet_seen) {
154 printf(
"-- board 0x%02x waiting on start packet\n",
i);
160 if(!
board[
i].stop_packet_seen) {
162 printf(
"-- board 0x%02x waiting on stop packet\n",
i);
170 if(!
board[
i].enabled)
continue;
172 if(num_packets < 0) {
173 num_packets += 0x10000;
176 for(
int j = num_packets; j >= 0; j--) {
178 if(
board[
i].packets[pn] == NULL) {
180 printf(
"-- board 0x%02x waiting on packet 0x%04x\n",
i, pn);
193 unsigned long long value)
196 int if_index = if_nametoindex(if_name);
198 printf(
"Unknown interface %s\n", if_name);
203 strcpy(req.ifr_name, if_name);
205 perror(
"SIOCGIFHWADDR");
208 unsigned char src[ETH_ALEN];
209 memcpy(src, req.ifr_hwaddr.sa_data, ETH_ALEN);
211 unsigned char dst[ETH_ALEN] = { 0x00, 0x12, 0x6d, 0x12, 0x34, 0xff};
213 struct sockaddr_ll dstaddr;
214 dstaddr.sll_family = AF_PACKET;
215 dstaddr.sll_protocol = htons(ETH_P_ALL);
216 dstaddr.sll_ifindex = if_index;
217 dstaddr.sll_hatype = 0;
218 dstaddr.sll_pkttype = 0;
219 dstaddr.sll_halen = ETH_ALEN;
220 memcpy(dstaddr.sll_addr, dst, ETH_ALEN);
223 unsigned char packet[512];
224 memcpy(&packet[0], dst, ETH_ALEN);
225 memcpy(&packet[6], src, ETH_ALEN);
232 packet[14] = (fadc << 5) | reg;
233 packet[15] = (value >> 56) & 0xff;
234 packet[16] = (value >> 48) & 0xff;
235 packet[17] = (value >> 40) & 0xff;
236 packet[18] = (value >> 32) & 0xff;
237 packet[19] = (value >> 24) & 0xff;
238 packet[20] = (value >> 16) & 0xff;
239 packet[21] = (value >> 8) & 0xff;
240 packet[22] = (
value ) & 0xff;
242 int packet_length = 512;
244 if(sendto(
packet_socket, packet, packet_length, 0, (
const sockaddr *) &dstaddr,
sizeof(dstaddr)) < 0) {
254 if(!
odb_find_key(
"/Equipment/Crate %d/Settings/NFADC %02x",
259 printf(
"Found board %02x\n",
i);
262 odb_get_bool(
"/Equipment/Crate %d/Settings/NFADC %02x/Enabled",
267 for(
int chan = 0; chan < 8; chan++) {
269 odb_get_int(
"/Equipment/Crate %d/Settings/NFADC %02x/Channel %d/LED Mode",
272 int lower_threshold =
273 odb_get_int(
"/Equipment/Crate %d/Settings/NFADC %02x/Channel %d/Lower threshold",
275 int upper_threshold =
276 odb_get_int(
"/Equipment/Crate %d/Settings/NFADC %02x/Channel %d/Upper threshold",
279 odb_get_int(
"/Equipment/Crate %d/Settings/NFADC %02x/Channel %d/Pulser period",
282 odb_get_int(
"/Equipment/Crate %d/Settings/NFADC %02x/Channel %d/Trigger mask",
285 odb_get_int(
"/Equipment/Crate %d/Settings/NFADC %02x/Channel %d/Presamples",
287 int stretch_samples =
288 odb_get_int(
"/Equipment/Crate %d/Settings/NFADC %02x/Channel %d/Stretch samples",
291 odb_get_int(
"/Equipment/Crate %d/Settings/NFADC %02x/Channel %d/DCM phase",
295 unsigned long long r0 =
296 (lower_threshold & 0xfff) |
297 ((upper_threshold & 0xfff) << 12) |
298 ((trigger_mask & 0xf) << 24) |
299 ((presamples & 0xf) << 28) |
300 (((
unsigned long long) (stretch_samples & 0xff)) << 32);
301 unsigned long long r1 =
302 (pulser_period & 0xffffffff) |
303 (((
unsigned long long) (led_mode & 0xf)) << 32);
304 unsigned long long r2 = dcm_phase;
306 int frontend = chan/2;
309 }
else if(frontend == 2) {
314 setReg(
"eth0",
i, frontend, 0, r0);
315 setReg(
"eth0",
i, frontend, 1, r1);
316 setReg(
"eth0",
i, frontend, 4, r2);
318 setReg(
"eth0",
i, frontend, 2, r0);
319 setReg(
"eth0",
i, frontend, 3, r1);
320 setReg(
"eth0",
i, frontend, 5, r2);
340 struct timeval timeout;
342 timeout.tv_usec = 1000;
343 if(setsockopt(
packet_socket, SOL_SOCKET, SO_RCVTIMEO, &timeout,
sizeof(timeout)) < 0) {
344 perror(
"setsockopt");
350 perror(
"fcntl O_NONBLOCK");
381 bool timed_out =
false;
382 struct timeval t1, t2;
391 double tdiff = (t2.tv_usec-t1.tv_usec) + 1000000*(t2.tv_sec-t1.tv_sec);
392 if(tdiff > 10000 && loop_count > 10) {
405 if(!
board[
i].enabled)
continue;
407 for(
int j = 0; j < 4; j++) {
408 sprintf(bk_name,
"N%c%02x",
'a' + j,
i);
409 bk_create(pevent, bk_name, TID_BYTE, &pdata);
412 if(num_packets < 0) {
413 num_packets += 0x10000;
416 for(
int k = 0; k < num_packets; k++) {
418 int frontend = (
board[
i].
packets[pn]->buffer_number - 1) / 3;
420 int len = ntohs(
board[
i].packets[pn]->content_length);
421 char *p = ((
char *) (
board[
i].packets[pn])) + 20;
422 memcpy(pdata, p, len);
427 bk_close(pevent, pdata);