Subversion Repositories f9daq

Rev

Rev 124 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
100 f9daq 1
#include <stdlib.h>
2
#include <stdio.h>
135 f9daq 3
#include "wienvme_dll.h"
100 f9daq 4
 
5
#ifdef _CVI_
78 f9daq 6
#include <utility.h>
100 f9daq 7
#endif
78 f9daq 8
 
100 f9daq 9
#ifdef LINUX
10
#include <dlfcn.h>
11
#define LoadLibrary(x) dlopen( (x), RTLD_NOW );
12
#define GetProcAddress(x,y) dlsym((x),(y))
124 f9daq 13
static int  GetCurrentPlatform(void ) {
14
  return 0;
15
};
100 f9daq 16
#define __stdcall
17
#define UCHAR unsigned char
18
#define HINSTANCE void *
19
#define  _VI_FUNC
20
#include <stdlib.h>
21
#include <stdio.h>
22
#include <stdint.h>
23
#include <string.h>
24
#endif
25
 
78 f9daq 26
//----------- DEFINES -----------------------------------------------------
124 f9daq 27
#define DEVICENAME_LINUX "/dev/pcivme_0"     // a device name 'template' for LINUX
78 f9daq 28
#define DEVICENAME_NT "\\\\.\\PCIVME:\\VMEMMxx"     // a device name 'template' for WINNT
29
#define DEVICENAME_9X "\\\\.\\C:\\windows\\system\\VWIENVMED.vxd" // the same for WIN95/98
30
#define MODULE_NUMBER     1 // number of connected CC32 module
31
 
32
#define VMEinit (*vme_init)
33
static int VMEinit (const char*, unsigned short, unsigned char, int*);
34
#define VMEread (*vme_read)
35
static int VMEread (int, unsigned long, unsigned char, unsigned long, void*);
36
#define VMEwrite (*vme_write)
37
static int VMEwrite (int, unsigned long, unsigned char, unsigned long, void*);
38
#define VMEreset (*vme_reset)
39
static int VMEreset (int);
40
#define VMEclose (*vme_close)
41
static int VMEclose (int);
42
 
124 f9daq 43
int hHandle24, hHandle32;
78 f9daq 44
int VMEmodule;
45
 
100 f9daq 46
static HINSTANCE DLLHandle;
124 f9daq 47
void WIENVME_load (char* module_path) {
48
  /*
49
   int stat;
50
 
51
   if (module_path == NULL)
52
     VMEmodule = LoadExternalModule
53
       ("c:\\home\\CVI\\instr\\WIENVME_DLL\\pcivme_ni.lib");
54
    else
55
     VMEmodule = LoadExternalModule (module_path);
56
 
57
   vme_init = GetExternalModuleAddr (VMEmodule, "VMEinit", &stat);
58
   vme_read = GetExternalModuleAddr (VMEmodule, "VMEread", &stat);
59
   vme_write = GetExternalModuleAddr (VMEmodule, "VMEwrite", &stat);
60
   vme_reset = GetExternalModuleAddr (VMEmodule, "VMEreset", &stat);
61
   vme_close = GetExternalModuleAddr (VMEmodule, "VMEclose", &stat);
62
  */
100 f9daq 63
  if (module_path == NULL) {
64
    DLLHandle = LoadLibrary("c:\\home\\CVI\\instr\\WIENVME_DLL\\pcivme_ni.lib");
65
  } else {
66
    DLLHandle = LoadLibrary(module_path);
67
  }
68
  if (!DLLHandle) {
124 f9daq 69
    printf ("\n\nFailed to Open libxxusb.dll  \n");
70
    return;
100 f9daq 71
  }
124 f9daq 72
 
100 f9daq 73
  vme_init = (void *) GetProcAddress (DLLHandle , "VMEinit");
74
  vme_read = (void *) GetProcAddress (DLLHandle , "VMEread");
75
  vme_write =(void *) GetProcAddress (DLLHandle , "VMEwrite");
76
  vme_reset =(void *) GetProcAddress (DLLHandle , "VMEreset");
77
  vme_close =(void *) GetProcAddress (DLLHandle , "VMEclose");
78 f9daq 78
 
79
  return;
80
}
81
 
82
int WIENVME_open (int* hHandle, unsigned char AddMod, char* device_name,
124 f9daq 83
                  unsigned short module_number) {
84
  int result;
78 f9daq 85
 
124 f9daq 86
  /* open a path to a device. */
78 f9daq 87
  if (device_name == NULL)
124 f9daq 88
    switch (GetCurrentPlatform ()) {
89
      case 0:
100 f9daq 90
        device_name = DEVICENAME_LINUX;
124 f9daq 91
        break;
92
      case 2:
78 f9daq 93
        device_name = DEVICENAME_9X;
124 f9daq 94
        break;
95
      case 3:
78 f9daq 96
        device_name = DEVICENAME_NT;
124 f9daq 97
        break;
98
      default:
99
        break;
100
    }
78 f9daq 101
  result = VMEinit(device_name, module_number, AddMod, hHandle);
102
  if (result) {
103
    printf("Can't open interface \"%s\" to VMEMM-module \"%d\"!\n", DEVICENAME_NT, MODULE_NUMBER);
104
  }
105
  return(result);
106
}
107
 
