From ef27546ea1d0ae4e155ed994d08ab541740f0ea0 Mon Sep 17 00:00:00 2001 From: Juliano Murari <juliano.murari@ess.eu> Date: Tue, 9 Aug 2022 13:43:07 +0200 Subject: [PATCH] Add fiber reset PV --- sis8300bcmApp/Db/sis8300bcm-fiber.template | 9 +++++++++ sis8300bcmApp/src/sis8300bcm.cpp | 8 +++++++- sis8300bcmApp/src/sis8300bcm.h | 2 ++ vendor/ess/lib/sis8300bcm_reg.h | 1 + vendor/ess/lib/sis8300drvbcm.c | 10 ++++++++++ vendor/ess/lib/sis8300drvbcm.h | 1 + 6 files changed, 30 insertions(+), 1 deletion(-) diff --git a/sis8300bcmApp/Db/sis8300bcm-fiber.template b/sis8300bcmApp/Db/sis8300bcm-fiber.template index 0211cb9..c352ffc 100644 --- a/sis8300bcmApp/Db/sis8300bcm-fiber.template +++ b/sis8300bcmApp/Db/sis8300bcm-fiber.template @@ -125,3 +125,12 @@ record(bi, "$(P)$(R)SoftwareErrorR") field(SCAN, "I/O Intr") } +record(bo, "$(P)$(R)Reset") +{ + field(DTYP, "asynInt32") + field(OUT, "@asyn($(PORT),$(ADDR=0),$(TIMEOUT=1))BCM.FIBER.RESET") + field(ZNAM, "No") + field(ONAM, "Yes") + field(HIGH, "1") +# field(ASG, "critical") +} diff --git a/sis8300bcmApp/src/sis8300bcm.cpp b/sis8300bcmApp/src/sis8300bcm.cpp index 7c791fb..3ee42ce 100644 --- a/sis8300bcmApp/src/sis8300bcm.cpp +++ b/sis8300bcmApp/src/sis8300bcm.cpp @@ -323,6 +323,7 @@ sis8300bcm::sis8300bcm(const char *portName, const char *devicePath, createParam(BCMFiberChannelUpString, asynParamInt32, &BCMFiberChannelUp); createParam(BCMFiberHardwareErrorString, asynParamInt32, &BCMFiberHardwareError); createParam(BCMFiberSoftwareErrorString, asynParamInt32, &BCMFiberSoftwareError); + createParam(BCMFiberResetString, asynParamInt32, &BCMFiberReset); // LUT, channel specific char buf[255]; for (int i = 0; i < BCM_LUT_SIZE; i++) { @@ -1931,12 +1932,17 @@ asynStatus sis8300bcm::writeInt32(asynUser *pasynUser, epicsInt32 value) if (ret) { asynPrintError(pasynUserSelf, "sis8300drvbcm_set_fiber_out_data_enable returned %d", ret); } + + } else if (function == BCMFiberReset) { + ret = sis8300drvbcm_set_fiber_reset(mDeviceHandle, addr, value); + if (ret) { + asynPrintError(pasynUserSelf, "sis8300drvbcm_set_fiber_reset returned %d", ret); + } } else { if (function < BCM_FIRST_PARAM) { status = sis8300::writeInt32(pasynUser, value); } } - if (ret) { status = asynError; snprintf(mMessageBuffer, MAX_MESSAGE_LENGTH, "[%s,%d,%s] set failed: value %d", portName, addr, name, value); diff --git a/sis8300bcmApp/src/sis8300bcm.h b/sis8300bcmApp/src/sis8300bcm.h index b23167b..aa1a710 100644 --- a/sis8300bcmApp/src/sis8300bcm.h +++ b/sis8300bcmApp/src/sis8300bcm.h @@ -219,6 +219,7 @@ #define BCMFiberChannelUpString "BCM.FIBER.CHANNEL_UP" #define BCMFiberHardwareErrorString "BCM.FIBER.HARDWARE_ERROR" #define BCMFiberSoftwareErrorString "BCM.FIBER.SOFTWARE_ERROR" +#define BCMFiberResetString "BCM.FIBER.RESET" // LUT, board specific, 16 locations #define BCMLutDestinationIDString "BCM.LUT%d.DEST_ID" #define BCMLutMinTriggerPeriodString "BCM.LUT%d.MIN_TRIGGER_PERIOD" @@ -438,6 +439,7 @@ protected: int BCMFiberChannelUp; int BCMFiberHardwareError; int BCMFiberSoftwareError; + int BCMFiberReset; // LUT, board specific int BCMLutDestinationID[BCM_LUT_SIZE]; int BCMLutMinTriggerPeriod[BCM_LUT_SIZE]; diff --git a/vendor/ess/lib/sis8300bcm_reg.h b/vendor/ess/lib/sis8300bcm_reg.h index 6057add..62a96e4 100644 --- a/vendor/ess/lib/sis8300bcm_reg.h +++ b/vendor/ess/lib/sis8300bcm_reg.h @@ -189,6 +189,7 @@ extern "C" { */ #define SIS8300BCM_FIBR_X_OUT_DATA_SELECT_OFF 0x000 #define SIS8300BCM_FIBR_X_STATUS_OFF 0x001 +#define SIS8300BCM_FIBR_X_RESET_OFF 0x002 #ifdef __cplusplus } diff --git a/vendor/ess/lib/sis8300drvbcm.c b/vendor/ess/lib/sis8300drvbcm.c index e455edd..70581cb 100644 --- a/vendor/ess/lib/sis8300drvbcm.c +++ b/vendor/ess/lib/sis8300drvbcm.c @@ -2958,3 +2958,13 @@ int sis8300drvbcm_get_fiber_software_error(sis8300drv_usr *sisuser, unsigned int return ret; } +int sis8300drvbcm_set_fiber_reset(sis8300drv_usr *sisuser, unsigned int channel, unsigned int reset) +{ + unsigned int reg = SIS8300BCM_CHANNEL_BLOCK_BASE + \ + (SIS8300BCM_CHANNEL_BLOCK_SIZE * channel) + \ + SIS8300BCM_FIBR_BANK_OFF + \ + SIS8300BCM_FIBR_X_RESET_OFF; + int ret = sis8300drv_reg_write(sisuser, reg, reset); + return ret; +} + diff --git a/vendor/ess/lib/sis8300drvbcm.h b/vendor/ess/lib/sis8300drvbcm.h index 98dd3e2..ba82e42 100644 --- a/vendor/ess/lib/sis8300drvbcm.h +++ b/vendor/ess/lib/sis8300drvbcm.h @@ -301,6 +301,7 @@ int sis8300drvbcm_get_fiber_lane_up(sis8300drv_usr *sisuser, unsigned int channe int sis8300drvbcm_get_fiber_channel_up(sis8300drv_usr *sisuser, unsigned int channel, unsigned int *channel_up); int sis8300drvbcm_get_fiber_hardware_error(sis8300drv_usr *sisuser, unsigned int channel, unsigned int *hardware_error); int sis8300drvbcm_get_fiber_software_error(sis8300drv_usr *sisuser, unsigned int channel, unsigned int *software_error); +int sis8300drvbcm_set_fiber_reset(sis8300drv_usr *sisuser, unsigned int channel, unsigned int reset); #ifdef __cplusplus } -- GitLab