mirror of
https://github.com/slsdetectorgroup/slsDetectorPackage.git
synced 2025-06-14 13:57:13 +02:00
Compare commits
27 Commits
Author | SHA1 | Date | |
---|---|---|---|
ae0a54a774 | |||
ae33622da2 | |||
c4a453fdbd | |||
672c0f4a07 | |||
05af370883 | |||
a6022b7cec | |||
72316fa2ce | |||
65523dcc94 | |||
df40665c5e | |||
8472cca81f | |||
110e57ff6c | |||
fdd6031add | |||
e7c65f44cb | |||
0063cc8eb2 | |||
27e6fc3c73 | |||
83e0eb8b01 | |||
7f8b5ac6c0 | |||
340abec016 | |||
a8b37e3932 | |||
0883c73e88 | |||
ef7e9d73a5 | |||
a8bdc1495c | |||
1c54dea9c7 | |||
cee286b6ad | |||
da8e0060d3 | |||
85da65ca15 | |||
4fe067363a |
@ -2,7 +2,7 @@
|
|||||||
# Copyright (C) 2021 Contributors to the SLS Detector Package
|
# Copyright (C) 2021 Contributors to the SLS Detector Package
|
||||||
cmake_minimum_required(VERSION 3.12)
|
cmake_minimum_required(VERSION 3.12)
|
||||||
project(slsDetectorPackage)
|
project(slsDetectorPackage)
|
||||||
set(PROJECT_VERSION 6.1.0)
|
set(PROJECT_VERSION 6.1.2)
|
||||||
|
|
||||||
set(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG")
|
set(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG")
|
||||||
|
|
||||||
|
222
RELEASE.txt
222
RELEASE.txt
@ -1,170 +1,158 @@
|
|||||||
SLS Detector Package Minor Release 6.1.0 released on 25.11.2021
|
SLS Detector Package Patch Release 6.1.2 released on 25.11.2022
|
||||||
===============================================================
|
===============================================================
|
||||||
|
|
||||||
This document describes the differences between v6.1.0 and v6.0.0.
|
This document describes the differences between v6.1.2 and v6.1.1.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
CONTENTS
|
CONTENTS
|
||||||
--------
|
--------
|
||||||
1. New or Changed Features
|
1. Resolved Issues
|
||||||
2. Resolved Issues
|
2. On-board Detector Server Compatibility
|
||||||
3. Firmware Requirements
|
2. Firmware Requirements
|
||||||
4. Kernel Requirements
|
3. Kernel Requirements
|
||||||
5. Download, Documentation & Support
|
4. Download, Documentation & Support
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
1. Resolved Issues
|
||||||
1. New or Changed Features
|
|
||||||
==========================
|
|
||||||
|
|
||||||
Client
|
|
||||||
------
|
|
||||||
|
|
||||||
1. Kernel version
|
|
||||||
Commandline: kernelversion, API: getKernelVersion
|
|
||||||
|
|
||||||
2. [Jungfrau][Mythen3][Gotthard2][Gotthard][Moench][Ctb]
|
|
||||||
Update Kernel
|
|
||||||
Commandline: updatekernel, API: updatekernel
|
|
||||||
You could damage the detector. Please use with caution.
|
|
||||||
|
|
||||||
3. Update Detector Server (no tftp)
|
|
||||||
Commandline: updatedetectorserver, API: updateDetectorServer
|
|
||||||
Updates the detector server without using tftp. It also creates a
|
|
||||||
symbolic link to a shorter name and reboots. The API using tftp
|
|
||||||
(copydetectorserver) is deprecated.
|
|
||||||
|
|
||||||
4. Update Firmware and Server (no tftp)
|
|
||||||
Commandline: update (fewer arguments), API: updateFirmwareAndServer
|
|
||||||
(overloaded) Same as before, except the server is transferred to the
|
|
||||||
detector without tftp. The previous API and command (fewer arguments)
|
|
||||||
using tftp is deprecated.
|
|
||||||
|
|
||||||
5. Update mode in Detector server
|
|
||||||
Commandline: udpatemode, API set/getUpdateMode
|
|
||||||
One can set detector server to update mode (especially if server and
|
|
||||||
firmware are incompatible that the server cannot start up without errors).
|
|
||||||
This mode will limit access to a few operations only needed to update the
|
|
||||||
detector. Setting it will create an empty file (udpate.txt) and resetting
|
|
||||||
it will delete the empty file. Ofcourse, command line "--update" will
|
|
||||||
overwrite any file detection and start server in update mode.
|
|
||||||
|
|
||||||
|
|
||||||
Detector Server
|
|
||||||
---------------
|
|
||||||
|
|
||||||
1. [Gotthard2] speed
|
|
||||||
Ensuring dbitpipeline is default when changing speed. This has an effect
|
|
||||||
only if dbitpipeline was changed in between.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
2. Resolved Issues
|
|
||||||
==================
|
==================
|
||||||
|
|
||||||
Detector Server
|
Detector Server
|
||||||
---------------
|
---------------
|
||||||
|
|
||||||
1. [Jungfrau][Moench][Ctb] Programming Firmware Failures
|
1. [Jungfrau, Moench, Ctb]
|
||||||
Firmware programming via software failures are fixed using a new kernel
|
Programming Firmware
|
||||||
and corresponding changes in server software. Software works with both
|
Updating kernel was not enough to ensure seamless programming of FPGA.
|
||||||
old and new kernels.
|
nCe signal now made high before programming blackfin.
|
||||||
|
|
||||||
2. [Gotthard2][Mythen3]
|
Updating the on-board detector server to this version is recommended
|
||||||
Verifies kernel version at server start up.
|
before updating firmware for future releases.
|
||||||
|
|
||||||
3. [Jungfrau]
|
Also removed the unnecessary test to check if it is allowed to update
|
||||||
Verifies HW2.0 before trying to set read n rows or flip rows.
|
kernel or on-board detector server, depending on the current kernel
|
||||||
Has no effect when not using slsReceiver.
|
version.
|
||||||
|
|
||||||
4. [Eiger]
|
2. [Eiger] locking for start and stop
|
||||||
Thresholdnotb command loads threshold energy without trimbits, but had
|
Since the start and stop has a few commands within the server itself,
|
||||||
a bug in the server that was setting nchip to 0 and further trimval or
|
they are locked to ensure they dont disturb the other to have undefined
|
||||||
trim commands would no work reliably. This is fixed now.
|
behavior.
|
||||||
|
|
||||||
|
3. [Eiger] Quad Trimbits or threshold
|
||||||
|
Loading trimbits or setting threshold will throw an incorrect exception
|
||||||
|
for a quad as the left and right register values will not match. The fix
|
||||||
|
only sets and monitors right fpga for chip trim signals in quad.
|
||||||
|
|
||||||
|
4. [Eiger] Minor refactoring
|
||||||
|
Inconsistent reads between left and right register for read/write
|
||||||
|
register commands now give clear error messages.
|
||||||
|
|
||||||
|
Fixed some minor functions returned empty error messages when failing.
|
||||||
|
|
||||||
|
|
||||||
Client
|
Client
|
||||||
------
|
------
|
||||||
|
|
||||||
1. Receiver Id in the commands in config files were ignored. Fixed.
|
1. [Eiger] Stop command freezes server
|
||||||
|
It is apparent in large detectors.
|
||||||
|
|
||||||
2. Execute command now also mentions which module failed.
|
For example, if module A got a "stop" during an acquisition,
|
||||||
|
it stops to an 'Idle' state. If module B gets a "stop" before an
|
||||||
|
acquisition, it will return it is in 'Idle' state and continue
|
||||||
|
to start the next acquisition, but module B then waits for "ready
|
||||||
|
for trigger" synchronization from module A, which it will never get.
|
||||||
|
|
||||||
|
Since module B missed the asynchronous stop command, the workaround
|
||||||
|
in the client is to send another "stop" command (upto 10 retries)
|
||||||
|
till it returns Idle.
|
||||||
|
|
||||||
3. [Jungfrau][Moench][Ctb]
|
2. [Eiger][Jungfrau][Moench][Ctb]
|
||||||
Programming firmware procedure did not delete temporary file created in
|
Stop results in different frame numbers
|
||||||
6.0.0. Fixed.
|
A "stop" command will also now check for inconsistent 'nextframenumber'
|
||||||
|
between the modules and set it to the max + 1 to ensure that they
|
||||||
|
all start with the same frame number for the next acquisition.
|
||||||
|
|
||||||
|
|
||||||
Receiver
|
|
||||||
--------
|
|
||||||
|
|
||||||
1. Setting receiver hostname to "none" threw an exception. Fixed.
|
Python
|
||||||
|
------
|
||||||
|
|
||||||
2. [Jungfrau]
|
1. Conda package
|
||||||
Since the server verifies HW2.0 for number of rows before trying to set it,
|
Removed conda pkgs for python 3.6 and 3.7
|
||||||
the receiver now does not show incorrect missing packets stemming from this
|
Added conda pkgs for python 3.11
|
||||||
issue.
|
|
||||||
|
2. Pybind11
|
||||||
|
Updated pybind11 from 2.6.2 to 2.10.11
|
||||||
|
|
||||||
|
|
||||||
|
Test
|
||||||
|
----
|
||||||
|
|
||||||
|
1. Updated catch to latest 2.x version due do build failure on fedora
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
2. On-board Detector Server Compatibility
|
||||||
|
==========================================
|
||||||
|
|
||||||
|
Eiger 6.1.2
|
||||||
|
Jungfrau 6.1.2
|
||||||
|
Gotthard 6.1.0
|
||||||
|
Mythen3 6.1.0
|
||||||
|
Gotthard2 6.1.0
|
||||||
|
Moench 6.1.2
|
||||||
|
Ctb 6.1.2
|
||||||
|
|
||||||
|
On-board Detector Server Upgrade
|
||||||
|
================================
|
||||||
|
From v6.1.0 (without tftp):
|
||||||
|
Using command 'updatedetectorserver'
|
||||||
|
From 5.0.0 (with tftp):
|
||||||
|
Using command 'copydetectorserver'
|
||||||
|
|
||||||
|
Instructions available at
|
||||||
|
https://slsdetectorgroup.github.io/devdoc/serverupgrade.html
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
3. Firmware Requirements
|
3. Firmware Requirements
|
||||||
========================
|
========================
|
||||||
|
|
||||||
Eiger
|
Note: No change to 6.1.1.
|
||||||
=====
|
|
||||||
Compatible version : 08.10.2021 (v29)
|
|
||||||
|
|
||||||
Jungfrau
|
|
||||||
========
|
|
||||||
Compatible version : 31.08.2021 (v1.2, PCB v1.0)
|
|
||||||
: 08.10.2021 (v2.2, PCB v2.0)
|
|
||||||
|
|
||||||
Gotthard
|
Eiger 08.10.2021 (v29)
|
||||||
========
|
Jungfrau 31.08.2021 (v1.2, PCB v1.0)
|
||||||
Compatible version : 08.02.2018 (50um and 25um Master)
|
08.10.2021 (v2.2, PCB v2.0)
|
||||||
: 09.02.2018 (25 um Slave)
|
Gotthard 08.02.2018 (50um and 25um Master)
|
||||||
|
09.02.2018 (25 um Slave)
|
||||||
|
Mythen3 10.09.2021 (v1.1)
|
||||||
|
Gotthard2 27.05.2021 (v0.1)
|
||||||
|
Moench 05.10.2020 (v1.0)
|
||||||
|
Ctb 05.10.2020 (v1.0)
|
||||||
|
|
||||||
Mythen3
|
Detector Firmware Upgrade
|
||||||
=======
|
=========================
|
||||||
Compatible version : 10.09.2021 (v1.1)
|
|
||||||
|
|
||||||
Gotthard2
|
|
||||||
=========
|
|
||||||
Compatible version : 27.05.2021 (v0.1)
|
|
||||||
|
|
||||||
Moench
|
|
||||||
======
|
|
||||||
Compatible version : 05.10.2020 (v1.0)
|
|
||||||
|
|
||||||
Ctb
|
|
||||||
===
|
|
||||||
Compatible version : 05.10.2020 (v1.0)
|
|
||||||
|
|
||||||
Detector Upgrade
|
|
||||||
================
|
|
||||||
The following can be upgraded remotely:
|
The following can be upgraded remotely:
|
||||||
Eiger via bit files
|
Eiger via bit files
|
||||||
Jungfrau via command <.pof>
|
Jungfrau via 'programfpga' command <.pof>
|
||||||
Mythen3 via command <.rbf>
|
Mythen3 via 'programfpga' command <.rbf>
|
||||||
Gotthard2 via command <.rbf>
|
Gotthard2 via 'programfpga' command <.rbf>
|
||||||
Moench via command <.pof>
|
Moench via 'programfpga' command <.pof>
|
||||||
Ctb via command <.pof>
|
Ctb via 'programfpga' command <.pof>
|
||||||
|
|
||||||
The following cannot be upgraded remotely:
|
The following cannot be upgraded remotely:
|
||||||
Gotthard
|
Gotthard
|
||||||
|
|
||||||
Instructions available at
|
Instructions available at
|
||||||
https://slsdetectorgroup.github.io/devdoc/firmware.html
|
https://slsdetectorgroup.github.io/devdoc/firmware.html
|
||||||
and
|
|
||||||
https://slsdetectorgroup.github.io/devdoc/serverupgrade.html
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
4. Kernel Requirements
|
4. Kernel Requirements
|
||||||
======================
|
======================
|
||||||
|
|
||||||
|
Note: No change to 6.1.1.
|
||||||
|
|
||||||
|
|
||||||
Blackfin
|
Blackfin
|
||||||
========
|
========
|
||||||
Latest version: Fri Oct 29 00:00:00 2021
|
Latest version: Fri Oct 29 00:00:00 2021
|
||||||
|
@ -21,4 +21,4 @@ echo "Building using: ${NCORES} cores"
|
|||||||
cmake --build . -- -j${NCORES}
|
cmake --build . -- -j${NCORES}
|
||||||
cmake --build . --target install
|
cmake --build . --target install
|
||||||
|
|
||||||
CTEST_OUTPUT_ON_FAILURE=1 ctest -j 2
|
CTEST_OUTPUT_ON_FAILURE=1 ctest -j 1
|
||||||
|
@ -1,9 +1,8 @@
|
|||||||
python:
|
python:
|
||||||
- 3.6
|
|
||||||
- 3.7
|
|
||||||
- 3.8
|
- 3.8
|
||||||
- 3.9
|
- 3.9
|
||||||
- 3.10
|
- 3.10
|
||||||
|
- 3.11
|
||||||
|
|
||||||
numpy:
|
numpy:
|
||||||
- 1.17
|
- 1.17
|
||||||
|
5850
libs/catch/catch.hpp
5850
libs/catch/catch.hpp
File diff suppressed because it is too large
Load Diff
Submodule libs/pybind11 updated: 8de7772cc7...80dc998efc
@ -1 +0,0 @@
|
|||||||
../slsDetectorServers/ctbDetectorServer/bin/ctbDetectorServerv6.1.0
|
|
1
serverBin/ctbDetectorServerv6.1.2
Symbolic link
1
serverBin/ctbDetectorServerv6.1.2
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
../slsDetectorServers/ctbDetectorServer/bin/ctbDetectorServerv6.1.2
|
@ -1 +0,0 @@
|
|||||||
../slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServerv6.1.0
|
|
1
serverBin/eigerDetectorServerv6.1.2
Symbolic link
1
serverBin/eigerDetectorServerv6.1.2
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
../slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServerv6.1.2
|
@ -1 +0,0 @@
|
|||||||
../slsDetectorServers/jungfrauDetectorServer/bin/jungfrauDetectorServerv6.1.0
|
|
1
serverBin/jungfrauDetectorServerv6.1.2
Symbolic link
1
serverBin/jungfrauDetectorServerv6.1.2
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
../slsDetectorServers/jungfrauDetectorServer/bin/jungfrauDetectorServerv6.1.2
|
@ -1 +0,0 @@
|
|||||||
../slsDetectorServers/moenchDetectorServer/bin/moenchDetectorServerv6.1.0
|
|
1
serverBin/moenchDetectorServerv6.1.2
Symbolic link
1
serverBin/moenchDetectorServerv6.1.2
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
../slsDetectorServers/moenchDetectorServer/bin/moenchDetectorServerv6.1.2
|
Binary file not shown.
BIN
slsDetectorServers/ctbDetectorServer/bin/ctbDetectorServerv6.1.2
Executable file
BIN
slsDetectorServers/ctbDetectorServer/bin/ctbDetectorServerv6.1.2
Executable file
Binary file not shown.
@ -715,7 +715,7 @@ int Feb_Control_ProcessingInProgress() {
|
|||||||
unsigned int regr = 0, regl = 0;
|
unsigned int regr = 0, regl = 0;
|
||||||
// deactivated should return end of processing
|
// deactivated should return end of processing
|
||||||
if (!Feb_Control_activated)
|
if (!Feb_Control_activated)
|
||||||
return IDLE;
|
return STATUS_IDLE;
|
||||||
|
|
||||||
if (!Feb_Interface_ReadRegister(Feb_Control_rightAddress, FEB_REG_STATUS,
|
if (!Feb_Interface_ReadRegister(Feb_Control_rightAddress, FEB_REG_STATUS,
|
||||||
®r)) {
|
®r)) {
|
||||||
@ -729,8 +729,9 @@ int Feb_Control_ProcessingInProgress() {
|
|||||||
"processing status\n"));
|
"processing status\n"));
|
||||||
return STATUS_ERROR;
|
return STATUS_ERROR;
|
||||||
}
|
}
|
||||||
|
LOG(logDEBUG1, ("regl:0x%x regr:0x%x\n", regl, regr));
|
||||||
// processing done
|
// processing done
|
||||||
if ((regr | regl) & FEB_REG_STATUS_ACQ_DONE_MSK) {
|
if (regr & regl & FEB_REG_STATUS_ACQ_DONE_MSK) {
|
||||||
return STATUS_IDLE;
|
return STATUS_IDLE;
|
||||||
}
|
}
|
||||||
// processing running
|
// processing running
|
||||||
@ -1046,6 +1047,7 @@ int Feb_Control_StopAcquisition() {
|
|||||||
// wait for feb processing to be done
|
// wait for feb processing to be done
|
||||||
int is_processing = Feb_Control_ProcessingInProgress();
|
int is_processing = Feb_Control_ProcessingInProgress();
|
||||||
int check_error = 0;
|
int check_error = 0;
|
||||||
|
int check_stuck = 0;
|
||||||
while (is_processing != STATUS_IDLE) {
|
while (is_processing != STATUS_IDLE) {
|
||||||
usleep(500);
|
usleep(500);
|
||||||
is_processing = Feb_Control_ProcessingInProgress();
|
is_processing = Feb_Control_ProcessingInProgress();
|
||||||
@ -1057,12 +1059,28 @@ int Feb_Control_StopAcquisition() {
|
|||||||
break;
|
break;
|
||||||
check_error++;
|
check_error++;
|
||||||
} // reset check_error for next time
|
} // reset check_error for next time
|
||||||
else
|
else {
|
||||||
check_error = 0;
|
check_error = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// check stuck only 2000 times (1s)
|
||||||
|
if (is_processing == STATUS_RUNNING) {
|
||||||
|
if (check_stuck == 2000) {
|
||||||
|
LOG(logERROR, ("Unable to get feb processing done signal\n"));
|
||||||
|
// at least it is idle
|
||||||
|
if (Feb_Control_AcquisitionInProgress() == STATUS_IDLE) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
LOG(logERROR, ("Unable to get acquisition done signal\n"));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
check_stuck++;
|
||||||
|
} // reset check_stuck for next time
|
||||||
|
else {
|
||||||
|
check_stuck = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
LOG(logINFO, ("Feb: Processing done (to stop acq)\n"));
|
LOG(logINFO, ("Feb: Processing done (to stop acq)\n"));
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -1544,7 +1562,9 @@ int Feb_Control_SetChipSignalsToTrimQuad(int enable) {
|
|||||||
LOG(logINFO, ("%s chip signals to trim quad\n",
|
LOG(logINFO, ("%s chip signals to trim quad\n",
|
||||||
enable ? "Enabling" : "Disabling"));
|
enable ? "Enabling" : "Disabling"));
|
||||||
unsigned int regval = 0;
|
unsigned int regval = 0;
|
||||||
if (!Feb_Control_ReadRegister(DAQ_REG_HRDWRE, ®val)) {
|
// right fpga only
|
||||||
|
uint32_t righOffset = DAQ_REG_HRDWRE + Feb_Control_rightAddress;
|
||||||
|
if (!Feb_Control_ReadRegister(righOffset, ®val)) {
|
||||||
LOG(logERROR, ("Could not set chip signals to trim quad\n"));
|
LOG(logERROR, ("Could not set chip signals to trim quad\n"));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -1554,7 +1574,7 @@ int Feb_Control_SetChipSignalsToTrimQuad(int enable) {
|
|||||||
regval &= ~(DAQ_REG_HRDWRE_PROGRAM_MSK | DAQ_REG_HRDWRE_M8_MSK);
|
regval &= ~(DAQ_REG_HRDWRE_PROGRAM_MSK | DAQ_REG_HRDWRE_M8_MSK);
|
||||||
}
|
}
|
||||||
|
|
||||||
return Feb_Control_WriteRegister(DAQ_REG_HRDWRE, regval);
|
return Feb_Control_WriteRegister(righOffset, regval);
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -1587,19 +1607,19 @@ int Feb_Control_WriteRegister(uint32_t offset, uint32_t data) {
|
|||||||
|
|
||||||
int run[2] = {0, 0};
|
int run[2] = {0, 0};
|
||||||
// both registers
|
// both registers
|
||||||
if (offset < 0x100) {
|
if (offset < Feb_Control_leftAddress) {
|
||||||
run[0] = 1;
|
run[0] = 1;
|
||||||
run[1] = 1;
|
run[1] = 1;
|
||||||
}
|
}
|
||||||
// right registers only
|
// right registers only
|
||||||
else if (offset >= 0x200) {
|
else if (offset >= Feb_Control_rightAddress) {
|
||||||
run[0] = 1;
|
run[0] = 1;
|
||||||
actualOffset = offset - 0x200;
|
actualOffset = offset - Feb_Control_rightAddress;
|
||||||
}
|
}
|
||||||
// left registers only
|
// left registers only
|
||||||
else {
|
else {
|
||||||
run[1] = 1;
|
run[1] = 1;
|
||||||
actualOffset = offset - 0x100;
|
actualOffset = offset - Feb_Control_leftAddress;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int iloop = 0; iloop < 2; ++iloop) {
|
for (int iloop = 0; iloop < 2; ++iloop) {
|
||||||
@ -1625,19 +1645,19 @@ int Feb_Control_ReadRegister(uint32_t offset, uint32_t *retval) {
|
|||||||
uint32_t value[2] = {0, 0};
|
uint32_t value[2] = {0, 0};
|
||||||
int run[2] = {0, 0};
|
int run[2] = {0, 0};
|
||||||
// both registers
|
// both registers
|
||||||
if (offset < 0x100) {
|
if (offset < Feb_Control_leftAddress) {
|
||||||
run[0] = 1;
|
run[0] = 1;
|
||||||
run[1] = 1;
|
run[1] = 1;
|
||||||
}
|
}
|
||||||
// right registers only
|
// right registers only
|
||||||
else if (offset >= 0x200) {
|
else if (offset >= Feb_Control_rightAddress) {
|
||||||
run[0] = 1;
|
run[0] = 1;
|
||||||
actualOffset = offset - 0x200;
|
actualOffset = offset - Feb_Control_rightAddress;
|
||||||
}
|
}
|
||||||
// left registers only
|
// left registers only
|
||||||
else {
|
else {
|
||||||
run[1] = 1;
|
run[1] = 1;
|
||||||
actualOffset = offset - 0x100;
|
actualOffset = offset - Feb_Control_leftAddress;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int iloop = 0; iloop < 2; ++iloop) {
|
for (int iloop = 0; iloop < 2; ++iloop) {
|
||||||
@ -1658,11 +1678,11 @@ int Feb_Control_ReadRegister(uint32_t offset, uint32_t *retval) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Inconsistent values
|
// Inconsistent values when reading both registers
|
||||||
if (value[0] != value[1]) {
|
if ((run[0] & run[1]) & (value[0] != value[1])) {
|
||||||
LOG(logERROR,
|
LOG(logERROR,
|
||||||
("Inconsistent values read from left 0x%x and right 0x%x\n",
|
("Inconsistent values read from %s 0x%x and %s 0x%x\n",
|
||||||
value[0], value[1]));
|
side[0], value[0], side[1], value[1]));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
|
Binary file not shown.
BIN
slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServerv6.1.2
Executable file
BIN
slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServerv6.1.2
Executable file
Binary file not shown.
@ -1158,6 +1158,8 @@ int setModule(sls_detector_module myMod, char *mess) {
|
|||||||
|
|
||||||
// if quad, set M8 and PROGRAM manually
|
// if quad, set M8 and PROGRAM manually
|
||||||
if (!Feb_Control_SetChipSignalsToTrimQuad(1)) {
|
if (!Feb_Control_SetChipSignalsToTrimQuad(1)) {
|
||||||
|
sprintf(mess, "Could not set module. Could not enable chip signals to set trimbits\n");
|
||||||
|
LOG(logERROR, (mess));
|
||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1170,6 +1172,8 @@ int setModule(sls_detector_module myMod, char *mess) {
|
|||||||
|
|
||||||
// if quad, reset M8 and PROGRAM manually
|
// if quad, reset M8 and PROGRAM manually
|
||||||
if (!Feb_Control_SetChipSignalsToTrimQuad(0)) {
|
if (!Feb_Control_SetChipSignalsToTrimQuad(0)) {
|
||||||
|
sprintf(mess, "Could not set module. Could not disable chip signals to set trimbits\n");
|
||||||
|
LOG(logERROR, (mess));
|
||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1179,6 +1183,8 @@ int setModule(sls_detector_module myMod, char *mess) {
|
|||||||
|
|
||||||
// if quad, reset M8 and PROGRAM manually
|
// if quad, reset M8 and PROGRAM manually
|
||||||
if (!Feb_Control_SetChipSignalsToTrimQuad(0)) {
|
if (!Feb_Control_SetChipSignalsToTrimQuad(0)) {
|
||||||
|
sprintf(mess, "Could not set module. Could not disable chip signals to set trimbits\n");
|
||||||
|
LOG(logERROR, (mess));
|
||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2211,43 +2217,44 @@ int setTransmissionDelayRight(int value) {
|
|||||||
|
|
||||||
/* aquisition */
|
/* aquisition */
|
||||||
|
|
||||||
int prepareAcquisition() {
|
|
||||||
#ifndef VIRTUAL
|
|
||||||
sharedMemory_lockLocalLink();
|
|
||||||
LOG(logINFO, ("Going to prepare for acquisition with counter_bit:%d\n",
|
|
||||||
Feb_Control_Get_Counter_Bit()));
|
|
||||||
Feb_Control_PrepareForAcquisition();
|
|
||||||
sharedMemory_unlockLocalLink();
|
|
||||||
#endif
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
int startStateMachine() {
|
int startStateMachine() {
|
||||||
|
sharedMemory_lockAcqFlag();
|
||||||
|
|
||||||
#ifdef VIRTUAL
|
#ifdef VIRTUAL
|
||||||
// create udp socket
|
// create udp socket
|
||||||
if (createUDPSocket(0) != OK) {
|
if (createUDPSocket(0) != OK) {
|
||||||
|
sharedMemory_unlockAcqFlag();
|
||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
if (createUDPSocket(1) != OK) {
|
if (createUDPSocket(1) != OK) {
|
||||||
|
sharedMemory_unlockAcqFlag();
|
||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
LOG(logINFOBLUE, ("Starting State Machine\n"));
|
LOG(logINFOBLUE, ("Starting State Machine\n"));
|
||||||
if (sharedMemory_getStop() != 0) {
|
if (sharedMemory_getStop() != 0) {
|
||||||
LOG(logERROR, ("Cant start acquisition. "
|
LOG(logERROR, ("Cant start acquisition. "
|
||||||
"Stop server has not updated stop status to 0\n"));
|
"Stop server has not updated stop status to 0\n"));
|
||||||
|
sharedMemory_unlockAcqFlag();
|
||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
sharedMemory_setStatus(RUNNING);
|
sharedMemory_setStatus(RUNNING);
|
||||||
if (pthread_create(&virtual_tid, NULL, &start_timer, NULL)) {
|
if (pthread_create(&virtual_tid, NULL, &start_timer, NULL)) {
|
||||||
LOG(logERROR, ("Could not start Virtual acquisition thread\n"));
|
LOG(logERROR, ("Could not start Virtual acquisition thread\n"));
|
||||||
sharedMemory_setStatus(IDLE);
|
sharedMemory_setStatus(IDLE);
|
||||||
|
sharedMemory_unlockAcqFlag();
|
||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
LOG(logINFO, ("Virtual Acquisition started\n"));
|
LOG(logINFO, ("Virtual Acquisition started\n"));
|
||||||
|
sharedMemory_unlockAcqFlag();
|
||||||
return OK;
|
return OK;
|
||||||
#else
|
#else
|
||||||
sharedMemory_lockLocalLink();
|
sharedMemory_lockLocalLink();
|
||||||
LOG(logINFO, ("Acquisition started bit toggled\n"));
|
|
||||||
|
LOG(logINFO, ("Going to prepare for acquisition with counter_bit:%d\n",
|
||||||
|
Feb_Control_Get_Counter_Bit()));
|
||||||
|
Feb_Control_PrepareForAcquisition();
|
||||||
|
|
||||||
|
|
||||||
int ret = OK, prev_flag;
|
int ret = OK, prev_flag;
|
||||||
// get the DAQ toggle bit
|
// get the DAQ toggle bit
|
||||||
prev_flag = Feb_Control_AcquisitionStartedBit();
|
prev_flag = Feb_Control_AcquisitionStartedBit();
|
||||||
@ -2264,12 +2271,14 @@ int startStateMachine() {
|
|||||||
LOG(logERROR,
|
LOG(logERROR,
|
||||||
("Acquisition did not LOG(logERROR ouble reading register\n"));
|
("Acquisition did not LOG(logERROR ouble reading register\n"));
|
||||||
sharedMemory_unlockLocalLink();
|
sharedMemory_unlockLocalLink();
|
||||||
|
sharedMemory_unlockAcqFlag();
|
||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
|
usleep(100 * 1000);
|
||||||
LOG(logINFOGREEN, ("Acquisition started\n"));
|
LOG(logINFOGREEN, ("Acquisition started\n"));
|
||||||
}
|
}
|
||||||
sharedMemory_unlockLocalLink();
|
sharedMemory_unlockLocalLink();
|
||||||
|
sharedMemory_unlockAcqFlag();
|
||||||
return ret;
|
return ret;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@ -2502,6 +2511,10 @@ void *start_timer(void *arg) {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
int stopStateMachine() {
|
int stopStateMachine() {
|
||||||
|
|
||||||
|
// acq lock for seamless stop
|
||||||
|
sharedMemory_lockAcqFlag();
|
||||||
|
|
||||||
LOG(logINFORED, ("Stopping state machine\n"));
|
LOG(logINFORED, ("Stopping state machine\n"));
|
||||||
// if scan active, stop scan
|
// if scan active, stop scan
|
||||||
if (sharedMemory_getScanStatus() == RUNNING) {
|
if (sharedMemory_getScanStatus() == RUNNING) {
|
||||||
@ -2514,13 +2527,15 @@ int stopStateMachine() {
|
|||||||
usleep(500);
|
usleep(500);
|
||||||
sharedMemory_setStop(0);
|
sharedMemory_setStop(0);
|
||||||
LOG(logINFO, ("Stopped State Machine\n"));
|
LOG(logINFO, ("Stopped State Machine\n"));
|
||||||
|
sharedMemory_unlockAcqFlag();
|
||||||
return OK;
|
return OK;
|
||||||
#else
|
#else
|
||||||
sharedMemory_lockLocalLink();
|
sharedMemory_lockLocalLink();
|
||||||
// sends last frames from fifo and wait for feb processing done
|
// sends last frames from fifo and wait for feb processing done
|
||||||
if ((Feb_Control_StopAcquisition() != STATUS_IDLE)) {
|
if (!Feb_Control_StopAcquisition()) {
|
||||||
LOG(logERROR, ("failed to stop acquisition\n"));
|
LOG(logERROR, ("failed to stop acquisition\n"));
|
||||||
sharedMemory_unlockLocalLink();
|
sharedMemory_unlockLocalLink();
|
||||||
|
sharedMemory_unlockAcqFlag();
|
||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
sharedMemory_unlockLocalLink();
|
sharedMemory_unlockLocalLink();
|
||||||
@ -2531,6 +2546,7 @@ int stopStateMachine() {
|
|||||||
// wait for beb to send out all packets
|
// wait for beb to send out all packets
|
||||||
if (Beb_IsTransmitting(&isTransmitting, send_to_ten_gig, 1) == FAIL) {
|
if (Beb_IsTransmitting(&isTransmitting, send_to_ten_gig, 1) == FAIL) {
|
||||||
LOG(logERROR, ("failed to stop beb acquisition\n"));
|
LOG(logERROR, ("failed to stop beb acquisition\n"));
|
||||||
|
sharedMemory_unlockAcqFlag();
|
||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
if (isTransmitting) {
|
if (isTransmitting) {
|
||||||
@ -2545,6 +2561,7 @@ int stopStateMachine() {
|
|||||||
sharedMemory_unlockLocalLink();
|
sharedMemory_unlockLocalLink();
|
||||||
if (!Beb_StopAcquisition()) {
|
if (!Beb_StopAcquisition()) {
|
||||||
LOG(logERROR, ("failed to stop acquisition\n"));
|
LOG(logERROR, ("failed to stop acquisition\n"));
|
||||||
|
sharedMemory_unlockAcqFlag();
|
||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2554,6 +2571,7 @@ int stopStateMachine() {
|
|||||||
Beb_SetNextFrameNumber(retval + 1);
|
Beb_SetNextFrameNumber(retval + 1);
|
||||||
}
|
}
|
||||||
LOG(logINFOBLUE, ("Stopping state machine complete\n\n"));
|
LOG(logINFOBLUE, ("Stopping state machine complete\n\n"));
|
||||||
|
sharedMemory_unlockAcqFlag();
|
||||||
return OK;
|
return OK;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@ -2637,7 +2655,8 @@ void readFrame(int *ret, char *mess) {
|
|||||||
sharedMemory_lockLocalLink();
|
sharedMemory_lockLocalLink();
|
||||||
if (Feb_Control_WaitForFinishedFlag(5000, 1) == STATUS_ERROR) {
|
if (Feb_Control_WaitForFinishedFlag(5000, 1) == STATUS_ERROR) {
|
||||||
sharedMemory_unlockLocalLink();
|
sharedMemory_unlockLocalLink();
|
||||||
LOG(logERROR, ("Waiting for finished flag\n"));
|
strcpy(mess, "Could not wait for finished flag\n");
|
||||||
|
LOG(logERROR, (mess));
|
||||||
*ret = FAIL;
|
*ret = FAIL;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -2653,6 +2672,7 @@ void readFrame(int *ret, char *mess) {
|
|||||||
sharedMemory_unlockLocalLink();
|
sharedMemory_unlockLocalLink();
|
||||||
if (i == STATUS_ERROR) {
|
if (i == STATUS_ERROR) {
|
||||||
strcpy(mess, "Could not read feb processing done register\n");
|
strcpy(mess, "Could not read feb processing done register\n");
|
||||||
|
LOG(logERROR, (mess));
|
||||||
*ret = (int)FAIL;
|
*ret = (int)FAIL;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -2664,6 +2684,7 @@ void readFrame(int *ret, char *mess) {
|
|||||||
// wait for beb to send out all packets
|
// wait for beb to send out all packets
|
||||||
if (Beb_IsTransmitting(&isTransmitting, send_to_ten_gig, 1) == FAIL) {
|
if (Beb_IsTransmitting(&isTransmitting, send_to_ten_gig, 1) == FAIL) {
|
||||||
strcpy(mess, "Could not read delay counters\n");
|
strcpy(mess, "Could not read delay counters\n");
|
||||||
|
LOG(logERROR, (mess));
|
||||||
*ret = (int)FAIL;
|
*ret = (int)FAIL;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
slsDetectorServers/jungfrauDetectorServer/bin/jungfrauDetectorServerv6.1.2
Executable file
BIN
slsDetectorServers/jungfrauDetectorServer/bin/jungfrauDetectorServerv6.1.2
Executable file
Binary file not shown.
@ -2646,6 +2646,7 @@ int stopStateMachine() {
|
|||||||
|
|
||||||
LOG(logINFO, ("Status Register: %08x\n", bus_r(STATUS_REG)));
|
LOG(logINFO, ("Status Register: %08x\n", bus_r(STATUS_REG)));
|
||||||
|
|
||||||
|
usleep(100 * 1000);
|
||||||
resetCore();
|
resetCore();
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
Binary file not shown.
BIN
slsDetectorServers/moenchDetectorServer/bin/moenchDetectorServerv6.1.2
Executable file
BIN
slsDetectorServers/moenchDetectorServer/bin/moenchDetectorServerv6.1.2
Executable file
Binary file not shown.
Binary file not shown.
@ -11,12 +11,11 @@
|
|||||||
#define BLACKFIN_DEFINED
|
#define BLACKFIN_DEFINED
|
||||||
|
|
||||||
int defineGPIOpins(char *mess);
|
int defineGPIOpins(char *mess);
|
||||||
int FPGAdontTouchFlash(char *mess);
|
int FPGAdontTouchFlash(char *mess, int programming);
|
||||||
int FPGATouchFlash(char *mess);
|
int FPGATouchFlash(char *mess, int programming);
|
||||||
int resetFPGA(char *mess);
|
int resetFPGA(char *mess);
|
||||||
|
|
||||||
int emptyTempFolder(char *mess);
|
int emptyTempFolder(char *mess);
|
||||||
int allowUpdate(char *mess, char *functionType);
|
|
||||||
/**
|
/**
|
||||||
* deletes old file
|
* deletes old file
|
||||||
* verify memory available to copy
|
* verify memory available to copy
|
||||||
|
@ -25,4 +25,6 @@ int sharedMemory_getScanStop();
|
|||||||
#ifdef EIGERD
|
#ifdef EIGERD
|
||||||
void sharedMemory_lockLocalLink();
|
void sharedMemory_lockLocalLink();
|
||||||
void sharedMemory_unlockLocalLink();
|
void sharedMemory_unlockLocalLink();
|
||||||
|
void sharedMemory_lockAcqFlag();
|
||||||
|
void sharedMemory_unlockAcqFlag();
|
||||||
#endif
|
#endif
|
@ -600,9 +600,6 @@ int setTransmissionDelayRight(int value);
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
// aquisition
|
// aquisition
|
||||||
#ifdef EIGERD
|
|
||||||
int prepareAcquisition();
|
|
||||||
#endif
|
|
||||||
int startStateMachine();
|
int startStateMachine();
|
||||||
#ifdef VIRTUAL
|
#ifdef VIRTUAL
|
||||||
void *start_timer(void *arg);
|
void *start_timer(void *arg);
|
||||||
|
@ -18,8 +18,11 @@
|
|||||||
#define CMD_GPIO9_DEFINE "echo 9 > /sys/class/gpio/export"
|
#define CMD_GPIO9_DEFINE "echo 9 > /sys/class/gpio/export"
|
||||||
#define CMD_GPIO3_DEFINE "echo 3 > /sys/class/gpio/export"
|
#define CMD_GPIO3_DEFINE "echo 3 > /sys/class/gpio/export"
|
||||||
|
|
||||||
|
// N config done
|
||||||
#define CMD_GPIO7_EXIST "/sys/class/gpio/gpio7"
|
#define CMD_GPIO7_EXIST "/sys/class/gpio/gpio7"
|
||||||
|
// N Config
|
||||||
#define CMD_GPIO9_EXIST "/sys/class/gpio/gpio9"
|
#define CMD_GPIO9_EXIST "/sys/class/gpio/gpio9"
|
||||||
|
// N CE (access to AS interface)
|
||||||
#define CMD_GPIO3_EXIST "/sys/class/gpio/gpio3"
|
#define CMD_GPIO3_EXIST "/sys/class/gpio/gpio3"
|
||||||
|
|
||||||
#define CMD_GPIO9_DEFINE_OUT "echo out > /sys/class/gpio/gpio9/direction"
|
#define CMD_GPIO9_DEFINE_OUT "echo out > /sys/class/gpio/gpio9/direction"
|
||||||
@ -28,8 +31,11 @@
|
|||||||
#define CMD_GPIO9_DEFINE_IN "echo in > /sys/class/gpio/gpio9/direction"
|
#define CMD_GPIO9_DEFINE_IN "echo in > /sys/class/gpio/gpio9/direction"
|
||||||
#define CMD_GPIO3_DEFINE_IN "echo in > /sys/class/gpio/gpio3/direction"
|
#define CMD_GPIO3_DEFINE_IN "echo in > /sys/class/gpio/gpio3/direction"
|
||||||
|
|
||||||
|
// nConfig
|
||||||
#define CMD_GPIO9_DONT_TOUCH_FLASH "echo 0 > /sys/class/gpio/gpio9/value"
|
#define CMD_GPIO9_DONT_TOUCH_FLASH "echo 0 > /sys/class/gpio/gpio9/value"
|
||||||
#define CMD_GPIO3_DONT_TOUCH_FLASH "echo 0 > /sys/class/gpio/gpio3/value"
|
// nCE
|
||||||
|
#define CMD_GPIO3_DONT_TOUCH_FLASH "echo 1 > /sys/class/gpio/gpio3/value"
|
||||||
|
// CD
|
||||||
#define CMD_FPGA_PICKED_STATUS "cat /sys/class/gpio/gpio7/value"
|
#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_FPGA_FLASH_DRIVE "awk \'$4== \"\\\"bitfile(spi)\\\"\" {print $1}\' /proc/mtd"
|
||||||
@ -65,7 +71,7 @@ int defineGPIOpins(char *mess) {
|
|||||||
if (FAIL == validateKernelVersion(KERNEL_DATE_VRSN_3GPIO)) {
|
if (FAIL == validateKernelVersion(KERNEL_DATE_VRSN_3GPIO)) {
|
||||||
latestKernelVerified = 0;
|
latestKernelVerified = 0;
|
||||||
LOG(logWARNING,
|
LOG(logWARNING,
|
||||||
("Kernel too old to use gpio 3 pins. Update kernel to "
|
("Kernel too old to use gpio3 (nCE). Update kernel to "
|
||||||
"guarantee error-free fpga programming. \n\tNot the end "
|
"guarantee error-free fpga programming. \n\tNot the end "
|
||||||
"of the world. Continuing with current kernel...\n"));
|
"of the world. Continuing with current kernel...\n"));
|
||||||
} else {
|
} else {
|
||||||
@ -78,35 +84,35 @@ int defineGPIOpins(char *mess) {
|
|||||||
if (access(CMD_GPIO7_EXIST, F_OK) != 0) {
|
if (access(CMD_GPIO7_EXIST, F_OK) != 0) {
|
||||||
if (executeCommand(CMD_GPIO7_DEFINE, retvals, logDEBUG1) == FAIL) {
|
if (executeCommand(CMD_GPIO7_DEFINE, retvals, logDEBUG1) == FAIL) {
|
||||||
snprintf(mess, MAX_STR_LENGTH,
|
snprintf(mess, MAX_STR_LENGTH,
|
||||||
"Could not define gpio7 pins for fpga (%s)\n", retvals);
|
"Could not define gpio7 (CD) for fpga (%s)\n", retvals);
|
||||||
LOG(logERROR, (mess));
|
LOG(logERROR, (mess));
|
||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
LOG(logINFO, ("\tgpio7: defined\n"));
|
LOG(logINFO, ("\tgpio7 (CD): defined\n"));
|
||||||
} else {
|
} else {
|
||||||
LOG(logINFO, ("\tgpio7: already defined\n"));
|
LOG(logINFO, ("\tgpio7 (CD): already defined\n"));
|
||||||
}
|
}
|
||||||
|
|
||||||
// define gpio7 direction
|
// define gpio7 direction
|
||||||
if (executeCommand(CMD_GPIO7_DEFINE_IN, retvals, logDEBUG1) == FAIL) {
|
if (executeCommand(CMD_GPIO7_DEFINE_IN, retvals, logDEBUG1) == FAIL) {
|
||||||
snprintf(mess, MAX_STR_LENGTH,
|
snprintf(mess, MAX_STR_LENGTH,
|
||||||
"Could not set gpio7 as input for fpga (%s)\n", retvals);
|
"Could not set gpio7 (CD) as input for fpga (%s)\n", retvals);
|
||||||
LOG(logERROR, (mess));
|
LOG(logERROR, (mess));
|
||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
LOG(logINFO, ("\tgpio7: setting intput\n"));
|
LOG(logINFO, ("\tgpio7 (CD): setting intput\n"));
|
||||||
|
|
||||||
// define gpio9
|
// define gpio9
|
||||||
if (access(CMD_GPIO9_EXIST, F_OK) != 0) {
|
if (access(CMD_GPIO9_EXIST, F_OK) != 0) {
|
||||||
if (executeCommand(CMD_GPIO9_DEFINE, retvals, logDEBUG1) == FAIL) {
|
if (executeCommand(CMD_GPIO9_DEFINE, retvals, logDEBUG1) == FAIL) {
|
||||||
snprintf(mess, MAX_STR_LENGTH,
|
snprintf(mess, MAX_STR_LENGTH,
|
||||||
"Could not define gpio9 pins for fpga (%s)\n", retvals);
|
"Could not define gpio9 (nConfig) for fpga (%s)\n", retvals);
|
||||||
LOG(logERROR, (mess));
|
LOG(logERROR, (mess));
|
||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
LOG(logINFO, ("\tgpio9: defined\n"));
|
LOG(logINFO, ("\tgpio9 (nConfig): defined\n"));
|
||||||
} else {
|
} else {
|
||||||
LOG(logINFO, ("\tgpio9: already defined\n"));
|
LOG(logINFO, ("\tgpio9 (nConfig): already defined\n"));
|
||||||
}
|
}
|
||||||
|
|
||||||
// define gpio3 (not chip enable)
|
// define gpio3 (not chip enable)
|
||||||
@ -114,21 +120,21 @@ int defineGPIOpins(char *mess) {
|
|||||||
if (access(CMD_GPIO3_EXIST, F_OK) != 0) {
|
if (access(CMD_GPIO3_EXIST, F_OK) != 0) {
|
||||||
if (executeCommand(CMD_GPIO3_DEFINE, retvals, logDEBUG1) == FAIL) {
|
if (executeCommand(CMD_GPIO3_DEFINE, retvals, logDEBUG1) == FAIL) {
|
||||||
snprintf(mess, MAX_STR_LENGTH,
|
snprintf(mess, MAX_STR_LENGTH,
|
||||||
"Could not define gpio3 pins for fpga (%s)\n",
|
"Could not define gpio3 (nCE) for fpga (%s)\n",
|
||||||
retvals);
|
retvals);
|
||||||
LOG(logERROR, (mess));
|
LOG(logERROR, (mess));
|
||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
LOG(logINFO, ("\tgpio3: defined\n"));
|
LOG(logINFO, ("\tgpio3 (nCE): defined\n"));
|
||||||
} else {
|
} else {
|
||||||
LOG(logINFO, ("\tgpio3: already defined\n"));
|
LOG(logINFO, ("\tgpio3 (nCE): already defined\n"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
int FPGAdontTouchFlash(char *mess) {
|
int FPGAdontTouchFlash(char *mess, int programming) {
|
||||||
#ifdef VIRTUAL
|
#ifdef VIRTUAL
|
||||||
return OK;
|
return OK;
|
||||||
#endif
|
#endif
|
||||||
@ -136,51 +142,51 @@ int FPGAdontTouchFlash(char *mess) {
|
|||||||
// define gpio9 as output
|
// define gpio9 as output
|
||||||
if (executeCommand(CMD_GPIO9_DEFINE_OUT, retvals, logDEBUG1) == FAIL) {
|
if (executeCommand(CMD_GPIO9_DEFINE_OUT, retvals, logDEBUG1) == FAIL) {
|
||||||
snprintf(mess, MAX_STR_LENGTH,
|
snprintf(mess, MAX_STR_LENGTH,
|
||||||
"Could not set gpio9 as output for fpga (%s)\n", retvals);
|
"Could not set gpio9 (nConfig) as output for fpga (%s)\n", retvals);
|
||||||
LOG(logERROR, (mess));
|
LOG(logERROR, (mess));
|
||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
LOG(logINFO, ("\tgpio9: setting output\n"));
|
LOG(logINFO, ("\tgpio9 (nConfig): setting output\n"));
|
||||||
|
|
||||||
// define gpio3 as output
|
// define gpio3 as output
|
||||||
if (latestKernelVerified == 1) {
|
if (programming && latestKernelVerified == 1) {
|
||||||
if (executeCommand(CMD_GPIO3_DEFINE_OUT, retvals, logDEBUG1) == FAIL) {
|
if (executeCommand(CMD_GPIO3_DEFINE_OUT, retvals, logDEBUG1) == FAIL) {
|
||||||
snprintf(mess, MAX_STR_LENGTH,
|
snprintf(mess, MAX_STR_LENGTH,
|
||||||
"Could not set gpio3 as output for fpga (%s)\n", retvals);
|
"Could not set gpio3 (nCE) as output for fpga (%s)\n", retvals);
|
||||||
LOG(logERROR, (mess));
|
LOG(logERROR, (mess));
|
||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
LOG(logINFO, ("\tgpio3: setting output\n"));
|
LOG(logINFO, ("\tgpio3 (nCE): setting output\n"));
|
||||||
}
|
}
|
||||||
|
|
||||||
// tell FPGA to not: gpio9
|
// tell FPGA to not: gpio9
|
||||||
if (executeCommand(CMD_GPIO9_DONT_TOUCH_FLASH, retvals, logDEBUG1) ==
|
if (executeCommand(CMD_GPIO9_DONT_TOUCH_FLASH, retvals, logDEBUG1) ==
|
||||||
FAIL) {
|
FAIL) {
|
||||||
snprintf(mess, MAX_STR_LENGTH,
|
snprintf(mess, MAX_STR_LENGTH,
|
||||||
"Could not set gpio9 to not touch flash for fpga (%s)\n",
|
"Could not set gpio9 (nConfig) to not touch flash for fpga (%s)\n",
|
||||||
retvals);
|
retvals);
|
||||||
LOG(logERROR, (mess));
|
LOG(logERROR, (mess));
|
||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
LOG(logINFO, ("\tgpio9: fpga dont touch flash\n"));
|
LOG(logINFO, ("\tgpio9 (nConfig): fpga dont touch flash (Low)\n"));
|
||||||
|
|
||||||
// tell FPGA to not: gpio3
|
// tell FPGA to not: gpio3
|
||||||
if (latestKernelVerified == 1) {
|
if (programming && latestKernelVerified == 1) {
|
||||||
if (executeCommand(CMD_GPIO3_DONT_TOUCH_FLASH, retvals, logDEBUG1) ==
|
if (executeCommand(CMD_GPIO3_DONT_TOUCH_FLASH, retvals, logDEBUG1) ==
|
||||||
FAIL) {
|
FAIL) {
|
||||||
snprintf(mess, MAX_STR_LENGTH,
|
snprintf(mess, MAX_STR_LENGTH,
|
||||||
"Could not set gpio3 to not touch flash for fpga (%s)\n",
|
"Could not set gpio3 (nCE) to not touch flash for fpga (%s)\n",
|
||||||
retvals);
|
retvals);
|
||||||
LOG(logERROR, (mess));
|
LOG(logERROR, (mess));
|
||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
LOG(logINFO, ("\tgpio3: fpga dont touch flash\n"));
|
LOG(logINFO, ("\tgpio3 (nCE): fpga dont touch flash (High)\n"));
|
||||||
}
|
}
|
||||||
// usleep(100*1000);
|
// usleep(100*1000);
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
int FPGATouchFlash(char *mess) {
|
int FPGATouchFlash(char *mess, int programming) {
|
||||||
#ifdef VIRTUAL
|
#ifdef VIRTUAL
|
||||||
return OK;
|
return OK;
|
||||||
#endif
|
#endif
|
||||||
@ -188,20 +194,20 @@ int FPGATouchFlash(char *mess) {
|
|||||||
// tell FPGA to touch flash to program itself
|
// tell FPGA to touch flash to program itself
|
||||||
if (executeCommand(CMD_GPIO9_DEFINE_IN, retvals, logDEBUG1) == FAIL) {
|
if (executeCommand(CMD_GPIO9_DEFINE_IN, retvals, logDEBUG1) == FAIL) {
|
||||||
snprintf(mess, MAX_STR_LENGTH,
|
snprintf(mess, MAX_STR_LENGTH,
|
||||||
"Could not set gpio9 as input for fpga (%s)\n", retvals);
|
"Could not set gpio9 (nConfig) as input for fpga (%s)\n", retvals);
|
||||||
LOG(logERROR, (mess));
|
LOG(logERROR, (mess));
|
||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
LOG(logINFO, ("\tgpio9: setting input\n"));
|
LOG(logINFO, ("\tgpio9 (nConfig): setting input\n"));
|
||||||
|
|
||||||
if (latestKernelVerified == 1) {
|
if (programming && latestKernelVerified == 1) {
|
||||||
if (executeCommand(CMD_GPIO3_DEFINE_IN, retvals, logDEBUG1) == FAIL) {
|
if (executeCommand(CMD_GPIO3_DEFINE_IN, retvals, logDEBUG1) == FAIL) {
|
||||||
snprintf(mess, MAX_STR_LENGTH,
|
snprintf(mess, MAX_STR_LENGTH,
|
||||||
"Could not set gpio3 as input for fpga (%s)\n", retvals);
|
"Could not set gpio3 (nCE) as input for fpga (%s)\n", retvals);
|
||||||
LOG(logERROR, (mess));
|
LOG(logERROR, (mess));
|
||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
LOG(logINFO, ("\tgpio3: setting input\n"));
|
LOG(logINFO, ("\tgpio3 (nCE): setting input\n"));
|
||||||
}
|
}
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
@ -211,10 +217,10 @@ int resetFPGA(char *mess) {
|
|||||||
#ifdef VIRTUAL
|
#ifdef VIRTUAL
|
||||||
return OK;
|
return OK;
|
||||||
#endif
|
#endif
|
||||||
if (FPGAdontTouchFlash(mess) == FAIL) {
|
if (FPGAdontTouchFlash(mess, 0) == FAIL) {
|
||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
if (FPGATouchFlash(mess) == FAIL) {
|
if (FPGATouchFlash(mess, 0) == FAIL) {
|
||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
usleep(CTRL_SRVR_INIT_TIME_US);
|
usleep(CTRL_SRVR_INIT_TIME_US);
|
||||||
@ -248,41 +254,6 @@ int emptyTempFolder(char *mess) {
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
int allowUpdate(char *mess, char *functionType) {
|
|
||||||
LOG(logINFO, ("\tVerifying %s allowed...\n", functionType));
|
|
||||||
|
|
||||||
#ifdef VIRTUAL
|
|
||||||
return OK;
|
|
||||||
#endif
|
|
||||||
char retvals[MAX_STR_LENGTH] = {0};
|
|
||||||
if (executeCommand(CMD_GET_AMD_FLASH, retvals, logDEBUG1) == FAIL) {
|
|
||||||
// no amd found
|
|
||||||
if (strstr(retvals, "No result") != NULL) {
|
|
||||||
LOG(logINFO, ("\tNot Amd Flash\n"));
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
// could not figure out if amd
|
|
||||||
snprintf(
|
|
||||||
mess, MAX_STR_LENGTH,
|
|
||||||
"Could not update %s. (Could not figure out if Amd flash: %s)\n",
|
|
||||||
functionType, retvals);
|
|
||||||
LOG(logERROR, (mess));
|
|
||||||
return FAIL;
|
|
||||||
}
|
|
||||||
// amd, only current kernel works with amd flash
|
|
||||||
if (validateKernelVersion(KERNEL_DATE_VRSN_3GPIO) == FAIL) {
|
|
||||||
getKernelVersion(retvals);
|
|
||||||
snprintf(mess, MAX_STR_LENGTH,
|
|
||||||
"Could not update %s. Kernel version %s is too old to "
|
|
||||||
"update the Amd flash/ root directory. Most likely, blackfin needs rescue or replacement. Please contact us.\n",
|
|
||||||
functionType, retvals);
|
|
||||||
LOG(logERROR, (mess));
|
|
||||||
return FAIL;
|
|
||||||
}
|
|
||||||
LOG(logINFO, ("\tAmd flash with compatible kernel version\n"));
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
int preparetoCopyProgram(char *mess, char *functionType, FILE **fd,
|
int preparetoCopyProgram(char *mess, char *functionType, FILE **fd,
|
||||||
uint64_t fsize) {
|
uint64_t fsize) {
|
||||||
|
|
||||||
@ -335,7 +306,7 @@ int eraseAndWriteToFlash(char *mess, enum PROGRAM_INDEX index,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (index == PROGRAM_FPGA) {
|
if (index == PROGRAM_FPGA) {
|
||||||
if (FPGAdontTouchFlash(mess) == FAIL) {
|
if (FPGAdontTouchFlash(mess, 1) == FAIL) {
|
||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -564,14 +535,14 @@ int writeToFlash(char *mess, ssize_t fsize, FILE *flashfd, FILE *srcfd) {
|
|||||||
|
|
||||||
int waitForFPGAtoTouchFlash(char *mess) {
|
int waitForFPGAtoTouchFlash(char *mess) {
|
||||||
// touch and program
|
// touch and program
|
||||||
if (FPGATouchFlash(mess) == FAIL) {
|
if (FPGATouchFlash(mess, 1) == FAIL) {
|
||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef VIRTUAL
|
#ifdef VIRTUAL
|
||||||
return OK;
|
return OK;
|
||||||
#endif
|
#endif
|
||||||
LOG(logINFO, ("\tWaiting for FPGA to program from flash\n"));
|
LOG(logINFO, ("\tWaiting for FPGA to program from flash... \n\t[gpio7 (CD) should be High when done]\n"));
|
||||||
int timeSpent = 0;
|
int timeSpent = 0;
|
||||||
|
|
||||||
int result = 0;
|
int result = 0;
|
||||||
@ -609,8 +580,8 @@ int waitForFPGAtoTouchFlash(char *mess) {
|
|||||||
LOG(logERROR, (mess));
|
LOG(logERROR, (mess));
|
||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
LOG(logDEBUG1, ("gpi07 returned %d\n", result));
|
LOG(logDEBUG1, ("gpi07 (CD)returned %d\n", result));
|
||||||
}
|
}
|
||||||
LOG(logINFO, ("\tFPGA has picked up the program from flash\n"));
|
LOG(logINFO, ("\tFPGA has picked up the program from flash. gpio7 (CD) is High\n"));
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
@ -20,6 +20,7 @@ typedef struct Memory {
|
|||||||
pthread_mutex_t lockStatus;
|
pthread_mutex_t lockStatus;
|
||||||
#ifdef EIGERD
|
#ifdef EIGERD
|
||||||
pthread_mutex_t lockLocalLink;
|
pthread_mutex_t lockLocalLink;
|
||||||
|
pthread_mutex_t lockAcqFlag;
|
||||||
#endif
|
#endif
|
||||||
enum runStatus scanStatus; // idle, running or error
|
enum runStatus scanStatus; // idle, running or error
|
||||||
int scanStop;
|
int scanStop;
|
||||||
@ -120,6 +121,7 @@ int sharedMemory_initialize() {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef EIGERD
|
#ifdef EIGERD
|
||||||
|
// local link mutex
|
||||||
pthread_mutexattr_t lockLocalLinkAttribute;
|
pthread_mutexattr_t lockLocalLinkAttribute;
|
||||||
if (pthread_mutexattr_init(&lockLocalLinkAttribute) != 0) {
|
if (pthread_mutexattr_init(&lockLocalLinkAttribute) != 0) {
|
||||||
LOG(logERROR,
|
LOG(logERROR,
|
||||||
@ -141,6 +143,28 @@ int sharedMemory_initialize() {
|
|||||||
"shared memory\n"));
|
"shared memory\n"));
|
||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
|
// acq flag mutex
|
||||||
|
pthread_mutexattr_t lockAcqFlagAttribute;
|
||||||
|
if (pthread_mutexattr_init(&lockAcqFlagAttribute) != 0) {
|
||||||
|
LOG(logERROR,
|
||||||
|
("Failed to initialize mutex attribute for lockAcqFlag for "
|
||||||
|
"shared memory\n"));
|
||||||
|
return FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pthread_mutexattr_setpshared(&lockAcqFlagAttribute,
|
||||||
|
PTHREAD_PROCESS_SHARED) != 0) {
|
||||||
|
LOG(logERROR, ("Failed to set attribute property to process shared for "
|
||||||
|
"lockAcqFlag for shared memory\n"));
|
||||||
|
return FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pthread_mutex_init(&(shm->lockAcqFlag), &lockAcqFlagAttribute) !=
|
||||||
|
0) {
|
||||||
|
LOG(logERROR, ("Failed to initialize pthread_mutex_t lockAcqFlag for "
|
||||||
|
"shared memory\n"));
|
||||||
|
return FAIL;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
shm->scanStatus = IDLE;
|
shm->scanStatus = IDLE;
|
||||||
shm->scanStop = 0;
|
shm->scanStop = 0;
|
||||||
@ -266,4 +290,10 @@ void sharedMemory_lockLocalLink() { pthread_mutex_lock(&(shm->lockLocalLink)); }
|
|||||||
void sharedMemory_unlockLocalLink() {
|
void sharedMemory_unlockLocalLink() {
|
||||||
pthread_mutex_unlock(&(shm->lockLocalLink));
|
pthread_mutex_unlock(&(shm->lockLocalLink));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void sharedMemory_lockAcqFlag() { pthread_mutex_lock(&(shm->lockAcqFlag)); }
|
||||||
|
|
||||||
|
void sharedMemory_unlockAcqFlag() {
|
||||||
|
pthread_mutex_unlock(&(shm->lockAcqFlag));
|
||||||
|
}
|
||||||
#endif
|
#endif
|
@ -1499,7 +1499,7 @@ int write_register(int file_des) {
|
|||||||
} else {
|
} else {
|
||||||
if (readRegister(addr, &retval) == FAIL) {
|
if (readRegister(addr, &retval) == FAIL) {
|
||||||
ret = FAIL;
|
ret = FAIL;
|
||||||
sprintf(mess, "Could not read register 0x%x.\n", addr);
|
sprintf(mess, "Could not read register 0x%x or inconsistent values. Try to read +0x100 for only left and +0x200 for only right.\n", addr);
|
||||||
LOG(logERROR, (mess));
|
LOG(logERROR, (mess));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1537,7 +1537,7 @@ int read_register(int file_des) {
|
|||||||
#elif EIGERD
|
#elif EIGERD
|
||||||
if (readRegister(addr, &retval) == FAIL) {
|
if (readRegister(addr, &retval) == FAIL) {
|
||||||
ret = FAIL;
|
ret = FAIL;
|
||||||
sprintf(mess, "Could not read register 0x%x.\n", addr);
|
sprintf(mess, "Could not read register 0x%x or inconsistent values. Try +0x100 for only left and +0x200 for only right..\n", addr);
|
||||||
LOG(logERROR, (mess));
|
LOG(logERROR, (mess));
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
@ -1909,9 +1909,6 @@ void *start_state_machine(void *arg) {
|
|||||||
}
|
}
|
||||||
usleep(scanSettleTime_ns / 1000);
|
usleep(scanSettleTime_ns / 1000);
|
||||||
}
|
}
|
||||||
#ifdef EIGERD
|
|
||||||
prepareAcquisition();
|
|
||||||
#endif
|
|
||||||
ret = startStateMachine();
|
ret = startStateMachine();
|
||||||
LOG(logDEBUG2, ("Starting Acquisition ret: %d\n", ret));
|
LOG(logDEBUG2, ("Starting Acquisition ret: %d\n", ret));
|
||||||
if (ret == FAIL) {
|
if (ret == FAIL) {
|
||||||
@ -2984,6 +2981,10 @@ int validateAndSetAllTrimbits(int arg) {
|
|||||||
LOG(logERROR, (mess));
|
LOG(logERROR, (mess));
|
||||||
} else {
|
} else {
|
||||||
ret = setAllTrimbits(arg);
|
ret = setAllTrimbits(arg);
|
||||||
|
if (ret == FAIL) {
|
||||||
|
strcpy(mess, "Could not set all trimbits\n");
|
||||||
|
LOG(logERROR, (mess));
|
||||||
|
}
|
||||||
#ifdef EIGERD
|
#ifdef EIGERD
|
||||||
// changes settings to undefined
|
// changes settings to undefined
|
||||||
if (getSettings() != UNDEFINED) {
|
if (getSettings() != UNDEFINED) {
|
||||||
@ -4143,28 +4144,21 @@ int copy_detector_server(int file_des) {
|
|||||||
LOG(logINFOBLUE, ("Copying server %s from host %s\n", sname, hostname));
|
LOG(logINFOBLUE, ("Copying server %s from host %s\n", sname, hostname));
|
||||||
char cmd[MAX_STR_LENGTH] = {0};
|
char cmd[MAX_STR_LENGTH] = {0};
|
||||||
|
|
||||||
#ifdef BLACKFIN_DEFINED
|
|
||||||
// check update is allowed (Non Amd OR AMD + current kernel)
|
|
||||||
ret = allowUpdate(mess, "copy detector server");
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// tftp server
|
// tftp server
|
||||||
if (ret == OK) {
|
if (snprintf(cmd, MAX_STR_LENGTH, "tftp %s -r %s -g", hostname,
|
||||||
if (snprintf(cmd, MAX_STR_LENGTH, "tftp %s -r %s -g", hostname,
|
sname) >= MAX_STR_LENGTH) {
|
||||||
sname) >= MAX_STR_LENGTH) {
|
ret = FAIL;
|
||||||
ret = FAIL;
|
strcpy(mess, "Could not copy detector server. Command to copy "
|
||||||
strcpy(mess, "Could not copy detector server. Command to copy "
|
"server too long\n");
|
||||||
"server too long\n");
|
LOG(logERROR, (mess));
|
||||||
LOG(logERROR, (mess));
|
} else if (executeCommand(cmd, retvals, logDEBUG1) == FAIL) {
|
||||||
} else if (executeCommand(cmd, retvals, logDEBUG1) == FAIL) {
|
ret = FAIL;
|
||||||
ret = FAIL;
|
snprintf(mess, MAX_STR_LENGTH,
|
||||||
snprintf(mess, MAX_STR_LENGTH,
|
"Could not copy detector server (tftp). %s\n",
|
||||||
"Could not copy detector server (tftp). %s\n",
|
retvals);
|
||||||
retvals);
|
// LOG(logERROR, (mess)); already printed in executecommand
|
||||||
// LOG(logERROR, (mess)); already printed in executecommand
|
} else {
|
||||||
} else {
|
LOG(logINFO, ("\tServer copied\n"));
|
||||||
LOG(logINFO, ("\tServer copied\n"));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ret == OK) {
|
if (ret == OK) {
|
||||||
@ -9403,16 +9397,6 @@ void receive_program_via_blackfin(int file_des, enum PROGRAM_INDEX index,
|
|||||||
functionType);
|
functionType);
|
||||||
LOG(logERROR, (mess));
|
LOG(logERROR, (mess));
|
||||||
#else
|
#else
|
||||||
// only when writing to kernel flash or root directory
|
|
||||||
if (index != PROGRAM_FPGA) {
|
|
||||||
// check update is allowed (Non Amd OR AMD + current kernel)
|
|
||||||
ret = allowUpdate(mess, functionType);
|
|
||||||
if (ret == FAIL) {
|
|
||||||
Server_SendResult(file_des, INT32, NULL, 0);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// open file and allocate memory for part program
|
// open file and allocate memory for part program
|
||||||
FILE *fd = NULL;
|
FILE *fd = NULL;
|
||||||
ret = preparetoCopyProgram(mess, functionType, &fd, filesize);
|
ret = preparetoCopyProgram(mess, functionType, &fd, filesize);
|
||||||
@ -9632,25 +9616,18 @@ int set_update_mode(int file_des) {
|
|||||||
return printSocketReadError();
|
return printSocketReadError();
|
||||||
LOG(logDEBUG1, ("Setting update mode to \n", arg));
|
LOG(logDEBUG1, ("Setting update mode to \n", arg));
|
||||||
|
|
||||||
#ifdef BLACKFIN_DEFINED
|
switch (arg) {
|
||||||
// check update is allowed (Non Amd OR AMD + current kernel)
|
case 0:
|
||||||
ret = allowUpdate(mess, "set/unset update mode");
|
ret = deleteFile(mess, UPDATE_FILE, "unset update mode");
|
||||||
#endif
|
break;
|
||||||
|
case 1:
|
||||||
if (ret == OK) {
|
ret = createEmptyFile(mess, UPDATE_FILE, "set update mode");
|
||||||
switch (arg) {
|
break;
|
||||||
case 0:
|
default:
|
||||||
ret = deleteFile(mess, UPDATE_FILE, "unset update mode");
|
ret = FAIL;
|
||||||
break;
|
sprintf(mess, "Could not set updatemode. Options: 0 or 1\n");
|
||||||
case 1:
|
LOG(logERROR, (mess));
|
||||||
ret = createEmptyFile(mess, UPDATE_FILE, "set update mode");
|
break;
|
||||||
break;
|
|
||||||
default:
|
|
||||||
ret = FAIL;
|
|
||||||
sprintf(mess, "Could not set updatemode. Options: 0 or 1\n");
|
|
||||||
LOG(logERROR, (mess));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return Server_SendResult(file_des, INT32, NULL, 0);
|
return Server_SendResult(file_des, INT32, NULL, 0);
|
||||||
|
@ -780,7 +780,39 @@ void Detector::startDetectorReadout() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Detector::stopDetector(Positions pos) {
|
void Detector::stopDetector(Positions pos) {
|
||||||
pimpl->Parallel(&Module::stopAcquisition, pos);
|
|
||||||
|
// stop and check status X times
|
||||||
|
int retries{0};
|
||||||
|
//avoid default construction of runStatus::IDLE on squash
|
||||||
|
auto status = getDetectorStatus().squash(defs::runStatus::RUNNING);
|
||||||
|
while(status != defs::runStatus::IDLE){
|
||||||
|
pimpl->Parallel(&Module::stopAcquisition, pos);
|
||||||
|
status = getDetectorStatus().squash(defs::runStatus::RUNNING);
|
||||||
|
++retries;
|
||||||
|
|
||||||
|
if(retries == 10)
|
||||||
|
throw RuntimeError("Could not stop detector");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// validate consistent frame numbers
|
||||||
|
switch (getDetectorType().squash()) {
|
||||||
|
case defs::EIGER:
|
||||||
|
case defs::JUNGFRAU:
|
||||||
|
case defs::MOENCH:
|
||||||
|
case defs::CHIPTESTBOARD: {
|
||||||
|
auto res = getNextFrameNumber(pos);
|
||||||
|
if (!res.equal()) {
|
||||||
|
uint64_t maxVal = 0;
|
||||||
|
for (auto it : res) {
|
||||||
|
maxVal = std::max(maxVal, it);
|
||||||
|
}
|
||||||
|
setNextFrameNumber(maxVal + 1);
|
||||||
|
}
|
||||||
|
} break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Result<defs::runStatus> Detector::getDetectorStatus(Positions pos) const {
|
Result<defs::runStatus> Detector::getDetectorStatus(Positions pos) const {
|
||||||
|
@ -1,15 +1,15 @@
|
|||||||
// SPDX-License-Identifier: LGPL-3.0-or-other
|
// SPDX-License-Identifier: LGPL-3.0-or-other
|
||||||
// Copyright (C) 2021 Contributors to the SLS Detector Package
|
// Copyright (C) 2021 Contributors to the SLS Detector Package
|
||||||
/** API versions */
|
/** API versions */
|
||||||
#define GITBRANCH "6.1.0"
|
#define GITBRANCH "6.1.2"
|
||||||
|
|
||||||
#define APILIB 0x211125
|
|
||||||
#define APIRECEIVER 0x211125
|
|
||||||
#define APIGUI 0x211125
|
|
||||||
#define APICTB 0x211125
|
#define APICTB 0x211125
|
||||||
#define APIGOTTHARD 0x211125
|
#define APIGOTTHARD 0x211125
|
||||||
#define APIGOTTHARD2 0x211125
|
#define APIGOTTHARD2 0x211125
|
||||||
#define APIJUNGFRAU 0x211125
|
|
||||||
#define APIMYTHEN3 0x211125
|
#define APIMYTHEN3 0x211125
|
||||||
#define APIMOENCH 0x211124
|
#define APIMOENCH 0x211124
|
||||||
|
#define APIJUNGFRAU 0x220104
|
||||||
|
#define APILIB 0x221125
|
||||||
|
#define APIRECEIVER 0x211125
|
||||||
|
#define APIGUI 0x211125
|
||||||
#define APIEIGER 0x211125
|
#define APIEIGER 0x211125
|
||||||
|
Reference in New Issue
Block a user