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];
102 struct tpacket_hdr *tph = (
struct tpacket_hdr *) frame;
103 if(!(tph->tp_status & TP_STATUS_USER))
continue;
106 int board_number = pkt->
src_addr[5];
115 if(admin_message & 0x1) {
119 if(admin_message & 0x2) {
123 if(admin_message & 0x4) {
126 double packet_time = tph->tp_sec*1e6 + tph->tp_usec;
128 if(packet_time < fpt || fpt < 0) {
133 if(packet_time > lpt || lpt < 0) {
158 struct tpacket_hdr *tph = (
struct tpacket_hdr *) frame;
159 tph->tp_status = TP_STATUS_KERNEL;
170 bool missing =
false;
174 if(!
board[
i].start_packet_seen) {
177 printf(
"-- board 0x%02x waiting on start packet\n",
i);
187 printf(
"-- board 0x%02x workaround for missing start packet\n",
i);
190 if(!
board[
i].stop_packet_seen) {
193 printf(
"-- board 0x%02x waiting on stop packet\n",
i);
205 if(num_packets < 0) {
206 num_packets += 0x10000;
215 for(
int j = num_packets; j >= 0; j--) {
217 if(
board[
i].packets[pn] == NULL) {
219 printf(
"-- board 0x%02x waiting on packet %d\n",
i, pn);
227 if(diag && num_missing != 0) {
228 printf(
"-- board 0x%02x waiting on %d/%d packets\n",
i,
229 num_missing, num_packets);
237 unsigned long long value,
bool acquire)
240 int if_index = if_nametoindex(if_name);
242 printf(
"Unknown interface %s\n", if_name);
247 strcpy(req.ifr_name, if_name);
249 perror(
"SIOCGIFHWADDR");
252 unsigned char src[ETH_ALEN];
253 memcpy(src, req.ifr_hwaddr.sa_data, ETH_ALEN);
255 unsigned char dst[ETH_ALEN] = { 0x00, 0x12, 0x6d, 0x12, 0x34, 0xff};
257 struct sockaddr_ll dstaddr;
258 dstaddr.sll_family = AF_PACKET;
259 dstaddr.sll_protocol = htons(ETH_P_ALL);
260 dstaddr.sll_ifindex = if_index;
261 dstaddr.sll_hatype = 0;
262 dstaddr.sll_pkttype = 0;
263 dstaddr.sll_halen = ETH_ALEN;
264 memcpy(dstaddr.sll_addr, dst, ETH_ALEN);
267 unsigned char packet[512];
268 memcpy(&packet[0], dst, ETH_ALEN);
269 memcpy(&packet[6], src, ETH_ALEN);
276 packet[14] = (!acquire << 7) |(fadc << 5) | reg;
277 packet[15] = (value >> 56) & 0xff;
278 packet[16] = (value >> 48) & 0xff;
279 packet[17] = (value >> 40) & 0xff;
280 packet[18] = (value >> 32) & 0xff;
281 packet[19] = (value >> 24) & 0xff;
282 packet[20] = (value >> 16) & 0xff;
283 packet[21] = (value >> 8) & 0xff;
284 packet[22] = (
value ) & 0xff;
286 int packet_length = 512;
288 if(sendto(
packet_socket, packet, packet_length, 0, (
const sockaddr *) &dstaddr,
sizeof(dstaddr)) < 0) {
301 if(!
odb_find_key(
"/Equipment/Crate %d/Settings/NFADC %02x",
306 printf(
"Found board %02x\n",
i);
309 odb_get_bool(
"/Equipment/Crate %d/Settings/NFADC %02x/Enabled",
314 printf(
"FADC board 0x%02x: enabled: %s\n",
i, yn);
318 for(
int chan = 0; chan < 8; chan++) {
320 odb_get_int(
"/Equipment/Crate %d/Settings/NFADC %02x/Channel %d/LED Mode",
323 int lower_threshold =
324 odb_get_int(
"/Equipment/Crate %d/Settings/NFADC %02x/Channel %d/Lower threshold",
326 int upper_threshold =
327 odb_get_int(
"/Equipment/Crate %d/Settings/NFADC %02x/Channel %d/Upper threshold",
330 odb_get_int(
"/Equipment/Crate %d/Settings/NFADC %02x/Channel %d/Pulser period",
333 odb_get_int(
"/Equipment/Crate %d/Settings/NFADC %02x/Channel %d/Trigger mask",
336 odb_get_int(
"/Equipment/Crate %d/Settings/NFADC %02x/Channel %d/Presamples",
338 int stretch_samples =
339 odb_get_int(
"/Equipment/Crate %d/Settings/NFADC %02x/Channel %d/Stretch samples",
342 odb_get_int(
"/Equipment/Crate %d/Settings/NFADC %02x/Channel %d/DCM phase",
346 unsigned long long r0 =
347 (lower_threshold & 0xfff) |
348 ((upper_threshold & 0xfff) << 12) |
349 ((trigger_mask & 0xf) << 24) |
350 ((presamples & 0xfff) << 28) |
351 (((
unsigned long long) (stretch_samples & 0xfff)) << 40);
352 unsigned long long r1 =
353 (pulser_period & 0xffffffff) |
354 (((
unsigned long long) (led_mode & 0xf)) << 32);
355 unsigned long long r2 = dcm_phase;
357 int frontend = chan/2;
363 }
else if(frontend == 2) {
374 setReg(interface,
i, frontend, 0, r0, 0);
375 setReg(interface,
i, frontend, 1, r1, 0);
376 setReg(interface,
i, frontend, 4, r2, 1);
378 setReg(interface,
i, frontend, 2, r0, 0);
379 setReg(interface,
i, frontend, 3, r1, 0);
380 setReg(interface,
i, frontend, 5, r2, 1);
398 struct tpacket_req req;
404 (
void *) &req,
sizeof(req));
406 perror(
"setsockopt PACKET_RX_RING");
438 printf(
"new_fadc_read\n");
443 bool timed_out =
false;
444 struct timeval t1, t2;
454 double tdiff = (t2.tv_usec-t1.tv_usec) + 1000000*(t2.tv_sec-t1.tv_sec);
463 bool buffer_full =
false;
467 printf(
"Board 0x%02x: start %d (%c) - stop %d (%c) - buffer full (%c)\n",
i,
468 board[
i].start_packet,
board[
i].start_packet_seen ?
'+' :
'-',
469 board[
i].stop_packet,
board[
i].stop_packet_seen ?
'+' :
'-',
470 board[
i].buffer_full ?
'+' :
'-');
472 if(
board[
i].buffer_full) buffer_full =
true;
487 bk_create(pevent,
"NBUF", TID_INT, &pbuffer_full);
490 if(
board[j].buffer_full) *pbuffer_full++ = j;
492 bk_close(pevent, pbuffer_full);
499 bk_create(pevent,
"NLSS", TID_INT, &p_package_loss);
504 if(!
board[j].packets[m]){
505 *p_package_loss++ = j;
506 *p_package_loss++ = m;
511 bk_close(pevent, p_package_loss);
521 int fadc_number_offset = 32;
522 int data_offset = 33;
526 fadc_number_offset = 33;
530 for(
int j = 0; j < 8; j++) {
531 sprintf(bk_name,
"N%c%02x",
'a' + j,
i);
532 bk_create(pevent, bk_name, TID_BYTE, &pdata);
535 if(num_packets < 0) {
536 num_packets += 0x10000;
539 for(
int k = 0; k < num_packets; k++) {
543 int fadc_number = (int) *(((
unsigned char *) pkt) + fadc_number_offset);
544 if(fadc_number != 0 && fadc_number != 1)
545 printf(
"board %d: fadc_number = %d !\n", fadc_number);
549 if((len % word_length) != 0)
550 printf(
"board %d: content_length = %d !\n",
i, len);
552 char *p = ((
char *) pkt) + data_offset;
553 memcpy(pdata, p, len);
560 bk_close(pevent, pdata);