/* --------------------------------------------------------------------------- * Functions mapping to VME using the NI VXI library * * Author : J.B.Lane UCL March 1998 vxi.c * --------------------------------------------------------------------------- */ #include "nivxi.h" /* NB define VXIsystem eg VXINT for the preprocessor */ #include "ask.h" /* prototypes */ INT16 ret; unsigned long _vmeWindow; unsigned short* vme_get_window (const int vme_size, const int vme_addr, const int mode) { /* 2 = A24 user data access, Motorola byte order */ /* 3 = A32 ditto */ const UINT16 vme_mode[] = { 3, 2 }; static int open_device = 1; unsigned int value; /* UINT32 */ INT32 timo = 1000L; /* 1 second timeout */ UINT16* memory_ptr = NULL; UINT32 windowbase; UINT32 windowend; if (open_device) { open_device = 0; ret = InitVXIlibrary (); if (ret > 0) printf ("InitVXIlibrary already initialized %d\n", ret); if (ret < 0) printf ("InitVXIlibrary error %d\n", ret); } /* 0x10000 bytes is default and max at UCL. Smaller allows more windows */ /* 0x1000 bytes is min at UCL. */ ret = MapVXIAddressSize (vme_size); if (ret != 0) printf ("VME window size error %d\n", ret); memory_ptr = (UINT16*) MapVXIAddress (vme_mode[mode], vme_addr, timo, &_vmeWindow, &ret); if (ret != 0) printf ("VME window create error %d\n", ret); if (ret < 0) memory_ptr = NULL; else /* Try to recognize an MXI bus fault (eg VXIinit or VXIedit required)... * D32 read should give VME bus error and data 0xFFFFFFFF on a D16 module * but TIM now responses to D32 */ { printf ("Checking VME access\n"); VXIpeek (memory_ptr, 4, &value); if ((value & 0xFF000000) != 0xFF000000) { printf ( "\nERROR: address %p value %x D32 read expected data FFxxxxxx\n", memory_ptr, value); printf ("Try running Resman\n\n"); } ret = GetWindowRange (_vmeWindow, &windowbase, &windowend); if (ret == 0) printf ("Base VME address = %lx, End VME address = %lx\n", windowbase, windowend); } printf (" mapped address = %p\n", memory_ptr); return memory_ptr; } void vme_end (void) { ret = UnMapVXIAddress (_vmeWindow); if (ret != 0) printf ("VXI address unmap error %d\n", ret); ret = CloseVXIlibrary (); if (ret != 0) printf ("VXI library close error %d\n", ret); printf ("VXI done.\n"); }