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) {
150 bool missing =
false;
154 if(!
board[
i].start_packet_seen) {
156 printf(
"-- board 0x%02x waiting on start packet\n",
i);
162 if(!
board[
i].stop_packet_seen) {
164 printf(
"-- board 0x%02x waiting on stop packet\n",
i);
172 if(!
board[
i].enabled)
continue;
174 if(num_packets < 0) {
175 num_packets += 0x10000;
179 for(
int j = num_packets; j >= 0; j--) {
181 if(
board[
i].packets[pn] == NULL) {
191 printf(
"-- board 0x%02x waiting on %d/%d packets\n",
i,
192 num_missing, num_packets);
200 unsigned long long value)
203 int if_index = if_nametoindex(if_name);
205 printf(
"Unknown interface %s\n", if_name);
210 strcpy(req.ifr_name, if_name);
212 perror(
"SIOCGIFHWADDR");
215 unsigned char src[ETH_ALEN];
216 memcpy(src, req.ifr_hwaddr.sa_data, ETH_ALEN);
218 unsigned char dst[ETH_ALEN] = { 0x00, 0x12, 0x6d, 0x12, 0x34, 0xff};
220 struct sockaddr_ll dstaddr;
221 dstaddr.sll_family = AF_PACKET;
222 dstaddr.sll_protocol = htons(ETH_P_ALL);
223 dstaddr.sll_ifindex = if_index;
224 dstaddr.sll_hatype = 0;
225 dstaddr.sll_pkttype = 0;
226 dstaddr.sll_halen = ETH_ALEN;
227 memcpy(dstaddr.sll_addr, dst, ETH_ALEN);
230 unsigned char packet[512];
231 memcpy(&packet[0], dst, ETH_ALEN);
232 memcpy(&packet[6], src, ETH_ALEN);
239 packet[14] = (fadc << 5) | reg;
240 packet[15] = (value >> 56) & 0xff;
241 packet[16] = (value >> 48) & 0xff;
242 packet[17] = (value >> 40) & 0xff;
243 packet[18] = (value >> 32) & 0xff;
244 packet[19] = (value >> 24) & 0xff;
245 packet[20] = (value >> 16) & 0xff;
246 packet[21] = (value >> 8) & 0xff;
247 packet[22] = (
value ) & 0xff;
249 int packet_length = 512;
251 if(sendto(
packet_socket, packet, packet_length, 0, (
const sockaddr *) &dstaddr,
sizeof(dstaddr)) < 0) {
261 if(!
odb_find_key(
"/Equipment/Crate %d/Settings/NFADC %02x",
266 printf(
"Found board %02x\n",
i);
269 odb_get_bool(
"/Equipment/Crate %d/Settings/NFADC %02x/Enabled",
274 for(
int chan = 0; chan < 8; chan++) {
276 odb_get_int(
"/Equipment/Crate %d/Settings/NFADC %02x/Channel %d/LED Mode",
279 int lower_threshold =
280 odb_get_int(
"/Equipment/Crate %d/Settings/NFADC %02x/Channel %d/Lower threshold",
282 int upper_threshold =
283 odb_get_int(
"/Equipment/Crate %d/Settings/NFADC %02x/Channel %d/Upper threshold",
286 odb_get_int(
"/Equipment/Crate %d/Settings/NFADC %02x/Channel %d/Pulser period",
289 odb_get_int(
"/Equipment/Crate %d/Settings/NFADC %02x/Channel %d/Trigger mask",
292 odb_get_int(
"/Equipment/Crate %d/Settings/NFADC %02x/Channel %d/Presamples",
294 int stretch_samples =
295 odb_get_int(
"/Equipment/Crate %d/Settings/NFADC %02x/Channel %d/Stretch samples",
298 odb_get_int(
"/Equipment/Crate %d/Settings/NFADC %02x/Channel %d/DCM phase",
302 unsigned long long r0 =
303 (lower_threshold & 0xfff) |
304 ((upper_threshold & 0xfff) << 12) |
305 ((trigger_mask & 0xf) << 24) |
306 ((presamples & 0xf) << 28) |
307 (((
unsigned long long) (stretch_samples & 0xff)) << 32);
308 unsigned long long r1 =
309 (pulser_period & 0xffffffff) |
310 (((
unsigned long long) (led_mode & 0xf)) << 32);
311 unsigned long long r2 = dcm_phase;
313 int frontend = chan/2;
316 }
else if(frontend == 2) {
321 setReg(
"eth0",
i, frontend, 0, r0);
322 setReg(
"eth0",
i, frontend, 1, r1);
323 setReg(
"eth0",
i, frontend, 4, r2);
325 setReg(
"eth0",
i, frontend, 2, r0);
326 setReg(
"eth0",
i, frontend, 3, r1);
327 setReg(
"eth0",
i, frontend, 5, r2);
351 perror(
"setsockopt");
357 perror(
"fcntl O_NONBLOCK");
388 bool timed_out =
false;
389 struct timeval t1, t2;
398 double tdiff = (t2.tv_usec-t1.tv_usec) + 1000000*(t2.tv_sec-t1.tv_sec);
399 if(tdiff > 10000 && loop_count > 10) {
413 if(!
board[
i].enabled)
continue;
415 for(
int j = 0; j < 4; j++) {
416 sprintf(bk_name,
"N%c%02x",
'a' + j,
i);
417 bk_create(pevent, bk_name, TID_BYTE, &pdata);
420 if(num_packets < 0) {
421 num_packets += 0x10000;
424 for(
int k = 0; k < num_packets; k++) {
426 int frontend = (
board[
i].
packets[pn]->buffer_number - 1) / 3;
428 int len = ntohs(
board[
i].packets[pn]->content_length);
429 char *p = ((
char *) (
board[
i].packets[pn])) + 20;
430 memcpy(pdata, p, len);
435 bk_close(pevent, pdata);