AFHBA404
AFHBA404 connects ACQ2106 to PCI-Express
RTM_T_Device.cpp
Go to the documentation of this file.
1 /*
2  * RTM_T_Device.cpp
3  *
4  * Created on: Apr 28, 2011
5  * Author: pgm
6  */
7 
8 using namespace std;
9 
10 #include <stdio.h>
11 #include <unistd.h>
12 #include <errno.h>
13 #include <stdlib.h>
14 #include <sys/mman.h>
15 #include <sys/types.h>
16 #include <sys/stat.h>
17 #include <sys/time.h>
18 #include <fcntl.h>
19 
20 #include "local.h"
21 #include "RTM_T_Device.h"
22 
23 
24 
25 
26 static unsigned calc_nbuffers(unsigned devnum);
27 static unsigned calc_maxlen(unsigned devnum);
28 static unsigned calc_transfer_buffers(unsigned devnum);
29 
31  devnum(_devnum%100), nbuffers(calc_nbuffers(devnum)),
32  maxlen(calc_maxlen(devnum)),
33  transfer_buffers(calc_transfer_buffers(devnum))
34 {
35  char buf[120];
36 
37  sprintf(buf, "/dev/rtm-t.%d", devnum);
38  names[MINOR_DMAREAD] = *new string(buf);
39  _open(MINOR_DMAREAD);
40 
41  sprintf(buf, "/dev/rtm-t.%d.regs", devnum);
42  names[MINOR_REGREAD] = * new string(buf);
43  _open(MINOR_REGREAD);
44 
45  for (int ib = 0; ib < nbuffers; ++ib){
46  sprintf(buf, "/dev/rtm-t.%d.data/hb%02d", devnum, ib);
47  names[ib] = buf;
48 
49  _open(ib);
50  void *va = mmap(0, maxlen, PROT_READ|PROT_WRITE,
51  MAP_SHARED, handles[ib], 0);
52 
53  if (va == (caddr_t)-1 ){
54  perror( "mmap" );
55  _exit(errno);
56  }else{
57  host_buffers[ib] = va;
58  }
59  }
60 
61  sprintf(buf, "/dev/rtm-t.%d.ctrl", devnum);
62  names[CTRL_ROOT] = * new string(buf);
63 }
64 
65 static int getKnob(const char* knob, unsigned* value)
66 {
67  FILE *fp = fopen(knob, "r");
68  if (!fp)
69  {
70  perror(knob);
71  return -1;
72  }
73  int rc = fscanf(fp, "%u", value);
74  fclose(fp);
75  return rc;
76 }
77 
78 #define PARAMETERS "/sys/module/afhba/parameters/"
79 #define BUFFER_LEN PARAMETERS "buffer_len"
80 #define NBUFFERS PARAMETERS "nbuffers"
81 #define TRANSFER_BUFFERS PARAMETERS "transfer_buffers"
82 
83 static unsigned calc_transfer_buffers(unsigned devnum)
84 {
85  unsigned transfer_buffers = 0;
86  if (getKnob(TRANSFER_BUFFERS, &transfer_buffers) != 1){
87  perror("getKnob " TRANSFER_BUFFERS " failed");
88  exit(1);
89  }
90  return transfer_buffers;
91 }
92 
93 static unsigned calc_nbuffers(unsigned devnum)
94 {
95  unsigned nbuffers = 0;
96  if (getKnob(NBUFFERS, &nbuffers) != 1){
97  perror("getKnob " NBUFFERS " failed");
98  exit(1);
99  }
100  return nbuffers;
101 }
102 static unsigned calc_maxlen(unsigned devnum)
103 {
104  char knob[80];
105  unsigned maxlen;
106  snprintf(knob, 80, "/dev/rtm-t.%u.ctrl/buffer_len", devnum);
107  if (getKnob(knob, &maxlen) == 1){
108  return maxlen;
109  }else if (getKnob(BUFFER_LEN, &maxlen) == 1){
110  return maxlen;
111  }else{
112  perror("maxlen not set");
113  exit(1);
114  }
115 }
116 
117 
RTM_T_Device::nbuffers
const unsigned nbuffers
Definition: RTM_T_Device.h:45
local.h
RTM_T_Device::RTM_T_Device
RTM_T_Device(int _devnum)
Definition: RTM_T_Device.cpp:30
MINOR_DMAREAD
#define MINOR_DMAREAD
Definition: afhba_minor.h:13
RTM_T_Device::maxlen
const unsigned maxlen
Definition: RTM_T_Device.h:46
NBUFFERS
#define NBUFFERS
Definition: RTM_T_Device.cpp:80
TRANSFER_BUFFERS
#define TRANSFER_BUFFERS
Definition: RTM_T_Device.cpp:81
ib
int ib
Definition: InlineDataHandlerMuxAO_LLC.cpp:57
transfer_buffers
int transfer_buffers
Definition: afhba_stream_drv.c:85
MINOR_REGREAD
#define MINOR_REGREAD
Definition: afhba_minor.h:14
RTM_T_Device::devnum
const unsigned devnum
Definition: RTM_T_Device.h:44
RTM_T_Device.h
nbuffers
int nbuffers
Definition: afhba_stream_drv.c:73
BUFFER_LEN
#define BUFFER_LEN
Definition: RTM_T_Device.cpp:79