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) {
149 if(!
board[
i].start_packet_seen || !
board[
i].stop_packet_seen) {
157 if(num_packets < 0) {
158 num_packets += 0x10000;
161 for(
int j = num_packets; j >= 0; j--) {
163 if(
board[
i].packets[pn] == NULL) {
174 unsigned long long value)
177 int if_index = if_nametoindex(if_name);
179 printf(
"Unknown interface %s\n", if_name);
184 strcpy(req.ifr_name, if_name);
186 perror(
"SIOCGIFHWADDR");
189 unsigned char src[ETH_ALEN];
190 memcpy(src, req.ifr_hwaddr.sa_data, ETH_ALEN);
192 unsigned char dst[ETH_ALEN] = { 0x00, 0x12, 0x6d, 0x12, 0x34, 0xff};
194 struct sockaddr_ll dstaddr;
195 dstaddr.sll_family = AF_PACKET;
196 dstaddr.sll_protocol = htons(ETH_P_ALL);
197 dstaddr.sll_ifindex = if_index;
198 dstaddr.sll_hatype = 0;
199 dstaddr.sll_pkttype = 0;
200 dstaddr.sll_halen = ETH_ALEN;
201 memcpy(dstaddr.sll_addr, dst, ETH_ALEN);
204 unsigned char packet[512];
205 memcpy(&packet[0], dst, ETH_ALEN);
206 memcpy(&packet[6], src, ETH_ALEN);
213 packet[14] = (fadc << 5) | reg;
214 packet[15] = (value >> 56) & 0xff;
215 packet[16] = (value >> 48) & 0xff;
216 packet[17] = (value >> 40) & 0xff;
217 packet[18] = (value >> 32) & 0xff;
218 packet[19] = (value >> 24) & 0xff;
219 packet[20] = (value >> 16) & 0xff;
220 packet[21] = (value >> 8) & 0xff;
221 packet[22] = (
value ) & 0xff;
223 int packet_length = 512;
225 if(sendto(
packet_socket, packet, packet_length, 0, (
const sockaddr *) &dstaddr,
sizeof(dstaddr)) < 0) {
235 if(!
odb_find_key(
"/Equipment/Crate %d/Settings/NFADC %02x",
240 printf(
"Found board %02x\n",
i);
243 odb_get_bool(
"/Equipment/Crate %d/Settings/NFADC %02x/Enabled",
248 for(
int chan = 0; chan < 8; chan++) {
250 odb_get_int(
"/Equipment/Crate %d/Settings/NFADC %02x/Channel %d/LED Mode",
253 int lower_threshold =
254 odb_get_int(
"/Equipment/Crate %d/Settings/NFADC %02x/Channel %d/Lower threshold",
256 int upper_threshold =
257 odb_get_int(
"/Equipment/Crate %d/Settings/NFADC %02x/Channel %d/Upper threshold",
260 odb_get_int(
"/Equipment/Crate %d/Settings/NFADC %02x/Channel %d/Pulser period",
263 odb_get_int(
"/Equipment/Crate %d/Settings/NFADC %02x/Channel %d/Trigger mask",
266 odb_get_int(
"/Equipment/Crate %d/Settings/NFADC %02x/Channel %d/Presamples",
268 int stretch_samples =
269 odb_get_int(
"/Equipment/Crate %d/Settings/NFADC %02x/Channel %d/Stretch samples",
272 odb_get_int(
"/Equipment/Crate %d/Settings/NFADC %02x/Channel %d/DCM phase",
276 unsigned long long r0 =
277 (lower_threshold & 0xfff) |
278 ((upper_threshold & 0xfff) << 12) |
279 ((trigger_mask & 0xf) << 24) |
280 ((presamples & 0xf) << 28) |
281 (((
unsigned long long) (stretch_samples & 0xff)) << 32);
282 unsigned long long r1 =
283 (pulser_period & 0xffffffff) |
284 (((
unsigned long long) (led_mode & 0xf)) << 32);
285 unsigned long long r2 = dcm_phase;
287 int frontend = chan/2;
290 }
else if(frontend == 2) {
295 setReg(
"eth0",
i, frontend, 0, r0);
296 setReg(
"eth0",
i, frontend, 1, r1);
297 setReg(
"eth0",
i, frontend, 4, r2);
299 setReg(
"eth0",
i, frontend, 2, r0);
300 setReg(
"eth0",
i, frontend, 3, r1);
301 setReg(
"eth0",
i, frontend, 5, r2);
325 perror(
"setsockopt");
331 perror(
"fcntl O_NONBLOCK");
362 bool timed_out =
false;
363 struct timeval t1, t2;
372 double tdiff = (t2.tv_usec-t1.tv_usec) + 1000000*(t2.tv_sec-t1.tv_sec);
373 if(tdiff > 10000 && loop_count > 10) {
387 for(
int j = 0; j < 4; j++) {
388 sprintf(bk_name,
"N%c%02x",
'a' + j,
i);
389 bk_create(pevent, bk_name, TID_BYTE, &pdata);
392 if(num_packets < 0) {
393 num_packets += 0x10000;
396 for(
int k = 0; k < num_packets; k++) {
398 int frontend = (
board[
i].
packets[pn]->buffer_number - 1) / 3;
400 int len = ntohs(
board[
i].packets[pn]->content_length);
401 char *p = ((
char *) (
board[
i].packets[pn])) + 20;
402 memcpy(pdata, p, len);
407 bk_close(pevent, pdata);