/****************************************************************************** * * Title : vmeHpiUtility.c * Version 0.0 * * Description: Routines for VME and HPI access. * * Changes: March 7, 2002 - HPI access only D32 * * Author: Lukas Tomasek, tomasekl@fzu.cz * ******************************************************************************/ /****************************************************************************** * Header files * ******************************************************************************/ #include #include "errorHandler.h" #include "vmeHpiUtility.h" #include "threadUtility.h" #include "globalDefinitions.h" #include "vmeAddressMap.h" #include "hostUtility.h" #include /****************************************************************************** * Definitions * ******************************************************************************/ /****************************************************************************** * Static Function Declarations * ******************************************************************************/ static char *getNiVxiStatus(int status); /****************************************************************************** * Global functions * ******************************************************************************/ /*============================================================================= * RWvmeBlock() *============================================================================= * * NOTE: Must be protected by criticalSection to prevent from simultaneous multiple * access to shared VME from more threads (pause+abort bits are sent to * vmeCommandReg directly from UserInterface, not from CommunicationLoop)!! * * - buffer - local address space; * - noVmeAddressIncrement - constants defined in vmeHpiUtility.h (VME_ADDR_AUTOINCREMENT=0, NO_VME_ADDR_INCREMENT=1); * - noBlockAccess - * - writeNotRead - READ or WRITE constants defined in vmeHpiUtility.h (READ=0, WRITE=1) * */ ERROR_ID RWvmeBlock(int writeNotRead, UINT32 vmeAddr, UINT32 *buffer, UINT32 numberOfElements, UINT16 elementSizeInBytes, int noVmeAddressIncrement, int noBlockAccess, int vmeDma){ int status; char errorMessage[500]; ERROR_ID errorId=SUCCESS; int threadPriority; HANDLE threadHandle; UINT16 vmeAccessParams; UINT32 i; UINT32 relAddr; ENTER_CRITICAL_SECTION(&global.vmeAccessCriticalSection); if(noBlockAccess){ /* no block VME access - i.e. element by element R/W */ for(i=0, relAddr=0; i1)){ /* for write repeat last word to HPID */ errorId=RWmaster(writeNotRead, slotNumber, SLAVE_HPI_BASE_ADDR(slaveNumber)+SLAVE_HPID_OFFSET, buffer+wordCountTemp, 1, NO_HPIA_AUTOINCREMENT, 0); if(errorId!=SUCCESS) { sprintf(errorMessage, "FATAL HPI ERROR: Slave HPID(writeNotRead=%d) - not successful", writeNotRead); programError(__FILE__, __LINE__, FATAL_ERROR, "RWmaster()", errorId, errorMessage); status=dmaAccessSwitch(slotNumber, OFF, 0.0); ERROR_CHECK(status, dmaAccessSwitch(OFF) Error!!); LEAVE_CRITICAL_SECTION(&global.vmeAccessCriticalSection); return(FATAL_ERROR); } } /* check HPIA after transfer */ errorId=RWmaster(READ, slotNumber, slaveHpiaAddr, &hpiaData, 1, NO_HPIA_AUTOINCREMENT, 0); ERROR_CHECK(errorId, RWmaster()); if(errorId!=SUCCESS) { status=dmaAccessSwitch(slotNumber, OFF, 0.0); ERROR_CHECK(status, dmaAccessSwitch(OFF) Error!!); LEAVE_CRITICAL_SECTION(&global.vmeAccessCriticalSection); return(errorId); } if(wordCount==1){ endAddr=dspAddr; }else{ endAddr=dspAddr+wordCount*4; if(writeNotRead) endAddr-=4; /* write */ } if(hpiaData!=endAddr){ errorId=FATAL_ERROR; printf("error\n"); sprintf(errorMessage,"RWslave() - hpiaStart=0x%X, hpiaStop=0x%X, wordCount=0x%X.",dspAddr, hpiaData, wordCount); programError(__FILE__, __LINE__, errorId, "RWslave()", errorId, errorMessage); } /* turn master-slave communication ON */ status=dmaAccessSwitch(slotNumber, OFF, 0.0); ERROR_CHECK(status, dmaAccessSwitch(OFF) Error!!); LEAVE_CRITICAL_SECTION(&global.vmeAccessCriticalSection); return(errorId); } /*============================================================================= * setHpicMaster() *============================================================================= * * Init value for MasterDSP HPIC register - INTEL byte order * */ ERROR_ID setHpicMaster(UINT8 slotNumber){ const UINT32 hpicVmeAddr=BASE_ADDRESS(slotNumber)+HPIC_REL_ADDR; UINT32 hpic; UINT32 data; ERROR_ID errorId; UINT16 value; /* set little endian */ hpic=0x00010001; errorId=vmeWriteElement(hpic, hpicVmeAddr, sizeof(UINT32)); ERROR_CHECK(errorId, vmeWriteElement()); return(errorId); } /*============================================================================= * setHpicSlave() *============================================================================= * * Init value for SlaveDSP HPIC register - INTEL byte order * */ ERROR_ID setHpicSlave(UINT8 slotNumber, UINT8 slaveNumber){ const UINT32 hpicMasterAddr=SLAVE_HPI_BASE_ADDR(slaveNumber)+SLAVE_HPIC_OFFSET; UINT32 hpic; UINT32 data; ERROR_ID errorId; /* set little endian */ hpic=0x00010001; errorId=RWmaster(WRITE, slotNumber, hpicMasterAddr, &hpic, 1, NO_HPIA_AUTOINCREMENT, 0); ERROR_CHECK(errorId, RWmaster()); return(errorId); } /****************************************************************************** * Static functions * ******************************************************************************/ /*============================================================================= * getNiVxiStatus() *============================================================================= * * * */ static char *getNiVxiStatus(int status){ static char errorMessage[100]; switch(status){ case 0: strcpy(errorMessage, "Successful"); break; case -1: strcpy(errorMessage, "Bus Error occurred"); break; case -2: strcpy(errorMessage, "Invalid Access Parameters"); break; case -3: strcpy(errorMessage, "Invalid Address Offset"); break; case -4: strcpy(errorMessage, "Invalid Value Size"); break; case -5: strcpy(errorMessage, "Byte order not supported"); break; case -6: strcpy(errorMessage, "Address not accessible with this hardware"); break; case -7: strcpy(errorMessage, "Privilege not supported"); break; case -8: strcpy(errorMessage, "Timeout, DMA aborted"); break; case -9: strcpy(errorMessage, "Element Size not supported"); break; default: strcpy(errorMessage, "Non known VME/VXI error!"); break; } return(errorMessage); } /******************************************************************************/