AlcapDAQ  1
bt617.c
Go to the documentation of this file.
1 // ****************************************************************************
2 // * Filename: bt617.c
3 // * Description: Midas MVME standard layer, Bit3/SBS 617/618/620
4 // * Created by: Nam Tran (nam at kuno-g.phys.sci.osaka-u.ac.jp)
5 // * Time tag: 2013-03-05 18:15:17
6 // ****************************************************************************
7 #ifdef __linux__
8 #ifndef OS_LINUX
9 #define OS_LINUX
10 #endif
11 #endif
12 
13 #ifdef OS_LINUX
14 #include "bt617.h"
15 #endif //OS_LINUX
16 
17 #define DEV_FILE "/dev/vmedrv" // default access mode 0x09 - A32, data D32
18 
19 int mvme_open(MVME_INTERFACE **vme, int idx)
20 {
21  *vme = (MVME_INTERFACE *) malloc(sizeof(MVME_INTERFACE));
22  if (*vme == NULL)
23  return MVME_NO_MEM;
24  memset(*vme, 0, sizeof(MVME_INTERFACE));
25 
26  int fd;
27  if ((fd = open(DEV_FILE, O_RDWR))<0)
28  {
29  perror("ERROR: fd open()");
30  exit(EXIT_FAILURE);
31  }
32 
33  (*vme)->handle = fd;
34  (*vme)->am = MVME_AM_A32_ND;
35  (*vme)->dmode = MVME_DMODE_D32;
36  (*vme)->initialized = 1;
37  bt617_SetAccessMode(*vme);
38 
39  (*vme)->blt_mode = MVME_BLT_NONE;
40  (*vme)->table = NULL;
41 
42  return MVME_SUCCESS;
43 }
44 
46 {
47  close(vme->handle);
48  return MVME_SUCCESS;
49 }
50 
52 {
53  printf("mvme properties:\n");
54  printf("init: %d\n",vme->initialized);
55  printf("handl: %d\n",vme->handle);
56  printf("index: %d\n",vme->index);
57  printf("am: %X\n",vme->am);
58  printf("dw: %d\n",vme->dmode);
59 }
60 
62 {
63  int dmode = vme->dmode;
64  int am = vme->am;
65  int enum_am, enum_dm;
66  switch (am)
67  {
68  case MVME_AM_A32_ND:
69  enum_am = 0;
70  break;
71  case MVME_AM_A24_ND:
72  enum_am = 1;
73  break;
74  case MVME_AM_A16_ND:
75  enum_am = 2;
76  break;
77  default:
78  enum_am = 0;
79  break;
80  }
81 
82  switch (dmode)
83  {
84  case MVME_DMODE_D32:
85  enum_dm = 0;
86  break;
87  case MVME_DMODE_D16:
88  enum_dm = 1;
89  break;
90  default:
91  enum_dm = 0;
92  break;
93  }
94 
95  static vmedrv_access_mode_t access_mode_tab[3][2] = {
99  };
100  return access_mode_tab[enum_am][enum_dm];
101 }
102 
104 {
106  ioctl(vme->handle,VMEDRV_IOC_SET_ACCESS_MODE,&amode);
107 }
108 
109 int mvme_set_am(MVME_INTERFACE *vme, int am)
110 {
111  vme->am = am;
112  bt617_SetAccessMode(vme);
113  return 0;
114 }
115 
116 int mvme_get_am(MVME_INTERFACE *vme, int *am)
117 {
118  *am = vme->am;
119  return 0;
120 }
121 
123 {
124  vme->dmode = dm;
125  bt617_SetAccessMode(vme);
126  return 0;
127 }
128 
129 int mvme_set_blt(MVME_INTERFACE *vme, int mode)
130 {
131  vme->blt_mode = mode;
132  if (mode == MVME_BLT_NONE)
133  {
134  bt617_SetBLT(vme, false);
135  }
136  else
137  {
138  bt617_SetBLT(vme, true);
139  }
140  return 0;
141 }
142 
143 int mvme_get_blt(MVME_INTERFACE *vme, int *mode)
144 {
145  *mode = vme->blt_mode;
146  return 0;
147 }
148 
149 int mvme_get_dmode(MVME_INTERFACE *vme, int *dm)
150 {
151  *dm = vme->dmode;
152  return 0;
153 }
154 
155 int mvme_read(MVME_INTERFACE *vme, void *dst,
156  mvme_addr_t vme_addr, mvme_size_t n_bytes)
157 {
158  int read_size;
159  if(lseek(vme->handle,vme_addr,SEEK_SET) == -1)
160  {
161  printf("lseek err\n");
162  return -1;
163  }
164  read_size = read(vme->handle,dst,n_bytes);
165 
166  if (read_size < 0)
167  {
168  printf("read err\n");
169  return -1;
170  }
171  else
172  return read_size;
173 }
174 
175 int mvme_write(MVME_INTERFACE *vme, mvme_addr_t vme_addr, void *src, mvme_size_t n_bytes)
176 {
177  int write_size;
178  if(lseek(vme->handle,vme_addr,SEEK_SET) == -1)
179  {
180  printf("lseek err\n");
181  return -1;
182  }
183  write_size = write(vme->handle,src,n_bytes);
184  if (write_size < 0)
185  {
186  printf("write err\n");
187  return -1;
188  }
189  else
190  return write_size;
191 }
192 
193 unsigned int mvme_read_value(MVME_INTERFACE *vme, mvme_addr_t vme_addr)
194 {
195  int read_size,nbytes;
196  unsigned int value;
197  switch (vme->dmode)
198  {
199  case MVME_DMODE_D32:
200  nbytes = 4;
201  break;
202  case MVME_DMODE_D16:
203  nbytes = 2;
204  break;
205  default:
206  nbytes = 4;
207  break;
208  }
209  read_size = mvme_read(vme,&value,vme_addr,nbytes);
210  return value;
211 }
212 
213 int mvme_write_value(MVME_INTERFACE *vme, mvme_addr_t vme_addr, unsigned int value)
214 {
215  int write_size,nbytes;
216  switch (vme->dmode)
217  {
218  case MVME_DMODE_D32:
219  nbytes = 4;
220  break;
221  case MVME_DMODE_D16:
222  nbytes = 2;
223  break;
224  default:
225  nbytes = 4;
226  break;
227  }
228  write_size = mvme_write(vme,vme_addr,&value,nbytes);
229  if (write_size < 0)
230  {
231  printf("write_value err \n");
232  return -1;
233  }
234  else
235  return 0;
236 }
237 
238 void showbits(uint32_t data)
239 {
240  int ii;
241  for (ii=31;ii>=28;ii--)
242  (data&(1<<ii))?putchar('1'):putchar('0');
243  putchar(' ');
244 
245  for (ii=27;ii>=24;ii--)
246  (data&(1<<ii))?putchar('1'):putchar('0');
247  putchar(' ');
248 
249  for (ii=23;ii>=20;ii--)
250  (data&(1<<ii))?putchar('1'):putchar('0');
251  putchar(' ');
252 
253  for (ii=19;ii>=16;ii--)
254  (data&(1<<ii))?putchar('1'):putchar('0');
255  putchar(' ');
256 
257  for (ii=15;ii>=12;ii--)
258  (data&(1<<ii))?putchar('1'):putchar('0');
259  putchar(' ');
260 
261  for (ii=11;ii>=8;ii--)
262  (data&(1<<ii))?putchar('1'):putchar('0');
263  putchar(' ');
264 
265  for (ii=7;ii>=4;ii--)
266  (data&(1<<ii))?putchar('1'):putchar('0');
267  putchar(' ');
268 
269  for (ii=3;ii>=0;ii--)
270  (data&(1<<ii))?putchar('1'):putchar('0');
271  putchar('\n');
272 }
273 
274 void bt617_SetBLT(MVME_INTERFACE *vme, bool blt)
275 {
276  if (blt)
277  {
278  int transfer_method = VMEDRV_DMA;
279  ioctl(vme->handle, VMEDRV_IOC_SET_TRANSFER_METHOD, &transfer_method);
280  }
281  else
282  {
283  int transfer_method = VMEDRV_PIO;
284  ioctl(vme->handle, VMEDRV_IOC_SET_TRANSFER_METHOD, &transfer_method);
285 
286  }
287 }
288 //#define TEST_INTERFACE
289 #ifdef TEST_INTERFACE
290 #define V1290N_BASE 0x0040000
291 #define RPV130_BASE 0x8000
292 #include "rpv130.h"
293 
294 int main()
295 {
296  printf("Main: \n");
298  mvme_open(&myvme, 0);
299  //show_mvme(myvme);
300 
301  // RPV130, A16 only
302  myvme->am = MVME_AM_A16_ND;
303  myvme->dmode = MVME_DMODE_D16;
304  bt617_SetAccessMode(myvme);
305  //show_mvme(myvme);
306  unsigned short int reg;
308  printf("CSR1: %X \n",reg);
309 
310  reg = 0x3;
311  mvme_write_value(myvme,RPV130_BASE + RPV130_CSR_1,0x3); // reset busy flag
313  printf("CSR1: %X \n",reg);
314 
315  sleep(1);
316  mvme_write_value(myvme, RPV130_BASE + RPV130_PULSE,0x1); // pulse to set busy
318  printf("CSR1: %X \n",reg);
319 
320  // Finish
321  mvme_close(myvme);
322  return 0;
323 }
324 #endif
325