diff --git a/slsDetectorServers/ctbDetectorServer/CMakeLists.txt b/slsDetectorServers/ctbDetectorServer/CMakeLists.txt index 181600f44..f53bdc21d 100644 --- a/slsDetectorServers/ctbDetectorServer/CMakeLists.txt +++ b/slsDetectorServers/ctbDetectorServer/CMakeLists.txt @@ -17,7 +17,7 @@ add_executable(ctbDetectorServer_virtual ../slsDetectorServer/src/INA226.c ../slsDetectorServer/src/LTC2620.c ../slsDetectorServer/src/MAX1932.c - ../slsDetectorServer/src/programFpgaBlackfin.c + ../slsDetectorServer/src/programViaBlackfin.c ../slsDetectorServer/src/sharedMemory.c ../slsDetectorServer/src/loadPattern.c ../../slsSupportLib/src/md5.c diff --git a/slsDetectorServers/ctbDetectorServer/Makefile b/slsDetectorServers/ctbDetectorServer/Makefile index 56b3b271b..0d9229472 100755 --- a/slsDetectorServers/ctbDetectorServer/Makefile +++ b/slsDetectorServers/ctbDetectorServer/Makefile @@ -16,7 +16,7 @@ DESTDIR ?= bin INSTMODE = 0777 SRCS = slsDetectorFunctionList.c -SRCS += $(main_src)slsDetectorServer.c $(main_src)slsDetectorServer_funcs.c $(main_src)communication_funcs.c $(main_src)blackfin.c $(main_src)common.c $(main_src)commonServerFunctions.c $(main_src)communication_funcs_UDP.c $(main_src)UDPPacketHeaderGenerator.c $(main_src)AD7689.c $(main_src)AD9257.c $(main_src)ALTERA_PLL.c $(main_src)I2C.c $(main_src)INA226.c $(main_src)LTC2620.c $(main_src)MAX1932.c $(main_src)programFpgaBlackfin.c $(main_src)/sharedMemory.c $(main_src)/loadPattern.c $(md5_dir)md5.c +SRCS += $(main_src)slsDetectorServer.c $(main_src)slsDetectorServer_funcs.c $(main_src)communication_funcs.c $(main_src)blackfin.c $(main_src)common.c $(main_src)commonServerFunctions.c $(main_src)communication_funcs_UDP.c $(main_src)UDPPacketHeaderGenerator.c $(main_src)AD7689.c $(main_src)AD9257.c $(main_src)ALTERA_PLL.c $(main_src)I2C.c $(main_src)INA226.c $(main_src)LTC2620.c $(main_src)MAX1932.c $(main_src)programViaBlackfin.c $(main_src)/sharedMemory.c $(main_src)/loadPattern.c $(md5_dir)md5.c OBJS = $(SRCS:.c=.o) diff --git a/slsDetectorServers/gotthard2DetectorServer/CMakeLists.txt b/slsDetectorServers/gotthard2DetectorServer/CMakeLists.txt index dbe403fd3..d7b0edb31 100644 --- a/slsDetectorServers/gotthard2DetectorServer/CMakeLists.txt +++ b/slsDetectorServers/gotthard2DetectorServer/CMakeLists.txt @@ -12,7 +12,7 @@ add_executable(gotthard2DetectorServer_virtual ../slsDetectorServer/src/LTC2620_Driver.c ../slsDetectorServer/src/ALTERA_PLL_CYCLONE10.c ../slsDetectorServer/src/ASIC_Driver.c - ../slsDetectorServer/src/programFpgaNios.c + ../slsDetectorServer/src/programViaNios.c ../slsDetectorServer/src/sharedMemory.c ../../slsSupportLib/src/md5.c ) diff --git a/slsDetectorServers/gotthard2DetectorServer/Makefile b/slsDetectorServers/gotthard2DetectorServer/Makefile index 23ea50584..817babe0e 100755 --- a/slsDetectorServers/gotthard2DetectorServer/Makefile +++ b/slsDetectorServers/gotthard2DetectorServer/Makefile @@ -15,7 +15,7 @@ DESTDIR ?= bin INSTMODE = 0777 SRCS = slsDetectorFunctionList.c -SRCS += $(main_src)slsDetectorServer.c $(main_src)slsDetectorServer_funcs.c $(main_src)communication_funcs.c $(main_src)nios.c $(main_src)common.c $(main_src)DAC6571.c $(main_src)LTC2620_Driver.c $(main_src)ALTERA_PLL_CYCLONE10.c $(main_src)ASIC_Driver.c $(main_src)/programFpgaNios.c $(main_src)/sharedMemory.c $(md5_dir)md5.c +SRCS += $(main_src)slsDetectorServer.c $(main_src)slsDetectorServer_funcs.c $(main_src)communication_funcs.c $(main_src)nios.c $(main_src)common.c $(main_src)DAC6571.c $(main_src)LTC2620_Driver.c $(main_src)ALTERA_PLL_CYCLONE10.c $(main_src)ASIC_Driver.c $(main_src)/programViaNios.c $(main_src)/sharedMemory.c $(md5_dir)md5.c OBJS = $(SRCS:.c=.o) diff --git a/slsDetectorServers/gotthardDetectorServer/CMakeLists.txt b/slsDetectorServers/gotthardDetectorServer/CMakeLists.txt index e2f7eac57..0ab9c9d1f 100644 --- a/slsDetectorServers/gotthardDetectorServer/CMakeLists.txt +++ b/slsDetectorServers/gotthardDetectorServer/CMakeLists.txt @@ -11,6 +11,7 @@ add_executable(gotthardDetectorServer_virtual ../slsDetectorServer/src/LTC2620.c ../slsDetectorServer/src/common.c ../slsDetectorServer/src/commonServerFunctions.c + ../slsDetectorServer/src/programViaBlackfin.c ../slsDetectorServer/src/communication_funcs_UDP.c ../slsDetectorServer/src/sharedMemory.c ../../slsSupportLib/src/md5.c diff --git a/slsDetectorServers/gotthardDetectorServer/Makefile b/slsDetectorServers/gotthardDetectorServer/Makefile index 75bed6bb9..68af42ee7 100755 --- a/slsDetectorServers/gotthardDetectorServer/Makefile +++ b/slsDetectorServers/gotthardDetectorServer/Makefile @@ -15,7 +15,7 @@ DESTDIR ?= bin INSTMODE = 0777 SRCS = slsDetectorFunctionList.c -SRCS += $(main_src)slsDetectorServer.c $(main_src)slsDetectorServer_funcs.c $(main_src)communication_funcs.c $(main_src)blackfin.c $(main_src)AD9252.c $(main_src)AD9257.c $(main_src)LTC2620.c $(main_src)common.c $(main_src)commonServerFunctions.c $(main_src)/sharedMemory.c $(md5_dir)md5.c +SRCS += $(main_src)slsDetectorServer.c $(main_src)slsDetectorServer_funcs.c $(main_src)communication_funcs.c $(main_src)blackfin.c $(main_src)AD9252.c $(main_src)AD9257.c $(main_src)LTC2620.c $(main_src)programViaBlackfin.c $(main_src)common.c $(main_src)commonServerFunctions.c $(main_src)/sharedMemory.c $(md5_dir)md5.c OBJS = $(SRCS:.c=.o) all: clean $(PROGS) diff --git a/slsDetectorServers/gotthardDetectorServer/slsDetectorServer_defs.h b/slsDetectorServers/gotthardDetectorServer/slsDetectorServer_defs.h index b91bb9ab2..89d38eefc 100644 --- a/slsDetectorServers/gotthardDetectorServer/slsDetectorServer_defs.h +++ b/slsDetectorServers/gotthardDetectorServer/slsDetectorServer_defs.h @@ -6,6 +6,8 @@ #define LINKED_SERVER_NAME "gotthardDetectorServer" +#define CTRL_SRVR_INIT_TIME_US (300 * 1000) + /* Enums */ enum ADCINDEX { TEMP_FPGA, TEMP_ADC }; enum DACINDEX { diff --git a/slsDetectorServers/jungfrauDetectorServer/CMakeLists.txt b/slsDetectorServers/jungfrauDetectorServer/CMakeLists.txt index b1cd36a13..63c3afaec 100644 --- a/slsDetectorServers/jungfrauDetectorServer/CMakeLists.txt +++ b/slsDetectorServers/jungfrauDetectorServer/CMakeLists.txt @@ -12,7 +12,7 @@ add_executable(jungfrauDetectorServer_virtual ../slsDetectorServer/src/ALTERA_PLL.c ../slsDetectorServer/src/LTC2620.c ../slsDetectorServer/src/MAX1932.c - ../slsDetectorServer/src/programFpgaBlackfin.c + ../slsDetectorServer/src/programViaBlackfin.c ../slsDetectorServer/src/communication_funcs_UDP.c ../slsDetectorServer/src/sharedMemory.c ../../slsSupportLib/src/md5.c diff --git a/slsDetectorServers/jungfrauDetectorServer/Makefile b/slsDetectorServers/jungfrauDetectorServer/Makefile index 0468da861..5f2e93dc4 100755 --- a/slsDetectorServers/jungfrauDetectorServer/Makefile +++ b/slsDetectorServers/jungfrauDetectorServer/Makefile @@ -15,7 +15,7 @@ DESTDIR ?= bin INSTMODE = 0777 SRCS = slsDetectorFunctionList.c -SRCS += $(main_src)slsDetectorServer.c $(main_src)slsDetectorServer_funcs.c $(main_src)communication_funcs.c $(main_src)blackfin.c $(main_src)common.c $(main_src)commonServerFunctions.c $(main_src)AD9257.c $(main_src)ALTERA_PLL.c $(main_src)LTC2620.c $(main_src)MAX1932.c $(main_src)programFpgaBlackfin.c $(main_src)/sharedMemory.c $(md5_dir)md5.c +SRCS += $(main_src)slsDetectorServer.c $(main_src)slsDetectorServer_funcs.c $(main_src)communication_funcs.c $(main_src)blackfin.c $(main_src)common.c $(main_src)commonServerFunctions.c $(main_src)AD9257.c $(main_src)ALTERA_PLL.c $(main_src)LTC2620.c $(main_src)MAX1932.c $(main_src)programViaBlackfin.c $(main_src)/sharedMemory.c $(md5_dir)md5.c OBJS = $(SRCS:.c=.o) diff --git a/slsDetectorServers/moenchDetectorServer/CMakeLists.txt b/slsDetectorServers/moenchDetectorServer/CMakeLists.txt index de0923b87..4d6901afc 100644 --- a/slsDetectorServers/moenchDetectorServer/CMakeLists.txt +++ b/slsDetectorServers/moenchDetectorServer/CMakeLists.txt @@ -14,7 +14,7 @@ add_executable(moenchDetectorServer_virtual ../slsDetectorServer/src/ALTERA_PLL.c ../slsDetectorServer/src/LTC2620.c ../slsDetectorServer/src/MAX1932.c - ../slsDetectorServer/src/programFpgaBlackfin.c + ../slsDetectorServer/src/programViaBlackfin.c ../slsDetectorServer/src/loadPattern.c ../slsDetectorServer/src/sharedMemory.c ../../slsSupportLib/src/md5.c diff --git a/slsDetectorServers/moenchDetectorServer/Makefile b/slsDetectorServers/moenchDetectorServer/Makefile index f08d178e1..e57e80a03 100755 --- a/slsDetectorServers/moenchDetectorServer/Makefile +++ b/slsDetectorServers/moenchDetectorServer/Makefile @@ -16,7 +16,7 @@ DESTDIR ?= bin INSTMODE = 0777 SRCS = slsDetectorFunctionList.c -SRCS += $(main_src)slsDetectorServer.c $(main_src)slsDetectorServer_funcs.c $(main_src)communication_funcs.c $(main_src)blackfin.c $(main_src)common.c $(main_src)commonServerFunctions.c $(main_src)communication_funcs_UDP.c $(main_src)UDPPacketHeaderGenerator.c $(main_src)AD9257.c $(main_src)ALTERA_PLL.c $(main_src)LTC2620.c $(main_src)MAX1932.c $(main_src)programFpgaBlackfin.c $(main_src)loadPattern.c $(main_src)/sharedMemory.c $(md5_dir)md5.c +SRCS += $(main_src)slsDetectorServer.c $(main_src)slsDetectorServer_funcs.c $(main_src)communication_funcs.c $(main_src)blackfin.c $(main_src)common.c $(main_src)commonServerFunctions.c $(main_src)communication_funcs_UDP.c $(main_src)UDPPacketHeaderGenerator.c $(main_src)AD9257.c $(main_src)ALTERA_PLL.c $(main_src)LTC2620.c $(main_src)MAX1932.c $(main_src)programViaBlackfin.c $(main_src)loadPattern.c $(main_src)/sharedMemory.c $(md5_dir)md5.c OBJS = $(SRCS:.c=.o) diff --git a/slsDetectorServers/mythen3DetectorServer/CMakeLists.txt b/slsDetectorServers/mythen3DetectorServer/CMakeLists.txt index 9033f5200..ab1496fe6 100644 --- a/slsDetectorServers/mythen3DetectorServer/CMakeLists.txt +++ b/slsDetectorServers/mythen3DetectorServer/CMakeLists.txt @@ -12,7 +12,7 @@ add_executable(mythen3DetectorServer_virtual ../slsDetectorServer/src/common.c ../slsDetectorServer/src/LTC2620_Driver.c ../slsDetectorServer/src/ALTERA_PLL_CYCLONE10.c - ../slsDetectorServer/src/programFpgaNios.c + ../slsDetectorServer/src/programViaNios.c ../slsDetectorServer/src/loadPattern.c ../slsDetectorServer/src/sharedMemory.c ../../slsSupportLib/src/md5.c diff --git a/slsDetectorServers/mythen3DetectorServer/Makefile b/slsDetectorServers/mythen3DetectorServer/Makefile index 29e39f6b2..42b412f48 100755 --- a/slsDetectorServers/mythen3DetectorServer/Makefile +++ b/slsDetectorServers/mythen3DetectorServer/Makefile @@ -16,7 +16,7 @@ DESTDIR ?= bin INSTMODE = 0777 SRCS = slsDetectorFunctionList.c -SRCS += $(main_src)slsDetectorServer.c $(main_src)slsDetectorServer_funcs.c $(main_src)communication_funcs.c $(main_src)nios.c $(main_src)DAC6571.c $(main_src)common.c $(main_src)LTC2620_Driver.c $(main_src)ALTERA_PLL_CYCLONE10.c $(main_src)/programFpgaNios.c $(main_src)/sharedMemory.c $(main_src)/loadPattern.c mythen3.c $(md5_dir)md5.c +SRCS += $(main_src)slsDetectorServer.c $(main_src)slsDetectorServer_funcs.c $(main_src)communication_funcs.c $(main_src)nios.c $(main_src)DAC6571.c $(main_src)common.c $(main_src)LTC2620_Driver.c $(main_src)ALTERA_PLL_CYCLONE10.c $(main_src)/programViaNios.c $(main_src)/sharedMemory.c $(main_src)/loadPattern.c mythen3.c $(md5_dir)md5.c OBJS = $(SRCS:.c=.o) diff --git a/slsDetectorServers/slsDetectorServer/include/common.h b/slsDetectorServers/slsDetectorServer/include/common.h index 7cfbf007a..90a38b835 100644 --- a/slsDetectorServers/slsDetectorServer/include/common.h +++ b/slsDetectorServers/slsDetectorServer/include/common.h @@ -9,6 +9,7 @@ #include enum numberMode { DEC, HEX }; +enum PROGRAM_INDEX { PROGRAM_FPGA, PROGRAM_KERNEL, PROGRAM_SERVER }; /** * Convert a value from a range to a different range (eg voltage to dac or vice @@ -28,7 +29,7 @@ int getAbsPath(char *buf, size_t bufSize, char *fname); int getTimeFromString(char *buf, time_t *result); -int getKernelVersion(char* retvals); +int getKernelVersion(char *retvals); int validateKernelVersion(char *expectedVersion); @@ -38,9 +39,11 @@ void validate64(int *ret, char *mess, int64_t arg, int64_t retval, char *modename, enum numberMode nummode); int getModuleIdInFile(int *ret, char *mess, char *fileName); -int verifyChecksumFromBuffer(char *mess, char *clientChecksum, char *buffer, - ssize_t bytes); -int verifyChecksumFromFile(char *mess, char *clientChecksum, char *fname); -int verifyChecksumFromFlash(char *mess, char *clientChecksum, char *fname, - ssize_t fsize); -int verifyChecksum(char *mess, char *clientChecksum, MD5_CTX *c, char *msg); \ No newline at end of file +int verifyChecksumFromBuffer(char *mess, char *functionType, + char *clientChecksum, char *buffer, ssize_t bytes); +int verifyChecksumFromFile(char *mess, char *functionType, char *clientChecksum, + char *fname); +int verifyChecksumFromFlash(char *mess, char *functionType, + char *clientChecksum, char *fname, ssize_t fsize); +int verifyChecksum(char *mess, char *functionType, char *clientChecksum, + MD5_CTX *c, char *msg); \ No newline at end of file diff --git a/slsDetectorServers/slsDetectorServer/include/programViaBlackfin.h b/slsDetectorServers/slsDetectorServer/include/programViaBlackfin.h index 6e176e7d7..1da275577 100644 --- a/slsDetectorServers/slsDetectorServer/include/programViaBlackfin.h +++ b/slsDetectorServers/slsDetectorServer/include/programViaBlackfin.h @@ -2,6 +2,8 @@ // Copyright (C) 2021 Contributors to the SLS Detector Package #pragma once +#include "common.h" + #include #include #include @@ -21,15 +23,17 @@ int emptyTempFolder(char *mess); * verify memory available to copy * open file to copy */ -int preparetoCopyProgram(FILE **fd, uint64_t fsize, char *mess); -int copyToFlash(enum PROGRAMINDEX index, char *mType, ssize_t fsize, - char *clientChecksum, char *mess); -int getDrive(enum PROGRAMINDEX index, char *mess); +int preparetoCopyProgram(char *mess, char *functionType, FILE **fd, + uint64_t fsize); +int eraseAndWriteToFlash(char *mess, enum PROGRAM_INDEX index, + char *functionType, char *clientChecksum, + ssize_t fsize); +int getDrive(char *mess, enum PROGRAM_INDEX index); /** Notify fpga not to touch flash, open src and flash drive to write */ -int openFileForFlash(FILE **flashfd, FILE **srcfd, char *mess); +int openFileForFlash(char *mess, FILE **flashfd, FILE **srcfd); int eraseFlash(char *mess); /* write from tmp file to flash */ -int writeToFlash(ssize_t fsize, FILE *flashfd, FILE *srcfd, char *mess); +int writeToFlash(char *mess, ssize_t fsize, FILE *flashfd, FILE *srcfd); /** Notify fpga to pick up firmware from flash and wait for status confirmation */ int waitForFPGAtoTouchFlash(char *mess); diff --git a/slsDetectorServers/slsDetectorServer/include/programViaNios.h b/slsDetectorServers/slsDetectorServer/include/programViaNios.h index 7e9d0be7c..0b0a6bd02 100644 --- a/slsDetectorServers/slsDetectorServer/include/programViaNios.h +++ b/slsDetectorServers/slsDetectorServer/include/programViaNios.h @@ -2,6 +2,8 @@ // Copyright (C) 2021 Contributors to the SLS Detector Package #pragma once +#include "common.h" + #include #include @@ -13,9 +15,10 @@ void NotifyServerStartSuccess(); /** reset fpga and controller(only implemented for >= v1.1 boards) */ void rebootControllerAndFPGA(); -int eraseAndWriteToFlash(char *mess, char *checksum, char *fpgasrc, +int eraseAndWriteToFlash(char *mess, enum PROGRAM_INDEX index, + char *functionType, char *checksum, char *fpgasrc, uint64_t fsize); -int getDrive(char *mess); -int openFileForFlash(FILE **flashfd, char *mess); +int getDrive(char *mess, enum PROGRAM_INDEX index); +int openFileForFlash(char *mess, FILE **flashfd); int eraseFlash(char *mess); -int writeToFlash(ssize_t fsize, FILE *flashfd, char *buffer, char *mess); \ No newline at end of file +int writeToFlash(char *mess, ssize_t fsize, FILE *flashfd, char *buffer); \ No newline at end of file diff --git a/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h b/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h index 21cfaa3a4..0506650f6 100644 --- a/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h +++ b/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h @@ -13,7 +13,8 @@ #if defined(MYTHEN3D) || defined(GOTTHARD2D) #include "programViaNios.h" -#elif defined(CHIPTESTBOARDD) || defined(JUNGFRAUD) || defined(MOENCHD) +#elif defined(CHIPTESTBOARDD) || defined(JUNGFRAUD) || defined(MOENCHD) || \ + defined(GOTTHARDD) #include "programViaBlackfin.h" #endif @@ -60,7 +61,6 @@ typedef struct udpStruct_s { int isInitCheckDone(); int getInitResult(char **mess); void basictests(); -int getKernelVersion(char *retvals); #if defined(GOTTHARDD) || defined(JUNGFRAUD) || defined(CHIPTESTBOARDD) || \ defined(MOENCHD) || defined(MYTHEN3D) || defined(GOTTHARD2D) int checkType(); diff --git a/slsDetectorServers/slsDetectorServer/include/slsDetectorServer_funcs.h b/slsDetectorServers/slsDetectorServer/include/slsDetectorServer_funcs.h index 7097c732a..fec5ad6b2 100644 --- a/slsDetectorServers/slsDetectorServer/include/slsDetectorServer_funcs.h +++ b/slsDetectorServers/slsDetectorServer/include/slsDetectorServer_funcs.h @@ -8,8 +8,6 @@ #define GOODBYE (-200) #define REBOOT (-400) -enum PROGRAMINDEX {FPGA_PROGRAM, KERNEL_PROGRAM, SERVER_PROGRAM} - // initialization functions int printSocketReadError(); void init_detector(); @@ -121,10 +119,6 @@ int get_transmission_delay_left(int); int set_transmission_delay_right(int); int get_transmission_delay_right(int); int program_fpga(int); -void program_fpga_via_blackfin(int file_des, enum PROGRAMINDEX index, - uint64_t filesize, char *checksum); -void program_fpga_via_nios(int file_des, enum PROGRAMINDEX index, - uint64_t filesize, char *checksum); int reset_fpga(int); int power_chip(int); int set_activate(int); @@ -284,4 +278,12 @@ int set_udp_first_dest(int); int get_readout_speed(int); int set_readout_speed(int); int get_kernel_version(int); -int program_kernel(int); \ No newline at end of file +int update_kernel(int); +int update_detector_server(int); +int receive_program(int file_des, enum PROGRAM_INDEX index); +void receive_program_via_blackfin(int file_des, enum PROGRAM_INDEX index, + char *functionType, uint64_t filesize, + char *checksum); +void receive_program_default(int file_des, enum PROGRAM_INDEX index, + char *functionType, uint64_t filesize, + char *checksum); \ No newline at end of file diff --git a/slsDetectorServers/slsDetectorServer/src/common.c b/slsDetectorServers/slsDetectorServer/src/common.c index 0d9d0ce74..2a2b7b857 100644 --- a/slsDetectorServers/slsDetectorServer/src/common.c +++ b/slsDetectorServers/slsDetectorServer/src/common.c @@ -92,19 +92,21 @@ int getTimeFromString(char *buf, time_t *result) { } // print time structure - LOG(logDEBUG, ("%d %d %d %d:%d:%d %d (day date month H:M:S year)\n", t.tm_wday, t.tm_mday, t.tm_mon, t.tm_year +1900, t.tm_hour, t.tm_min, t.tm_sec)); + LOG(logDEBUG, + ("%d %d %d %d:%d:%d %d (day date month H:M:S year)\n", t.tm_wday, + t.tm_mday, t.tm_mon, t.tm_year + 1900, t.tm_hour, t.tm_min, t.tm_sec)); *result = mktime(&t); return OK; } -int getKernelVersion(char* retvals) { +int getKernelVersion(char *retvals) { struct utsname buf = {0}; if (uname(&buf) == -1) { strcpy(retvals, "Failed to get utsname structure from uname\n"); LOG(logERROR, (retvals)); return FAIL; - } + } strcpy(retvals, buf.version); LOG(logINFOBLUE, ("Kernel Version: %s\n", retvals)); return OK; @@ -135,7 +137,8 @@ int validateKernelVersion(char *expectedVersion) { // convert kernel date string into time time_t kernelDate; if (getTimeFromString(currentVersion, &kernelDate) == FAIL) { - LOG(logERROR, ("Could not parse retrieved kernel date, %s\n", currentVersion)); + LOG(logERROR, + ("Could not parse retrieved kernel date, %s\n", currentVersion)); return FAIL; } @@ -155,8 +158,8 @@ int validateKernelVersion(char *expectedVersion) { return FAIL; } - LOG(logINFOBLUE, ("Kernel Version Compatible: %s [min.: %s]\n", currentVersion, - expectedVersion)); + LOG(logINFOBLUE, ("Kernel Version Compatible: %s [min.: %s]\n", + currentVersion, expectedVersion)); return OK; } @@ -235,30 +238,39 @@ int getModuleIdInFile(int *ret, char *mess, char *fileName) { return retval; } -int verifyChecksumFromBuffer(char *mess, char *clientChecksum, char *buffer, +int verifyChecksumFromBuffer(char *mess, char *functionType, + char *clientChecksum, char *buffer, ssize_t bytes) { LOG(logINFO, ("\tVerifying Checksum...\n")); MD5_CTX c; if (!MD5_Init_SLS(&c)) { - strcpy(mess, "Unable to calculate checksum (MD5_Init_SLS)\n"); + sprintf(mess, + "Could not %s. Unable to calculate checksum (MD5_Init_SLS)\n", + functionType); LOG(logERROR, (mess)); return FAIL; } if (!MD5_Update_SLS(&c, buffer, bytes)) { - strcpy(mess, "Unable to calculate checksum (MD5_Update_SLS)\n"); + sprintf(mess, + "Could not %s. Unable to calculate checksum (MD5_Update_SLS)\n", + functionType); LOG(logERROR, (mess)); return FAIL; } - return verifyChecksum(mess, clientChecksum, &c, "copied program"); + return verifyChecksum(mess, functionType, clientChecksum, &c, + "copied program"); } -int verifyChecksumFromFile(char *mess, char *clientChecksum, char *fname) { +int verifyChecksumFromFile(char *mess, char *functionType, char *clientChecksum, + char *fname) { LOG(logINFO, ("\tVerifying Checksum...\n")); FILE *fp = fopen(fname, "r"); if (fp == NULL) { - sprintf(mess, "Unable to open %s in read mode to get checksum\n", - fname); + sprintf( + mess, + "Could not %s. Unable to open %s in read mode to get checksum\n", + functionType, fname); LOG(logERROR, (mess)); return FAIL; } @@ -266,7 +278,9 @@ int verifyChecksumFromFile(char *mess, char *clientChecksum, char *fname) { MD5_CTX c; if (!MD5_Init_SLS(&c)) { fclose(fp); - strcpy(mess, "Unable to calculate checksum (MD5_Init_SLS)\n"); + sprintf(mess, + "Could not %s. Unable to calculate checksum (MD5_Init_SLS)\n", + functionType); LOG(logERROR, (mess)); return FAIL; } @@ -277,7 +291,10 @@ int verifyChecksumFromFile(char *mess, char *clientChecksum, char *fname) { while (bytes > 0) { if (!MD5_Update_SLS(&c, buf, bytes)) { fclose(fp); - strcpy(mess, "Unable to calculate checksum (MD5_Update_SLS)\n"); + sprintf( + mess, + "Could not %s. Unable to calculate checksum (MD5_Update_SLS)\n", + functionType); LOG(logERROR, (mess)); return FAIL; } @@ -286,17 +303,20 @@ int verifyChecksumFromFile(char *mess, char *clientChecksum, char *fname) { } LOG(logINFO, ("\tRead %lu bytes to calculate checksum\n", totalBytesRead)); fclose(fp); - return verifyChecksum(mess, clientChecksum, &c, "copied program"); + return verifyChecksum(mess, functionType, clientChecksum, &c, + "copied program"); } -int verifyChecksumFromFlash(char *mess, char *clientChecksum, char *fname, - ssize_t fsize) { +int verifyChecksumFromFlash(char *mess, char *functionType, + char *clientChecksum, char *fname, ssize_t fsize) { LOG(logINFO, ("\tVerifying FlashChecksum...\n")); FILE *fp = fopen(fname, "r"); if (fp == NULL) { - sprintf(mess, "Unable to open %s in read mode to get checksum\n", - fname); + sprintf( + mess, + "Could not %s. Unable to open %s in read mode to get checksum\n", + functionType, fname); LOG(logERROR, (mess)); return FAIL; } @@ -304,7 +324,9 @@ int verifyChecksumFromFlash(char *mess, char *clientChecksum, char *fname, MD5_CTX c; if (!MD5_Init_SLS(&c)) { fclose(fp); - strcpy(mess, "Unable to calculate checksum (MD5_Init_SLS)\n"); + sprintf(mess, + "Could not %s. Unable to calculate checksum (MD5_Init_SLS)\n", + functionType); LOG(logERROR, (mess)); return FAIL; } @@ -324,7 +346,10 @@ int verifyChecksumFromFlash(char *mess, char *clientChecksum, char *fname, if (!MD5_Update_SLS(&c, buf, bytes)) { fclose(fp); - strcpy(mess, "Unable to calculate checksum (MD5_Update_SLS)\n"); + sprintf( + mess, + "Could not %s. Unable to calculate checksum (MD5_Update_SLS)\n", + functionType); LOG(logERROR, (mess)); return FAIL; } @@ -340,17 +365,20 @@ int verifyChecksumFromFlash(char *mess, char *clientChecksum, char *fname, } LOG(logINFO, ("\tRead %lu bytes to calculate checksum\n", totalBytesRead)); fclose(fp); - int ret = verifyChecksum(mess, clientChecksum, &c, "flash"); + int ret = verifyChecksum(mess, functionType, clientChecksum, &c, "flash"); if (ret == OK) { - LOG(logINFO, ("Checksum in Flash verified\n")); + LOG(logINFO, ("\tChecksum in Flash verified\n")); } return ret; } -int verifyChecksum(char *mess, char *clientChecksum, MD5_CTX *c, char *msg) { +int verifyChecksum(char *mess, char *functionType, char *clientChecksum, + MD5_CTX *c, char *msg) { unsigned char out[MD5_DIGEST_LENGTH]; if (!MD5_Final_SLS(out, c)) { - strcpy(mess, "Unable to calculate checksum (MD5_Final_SLS)\n"); + sprintf(mess, + "Could not %s. Unable to calculate checksum (MD5_Final_SLS)\n", + functionType); LOG(logERROR, (mess)); return FAIL; } @@ -370,9 +398,9 @@ int verifyChecksum(char *mess, char *clientChecksum, MD5_CTX *c, char *msg) { // compare checksum if (strcmp(clientChecksum, checksum)) { sprintf(mess, - "Checksum of %s does not match. Client " + "Could not %s. Checksum of %s does not match. Client " "checksum:%s, copied checksum:%s\n", - msg, clientChecksum, checksum); + functionType, msg, clientChecksum, checksum); LOG(logERROR, (mess)); return FAIL; } diff --git a/slsDetectorServers/slsDetectorServer/src/programViaBlackfin.c b/slsDetectorServers/slsDetectorServer/src/programViaBlackfin.c index 62ccf2815..cbd28e88c 100644 --- a/slsDetectorServers/slsDetectorServer/src/programViaBlackfin.c +++ b/slsDetectorServers/slsDetectorServer/src/programViaBlackfin.c @@ -29,13 +29,19 @@ #define CMD_FPGA_PICKED_STATUS "cat /sys/class/gpio/gpio7/value" #define CMD_GET_FPGA_FLASH_DRIVE "awk \'$4== \"\\\"bitfile(spi)\\\"\" {print $1}\' /proc/mtd" -#define CMD_GET_KERNEL_FLASH_DRIVE "awk \'$4== \"\\\"linux kernel(nor)\\\"\" {print $1}\' /proc/mtd" +#define CMD_GET_KERNEL_FLASH_DRIVE "awk \'$4== \"\\\"linux\\\"\" {print $1}\' /proc/mtd" #define FLASH_BUFFER_MEMORY_SIZE (128 * 1024) // 500 KB // clang-format on #define FLASH_DRIVE_NAME_SIZE 16 + +#ifdef VIRTUAL +char flashDriveName[FLASH_DRIVE_NAME_SIZE] = "/tmp/SLS_mtd3"; +#else char flashDriveName[FLASH_DRIVE_NAME_SIZE] = {0}; +#endif + char messageType[SHORT_STR_LENGTH] = {0}; int gpioDefined = 0; @@ -109,6 +115,7 @@ int FPGAdontTouchFlash(char *mess) { #ifdef VIRTUAL return OK; #endif + char retvals[MAX_STR_LENGTH] = {0}; // define gpio9 as output if (executeCommand(CMD_GPIO9_DEFINE_OUT, retvals, logDEBUG1) == FAIL) { snprintf(mess, MAX_STR_LENGTH, @@ -155,6 +162,7 @@ int FPGATouchFlash(char *mess) { #ifdef VIRTUAL return OK; #endif + char retvals[MAX_STR_LENGTH] = {0}; // tell FPGA to touch flash to program itself if (executeCommand(CMD_GPIO9_DEFINE_IN, retvals, logDEBUG1) == FAIL) { snprintf(mess, MAX_STR_LENGTH, @@ -211,7 +219,8 @@ int emptyTempFolder(char *mess) { return OK; } -int preparetoCopyProgram(FILE **fd, uint64_t fsize, char *mess) { +int preparetoCopyProgram(char *mess, char *functionType, FILE **fd, + uint64_t fsize) { if (emptyTempFolder(mess) == FAIL) { return FAIL; @@ -223,9 +232,9 @@ int preparetoCopyProgram(FILE **fd, uint64_t fsize, char *mess) { sysinfo(&info); if (fsize >= info.freeram) { sprintf(mess, - "Could not update program. Not enough memory to copy " + "Could not %s. Not enough memory to copy " "program. [File size:%ldMB, free RAM: %ldMB]\n", - (long int)(fsize / (1024 * 1024)), + functionType, (long int)(fsize / (1024 * 1024)), (long int)(info.freeram / (1024 * 1024))); LOG(logERROR, (mess)); return FAIL; @@ -235,7 +244,8 @@ int preparetoCopyProgram(FILE **fd, uint64_t fsize, char *mess) { // open file to copy program *fd = fopen(TEMP_PROG_FILE_NAME, "w"); if (*fd == NULL) { - sprintf(mess, "Unable to open %s in write mode\n", TEMP_PROG_FILE_NAME); + sprintf(mess, "Could not %s. Unable to open %s in write mode\n", + functionType, TEMP_PROG_FILE_NAME); LOG(logERROR, (mess)); return FAIL; } @@ -243,24 +253,25 @@ int preparetoCopyProgram(FILE **fd, uint64_t fsize, char *mess) { return OK; } -int copyToFlash(enum PROGRAMINDEX index, char *mType, ssize_t fsize, - char *clientChecksum, char *mess) { +int eraseAndWriteToFlash(char *mess, enum PROGRAM_INDEX index, + char *functionType, char *clientChecksum, + ssize_t fsize) { memset(messageType, 0, sizeof(messageType)); - strcpy(messageType, mType); + strcpy(messageType, functionType); - if (getDrive(index, messageType, mess) == FAIL) { + if (getDrive(mess, index) == FAIL) { return FAIL; } FILE *flashfd = NULL; FILE *srcfd = NULL; - if (openFileForFlash(&flashfd, &srcfd, mess) == FAIL) { + if (openFileForFlash(mess, &flashfd, &srcfd) == FAIL) { return FAIL; } - if (index == FPGA_PROGRAM) { - if (FPGAdontTouchFlash(char *mess) == FAIL) { + if (index == PROGRAM_FPGA) { + if (FPGAdontTouchFlash(mess) == FAIL) { return FAIL; } } @@ -271,7 +282,7 @@ int copyToFlash(enum PROGRAMINDEX index, char *mType, ssize_t fsize, return FAIL; } - if (writeToFlash(fsize, flashfd, srcfd, mess) == FAIL) { + if (writeToFlash(mess, fsize, flashfd, srcfd) == FAIL) { return FAIL; } @@ -280,14 +291,14 @@ int copyToFlash(enum PROGRAMINDEX index, char *mType, ssize_t fsize, } /* remove condition when flash fpga fixed */ - if (index == KERNEL_PROGRAM) { - if (verifyChecksumFromFlash(mess, clientChecksum, flashDriveName, - fsize) == FAIL) { + if (index == PROGRAM_KERNEL) { + if (verifyChecksumFromFlash(mess, messageType, clientChecksum, + flashDriveName, fsize) == FAIL) { return FAIL; } } - if (index == FPGA_PROGRAM) { + if (index == PROGRAM_FPGA) { if (waitForFPGAtoTouchFlash(mess) == FAIL) { return FAIL; } @@ -295,6 +306,7 @@ int copyToFlash(enum PROGRAMINDEX index, char *mType, ssize_t fsize, // kernel else { + char retvals[MAX_STR_LENGTH] = {0}; if (executeCommand("sync", retvals, logDEBUG1) == FAIL) { snprintf(mess, MAX_STR_LENGTH, "Could not update %s. (could not sync)\n", messageType); @@ -306,9 +318,8 @@ int copyToFlash(enum PROGRAMINDEX index, char *mType, ssize_t fsize, return OK; } -int getDrive(enum PROGRAMINDEX index, char *mess) { +int getDrive(char *mess, enum PROGRAM_INDEX index) { #ifdef VIRTUAL - strcpy(flashDriveName, "/tmp/SLS_tmpDrive"); return OK; #endif LOG(logDEBUG1, ("Finding flash drive...\n")); @@ -323,45 +334,43 @@ int getDrive(enum PROGRAMINDEX index, char *mess) { char cmd[MAX_STR_LENGTH] = {0}; char retvals[MAX_STR_LENGTH] = {0}; - if (index == FPGA_PROGRAM) { + if (index == PROGRAM_FPGA) { strcpy(cmd, CMD_GET_FPGA_FLASH_DRIVE); } else { strcpy(cmd, CMD_GET_KERNEL_FLASH_DRIVE); } if (executeCommand(cmd, retvals, logDEBUG1) == FAIL) { snprintf(mess, MAX_STR_LENGTH, - "Could not update %s. (could not get flash drive: %s)\n", - messageType, retvals); + "Could not %s. (could not get flash drive: %s)\n", messageType, + retvals); // LOG(logERROR, (mess)); already printed in executecommand return FAIL; } char *pch = strtok(retvals, ":"); if (pch == NULL) { - strcpy(mess, - "Could not update %s. Could not get mtd drive to flash (strtok " - "fail).\n", - messageType); + sprintf(mess, + "Could not %s. Could not get mtd drive to flash (strtok " + "fail).\n", + messageType); LOG(logERROR, (mess)); return FAIL; } memset(flashDriveName, 0, sizeof(flashDriveName)); - strcpy(flashDriveName, "/dev/"); - strcat(flashDriveName, pch); + sprintf(flashDriveName, "/dev/%s", pch); LOG(logINFO, ("\tFlash drive found: %s\n", flashDriveName)); return OK; } -int openFileForFlash(FILE **flashfd, FILE **srcfd, char *mess) { +int openFileForFlash(char *mess, FILE **flashfd, FILE **srcfd) { // open src file *srcfd = fopen(TEMP_PROG_FILE_NAME, "r"); if (*srcfd == NULL) { - sprintf( - mess, - "Could not update %s. Unable to open temp program file %s in read " - "mode\n", - messageType, TEMP_PROG_FILE_NAME); + sprintf(mess, + "Could not %s. Unable to open temp program file %s in read " + "mode\n", + messageType, TEMP_PROG_FILE_NAME); LOG(logERROR, (mess)); return FAIL; } @@ -372,7 +381,7 @@ int openFileForFlash(FILE **flashfd, FILE **srcfd, char *mess) { if (*flashfd == NULL) { fclose(*srcfd); sprintf(mess, - "Could not update %s. Unable to open flash drive %s in write " + "Could not %s. Unable to open flash drive %s in write " "mode\n", messageType, flashDriveName); LOG(logERROR, (mess)); @@ -393,8 +402,7 @@ int eraseFlash(char *mess) { char *format = "flash_eraseall %s"; if (snprintf(cmd, MAX_STR_LENGTH, format, flashDriveName) >= MAX_STR_LENGTH) { - sprintf(mess, - "Could not update %s. Command to erase flash is too long\n", + sprintf(mess, "Could not %s. Command to erase flash is too long\n", messageType); LOG(logERROR, (mess)); return FAIL; @@ -410,7 +418,7 @@ int eraseFlash(char *mess) { return OK; } -int writeToFlash(ssize_t fsize, FILE *flashfd, FILE *srcfd, char *mess) { +int writeToFlash(char *mess, ssize_t fsize, FILE *flashfd, FILE *srcfd) { LOG(logDEBUG1, ("writing to flash\n")); char *buffer = malloc(FLASH_BUFFER_MEMORY_SIZE); @@ -418,7 +426,7 @@ int writeToFlash(ssize_t fsize, FILE *flashfd, FILE *srcfd, char *mess) { fclose(flashfd); fclose(srcfd); sprintf(mess, - "Could not update %s. Memory allocation to write to " + "Could not %s. Memory allocation to write to " "flash failed.\n", messageType); LOG(logERROR, (mess)); @@ -442,7 +450,7 @@ int writeToFlash(ssize_t fsize, FILE *flashfd, FILE *srcfd, char *mess) { fclose(flashfd); fclose(srcfd); sprintf(mess, - "Could not update %s. Could not write to flash (bytes " + "Could not %s. Could not write to flash (bytes " "written:%ld, expected: " "%ld, total written:%ld)\n", messageType, (long int)bytesWritten, (long int)bytes, @@ -475,7 +483,7 @@ int writeToFlash(ssize_t fsize, FILE *flashfd, FILE *srcfd, char *mess) { if (totalBytes != fsize) { sprintf(mess, - "Could not update %s. Incorrect bytes written to flash %lu " + "Could not %s. Incorrect bytes written to flash %lu " "[expected: %lu]\n", messageType, totalBytes, fsize); LOG(logERROR, (mess)); diff --git a/slsDetectorServers/slsDetectorServer/src/programViaNios.c b/slsDetectorServers/slsDetectorServer/src/programViaNios.c index ba3b05521..706b0388c 100644 --- a/slsDetectorServers/slsDetectorServer/src/programViaNios.c +++ b/slsDetectorServers/slsDetectorServer/src/programViaNios.c @@ -11,10 +11,19 @@ /* global variables */ -#define CMD_GET_FLASH "awk \'$5== \"Application\" {print $1}\' /proc/mtd" +#define CMD_GET_FPGA_FLASH_DRIVE \ + "awk \'$5== \"Application\" {print $1}\' /proc/mtd" +#define CMD_GET_KERNEL_FLASH_DRIVE "awk \'$5== \"Linux\" {print $1}\' /proc/mtd" #define FLASH_DRIVE_NAME_SIZE 16 + +#ifdef VIRTUAL +char flashDriveName[FLASH_DRIVE_NAME_SIZE] = "/tmp/SLS_mtd3"; +#else char flashDriveName[FLASH_DRIVE_NAME_SIZE] = {0}; +#endif + +char messageType[SHORT_STR_LENGTH] = {0}; #define MICROCONTROLLER_FILE "/dev/ttyAL0" extern int executeCommand(char *command, char *result, enum TLogLevel level); @@ -35,15 +44,19 @@ void rebootControllerAndFPGA() { system(command); } -int eraseAndWriteToFlash(char *mess, char *checksum, char *fpgasrc, +int eraseAndWriteToFlash(char *mess, enum PROGRAM_INDEX index, + char *functionType, char *checksum, char *fpgasrc, uint64_t fsize) { - if (getDrive(mess) == FAIL) { + memset(messageType, 0, sizeof(messageType)); + strcpy(messageType, functionType); + + if (getDrive(mess, index) == FAIL) { return FAIL; } FILE *flashfd = NULL; - if (openFileForFlash(&flashfd, mess) == FAIL) { + if (openFileForFlash(mess, &flashfd) == FAIL) { return FAIL; } @@ -52,21 +65,33 @@ int eraseAndWriteToFlash(char *mess, char *checksum, char *fpgasrc, return FAIL; } - if (writeToFlash(fsize, flashfd, fpgasrc, mess) == FAIL) { + if (writeToFlash(mess, fsize, flashfd, fpgasrc) == FAIL) { return FAIL; } - /* ignoring this until a consistent way to read from nios flash - if (verifyChecksumFromFlash(mess, checksum, flashDriveName, fsize) == - FAIL) { - return FAIL; + + /* remove condition when flash fpga fixed */ + if (index == PROGRAM_KERNEL) { + if (verifyChecksumFromFlash(mess, messageType, checksum, flashDriveName, + fsize) == FAIL) { + return FAIL; + } } - */ + + if (index == PROGRAM_KERNEL) { + char retvals[MAX_STR_LENGTH] = {0}; + if (executeCommand("sync", retvals, logDEBUG1) == FAIL) { + snprintf(mess, MAX_STR_LENGTH, + "Could not update %s. (could not sync)\n", messageType); + // LOG(logERROR, (mess)); already printed in executecommand + return FAIL; + } + } + return OK; } -int getDrive(char *mess) { +int getDrive(char *mess, enum PROGRAM_INDEX index) { #ifdef VIRTUAL - strcpy(flashDriveName, "/tmp/SLS_mtd3"); return OK; #endif LOG(logDEBUG1, ("Finding flash drive...\n")); @@ -82,10 +107,15 @@ int getDrive(char *mess) { char cmd[MAX_STR_LENGTH] = {0}; char retvals[MAX_STR_LENGTH] = {0}; - strcpy(cmd, CMD_GET_FLASH); + + if (index == PROGRAM_FPGA) { + strcpy(cmd, CMD_GET_FPGA_FLASH_DRIVE); + } else { + strcpy(cmd, CMD_GET_KERNEL_FLASH_DRIVE); + } if (executeCommand(cmd, retvals, logDEBUG1) == FAIL) { snprintf(mess, MAX_STR_LENGTH, - "Could not program fpga. (could not get flash drive: %s)\n", + "Could not %s. (could not get flash drive: %s)\n", messageType, retvals); // LOG(logERROR, (mess)); already printed in executecommand return FAIL; @@ -93,7 +123,10 @@ int getDrive(char *mess) { char *pch = strtok(retvals, ":"); if (pch == NULL) { - strcpy(mess, "Could not get mtd drive to flash (strtok fail).\n"); + sprintf( + mess, + "Could not %s. Could not get mtd drive to flash (strtok fail).\n", + messageType); LOG(logERROR, (mess)); return FAIL; } @@ -105,11 +138,12 @@ int getDrive(char *mess) { return OK; } -int openFileForFlash(FILE **flashfd, char *mess) { +int openFileForFlash(char *mess, FILE **flashfd) { *flashfd = fopen(flashDriveName, "w"); if (*flashfd == NULL) { - sprintf(mess, "Unable to open flash drive %s in write mode\n", - flashDriveName); + sprintf(mess, + "Could not %s. Unable to open flash drive %s in write mode\n", + messageType, flashDriveName); LOG(logERROR, (mess)); return FAIL; } @@ -129,14 +163,14 @@ int eraseFlash(char *mess) { char *format = "flash_erase %s 0 0"; if (snprintf(cmd, MAX_STR_LENGTH, format, flashDriveName) >= MAX_STR_LENGTH) { - strcpy(mess, - "Could not program fpga. Command to erase flash is too long\n"); + sprintf(mess, "Could not %s. Command to erase flash is too long\n", + messageType); LOG(logERROR, (mess)); return FAIL; } if (executeCommand(cmd, retvals, logDEBUG1) == FAIL) { snprintf(mess, MAX_STR_LENGTH, - "Could not program fpga. (could not erase flash: %s)\n", + "Could not %s. (could not erase flash: %s)\n", messageType, retvals); // LOG(logERROR, (mess)); already printed in executecommand return FAIL; @@ -146,16 +180,16 @@ int eraseFlash(char *mess) { return OK; } -int writeToFlash(ssize_t fsize, FILE *flashfd, char *buffer, char *mess) { +int writeToFlash(char *mess, ssize_t fsize, FILE *flashfd, char *buffer) { LOG(logINFO, ("\tWriting to Flash...\n")); ssize_t bytesWritten = fwrite((void *)buffer, sizeof(char), fsize, flashfd); if (bytesWritten != fsize) { fclose(flashfd); sprintf(mess, - "Could not program fpga. Incorrect bytes written to flash %lu " + "Could not %s. Incorrect bytes written to flash %lu " "[expected: %lu]\n", - (long int)bytesWritten, (long int)fsize); + messageType, (long int)bytesWritten, (long int)fsize); LOG(logERROR, (mess)); return FAIL; } diff --git a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c index 03fec5136..a92aad40a 100644 --- a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c +++ b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c @@ -415,7 +415,8 @@ void function_table() { flist[F_GET_READOUT_SPEED] = &get_readout_speed; flist[F_SET_READOUT_SPEED] = &set_readout_speed; flist[F_GET_KERNEL_VERSION] = &get_kernel_version; - flist[F_PROGRAM_KERNEL] = &program_kernel; + flist[F_UPDATE_KERNEL] = &update_kernel; + flist[F_UPDATE_DETECTOR_SERVER] = &update_detector_server; // check if (NUM_DET_FUNCTIONS >= RECEIVER_ENUM_START) { @@ -3648,195 +3649,11 @@ int program_fpga(int file_des) { n = receiveData(file_des, mess, MAX_STR_LENGTH, OTHER); functionNotImplemented(); #else - // only set - if (Server_VerifyLock() == OK) { - - LOG(logINFOBLUE, ("Programming FPGA...\n")); - - // filesize - uint64_t filesize = 0; - if (receiveData(file_des, &filesize, sizeof(filesize), INT64) < 0) - return printSocketReadError(); - LOG(logDEBUG1, ("Program size is: %lld\n", (long long int)filesize)); - - // checksum - char checksum[MAX_STR_LENGTH]; - memset(checksum, 0, MAX_STR_LENGTH); - if (receiveData(file_des, checksum, MAX_STR_LENGTH, OTHER) < 0) - return printSocketReadError(); - LOG(logDEBUG1, ("checksum is: %s\n\n", checksum)); - - switch (myDetectorType) { - case MYTHEN3: - case GOTTHARD2: - program_fpga_via_nios(file_des, FPGA_PROGRAM, filesize, checksum); - break; - default: - program_fpga_via_blackfin(file_des, FPGA_PROGRAM, filesize, - checksum); - break; - } - - if (ret == OK) { - LOG(logINFOGREEN, ("Programming FPGA completed successfully\n")); - } else { - LOG(logERROR, ("Program FPGA FAIL!\n")); - } - } + receive_program(file_des, PROGRAM_FPGA); #endif return ret; } -void program_fpga_via_blackfin(int file_des, enum PROGRAMINDEX index, - uint64_t filesize, char *checksum) { - char messageType[SHORT_STR_LENGTH] = {0}; - switch (index) { - case FPGA_PROGRAM: - strcpy(messageType, "fpga program"); - break; - case KERNEL_PROGRAM: - strcpy(messageType, "kernel program"); - break; - case SERVER_PROGRAM: - strcpy(messageType, "server program"); - break; - default: - ret = FAIL; - sprintf(mess, "Unknown program index %d\n", index); - LOG(logERROR, (mess)); - Server_SendResult(file_des, INT32, NULL, 0); - return; - } - - // open file and allocate memory for part program - FILE *fd = NULL; - ret = preparetoCopyProgram(&fd, filesize, mess); - char *src = NULL; - if (ret == OK) { - src = malloc(MAX_BLACKFIN_PROGRAM_SIZE); - if (src == NULL) { - fclose(fd); - struct sysinfo info; - sysinfo(&info); - sprintf(mess, - "Could not allocate memory to get %s. Free " - "space: %d MB\n", - messageType, (int)(info.freeram / (1024 * 1024))); - LOG(logERROR, (mess)); - ret = FAIL; - } - } - Server_SendResult(file_des, INT32, NULL, 0); - if (ret == FAIL) { - return; - } - - // copying program part by part - uint64_t totalsize = filesize; - while (ret == OK && filesize) { - uint64_t unitprogramsize = MAX_BLACKFIN_PROGRAM_SIZE; - if (unitprogramsize > filesize) - unitprogramsize = filesize; - LOG(logDEBUG1, ("unit size to receive is:%lld [filesize:%lld]\n", - (long long unsigned int)unitprogramsize, - (long long unsigned int)filesize)); - - // receive part of program - if (receiveData(file_des, src, unitprogramsize, OTHER) < 0) { - printSocketReadError(); - break; - } - filesize -= unitprogramsize; - - // copy program - if (fwrite((void *)src, sizeof(char), unitprogramsize, fd) != - unitprogramsize) { - ret = FAIL; - sprintf(mess, "Could not copy program to /var/tmp (size:%ld)\n", - (long int)unitprogramsize); - LOG(logERROR, (mess)); - } - Server_SendResult(file_des, INT32, NULL, 0); - if (ret == FAIL) { - break; - } - // print progress - LOG(logINFO, - ("\t%d%%\r", - (int)(((double)(totalsize - filesize) / totalsize) * 100))); - fflush(stdout); - } - free(src); - fclose(fd); - - // checksum of copied program - if (ret == OK) { - ret = verifyChecksumFromFile(mess, checksum, TEMP_PROG_FILE_NAME); - } - Server_SendResult(file_des, INT32, NULL, 0); - if (ret == FAIL) { - return; - } - - // erase and copy to flash - ret = copyToFlash(index, messageType, totalsize, checksum, mess); - Server_SendResult(file_des, INT32, NULL, 0); -} - -void program_fpga_via_nios(int file_des, uint64_t filesize, char *checksum) { - // validate file size - if (filesize > NIOS_MAX_APP_IMAGE_SIZE) { - ret = FAIL; - sprintf(mess, - "Could not start programming FPGA. File size 0x%llx " - "exceeds max size 0x%llx. Forgot Compression?\n", - (long long unsigned int)filesize, - (long long unsigned int)NIOS_MAX_APP_IMAGE_SIZE); - LOG(logERROR, (mess)); - } - // memory allocation - char *src = NULL; - if (ret == OK) { - src = malloc(filesize); - if (src == NULL) { - fclose(fd); - struct sysinfo info; - sysinfo(&info); - sprintf(mess, - "Could not allocate memory to get %s. Free " - "space: %d MB\n", - messageType, (int)(info.freeram / (1024 * 1024))); - LOG(logERROR, (mess)); - ret = FAIL; - } - } - Server_SendResult(file_des, INT32, NULL, 0); - if (ret == FAIL) { - return; - } - - // receive program - if (receiveData(file_des, src, filesize, OTHER) < 0) { - free(src); - ret = printSocketReadError(); - return; - } - - // checksum of copied program - if (ret == OK) { - ret = verifyChecksumFromBuffer(mess, checksum, src, fsize); - } - Server_SendResult(file_des, INT32, NULL, 0); - if (ret == FAIL) { - return; - } - - // erase and program - ret = eraseAndWriteToFlash(mess, checksum, src, filesize); - Server_SendResult(file_des, INT32, NULL, 0); - free(src); -} - int reset_fpga(int file_des) { ret = OK; memset(mess, 0, sizeof(mess)); @@ -3850,16 +3667,24 @@ int reset_fpga(int file_des) { if (Server_VerifyLock() == OK) { if (isControlServer) { basictests(); // mapping of control server at least - if (initError == OK) { + char *message = NULL; + if (getInitResult(&message) == FAIL) { + ret = FAIL; + strcpy(mess, message); + LOG(logERROR, (mess)); + } else { initControlServer(); } } else { initStopServer(); // remapping of stop server } - if (initError == FAIL) { - ret = FAIL; - strcpy(mess, initErrorMessage); - // LOG(ERROR (mess));already printed + if (ret == OK) { + char *message = NULL; + if (getInitResult(&message) == FAIL) { + ret = FAIL; + strcpy(mess, message); + LOG(logERROR, (mess)); + } } } #endif @@ -9492,9 +9317,261 @@ int get_kernel_version(int file_des) { return Server_SendResult(file_des, OTHER, retvals, sizeof(retvals)); } -int program_kernel(int file_des) { +int update_kernel(int file_des) { ret = OK; memset(mess, 0, sizeof(mess)); +#if !defined(JUNGFRAUD) && !defined(CHIPTESTBOARDD) && !defined(MOENCHD) && \ + !defined(GOTTHARDD) + // to receive any arguments + int n = 1; + while (n > 0) + n = receiveData(file_des, mess, MAX_STR_LENGTH, OTHER); + functionNotImplemented(); +#else + receive_program(file_des, PROGRAM_FPGA); +#endif + return ret; +} + +int update_detector_server(int file_des) { + ret = OK; + memset(mess, 0, sizeof(mess)); + return receive_program(file_des, PROGRAM_SERVER); +} + +int receive_program(int file_des, enum PROGRAM_INDEX index) { + // only set + if (Server_VerifyLock() == OK) { + char functionType[SHORT_STR_LENGTH] = {0}; + switch (index) { + case PROGRAM_FPGA: + strcpy(functionType, "Update Firmware"); + break; + case PROGRAM_KERNEL: + strcpy(functionType, "Update Kernel"); + break; + case PROGRAM_SERVER: + strcpy(functionType, "Update Server"); + break; + } + LOG(logINFOBLUE, ("%s ...\n", functionType)); + + // filesize + uint64_t filesize = 0; + if (receiveData(file_des, &filesize, sizeof(filesize), INT64) < 0) + return printSocketReadError(); + LOG(logDEBUG1, ("Program size is: %lld\n", (long long int)filesize)); + + // client checksum + char checksum[MAX_STR_LENGTH]; + memset(checksum, 0, MAX_STR_LENGTH); + if (receiveData(file_des, checksum, MAX_STR_LENGTH, OTHER) < 0) + return printSocketReadError(); + LOG(logDEBUG1, ("checksum is: %s\n\n", checksum)); + +#if defined(GOTTHARD2D) || defined(MYTHEN3D) || defined(EIGERD) + receive_program_default(file_des, index, functionType, filesize, + checksum); +#else + receive_program_via_blackfin(file_des, index, functionType, filesize, + checksum); +#endif + + if (ret == OK) { + LOG(logINFOGREEN, ("%s completed successfully\n", functionType)); + } else { + LOG(logERROR, ("%s FAIL!\n", functionType)); + } + } return ret; } + +void receive_program_via_blackfin(int file_des, enum PROGRAM_INDEX index, + char *functionType, uint64_t filesize, + char *checksum) { + +#if !defined(JUNGFRAUD) && !defined(CHIPTESTBOARDD) && !defined(MOENCHD) && \ + !defined(GOTTHARDD) + ret = FAIL; + sprintf(mess, + "Could not %s. program via blackfin not implmented for this " + "detector.\n", + functionType); + LOG(logERROR, (mess)); +#else + // open file and allocate memory for part program + FILE *fd = NULL; + ret = preparetoCopyProgram(mess, functionType, &fd, filesize); + char *src = NULL; + if (ret == OK) { + src = malloc(MAX_BLACKFIN_PROGRAM_SIZE); + if (src == NULL) { + fclose(fd); + struct sysinfo info; + sysinfo(&info); + sprintf(mess, + "Could not %s. Memory allocation failure. Free " + "space: %d MB\n", + functionType, (int)(info.freeram / (1024 * 1024))); + LOG(logERROR, (mess)); + ret = FAIL; + } + } + Server_SendResult(file_des, INT32, NULL, 0); + if (ret == FAIL) { + return; + } + + // copying program part by part + uint64_t totalsize = filesize; + while (ret == OK && filesize) { + uint64_t unitprogramsize = MAX_BLACKFIN_PROGRAM_SIZE; + if (unitprogramsize > filesize) + unitprogramsize = filesize; + LOG(logDEBUG1, ("unit size to receive is:%lld [filesize:%lld]\n", + (long long unsigned int)unitprogramsize, + (long long unsigned int)filesize)); + + // receive part of program + if (receiveData(file_des, src, unitprogramsize, OTHER) < 0) { + printSocketReadError(); + break; + } + filesize -= unitprogramsize; + + // copy program + if (fwrite((void *)src, sizeof(char), unitprogramsize, fd) != + unitprogramsize) { + ret = FAIL; + sprintf( + mess, + "Could not %s. Could not copy program to /var/tmp (size:%ld)\n", + functionType, (long int)unitprogramsize); + LOG(logERROR, (mess)); + } + Server_SendResult(file_des, INT32, NULL, 0); + if (ret == FAIL) { + break; + } + // print progress + LOG(logINFO, + ("\t%d%%\r", + (int)(((double)(totalsize - filesize) / totalsize) * 100))); + fflush(stdout); + } + free(src); + fclose(fd); + + // checksum of copied program + if (ret == OK) { + ret = verifyChecksumFromFile(mess, functionType, checksum, + TEMP_PROG_FILE_NAME); + } + Server_SendResult(file_des, INT32, NULL, 0); + if (ret == FAIL) { + return; + } + + // appropriate functions + switch (index) { + case PROGRAM_FPGA: + case PROGRAM_KERNEL: + ret = + eraseAndWriteToFlash(mess, index, functionType, checksum, filesize); + break; + case PROGRAM_SERVER: + break; + default: + modeNotImplemented("Program index", (int)index); + break; + } + + // erase and copy to flash + Server_SendResult(file_des, INT32, NULL, 0); +#endif +} + +void receive_program_default(int file_des, enum PROGRAM_INDEX index, + char *functionType, uint64_t filesize, + char *checksum) { +#if !defined(GOTTHARD2D) && !defined(MYTHEN3D) && !defined(EIGERD) + ret = FAIL; + sprintf(mess, + "Could not %s. program via blackfin not implmented for this " + "detector.\n", + functionType); + LOG(logERROR, (mess)) +#else +#if defined(GOTTHARD2D) || defined(MYTHEN3D) + // validate file size + if (filesize > NIOS_MAX_APP_IMAGE_SIZE) { + ret = FAIL; + sprintf(mess, + "Could not %s. File size 0x%llx " + "exceeds max size 0x%llx. Forgot Compression?\n", + functionType, (long long unsigned int)filesize, + (long long unsigned int)NIOS_MAX_APP_IMAGE_SIZE); + LOG(logERROR, (mess)); + } +#endif + + // memory allocation + char *src = NULL; + if (ret == OK) { + src = malloc(filesize); + if (src == NULL) { + struct sysinfo info; + sysinfo(&info); + sprintf(mess, + "Could not %s. Memory allocation failure. Free " + "space: %d MB\n", + functionType, (int)(info.freeram / (1024 * 1024))); + LOG(logERROR, (mess)); + ret = FAIL; + } + } + Server_SendResult(file_des, INT32, NULL, 0); + if (ret == FAIL) { + return; + } + + // receive program + if (receiveData(file_des, src, filesize, OTHER) < 0) { + free(src); + ret = printSocketReadError(); + return; + } + + // checksum of copied program + if (ret == OK) { + ret = verifyChecksumFromBuffer(mess, functionType, checksum, src, + filesize); + } + Server_SendResult(file_des, INT32, NULL, 0); + if (ret == FAIL) { + return; + } + +#if defined(GOTTHARD2D) || defined(MYTHEN3D) + // appropriate functions + switch (index) { + case PROGRAM_FPGA: + case PROGRAM_KERNEL: + ret = eraseAndWriteToFlash(mess, index, functionType, checksum, src, + filesize); + break; + case PROGRAM_SERVER: + break; + default: + modeNotImplemented("Program index", (int)index); + break; + } +#endif + // send result + Server_SendResult(file_des, INT32, NULL, 0); + + // free resources + free(src); +#endif +} \ No newline at end of file