/****************************************************************************** * * Title : commandFunc_readWriteFpgaFlash.c * Version 0.0 * * Description: Reads/writes data from/to fpga flashes. * Related files: * * Author: Lukas Tomasek, tomasekl@fzu.cz * ******************************************************************************/ /****************************************************************************** * Header files * ******************************************************************************/ #include #include #include "commandListDefinitions.h" #include "commandFunc_readWriteFpgaFlash.h" #include "commandParamsUir.h" #include "globalDefinitions.h" #include "uirUtility.h" #include "mainUir.h" #include "vmeHpiUtility.h" #include "commandStatusMessage.h" #include "flashUtility.h" #include "threadUtility.h" #include "RWlists.h" /****************************************************************************** * Global functions * ******************************************************************************/ /*============================================================================= * commandFunction_readWriteFpgaFlash() *============================================================================= * * Changes: vmeCriticalSection included (not necessary) * */ ERROR_ID commandFunction_readWriteFpgaFlash(COMMAND_FUNC_OPTION funcOption, struct COMMAND *command, UINT8 slotNumber, FILE *file){ struct HOST *host; const int panel=global.panel.commandEdit[RW_FPGA_FLASH_ID]; struct RW_FPGA_FLASH_PARAMS *RWFpgaFlash=&command->params.readWriteFpgaFlash; int status; ERROR_ID errorId=SUCCESS; unsigned int fileSize; UINT8 *buffer; char subdir[PATHNAME_LENGTH]; int sector, endSector; UINT32 flashBottomRelAddress; UINT32 sourceVmeAddr; UINT32 fpgaStatusReg6; int newFlashLoc; switch(funcOption){ case COMMAND_TO_LIST: GetCtrlVal(panel, RW_FPGAF_READ_NOT_WRITE, &RWFpgaFlash->readNotWrite); GetCtrlVal(panel, RW_FPGAF_START_ADDRESS, &RWFpgaFlash->startAddress); GetCtrlVal(panel, RW_FPGAF_SIZE, &RWFpgaFlash->size); if(RWFpgaFlash->size==0) { status = MessagePopup ("WARNING", "DataSize==0!!"); UIR_STATUS_CHECK(status, MessagePopup()); return(PROGRAM_WARNING); } if(RWFpgaFlash->readNotWrite==0){ /* write */ GetCtrlVal(panel, RW_FPGAF_INP_FILE, RWFpgaFlash->dataFileName); if(RWFpgaFlash->dataFileName[0]==0) { status = MessagePopup ("WARNING", "No InputDataFile selected!!"); UIR_STATUS_CHECK(status, MessagePopup()); return(PROGRAM_WARNING); } }else{ /* read */ GetCtrlVal(panel, RW_FPGAF_OUT_FILE, RWFpgaFlash->dataFileName); if(RWFpgaFlash->dataFileName[0]==0) { status = MessagePopup ("WARNING", "No OutputDataFile selected!!"); UIR_STATUS_CHECK(status, MessagePopup()); return(PROGRAM_WARNING); } } break; case LIST_TO_COMMAND: SetCtrlVal(panel, RW_FPGAF_READ_NOT_WRITE, RWFpgaFlash->readNotWrite); SetCtrlVal(panel, RW_FPGAF_START_ADDRESS, RWFpgaFlash->startAddress); SetCtrlVal(panel, RW_FPGAF_SIZE, RWFpgaFlash->size); if(RWFpgaFlash->readNotWrite==0){ /* write */ SetCtrlVal(panel, RW_FPGAF_INP_FILE, RWFpgaFlash->dataFileName); status=SetCtrlAttribute(panel, RW_FPGAF_SIZE, ATTR_CTRL_MODE, VAL_INDICATOR); UIR_STATUS_CHECK(status, SetCtrlAttribute()); status=SetCtrlAttribute(panel, RW_FPGAF_SIZE, ATTR_FRAME_COLOR, VAL_LT_GRAY); UIR_STATUS_CHECK(status, SetCtrlAttribute()); status=SetInputMode(panel, RW_FPGAF_OUT_FILE, 0); UIR_STATUS_CHECK(status, SetInputMode()); SetCtrlVal(panel, RW_FPGAF_OUT_FILE, 0); status=SetInputMode(panel, RW_FPGAF_INP_FILE, 1); UIR_STATUS_CHECK(status, SetInputMode()); }else{ /* read */ SetCtrlVal(panel, RW_FPGAF_OUT_FILE, RWFpgaFlash->dataFileName); status=SetCtrlAttribute(panel, RW_FPGAF_SIZE, ATTR_FRAME_COLOR, 0xCC9966); UIR_STATUS_CHECK(status, SetCtrlAttribute()); status=SetCtrlAttribute(panel, RW_FPGAF_SIZE, ATTR_CTRL_MODE, VAL_NORMAL); UIR_STATUS_CHECK(status, SetCtrlAttribute()); status=SetInputMode(panel, RW_FPGAF_INP_FILE, 0); UIR_STATUS_CHECK(status, SetInputMode()); SetCtrlVal(panel, RW_FPGAF_INP_FILE, 0); status=SetInputMode(panel, RW_FPGAF_OUT_FILE, 1); UIR_STATUS_CHECK(status, SetInputMode()); } break; case COMMAND_EXECUTION: host=global.host[HOST_INDEX(slotNumber)]; /* read revision */ errorId=RWvmeBlock(READ, BASE_ADDRESS(host->slotNumber)+FPGA_STATUS_6_REL_ADDR, &fpgaStatusReg6, 1, sizeof(UINT32), VME_ADDR_AUTOINCREMENT, BLOCK_ACCESS, 0); ERROR_CHECK(errorId, RWvmeBlock(READ)); if(errorId!=SUCCESS) { return(-1); } //dpsf: modify to handle both Revision E & F RODs if ( (((fpgaStatusReg6 & 0xFF0000) >> 16) == 0xE) ||(((fpgaStatusReg6 & 0xFF0000) >> 16) == 0xF) ) newFlashLoc= 1; else newFlashLoc= 0; ENTER_CRITICAL_SECTION(&global.vmeAccessCriticalSection); /* test - not necessary!! */ if(RWFpgaFlash->readNotWrite){ buffer= malloc(RWFpgaFlash->size); if(buffer == NULL){ HOST_ERROR_CHECK(PROGRAM_ERROR, host, malloc()); LEAVE_CRITICAL_SECTION(&global.vmeAccessCriticalSection); return(COMMAND_ERROR); } errorId= readBlockFromFlash(host->slotNumber, RWFpgaFlash->startAddress, buffer, RWFpgaFlash->size, newFlashLoc); ERROR_CHECK(errorId, readBlockFromFlash()); if(RWFpgaFlash->dataFileName[0]!=0){ strcpy(subdir, host->dataDir); strcat(subdir, RWFpgaFlash->dataFileName); errorId= writeToBinFile(subdir, 0, buffer, RWFpgaFlash->size); HOST_ERROR_CHECK(errorId, host, writeToBinFile()); if(errorId != SUCCESS){ free(buffer); LEAVE_CRITICAL_SECTION(&global.vmeAccessCriticalSection); return(COMMAND_ERROR); } } }else{ /* write */ errorId= getFileSize(RWFpgaFlash->dataFileName, &fileSize); ERROR_CHECK(errorId, getFileSize()); if(errorId != SUCCESS){ LEAVE_CRITICAL_SECTION(&global.vmeAccessCriticalSection); return(errorId); } if(fileSize != RWFpgaFlash->size){ ERROR_CHECK(PROGRAM_ERROR, Wrong file size (file size has been changed)!); LEAVE_CRITICAL_SECTION(&global.vmeAccessCriticalSection); return(PROGRAM_ERROR); } buffer= malloc(RWFpgaFlash->size); if(buffer == NULL){ HOST_ERROR_CHECK(PROGRAM_ERROR, host, malloc()); LEAVE_CRITICAL_SECTION(&global.vmeAccessCriticalSection); return(COMMAND_ERROR); } errorId= readFromBinFile(RWFpgaFlash->dataFileName, buffer, RWFpgaFlash->size); HOST_ERROR_CHECK(errorId, host, readFromBinFile()); if(errorId != SUCCESS){ free(buffer); LEAVE_CRITICAL_SECTION(&global.vmeAccessCriticalSection); return(COMMAND_ERROR); } /* write data */ errorId= writeBlockToFlash(host->slotNumber, RWFpgaFlash->startAddress, buffer, RWFpgaFlash->size, newFlashLoc); ERROR_CHECK(errorId, writeBlockToFlash()); if(errorId != SUCCESS){ free(buffer); LEAVE_CRITICAL_SECTION(&global.vmeAccessCriticalSection); return(COMMAND_ERROR); } } free(buffer); /* !!! */ LEAVE_CRITICAL_SECTION(&global.vmeAccessCriticalSection); break; case SAVE_CMD_TO_FILE: fprintf(file, "readNotWrite= %d, startAddress= 0x%X, size= 0x%X\n", RWFpgaFlash->readNotWrite, RWFpgaFlash->startAddress, RWFpgaFlash->size); fprintf(file, "dataFileName[]= %s\n", RWFpgaFlash->dataFileName); break; case LOAD_CMD_FROM_FILE: status=fscanf(file, "readNotWrite= %d, startAddress= 0x%X, size= 0x%X\n", &RWFpgaFlash->readNotWrite, &RWFpgaFlash->startAddress, &RWFpgaFlash->size); if(status==-1) {ERROR_CHECK(FATAL_ERROR, Read from cmd file error!); return(FATAL_ERROR);} status=readLineFromIndex(file, strlen("dataFileName[]= "), PATHNAME_LENGTH, RWFpgaFlash->dataFileName); if(status!=0) {ERROR_CHECK(FATAL_ERROR, Read from cmd file error!); return(FATAL_ERROR);} break; default: ; } return(SUCCESS); } /******************************************************************************/