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 <linux/if_packet.h>
62 unsigned char dest_addr[6];
63 unsigned char src_addr[6];
64 unsigned short protocol;
65 unsigned short content_length;
66 unsigned char buffer_number;
67 unsigned char admin_message;
68 unsigned short packet_serial;
76 map<int, fadc_packet *> packets;
80 double first_packet_time;
82 double last_packet_time;
83 bool start_packet_seen;
84 bool stop_packet_seen;
94 struct tpacket_hdr *tph = (
struct tpacket_hdr *) frame;
95 if(!(tph->tp_status & TP_STATUS_USER))
continue;
108 printf(
"board %d length %d buffer %d admin %d serial %d\n",
109 board_number, content_length, buffer_number,
110 admin_message, packet_serial);
114 if(admin_message & 0x1) {
118 if(admin_message & 0x2) {
123 double packet_time = tph->tp_sec*1e6 + tph->tp_usec;
125 if(packet_time < fpt || fpt < 0) {
130 if(packet_time > lpt || lpt < 0) {
153 struct tpacket_hdr *tph = (
struct tpacket_hdr *) frame;
154 tph->tp_status = TP_STATUS_KERNEL;
164 bool missing =
false;
168 if(!
board[
i].start_packet_seen) {
172 printf(
"-- board 0x%02x waiting on start packet\n",
i);
179 printf(
"-- board 0x%02x workaround for missing start packet\n",
i);
182 if(!
board[
i].stop_packet_seen) {
185 printf(
"-- board 0x%02x waiting on stop packet\n",
i);
193 if(!
board[
i].enabled)
continue;
195 if(num_packets < 0) {
196 num_packets += 0x10000;
205 for(
int j = num_packets; j >= 0; j--) {
207 if(
board[
i].packets[pn] == NULL) {
218 printf(
"-- board 0x%02x waiting on %d/%d packets\n",
i,
219 num_missing, num_packets);
227 unsigned long long value)
230 int if_index = if_nametoindex(if_name);
232 printf(
"Unknown interface %s\n", if_name);
237 strcpy(req.ifr_name, if_name);
239 perror(
"SIOCGIFHWADDR");
242 unsigned char src[ETH_ALEN];
243 memcpy(src, req.ifr_hwaddr.sa_data, ETH_ALEN);
245 unsigned char dst[ETH_ALEN] = { 0x00, 0x12, 0x6d, 0x12, 0x34, 0xff};
247 struct sockaddr_ll dstaddr;
248 dstaddr.sll_family = AF_PACKET;
249 dstaddr.sll_protocol = htons(ETH_P_ALL);
250 dstaddr.sll_ifindex = if_index;
251 dstaddr.sll_hatype = 0;
252 dstaddr.sll_pkttype = 0;
253 dstaddr.sll_halen = ETH_ALEN;
254 memcpy(dstaddr.sll_addr, dst, ETH_ALEN);
257 unsigned char packet[512];
258 memcpy(&packet[0], dst, ETH_ALEN);
259 memcpy(&packet[6], src, ETH_ALEN);
266 packet[14] = (fadc << 5) | reg;
267 packet[15] = (value >> 56) & 0xff;
268 packet[16] = (value >> 48) & 0xff;
269 packet[17] = (value >> 40) & 0xff;
270 packet[18] = (value >> 32) & 0xff;
271 packet[19] = (value >> 24) & 0xff;
272 packet[20] = (value >> 16) & 0xff;
273 packet[21] = (value >> 8) & 0xff;
274 packet[22] = (
value ) & 0xff;
276 int packet_length = 512;
278 if(sendto(
packet_socket, packet, packet_length, 0, (
const sockaddr *) &dstaddr,
sizeof(dstaddr)) < 0) {
288 if(!
odb_find_key(
"/Equipment/Crate %d/Settings/NFADC %02x",
293 printf(
"Found board %02x\n",
i);
296 odb_get_bool(
"/Equipment/Crate %d/Settings/NFADC %02x/Enabled",
301 for(
int chan = 0; chan < 8; chan++) {
303 odb_get_int(
"/Equipment/Crate %d/Settings/NFADC %02x/Channel %d/LED Mode",
306 int lower_threshold =
307 odb_get_int(
"/Equipment/Crate %d/Settings/NFADC %02x/Channel %d/Lower threshold",
309 int upper_threshold =
310 odb_get_int(
"/Equipment/Crate %d/Settings/NFADC %02x/Channel %d/Upper threshold",
313 odb_get_int(
"/Equipment/Crate %d/Settings/NFADC %02x/Channel %d/Pulser period",
316 odb_get_int(
"/Equipment/Crate %d/Settings/NFADC %02x/Channel %d/Trigger mask",
319 odb_get_int(
"/Equipment/Crate %d/Settings/NFADC %02x/Channel %d/Presamples",
321 int stretch_samples =
322 odb_get_int(
"/Equipment/Crate %d/Settings/NFADC %02x/Channel %d/Stretch samples",
325 odb_get_int(
"/Equipment/Crate %d/Settings/NFADC %02x/Channel %d/DCM phase",
329 unsigned long long r0;
331 r0 = (lower_threshold & 0xfff) |
332 ((upper_threshold & 0xfff) << 12) |
333 ((trigger_mask & 0xf) << 24) |
334 ((presamples & 0xf) << 28) |
335 (((
unsigned long long) (stretch_samples & 0xff)) << 32);
337 r0 = (lower_threshold & 0xfff) |
338 ((upper_threshold & 0xfff) << 12) |
339 ((trigger_mask & 0xf) << 24) |
340 ((presamples & 0xfff) << 28) |
341 (((
unsigned long long) (stretch_samples & 0xfff)) << 40);
343 unsigned long long r1 =
344 (pulser_period & 0xffffffff) |
345 (((
unsigned long long) (led_mode & 0xf)) << 32);
346 unsigned long long r2 = dcm_phase;
348 int frontend = chan/2;
352 }
else if(frontend == 2) {
358 setReg(
"eth1",
i, frontend, 0, r0);
359 setReg(
"eth1",
i, frontend, 1, r1);
360 setReg(
"eth1",
i, frontend, 4, r2);
362 setReg(
"eth1",
i, frontend, 2, r0);
363 setReg(
"eth1",
i, frontend, 3, r1);
364 setReg(
"eth1",
i, frontend, 5, r2);
382 struct tpacket_req
req;
388 (
void *) &
req,
sizeof(
req));
390 perror(
"setsockopt PACKET_RX_RING");
422 printf(
"new_fadc_read\n");
427 bool timed_out =
false;
428 struct timeval t1, t2;
438 double tdiff = (t2.tv_usec-t1.tv_usec) + 1000000*(t2.tv_sec-t1.tv_sec);
449 printf(
"Board %d: start %d (%c) - stop %d (%c)\n",
i,
450 board[
i].start_packet,
board[
i].start_packet_seen ?
'-' :
'X',
451 board[
i].stop_packet,
board[
i].stop_packet_seen ?
'-' :
'X');
460 if(!
board[
i].enabled)
continue;
462 for(
int j = 0; j < 4; j++) {
463 sprintf(bk_name,
"N%c%02x",
'a' + j,
i);
464 bk_create(pevent, bk_name, TID_BYTE, &pdata);
467 if(num_packets < 0) {
468 num_packets += 0x10000;
471 for(
int k = 0; k < num_packets; k++) {
478 char *p = ((
char *) pkt) + 20;
479 memcpy(pdata, p, len);
480 if((len % 10) != 0)
printf(
"board %d: content_length = %d !\n",
i, len);
486 bk_close(pevent, pdata);