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