Initial look into bug with spot finder

This commit is contained in:
2023-12-15 06:50:14 +01:00
parent 05563966ee
commit a4e7cd54ae
8 changed files with 55 additions and 9 deletions
+8 -2
View File
@@ -95,7 +95,7 @@ void JungfraujochDevice::SetConfig(const DataCollectionConfig &config) {
bool JungfraujochDevice::ReadWorkCompletion(uint32_t *output) {
int tmp = ioctl(fd, IOCTL_JFJOCH_READ_WC_MBOX, output);
if (tmp != 0) {
if (errno == EAGAIN)
if ((errno == EAGAIN) || (errno == EINTR))
return false;
throw PCIeDeviceException("Failed receiving work completion");
}
@@ -208,10 +208,16 @@ void JungfraujochDevice::UnmapKernelBuffer(DeviceOutput *val) {
}
void JungfraujochDevice::SetSpotFinderParameters(const SpotFinderParameters& params) {
if (ioctl(fd, IOCTL_JFJOCH_SPOT_FINDER_PAR, &params) != 0)
if (ioctl(fd, IOCTL_JFJOCH_SET_SPOTFIN_PAR, &params) != 0)
throw PCIeDeviceException("Failed settings spot finder parameters");
}
SpotFinderParameters JungfraujochDevice::GetSpotFinderParameters() {
SpotFinderParameters ret{};
if (ioctl(fd, IOCTL_JFJOCH_GET_SPOTFIN_PAR, &ret) != 0)
throw PCIeDeviceException("Failed fetching spot finder parameters");
return ret;
}
uint32_t JungfraujochDevice::GetDataSource() {
uint32_t tmp;
if (ioctl(fd, IOCTL_JFJOCH_GET_DATA_SOURCE, &tmp) != 0)
+1
View File
@@ -102,6 +102,7 @@ public:
void LoadIntegrationMap(uint32_t modules);
void SetSpotFinderParameters(const SpotFinderParameters &params);
SpotFinderParameters GetSpotFinderParameters();
// Get number of kernel buffers
uint32_t GetBufferCount() const;
+26
View File
@@ -53,11 +53,32 @@ int main(int argc, char **argv) {
JungfraujochDevice device(argv[1], false);
auto fpga_status = device.GetDataCollectionStatus();
auto fpga_env_data = device.GetDeviceStatus();
auto spot_finder_settings = device.GetSpotFinderParameters();
auto source = device.GetDataSource();
std::cout << "PCIe/JFJoch card detected " << std::endl;
std::cout << "Git SHA1 " << std::hex << fpga_status.git_sha1 << std::endl;
std::cout << "Max modules " << std::dec << fpga_status.max_modules << std::endl;
std::cout << "NUMA node " << device.GetNumaNode() << std::endl;
std::cout << "Data source ";
switch (source) {
case STREAM_MERGE_SRC_NONE:
std::cout << "none";
break;
case STREAM_MERGE_SRC_100G:
std::cout << "100G";
break;
case STREAM_MERGE_SRC_4x10G:
std::cout << "4x10G";
break;
case STREAM_MERGE_SRC_FRAME_GEN:
std::cout << "frame generator";
break;
default:
std::cout << "unknown value";
break;
}
std::cout << std::endl;
std::cout << "Ethernet 100G link " << (fpga_env_data.eth_100G_link ? "Yes" : "No") << std::endl;
std::cout << "Ethernet 10G link (*=link) "
<< (fpga_env_data.eth_10G_link[0] ? "*" : "-")
@@ -103,6 +124,11 @@ int main(int argc, char **argv) {
std::cout << "Modules " << std::dec << cfg.nmodules << std::endl;
std::cout << "Frames int. pkt. gen. " << std::dec << cfg.nframes << std::endl;
std::cout << std::endl;
std::cout << "Spot finder settings " << std::endl;
std::cout << "Count threshold " << spot_finder_settings.count_threshold << std::endl;
std::cout << "SNR threshold " << spot_finder_settings.snr_threshold / 4.0f << std::endl;
std::cout << std::endl;
FIFO_check(fpga_status.fifo_status);
std::cout << std::endl;
std::cout << "Packet counters - ETH " << fpga_status.packets_eth << std::endl;
+1
View File
@@ -226,6 +226,7 @@ int jfjoch_load_integration_map(struct jfjoch_drvdata *drvdata, struct DataColle
int jfjoch_run_frame_gen(struct jfjoch_drvdata *drvdata, struct FrameGeneratorConfig *config);
u32 jfjoch_get_c2h_descriptors(struct jfjoch_drvdata *drvdata);
void jfjoch_set_spot_finder_parameters(struct jfjoch_drvdata *drvdata, struct SpotFinderParameters *params);
void jfjoch_get_spot_finder_parameters(struct jfjoch_drvdata *drvdata, struct SpotFinderParameters *params);
u32 jfjoch_get_data_source(struct jfjoch_drvdata *drvdata);
void jfjoch_set_data_source(struct jfjoch_drvdata *drvdata, const u32 *val);
+8 -2
View File
@@ -425,8 +425,14 @@ u32 jfjoch_get_c2h_descriptors(struct jfjoch_drvdata *drvdata) {
}
void jfjoch_set_spot_finder_parameters(struct jfjoch_drvdata *drvdata, struct SpotFinderParameters *params) {
iowrite32(params->count_threshold, drvdata->bar0 + ADDR_SPOT_FINDER_THRESHOLD);
iowrite32(params->snr_threshold, drvdata->bar0 + ADDR_SPOT_FINDER_SNR);
iowrite32(params->count_threshold, drvdata->bar0 + ACTION_CONFIG_OFFSET + ADDR_SPOT_FINDER_THRESHOLD);
iowrite32(params->snr_threshold, drvdata->bar0 + ACTION_CONFIG_OFFSET + ADDR_SPOT_FINDER_SNR);
}
void jfjoch_get_spot_finder_parameters(struct jfjoch_drvdata *drvdata, struct SpotFinderParameters *params) {
params->count_threshold = ioread32(drvdata->bar0 + ACTION_CONFIG_OFFSET + ADDR_SPOT_FINDER_THRESHOLD);
params->snr_threshold = ioread32(drvdata->bar0 + ACTION_CONFIG_OFFSET + ADDR_SPOT_FINDER_SNR);
}
u32 jfjoch_get_data_source(struct jfjoch_drvdata *drvdata) {
+6 -1
View File
@@ -120,13 +120,18 @@ long jfjoch_cdev_ioctl(struct file *file, unsigned int cmd, unsigned long arg) {
if (copy_to_user((char *) arg, exchange, sizeof(u32)) != 0)
return -EFAULT;
return 0;
case IOCTL_JFJOCH_SPOT_FINDER_PAR:
case IOCTL_JFJOCH_SET_SPOTFIN_PAR:
if (!(file->f_mode & FMODE_WRITE))
return -EACCES;
if (copy_from_user(&spot_finder_parameters, (char *) arg, sizeof(struct SpotFinderParameters)) != 0)
return -EFAULT;
jfjoch_set_spot_finder_parameters(drvdata, &spot_finder_parameters);
return 0;
case IOCTL_JFJOCH_GET_SPOTFIN_PAR:
jfjoch_get_spot_finder_parameters(drvdata, &spot_finder_parameters);
if (copy_to_user((char *) arg, &spot_finder_parameters, sizeof(struct SpotFinderParameters)) != 0)
return -EFAULT;
return 0;
case IOCTL_JFJOCH_ISIDLE:
jfjoch_is_idle(drvdata, exchange);
if (copy_to_user((char *) arg, exchange, sizeof(int32_t)) != 0)
+3 -2
View File
@@ -39,8 +39,9 @@
#define IOCTL_JFJOCH_C2H_DMA_DESC _IOR(IOCTL_JFJOCH_MAGIC, 24, uint32_t)
#define IOCTL_JFJOCH_WRITE_REGISTER _IOW(IOCTL_JFJOCH_MAGIC, 25, struct RegisterConfig )
#define IOCTL_JFJOCH_READ_REGISTER _IOWR(IOCTL_JFJOCH_MAGIC, 26, struct RegisterConfig )
#define IOCTL_JFJOCH_SPOT_FINDER_PAR _IOW(IOCTL_JFJOCH_MAGIC, 27, struct SpotFinderParameters)
#define IOCTL_JFJOCH_SET_SPOTFIN_PAR _IOW(IOCTL_JFJOCH_MAGIC, 27, struct SpotFinderParameters)
#define IOCTL_JFJOCH_SET_DATA_SOURCE _IOW(IOCTL_JFJOCH_MAGIC, 28, uint32_t)
#define IOCTL_JFJOCH_GET_DATA_SOURCE _IOR(IOCTL_JFJOCH_MAGIC, 28, uint32_t)
#define IOCTL_JFJOCH_GET_DATA_SOURCE _IOR(IOCTL_JFJOCH_MAGIC, 29, uint32_t)
#define IOCTL_JFJOCH_GET_SPOTFIN_PAR _IOR(IOCTL_JFJOCH_MAGIC, 30, struct SpotFinderParameters)
#endif //JUNGFRAUJOCH_JFJOCH_IOCTL_H
+2 -2
View File
@@ -327,8 +327,8 @@ void JFJochReceiver::FrameTransformationThread() {
if (rad_int_profile_image)
rad_int_profile_image->Add(*output);
if (find_spots)
strong_pixel_set.ReadFPGAOutput(experiment, *output, m);
//if (find_spots)
// strong_pixel_set.ReadFPGAOutput(experiment, *output, m);
} else
src = acquisition_device[d].GetErrorFrameBuffer();