From a4e7cd54ae55862fba39447b288adb973823f895 Mon Sep 17 00:00:00 2001 From: leonarski_f Date: Fri, 15 Dec 2023 06:50:14 +0100 Subject: [PATCH] Initial look into bug with spot finder --- fpga/host_library/JungfraujochDevice.cpp | 10 +++++++-- fpga/host_library/JungfraujochDevice.h | 1 + fpga/host_library/jfjoch_pcie_status.cpp | 26 ++++++++++++++++++++++++ fpga/pcie_driver/jfjoch_drv.h | 1 + fpga/pcie_driver/jfjoch_function.c | 10 +++++++-- fpga/pcie_driver/jfjoch_ioctl.c | 7 ++++++- fpga/pcie_driver/jfjoch_ioctl.h | 5 +++-- receiver/JFJochReceiver.cpp | 4 ++-- 8 files changed, 55 insertions(+), 9 deletions(-) diff --git a/fpga/host_library/JungfraujochDevice.cpp b/fpga/host_library/JungfraujochDevice.cpp index a43400bb..ea30b314 100644 --- a/fpga/host_library/JungfraujochDevice.cpp +++ b/fpga/host_library/JungfraujochDevice.cpp @@ -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, ¶ms) != 0) + if (ioctl(fd, IOCTL_JFJOCH_SET_SPOTFIN_PAR, ¶ms) != 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) diff --git a/fpga/host_library/JungfraujochDevice.h b/fpga/host_library/JungfraujochDevice.h index 3afe76db..4d347b33 100644 --- a/fpga/host_library/JungfraujochDevice.h +++ b/fpga/host_library/JungfraujochDevice.h @@ -102,6 +102,7 @@ public: void LoadIntegrationMap(uint32_t modules); void SetSpotFinderParameters(const SpotFinderParameters ¶ms); + SpotFinderParameters GetSpotFinderParameters(); // Get number of kernel buffers uint32_t GetBufferCount() const; diff --git a/fpga/host_library/jfjoch_pcie_status.cpp b/fpga/host_library/jfjoch_pcie_status.cpp index 472a2420..85382d5e 100644 --- a/fpga/host_library/jfjoch_pcie_status.cpp +++ b/fpga/host_library/jfjoch_pcie_status.cpp @@ -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; diff --git a/fpga/pcie_driver/jfjoch_drv.h b/fpga/pcie_driver/jfjoch_drv.h index c0c59780..119b4858 100644 --- a/fpga/pcie_driver/jfjoch_drv.h +++ b/fpga/pcie_driver/jfjoch_drv.h @@ -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); diff --git a/fpga/pcie_driver/jfjoch_function.c b/fpga/pcie_driver/jfjoch_function.c index 0322f340..225e21f5 100644 --- a/fpga/pcie_driver/jfjoch_function.c +++ b/fpga/pcie_driver/jfjoch_function.c @@ -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) { diff --git a/fpga/pcie_driver/jfjoch_ioctl.c b/fpga/pcie_driver/jfjoch_ioctl.c index 83140819..15b1a0b6 100644 --- a/fpga/pcie_driver/jfjoch_ioctl.c +++ b/fpga/pcie_driver/jfjoch_ioctl.c @@ -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) diff --git a/fpga/pcie_driver/jfjoch_ioctl.h b/fpga/pcie_driver/jfjoch_ioctl.h index f10bf707..0a3ca7fa 100644 --- a/fpga/pcie_driver/jfjoch_ioctl.h +++ b/fpga/pcie_driver/jfjoch_ioctl.h @@ -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 diff --git a/receiver/JFJochReceiver.cpp b/receiver/JFJochReceiver.cpp index 2c900bca..be861087 100644 --- a/receiver/JFJochReceiver.cpp +++ b/receiver/JFJochReceiver.cpp @@ -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();