124 f9daq 108
int WIENVME_open24 (void) {
78 f9daq 109
  return (WIENVME_open (&hHandle24, Std_NoPriv_Data, NULL, 1));
110
}
111
 
124 f9daq 112
int WIENVME_open32 (void) {
78 f9daq 113
  return (WIENVME_open (&hHandle32, Ext_NoPriv_Data, NULL, 1));
114
}
115
 
124 f9daq 116
int WIENVME_start (char* module_path) {
78 f9daq 117
  WIENVME_load(module_path);
118
  WIENVME_open24();
119
  WIENVME_open32();
124 f9daq 120
 
78 f9daq 121
  return 0;
122
}
123
 
124 f9daq 124
void WIENVME_unload () {
100 f9daq 125
  //UnloadExternalModule (VMEmodule);
78 f9daq 126
  return;
127
}
128
 
124 f9daq 129
int WIENVME_close (int hHandle) {
78 f9daq 130
  int result;
131
 
124 f9daq 132
  /* close the opened path */
78 f9daq 133
  printf("hHandle %d\n",hHandle);
124 f9daq 134
 
135
  result = VMEclose(hHandle);
78 f9daq 136
  if (result) {
137
    printf("Can't close interface!\n");
138
  }
139
  return (result);
140
}
141
 
124 f9daq 142
int WIENVME_close24 () {
78 f9daq 143
  return (WIENVME_close (hHandle24));
144
}
145
 
124 f9daq 146
int WIENVME_close32 () {
78 f9daq 147
  return (WIENVME_close (hHandle32));
148
}
149
 
124 f9daq 150
int WIENVME_stop () {
78 f9daq 151
  WIENVME_close24();
152
  WIENVME_close32();
153
  WIENVME_unload();
124 f9daq 154
 
78 f9daq 155
  return 0;
156
}
157
 
124 f9daq 158
int WIENVME_reset () {
78 f9daq 159
  int result;
160
 
124 f9daq 161
  /* close the opened path */
162
  result = VMEreset(hHandle24);
78 f9daq 163
  if (result) {
164
    printf("Can't reset interface!\n");
165
  }
166
  return (result);
167
}
168
 
124 f9daq 169
int WIENVME_read8 (int hHandle, unsigned long n, unsigned long at, void* buff) {
78 f9daq 170
  int result;
171
 
124 f9daq 172
  /* D8 read */
78 f9daq 173
  result = VMEread(hHandle, at, 1, n, buff);
174
  if (result) {
100 f9daq 175
    printf("D8 read at 0x%lX failed!\n", at);
78 f9daq 176
  }
177
//  printf("0x%X, 0x%X, 0x%X, 0x%X\n", hHandle, at, n, * (unsigned short *) buff);
178
  return (result);
179
}
180
 
124 f9daq 181
int WIENVME_read16 (int hHandle, unsigned long n, unsigned long at, void* buff) {
78 f9daq 182
  int result;
183
 
124 f9daq 184
  /* D16 read */
78 f9daq 185
  result = VMEread(hHandle, at, 2, n, buff);
186
  if (result) {
100 f9daq 187
    printf("D16 read at 0x%lX failed!\n", at);
78 f9daq 188
  }
189
//  printf("0x%X, 0x%X, 0x%X, 0x%X\n", hHandle, at, n, * (unsigned short *) buff);
190
  return (result);
191
}
192
 
124 f9daq 193
int WIENVME_read32 (int hHandle, unsigned long n, unsigned long at, void* buff) {
78 f9daq 194
  int result;
195
 
124 f9daq 196
  /* D32 read */
78 f9daq 197
  result = VMEread(hHandle, at, 4, n, buff);
198
  if (result) {
100 f9daq 199
    printf("D32 read at 0x%lX failed!\n", at);
78 f9daq 200
  }
201
  //printf("0x%X, 0x%X, 0x%X, 0x%X\n", hHandle, at, n, * (unsigned short *) buff);
202
  return (result);
203
}
204
 
