mirror of
https://github.com/slsdetectorgroup/slsDetectorPackage.git
synced 2025-06-23 18:17:59 +02:00
test if special file when updating kernel(solution: reboot only), --force-delete-normal-file used to force delete bfin fpga drive if normal file and create proper device tree
This commit is contained in:
@ -26,10 +26,12 @@ 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);
|
||||
ssize_t fsize, int forceDeleteNormalFile);
|
||||
int getDrive(char *mess, enum PROGRAM_INDEX index);
|
||||
/** Notify fpga not to touch flash, open src and flash drive to write */
|
||||
int openFileForFlash(char *mess, FILE **flashfd, FILE **srcfd);
|
||||
int openFileForFlash(char *mess, FILE **flashfd, FILE **srcfd,
|
||||
int forceDeleteNormalFile);
|
||||
int checkNormalFile(char *mess, int forceDeleteNormalFile);
|
||||
int eraseFlash(char *mess);
|
||||
/* write from tmp file to flash */
|
||||
int writeToFlash(char *mess, ssize_t fsize, FILE *flashfd, FILE *srcfd);
|
||||
|
@ -285,7 +285,8 @@ 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, char *serverName);
|
||||
char *checksum, char *serverName,
|
||||
int forceDeleteNormalFile);
|
||||
void receive_program_default(int file_des, enum PROGRAM_INDEX index,
|
||||
char *functionType, uint64_t filesize,
|
||||
char *checksum, char *serverName);
|
||||
|
@ -39,6 +39,9 @@
|
||||
|
||||
#define CMD_GET_AMD_FLASH "dmesg | grep Amd"
|
||||
|
||||
#define CMD_CREATE_DEVICE_FILE_PART1 "mknod"
|
||||
#define CMD_CREATE_DEVICE_FILE_PART2 "c 90 6"
|
||||
|
||||
#define FLASH_BUFFER_MEMORY_SIZE (128 * 1024) // 500 KB
|
||||
// clang-format on
|
||||
|
||||
@ -321,7 +324,7 @@ int preparetoCopyProgram(char *mess, char *functionType, FILE **fd,
|
||||
|
||||
int eraseAndWriteToFlash(char *mess, enum PROGRAM_INDEX index,
|
||||
char *functionType, char *clientChecksum,
|
||||
ssize_t fsize) {
|
||||
ssize_t fsize, int forceDeleteNormalFile) {
|
||||
|
||||
memset(messageType, 0, sizeof(messageType));
|
||||
strcpy(messageType, functionType);
|
||||
@ -332,7 +335,8 @@ int eraseAndWriteToFlash(char *mess, enum PROGRAM_INDEX index,
|
||||
|
||||
FILE *flashfd = NULL;
|
||||
FILE *srcfd = NULL;
|
||||
if (openFileForFlash(mess, &flashfd, &srcfd) == FAIL) {
|
||||
if (openFileForFlash(mess, &flashfd, &srcfd, forceDeleteNormalFile) ==
|
||||
FAIL) {
|
||||
return FAIL;
|
||||
}
|
||||
|
||||
@ -436,7 +440,8 @@ int getDrive(char *mess, enum PROGRAM_INDEX index) {
|
||||
return OK;
|
||||
}
|
||||
|
||||
int openFileForFlash(char *mess, FILE **flashfd, FILE **srcfd) {
|
||||
int openFileForFlash(char *mess, FILE **flashfd, FILE **srcfd,
|
||||
int forceDeleteNormalFile) {
|
||||
// open src file
|
||||
*srcfd = fopen(TEMP_PROG_FILE_NAME, "r");
|
||||
if (*srcfd == NULL) {
|
||||
@ -449,29 +454,8 @@ int openFileForFlash(char *mess, FILE **flashfd, FILE **srcfd) {
|
||||
}
|
||||
LOG(logDEBUG1, ("Temp file ready for reading\n"));
|
||||
|
||||
#ifndef VIRTUAL
|
||||
// check if its a normal file or special file
|
||||
struct stat buf;
|
||||
if (stat(flashDriveName, &buf) == -1) {
|
||||
sprintf(mess,
|
||||
"Could not %s. Unable to validate if flash drive found is a "
|
||||
"special file\n",
|
||||
messageType);
|
||||
LOG(logERROR, (mess));
|
||||
if (checkNormalFile(mess, forceDeleteNormalFile) == FAIL)
|
||||
return FAIL;
|
||||
}
|
||||
// non zero = block special file
|
||||
if (S_ISBLK(buf.st_mode)) {
|
||||
sprintf(mess,
|
||||
"Could not %s. The flash drive found is a normal file. To "
|
||||
"delete this file, create the flash drive and proceed with "
|
||||
"programming, re-run the programming command with parameter "
|
||||
"'--force-delete-normal-file'\n",
|
||||
messageType);
|
||||
LOG(logERROR, (mess));
|
||||
return FAIL;
|
||||
}
|
||||
#endif
|
||||
|
||||
// open flash drive for writing
|
||||
*flashfd = fopen(flashDriveName, "w");
|
||||
@ -488,6 +472,91 @@ int openFileForFlash(char *mess, FILE **flashfd, FILE **srcfd) {
|
||||
return OK;
|
||||
}
|
||||
|
||||
int checkNormalFile(char *mess, int forceDeleteNormalFile) {
|
||||
#ifndef VIRTUAL
|
||||
// check if its a normal file or special file
|
||||
struct stat buf;
|
||||
if (stat(flashDriveName, &buf) == -1) {
|
||||
sprintf(mess,
|
||||
"Could not %s. Unable to validate if flash drive found is a "
|
||||
"special file\n",
|
||||
messageType);
|
||||
LOG(logERROR, (mess));
|
||||
return FAIL;
|
||||
}
|
||||
// non zero = block special file
|
||||
if (S_ISBLK(buf.st_mode)) {
|
||||
// kernel memory is not permanent
|
||||
if (index != PROGRAM_FPGA) {
|
||||
sprintf(mess,
|
||||
"Could not %s. The flash drive found is a normal file. "
|
||||
"Reboot board using 'rebootcontroller' command to load "
|
||||
"proper device tree\n",
|
||||
messageType);
|
||||
LOG(logERROR, (mess));
|
||||
return FAIL;
|
||||
}
|
||||
// fpga memory stays after a reboot, so fix it if user allows
|
||||
sprintf(mess,
|
||||
"Could not %s. The flash drive found is a normal file. To "
|
||||
"delete this file, create the flash drive and proceed with "
|
||||
"programming, re-run the programming command with parameter "
|
||||
"'--force-delete-normal-file'\n",
|
||||
messageType);
|
||||
LOG(logERROR, (mess));
|
||||
// user does not allow (default)
|
||||
if (!forceDeleteNormalFile) {
|
||||
return FAIL;
|
||||
}
|
||||
|
||||
// user allows to fix it, so force delete normal file
|
||||
char cmd[MAX_STR_LENGTH] = {0};
|
||||
char retvals[MAX_STR_LENGTH] = {0};
|
||||
|
||||
if (snprintf(cmd, MAX_STR_LENGTH, "rm %s", flashDriveName) >=
|
||||
MAX_STR_LENGTH) {
|
||||
sprintf(mess,
|
||||
"Could not update %s. Command to delete normal file %s is "
|
||||
"too long\n",
|
||||
messageType, flashDriveName);
|
||||
LOG(logERROR, (mess));
|
||||
return FAIL;
|
||||
}
|
||||
if (executeCommand(cmd, retvals, logDEBUG1) == FAIL) {
|
||||
snprintf(
|
||||
mess, MAX_STR_LENGTH,
|
||||
"Could not update %s. (could not delete normal file %s: %s)\n",
|
||||
messageType, flashDriveName, retvals);
|
||||
LOG(logERROR, (mess));
|
||||
return FAIL;
|
||||
}
|
||||
LOG(logINFO, ("\tDeleted Normal File(%s)\n", flashDriveName));
|
||||
|
||||
// create special drive
|
||||
if (snprintf(cmd, MAX_STR_LENGTH, "%s %s %s",
|
||||
CMD_CREATE_DEVICE_FILE_PART1, flashDriveName,
|
||||
CMD_CREATE_DEVICE_FILE_PART2) >= MAX_STR_LENGTH) {
|
||||
sprintf(mess,
|
||||
"Could not update %s. Command to create special file %s is "
|
||||
"too long\n",
|
||||
messageType, flashDriveName);
|
||||
LOG(logERROR, (mess));
|
||||
return FAIL;
|
||||
}
|
||||
if (executeCommand(cmd, retvals, logDEBUG1) == FAIL) {
|
||||
snprintf(
|
||||
mess, MAX_STR_LENGTH,
|
||||
"Could not update %s. (could not create special file %s: %s)\n",
|
||||
messageType, flashDriveName, retvals);
|
||||
LOG(logERROR, (mess));
|
||||
return FAIL;
|
||||
}
|
||||
LOG(logINFO, ("\tSpecial File created (%s)\n", flashDriveName));
|
||||
}
|
||||
#endif
|
||||
return OK;
|
||||
}
|
||||
|
||||
int eraseFlash(char *mess) {
|
||||
LOG(logINFO, ("\tErasing Flash...\n"));
|
||||
|
||||
|
@ -146,6 +146,30 @@ int getDrive(char *mess, enum PROGRAM_INDEX index) {
|
||||
}
|
||||
|
||||
int openFileForFlash(char *mess, FILE **flashfd) {
|
||||
#ifndef VIRTUAL
|
||||
// check if its a normal file or special file
|
||||
struct stat buf;
|
||||
if (stat(flashDriveName, &buf) == -1) {
|
||||
sprintf(mess,
|
||||
"Could not %s. Unable to validate if flash drive found is a "
|
||||
"special file\n",
|
||||
messageType);
|
||||
LOG(logERROR, (mess));
|
||||
return FAIL;
|
||||
}
|
||||
// non zero = block special file
|
||||
if (S_ISBLK(buf.st_mode)) {
|
||||
// memory is not permanent
|
||||
sprintf(mess,
|
||||
"Could not %s. The flash drive found is a normal file. "
|
||||
"Reboot board using 'rebootcontroller' command to load "
|
||||
"proper device tree\n",
|
||||
messageType);
|
||||
LOG(logERROR, (mess));
|
||||
return FAIL;
|
||||
}
|
||||
#endif
|
||||
|
||||
*flashfd = fopen(flashDriveName, "w");
|
||||
if (*flashfd == NULL) {
|
||||
sprintf(mess,
|
||||
|
@ -4003,7 +4003,8 @@ int check_version(int file_des) {
|
||||
usleep(3 * 1000 * 1000);
|
||||
if (!isInitCheckDone()) {
|
||||
ret = FAIL;
|
||||
strcpy(mess, "Server Initialization still not done done in server. Unexpected.\n");
|
||||
strcpy(mess, "Server Initialization still not done done in server. "
|
||||
"Unexpected.\n");
|
||||
LOG(logERROR, (mess));
|
||||
}
|
||||
}
|
||||
@ -9443,6 +9444,15 @@ int receive_program(int file_des, enum PROGRAM_INDEX index) {
|
||||
LOG(logINFO, ("\tServer Name: %s\n", serverName));
|
||||
}
|
||||
|
||||
#if !defined(GOTTHARD2D) && !defined(MYTHEN3D) && !defined(EIGERD)
|
||||
int forceDeleteNormalFile = 0;
|
||||
if (receiveData(file_des, &forceDeleteNormalFile,
|
||||
sizeof(forceDeleteNormalFile), INT32) < 0)
|
||||
return printSocketReadError();
|
||||
LOG(logINFO,
|
||||
("\tForce Delete Normal File: %d\n", forceDeleteNormalFile));
|
||||
#endif
|
||||
|
||||
// in same folder as current process (will also work for virtual then
|
||||
// with write permissions)
|
||||
{
|
||||
@ -9467,7 +9477,7 @@ int receive_program(int file_des, enum PROGRAM_INDEX index) {
|
||||
checksum, serverName);
|
||||
#else
|
||||
receive_program_via_blackfin(file_des, index, functionType,
|
||||
filesize, checksum, serverName);
|
||||
filesize, checksum, serverName, forceDeleteNormalFile);
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -9483,7 +9493,7 @@ 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, char *serverName) {
|
||||
char *checksum, char *serverName, int forceDeleteNormalFile) {
|
||||
|
||||
#if !defined(JUNGFRAUD) && !defined(CHIPTESTBOARDD) && !defined(MOENCHD) && \
|
||||
!defined(GOTTHARDD)
|
||||
@ -9582,7 +9592,7 @@ void receive_program_via_blackfin(int file_des, enum PROGRAM_INDEX index,
|
||||
case PROGRAM_FPGA:
|
||||
case PROGRAM_KERNEL:
|
||||
ret = eraseAndWriteToFlash(mess, index, functionType, checksum,
|
||||
totalsize);
|
||||
totalsize, forceDeleteNormalFile);
|
||||
break;
|
||||
case PROGRAM_SERVER:
|
||||
ret = moveBinaryFile(mess, serverName, TEMP_PROG_FILE_NAME,
|
||||
@ -9785,20 +9795,24 @@ int set_top(int file_des) {
|
||||
if (Server_VerifyLock() == OK) {
|
||||
if (arg != 0 && arg != 1) {
|
||||
ret = FAIL;
|
||||
sprintf(mess, "Could not set top mode. Invalid value: %d. Must be 0 or 1\n", arg);
|
||||
sprintf(
|
||||
mess,
|
||||
"Could not set top mode. Invalid value: %d. Must be 0 or 1\n",
|
||||
arg);
|
||||
LOG(logERROR, (mess));
|
||||
} else {
|
||||
ret = setTop(arg == 1 ? OW_TOP : OW_BOTTOM);
|
||||
if (ret == FAIL) {
|
||||
sprintf(mess, "Could not set %s\n", (arg == 1 ? "Top" : "Bottom"));
|
||||
sprintf(mess, "Could not set %s\n",
|
||||
(arg == 1 ? "Top" : "Bottom"));
|
||||
LOG(logERROR, (mess));
|
||||
} else {
|
||||
} else {
|
||||
int retval = -1;
|
||||
ret = isTop(&retval);
|
||||
if (ret == FAIL) {
|
||||
strcpy(mess, "Could not get Top mode\n");
|
||||
LOG(logERROR, (mess));
|
||||
} else {
|
||||
} else {
|
||||
LOG(logDEBUG1, ("retval top: %d\n", retval));
|
||||
validate(&ret, mess, arg, retval, "set top mode", DEC);
|
||||
}
|
||||
|
Reference in New Issue
Block a user