Dev/xilinx mat update (#959)

* put back code to obtain adc and dac device indexafter loading device tree and then create folder iio_device_links and create symbolic links there according to device indices found. ln -sf operation not permitted, so folder has to be deleted and created everytime. Also refactored definitions to have all the xilinx name or detector specific stuff out of programbyArm.c

* uncommented waittransceiverreset at startup (should work now) and return of powering off chip at startup (error for transceiver alignment reset)

* updated registerdefs from firmware

* minor prints and updating names from registerdefs

* waittransceiverreset has been fixed in firmware and removing warnign for that, transceiver alignment check for powering off chip is not done in fw (giving a warning and returning ok for now)

* fixing ipchecksum (not done), removed startperiphery, allowing readout command to be allowed for xilinx when acquiring
This commit is contained in:
2024-09-10 16:19:03 +02:00
committed by GitHub
parent 5b61ff24bb
commit 9f079b17a2
19 changed files with 235 additions and 121 deletions

View File

@ -69,4 +69,9 @@ int deleteFile(char *mess, char *fname, char *errorPrefix);
int deleteOldServers(char *mess, char *newServerPath, char *errorPrefix);
int readParameterFromFile(char *fname, char *parameterName, int *value);
int readParameterFromFile(char *fname, char *parameterName, int *value);
int createAbsoluteDirectory(char *mess, const char *absPath, char *errorPrefix);
int deleteAbsoluteDirectory(char *mess, const char *absPath, char *errorPrefix);
int deleteItem(char *mess, int isFile, const char *absPath, char *errorPrefix);

View File

@ -9,4 +9,8 @@ int loadDeviceTree(char *mess);
int checksBeforeCreatingDeviceTree(char *mess);
int createDeviceTree(char *mess);
int verifyDeviceTree(char *mess);
int verifyDeviceTree(char *mess);
#ifndef VIRTUAL
int createSymbolicLinksForDevices(int adcDeviceIndex, int dacDeviceIndex,
char *mess);
#endif

View File

@ -198,7 +198,6 @@ int isChipConfigured();
int powerChip(int on, char *mess);
int getPowerChip();
int configureChip(char *mess);
void startPeriphery();
#endif
#if defined(JUNGFRAUD) || defined(MOENCHD) || defined(CHIPTESTBOARDD) || \
defined(MYTHEN3D) || defined(GOTTHARD2D)

View File

@ -50,6 +50,7 @@ u_int32_t writeRegister(u_int32_t offset, u_int32_t data) {
}
int mapCSP0(void) {
LOG(logINFO, ("Mapping memory\n"));
u_int32_t csps[2] = {CSP0, CSP1};
u_int32_t **cspbases[2] = {&csp0base, &csp1base};
u_int32_t memsize[2] = {MEM_SIZE_CSP0, MEM_SIZE_CSP1};
@ -58,7 +59,7 @@ int mapCSP0(void) {
for (int i = 0; i < 2; ++i) {
// if not mapped
if (*cspbases[i] == 0) {
LOG(logINFO, ("Mapping memory for %s\n", names[i]));
LOG(logINFO, ("\tMapping memory for %s\n", names[i]));
#ifdef VIRTUAL
*cspbases[i] = malloc(memsize[i]);
if (*cspbases[i] == NULL) {
@ -67,7 +68,7 @@ int mapCSP0(void) {
memsize[i], names[i]));
return FAIL;
}
LOG(logINFO, ("memory allocated for %s\n", names[i]));
LOG(logINFO, ("\tmemory allocated for %s\n", names[i]));
#else
int fd = open("/dev/mem", O_RDWR | O_SYNC, 0);
if (fd == -1) {
@ -75,7 +76,7 @@ int mapCSP0(void) {
return FAIL;
}
LOG(logDEBUG1,
("/dev/mem opened for %s, (CSP:0x%x)\n", names[i], csps[i]));
("\t/dev/mem opened for %s, (CSP:0x%x)\n", names[i], csps[i]));
*cspbases[i] =
(u_int32_t *)mmap(0, memsize[i], PROT_READ | PROT_WRITE,
MAP_FILE | MAP_SHARED, fd, csps[i]);
@ -85,11 +86,11 @@ int mapCSP0(void) {
}
#endif
LOG(logINFO,
("%s mapped of size %d from %p to %p,(CSP:0x%x) \n", names[i],
("\t%s mapped of size %d from %p to %p,(CSP:0x%x) \n", names[i],
memsize[i], *cspbases[i], *cspbases[i] + memsize[i], csps[i]));
// LOG(logINFO, ("Status Register: %08x\n", bus_r(STATUS_REG)));
} else
LOG(logINFO, ("Memory %s already mapped before\n", names[i]));
LOG(logINFO, ("\tMemory %s already mapped before\n", names[i]));
}
return OK;
}

View File

@ -8,6 +8,7 @@
#include <libgen.h> // dirname
#include <string.h>
#include <sys/stat.h> // stat
#include <sys/utsname.h> // uname
#include <unistd.h> // readlink
@ -677,31 +678,7 @@ int deleteFile(char *mess, char *fname, char *errorPrefix) {
return FAIL;
}
if (access(fullname, F_OK) == 0) {
char cmd[MAX_STR_LENGTH] = {0};
char retvals[MAX_STR_LENGTH] = {0};
if (snprintf(cmd, MAX_STR_LENGTH, "rm %s", fullname) >=
MAX_STR_LENGTH) {
sprintf(mess, "Could not %s. Command to delete is too long\n",
errorPrefix);
LOG(logERROR, (mess));
return FAIL;
}
if (executeCommand(cmd, retvals, logDEBUG1) == FAIL) {
snprintf(mess, MAX_STR_LENGTH,
"Could not %s. (deleting file %s). %s\n", errorPrefix,
fullname, retvals);
LOG(logERROR, (mess));
return FAIL;
}
LOG(logINFO, ("\tDeleted file: %s (%s)\n", fullname, errorPrefix));
} else {
LOG(logINFO,
("\tFile does not exist anyway: %s (%s)\n", fullname, errorPrefix));
}
return OK;
return deleteItem(mess, 1, fullname, errorPrefix);
}
int deleteOldServers(char *mess, char *newServerPath, char *errorPrefix) {
@ -758,4 +735,60 @@ int readParameterFromFile(char *fname, char *parameterName, int *value) {
fclose(fd);
return OK;
}
int createAbsoluteDirectory(char *mess, const char *absPath,
char *errorPrefix) {
// check if folder exists
if (access(absPath, F_OK) == 0) {
LOG(logINFO, ("Folder %s already exists\n", absPath));
return OK;
}
// folder does not exist, create it
if (mkdir(absPath, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) != 0) {
sprintf(mess, "Could not %s. Could not create folder %s\n", errorPrefix,
absPath);
LOG(logERROR, (mess));
return FAIL;
}
LOG(logINFO, ("\tCreated folder: %s (%s)\n", absPath, errorPrefix));
return OK;
}
int deleteAbsoluteDirectory(char *mess, const char *absPath,
char *errorPrefix) {
return deleteItem(mess, 0, absPath, errorPrefix);
}
int deleteItem(char *mess, int isFile, const char *absPath, char *errorPrefix) {
// item does not exist
if (access(absPath, F_OK) != 0) {
LOG(logINFO, ("\t%s does not exist anyway: %s (%s)\n",
(isFile ? "File" : "Folder"), absPath, errorPrefix));
return OK;
}
// delete item
char cmd[MAX_STR_LENGTH] = {0};
char retvals[MAX_STR_LENGTH] = {0};
if (snprintf(cmd, MAX_STR_LENGTH, "rm %s %s", (isFile ? "-f" : "-rf"),
absPath) >= MAX_STR_LENGTH) {
sprintf(mess, "Could not %s. Command to delete is too long\n",
errorPrefix);
LOG(logERROR, (mess));
return FAIL;
}
if (executeCommand(cmd, retvals, logDEBUG1) == FAIL) {
snprintf(mess, MAX_STR_LENGTH, "Could not %s. (deleting %s %s). %s\n",
errorPrefix, (isFile ? "file" : "folder"), absPath, retvals);
LOG(logERROR, (mess));
return FAIL;
}
LOG(logINFO, ("\tDeleted %s: %s (%s)\n", (isFile ? "file" : "folder"),
absPath, errorPrefix));
return OK;
}

View File

@ -2,20 +2,19 @@
// Copyright (C) 2021 Contributors to the SLS Detector Package
#include "programViaArm.h"
#include "clogger.h"
#include "common.h"
#include "sls/sls_detector_defs.h"
#include "slsDetectorServer_defs.h"
#include <string.h> //memset
#include <unistd.h> // access
#define CMD_ARM_LOAD_BIT_FILE \
"~/fpgautil/fpgautil -b /root/apps/xilinx-ctb/XilinxCTB.bit -f Full"
#define CMD_ARM_DEVICE_TREE_API_FOLDER \
"/sys/kernel/config/device-tree/overlays/spidr"
#define CMD_ARM_DEVICE_TREE_OVERLAY_FILE "/root/apps/xilinx-ctb/pl.dtbo"
#define CMD_ARM_LOAD_DEVICE_TREE_FORMAT "cat %s > %s/dtbo"
#define CMD_ARM_DEVICE_TREE_DST "/sys/bus/iio/devices/iio:device"
#define CMD_ARM_DEVICE_NAME "xilinx-ams", "ad7689", "dac@0", "dac@1", "dac@2"
#define TIME_LOAD_DEVICE_TREE_MS (500)
#define CMD_ARM_LOAD_BIT_FILE "~/fpgautil/fpgautil -b " FIRMWARE_FILE " -f Full"
#define CMD_ARM_LOAD_DEVICE_TREE \
"cat " DEVICE_TREE_OVERLAY_FILE " > " DEVICE_TREE_API_FOLDER "/dtbo"
#define CMD_ARM_SYM_LINK_FORMAT \
"ln -sf " DEVICE_TREE_DST "%d " IIO_DEVICE_FOLDER "/%s"
#define TIME_LOAD_DEVICE_TREE_MS (500)
extern int executeCommand(char *command, char *result, enum TLogLevel level);
@ -56,54 +55,54 @@ int loadDeviceTree(char *mess) {
int checksBeforeCreatingDeviceTree(char *mess) {
// check if device tree overlay file exists
if (access(CMD_ARM_DEVICE_TREE_OVERLAY_FILE, F_OK) != 0) {
if (access(DEVICE_TREE_OVERLAY_FILE, F_OK) != 0) {
snprintf(mess, MAX_STR_LENGTH,
"Device tree overlay file (%s) does not exist\n",
CMD_ARM_DEVICE_TREE_OVERLAY_FILE);
DEVICE_TREE_OVERLAY_FILE);
LOG(logERROR, (mess));
return FAIL;
}
LOG(logINFO, ("\tDevice tree overlay file exists (%s)\n",
CMD_ARM_DEVICE_TREE_OVERLAY_FILE));
LOG(logINFO,
("\tDevice tree overlay file exists (%s)\n", DEVICE_TREE_OVERLAY_FILE));
// check if device tree folder exists. If it does, remove it
if (access(CMD_ARM_DEVICE_TREE_API_FOLDER, F_OK) == 0) {
if (access(DEVICE_TREE_API_FOLDER, F_OK) == 0) {
// remove it
char cmd[MAX_STR_LENGTH] = {0};
memset(cmd, 0, MAX_STR_LENGTH);
sprintf(cmd, "rmdir %s", CMD_ARM_DEVICE_TREE_API_FOLDER);
sprintf(cmd, "rmdir %s", DEVICE_TREE_API_FOLDER);
char retvals[MAX_STR_LENGTH] = {0};
memset(retvals, 0, MAX_STR_LENGTH);
if (executeCommand(cmd, retvals, logDEBUG1) == FAIL) {
snprintf(mess, MAX_STR_LENGTH,
"Could not unload device tree overlay api with %s (%s)\n",
cmd, retvals);
LOG(logWARNING, (mess));
LOG(logERROR, (mess));
return FAIL;
}
LOG(logINFO, ("\tUnloaded existing device tree overlay api (%s)\n",
CMD_ARM_DEVICE_TREE_API_FOLDER));
DEVICE_TREE_API_FOLDER));
} else {
LOG(logINFO, ("\tNo existing device tree overlay api found(%s)\n",
CMD_ARM_DEVICE_TREE_API_FOLDER));
DEVICE_TREE_API_FOLDER));
}
// create device tree overlay folder
{
char cmd[MAX_STR_LENGTH] = {0};
memset(cmd, 0, MAX_STR_LENGTH);
sprintf(cmd, "mkdir %s", CMD_ARM_DEVICE_TREE_API_FOLDER);
sprintf(cmd, "mkdir %s", DEVICE_TREE_API_FOLDER);
char retvals[MAX_STR_LENGTH] = {0};
memset(retvals, 0, MAX_STR_LENGTH);
if (executeCommand(cmd, retvals, logDEBUG1) == FAIL) {
snprintf(mess, MAX_STR_LENGTH,
"Could not create device tree overlay api with %s (%s)\n",
cmd, retvals);
LOG(logWARNING, (mess));
LOG(logERROR, (mess));
return FAIL;
}
LOG(logINFO, ("\tDevice tree overlay api created (%s)\n",
CMD_ARM_DEVICE_TREE_API_FOLDER));
DEVICE_TREE_API_FOLDER));
}
return OK;
@ -112,15 +111,14 @@ int checksBeforeCreatingDeviceTree(char *mess) {
int createDeviceTree(char *mess) {
char cmd[MAX_STR_LENGTH] = {0};
memset(cmd, 0, MAX_STR_LENGTH);
sprintf(cmd, CMD_ARM_LOAD_DEVICE_TREE_FORMAT,
CMD_ARM_DEVICE_TREE_OVERLAY_FILE, CMD_ARM_DEVICE_TREE_API_FOLDER);
strcpy(cmd, CMD_ARM_LOAD_DEVICE_TREE);
char retvals[MAX_STR_LENGTH] = {0};
memset(retvals, 0, MAX_STR_LENGTH);
if (executeCommand(cmd, retvals, logDEBUG1) == FAIL) {
snprintf(mess, MAX_STR_LENGTH,
"Could not load device tree overlay with %s (%s)\n", cmd,
retvals);
LOG(logWARNING, (mess));
LOG(logERROR, (mess));
return FAIL;
}
LOG(logINFO, ("\tDevice tree overlay created (cmd: %s)\n", cmd));
@ -131,20 +129,27 @@ int createDeviceTree(char *mess) {
int verifyDeviceTree(char *mess) {
LOG(logINFOBLUE, ("Verifying Device Tree...\n"));
#ifndef VIRTUAL
#ifdef VIRTUAL
LOG(logINFOBLUE, ("Device tree verified successfully\n"));
return OK;
#else
// check if iio:device0-4 exists in device tree destination
int hardcodedDeviceIndex = 0;
int adcDeviceIndex = 1;
int dacDeviceIndex = 2;
for (int i = 0; i != 5; ++i) {
char deviceName[MAX_STR_LENGTH] = {0};
memset(deviceName, 0, MAX_STR_LENGTH);
sprintf(deviceName, "%s%d/name", CMD_ARM_DEVICE_TREE_DST, i);
sprintf(deviceName, "%s%d/name", DEVICE_TREE_DST, i);
// check if device exist
if (access(deviceName, F_OK) != 0) {
snprintf(mess, MAX_STR_LENGTH,
"Could not verify device tree. Device %s does not exist\n",
deviceName);
LOG(logWARNING, (mess));
LOG(logERROR, (mess));
return FAIL;
}
// find name
@ -157,24 +162,26 @@ int verifyDeviceTree(char *mess) {
snprintf(mess, MAX_STR_LENGTH,
"Could not retrieve device name from device %s (%s)\n",
deviceName, retvals);
LOG(logWARNING, (mess));
LOG(logERROR, (mess));
return FAIL;
}
// verify name
char *deviceNames[] = {CMD_ARM_DEVICE_NAME};
char *deviceNames[] = {DEVICE_NAME_LIST};
if (strstr(retvals, deviceNames[hardcodedDeviceIndex]) == NULL) {
// dacs got loaded first
if (i == 1 &&
strstr(retvals, deviceNames[hardcodedDeviceIndex + 1]) !=
NULL) {
++hardcodedDeviceIndex;
adcDeviceIndex = 4;
dacDeviceIndex = 1;
} else {
snprintf(
mess, MAX_STR_LENGTH,
"Could not verify device tree. Device %s expected %s but "
"got %s\n",
deviceName, deviceNames[i], retvals);
LOG(logWARNING, (mess));
LOG(logERROR, (mess));
return FAIL;
}
}
@ -183,7 +190,66 @@ int verifyDeviceTree(char *mess) {
if (hardcodedDeviceIndex == 5)
hardcodedDeviceIndex = 1;
}
LOG(logINFOBLUE, ("Device tree verified successfully [temp: 0, adc:%d, "
"dac:%d, %d, %d]\n",
adcDeviceIndex, dacDeviceIndex, dacDeviceIndex + 1,
dacDeviceIndex + 2));
return createSymbolicLinksForDevices(adcDeviceIndex, dacDeviceIndex, mess);
#endif
LOG(logINFOBLUE, ("Device tree verified successfully\n"));
}
#ifndef VIRTUAL
int createSymbolicLinksForDevices(int adcDeviceIndex, int dacDeviceIndex,
char *mess) {
// delete andcreate iio device links folder (deleting because cannot
// overwrite symbolic links with -sf)
if (deleteAbsoluteDirectory(mess, IIO_DEVICE_FOLDER,
"create sym links for device trees") ==
FAIL) {
return FAIL;
}
if (createAbsoluteDirectory(mess, IIO_DEVICE_FOLDER,
"create sym links for device trees") ==
FAIL) {
return FAIL;
}
char *deviceNames[] = {DEVICE_NAME_LIST};
// create symbolic links for adc
{
char cmd[MAX_STR_LENGTH] = {0};
memset(cmd, 0, MAX_STR_LENGTH);
sprintf(cmd, CMD_ARM_SYM_LINK_FORMAT, adcDeviceIndex, deviceNames[1]);
char retvals[MAX_STR_LENGTH] = {0};
memset(retvals, 0, MAX_STR_LENGTH);
if (executeCommand(cmd, retvals, logDEBUG1) == FAIL) {
snprintf(mess, MAX_STR_LENGTH,
"Could not create sym link [adc] (%s)\n", retvals);
LOG(logERROR, (mess));
return FAIL;
}
LOG(logINFO, ("\tSym link [adc] created (%s)\n", cmd));
}
// create symbolic links for dacs
for (int idac = 0; idac != 3; ++idac) {
char cmd[MAX_STR_LENGTH] = {0};
memset(cmd, 0, MAX_STR_LENGTH);
sprintf(cmd, CMD_ARM_SYM_LINK_FORMAT, dacDeviceIndex + idac,
deviceNames[idac + 2]);
char retvals[MAX_STR_LENGTH] = {0};
memset(retvals, 0, MAX_STR_LENGTH);
if (executeCommand(cmd, retvals, logDEBUG1) == FAIL) {
snprintf(mess, MAX_STR_LENGTH,
"Could not create sym link [dac%d] (%s)\n", idac,
retvals);
LOG(logERROR, (mess));
return FAIL;
}
LOG(logINFO, ("\tSym link [dac%d] created (%s)\n", idac, cmd));
}
return OK;
}
}
#endif

View File

@ -8470,7 +8470,7 @@ int start_readout(int file_des) {
#else
if (Server_VerifyLock() == OK) {
enum runStatus s = getRunStatus();
if (s == RUNNING || s == WAITING) {
if ((s == RUNNING || s == WAITING) && (myDetectorType != XILINX_CHIPTESTBOARD)) {
ret = FAIL;
strcpy(mess, "Could not start readout because the detector is "
"already running!\n");