124 f9daq 205
int WIENVME_write8 (int hHandle, unsigned long n, unsigned long at, void* buff) {
78 f9daq 206
  int result;
207
 
124 f9daq 208
  /* D8 write */
78 f9daq 209
  result = VMEwrite(hHandle, at, 1, n, buff);
210
  if (result) {
100 f9daq 211
    printf("D8 write at 0x%lX failed!\n", at);
78 f9daq 212
  }
213
  return (result);
214
}
215
 
124 f9daq 216
int WIENVME_write16 (int hHandle, unsigned long n, unsigned long at, void* buff) {
78 f9daq 217
  int result;
218
 
124 f9daq 219
  /* D16 write */
78 f9daq 220
  result = VMEwrite(hHandle, at, 2, n, buff);
221
  if (result) {
100 f9daq 222
    printf("D16 write at 0x%lX failed!\n", at);
78 f9daq 223
  }
224
  return (result);
225
}
226
 
124 f9daq 227
int WIENVME_write32 (int hHandle, unsigned long n, unsigned long at, void* buff) {
78 f9daq 228
  int result;
229
 
124 f9daq 230
  /* D32 write */
78 f9daq 231
  result = VMEwrite(hHandle, at, 4, n, buff);
232
  if (result) {
100 f9daq 233
    printf("D32 write at 0x%lX failed!\n", at);
78 f9daq 234
  }
235
  //printf("D32 write at 0x%X buff=0x%X\n", at,((int*) buff)[0]);
236
  return (result);
237
}
238
 
239
 
240
#ifndef VME_D32
241
 
242
#define VME_D8  0x1
243
#define VME_D16 0x2
244
#define VME_D32 0x4
245
#endif
246
 
124 f9daq 247
short __stdcall WIENVME_VME_R( uint16_t AM, uint16_t DW,  uint32_t VME_Address, uint32_t *Data) {
248
  int hHandle=0, nb=0;
249
  switch (AM) {
250
    case Ext_NoPriv_Data:
251
      hHandle = hHandle32;
252
      break;
253
    case Std_NoPriv_Data:
254
      hHandle = hHandle24;
255
      break;
256
    default :
257
      return 0;
258
  }
78 f9daq 259
 
260
 
124 f9daq 261
  switch (DW) {
262
    case VME_D16:
263
      nb=  WIENVME_read16 (hHandle, 1, (unsigned long) VME_Address, (void*) Data)  ;
264
      break;
265
    case VME_D32:
266
      nb=  WIENVME_read32 (hHandle, 1, (unsigned long) VME_Address, (void*) Data)  ;
267
      break;
78 f9daq 268
 
124 f9daq 269
    default:
270
      return 0;
271
  }
135 f9daq 272
  return (short)nb;
124 f9daq 273
}
78 f9daq 274
 
124 f9daq 275
short __stdcall WIENVME_VME_W( uint16_t AM, uint16_t DW, uint32_t VME_Address, uint32_t Data) {
276
  int hHandle=0, nb=0;
277
  switch (AM) {
278
    case Ext_NoPriv_Data:
279
      hHandle = hHandle32;
280
      break;
281
    case Std_NoPriv_Data:
282
      hHandle = hHandle24;
283
      break;
284
    default :
285
      return 0;
286
  }
78 f9daq 287
 
288
 
124 f9daq 289
  switch (DW) {
290
    case VME_D16:
291
      nb=  WIENVME_write16 (hHandle, 1, (unsigned long) VME_Address, (void*) &Data)  ;
292
      break;
293
    case VME_D32:
294
      nb=  WIENVME_write32 (hHandle, 1, (unsigned long) VME_Address, (void*) &Data)  ;
295
      break;
78 f9daq 296
 
124 f9daq 297
    default:
298
      return 0;
299
  }
135 f9daq 300
  return (short)nb;
124 f9daq 301
}
78 f9daq 302
 
124 f9daq 303
short __stdcall WIENVME_VME_MW( uint16_t AM, uint16_t DW, uint32_t VME_Address, uint32_t Data) {
78 f9daq 304
 
124 f9daq 305
  return WIENVME_VME_W( AM, DW, VME_Address, Data);
306
}
307
short __stdcall WIENVME_VME_MWRST( void ) {
78 f9daq 308
 
309
 
124 f9daq 310
  return 0;
311
}
312
short __stdcall WIENVME_VME_MWEXEC( void ) {
313
 
314
 
315
  return 0;
316
}
317
 
318
short __stdcall WIENVME_VME_MR( uint16_t AM, uint16_t DW, uint32_t VME_Address, uint32_t *Data) {
319
 
320
 
321
  return WIENVME_VME_R( AM, DW, VME_Address, Data);
322
}
323
short __stdcall WIENVME_VME_MRRST( void ) {
324
 
325
 
326
  return 0;
327
}
328
short __stdcall WIENVME_VME_MREXEC(  uint32_t *Data  ) {
329
 
330
 
331
  return 0;
332
}