From 1797d39216f9cc2274bdbdcbff16ad99c394d214 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Wed, 6 Nov 2019 18:58:22 +0100 Subject: [PATCH] updated mythen3 to configure phase, freq, delay left, period left, actual time, measurement time, framesfrom start and othe register mappings --- .../gotthard2DetectorServer/RegisterDefs.h | 87 +++-- .../bin/gotthard2DetectorServer_developer | Bin 134900 -> 134900 bytes .../slsDetectorFunctionList.c | 14 +- .../slsDetectorServer_defs.h | 3 +- .../mythen3DetectorServer/CMakeLists.txt | 1 + .../mythen3DetectorServer/Makefile | 2 +- .../mythen3DetectorServer/RegisterDefs.h | 71 ++++- .../bin/mythen3DetectorServer_developer | Bin 133968 -> 147760 bytes .../slsDetectorFunctionList.c | 301 ++++++++++++++++-- .../slsDetectorServer_defs.h | 60 ++-- .../include/slsDetectorFunctionList.h | 25 +- .../slsDetectorServer/src/nios.c | 2 +- .../src/slsDetectorServer_funcs.c | 46 +-- slsDetectorSoftware/src/CmdProxy.cpp | 20 +- .../tests/test-multiSlsDetectorClient.cpp | 4 +- slsSupportLib/include/versionAPI.h | 4 +- 16 files changed, 493 insertions(+), 147 deletions(-) diff --git a/slsDetectorServers/gotthard2DetectorServer/RegisterDefs.h b/slsDetectorServers/gotthard2DetectorServer/RegisterDefs.h index f22731f77..5314c6a87 100644 --- a/slsDetectorServers/gotthard2DetectorServer/RegisterDefs.h +++ b/slsDetectorServers/gotthard2DetectorServer/RegisterDefs.h @@ -1,43 +1,62 @@ #pragma once -/* Definitions for FPGA*/ + #define REG_OFFSET (4) -/* cspbase 0x1804 0000 */ -#define BASE_READOUT_PLL (0x000) -#define BASE_SYSTEM_PLL (0x800) + +/* Base addresses 0x1804 0000 ---------------------------------------------*/ +/* Reconfiguration core for readout pll */ +#define BASE_READOUT_PLL (0x0000) // 0x1804_0000 - 0x1804_07FF +/* Reconfiguration core for system pll */ +#define BASE_SYSTEM_PLL (0x0800) // 0x1804_0800 - 0x1804_0FFF + +/* Base addresses 0x1806 0000 ---------------------------------------------*/ +/* General purpose control and status registers */ +#define BASE_CONTROL (0x0000) +/* Acquisition? TODO */ +#define BASE_ACQUISITION (0x0200) +/* UDP datagram generator */ +#define BASE_UDP_RAM (0x01000) // 0x1806_1000 - 0x1806_1FFF + + + + +/* Readout PLL registers --------------------------------------------------*/ #define READOUT_PLL_RESET_REG (0x1 * REG_OFFSET + BASE_READOUT_PLL) //TODO #define READOUT_PLL_RESET_OFST (0) #define READOUT_PLL_RESET_MSK (0x00000001 << READOUT_PLL_RESET_OFST) -#define SYSTEM_PLL_RESET_REG (0x1 * REG_OFFSET + BASE_SYSTEM_PLL) //TODO - -#define SYSTEM_PLL_RESET_OFST (0) -#define SYSTEM_PLL_RESET_MSK (0x00000001 << SYSTEM_PLL_RESET_OFST) - #define READOUT_PLL_WAIT_REG (0x2 * REG_OFFSET + BASE_READOUT_PLL) //TODO #define READOUT_PLL_WAIT_OFST (0) #define READOUT_PLL_WAIT_MSK (0x00000001 << READOUT_PLL_WAIT_OFST) + +/* System PLL registers --------------------------------------------------*/ + +#define SYSTEM_PLL_RESET_REG (0x1 * REG_OFFSET + BASE_SYSTEM_PLL) //TODO + +#define SYSTEM_PLL_RESET_OFST (0) +#define SYSTEM_PLL_RESET_MSK (0x00000001 << SYSTEM_PLL_RESET_OFST) + #define SYSTEM_PLL_WAIT_REG (0x2 * REG_OFFSET + BASE_SYSTEM_PLL) //TODO #define SYSTEM_PLL_WAIT_OFST (0) #define SYSTEM_PLL_WAIT_MSK (0x00000001 << SYSTEM_PLL_WAIT_OFST) -/* cspbase 0x1806 0000 */ -#define BASE_CONTROL (0x000) -#define BASE_ACQUISITION (0x200) //???TODO -#define BASE_UDP_RAM (0x1000) +/* Control registers --------------------------------------------------*/ /* Module Control Board Serial Number register */ -#define MCB_SERIAL_NO_REG (0x000 * REG_OFFSET + BASE_CONTROL) +#define MCB_SERIAL_NO_REG (0x00 * REG_OFFSET + BASE_CONTROL) + +#define MCB_SERIAL_NO_VRSN_OFST (16) +#define MCB_SERIAL_NO_VRSN_MSK (0x0000001F << MCB_SERIAL_NO_VRSN_OFST) /* FPGA Version register */ -#define FPGA_VERSION_REG (0x001 * REG_OFFSET + BASE_CONTROL) +#define FPGA_VERSION_REG (0x01 * REG_OFFSET + BASE_CONTROL) #define FPGA_COMPILATION_DATE_OFST (0) #define FPGA_COMPILATION_DATE_MSK (0x00FFFFFF << FPGA_COMPILATION_DATE_OFST) @@ -45,7 +64,7 @@ #define DETECTOR_TYPE_MSK (0x000000FF << DETECTOR_TYPE_OFST) /* API Version register */ -#define API_VERSION_REG (0x002 * REG_OFFSET + BASE_CONTROL) +#define API_VERSION_REG (0x02 * REG_OFFSET + BASE_CONTROL) #define API_VERSION_OFST (0) #define API_VERSION_MSK (0x00FFFFFF << API_VERSION_OFST) @@ -53,11 +72,11 @@ #define API_VERSION_DETECTOR_TYPE_MSK (0x000000FF << API_VERSION_DETECTOR_TYPE_OFST) //Not used in software /* Fix pattern register */ -#define FIX_PATT_REG (0x003 * REG_OFFSET + BASE_CONTROL) +#define FIX_PATT_REG (0x03 * REG_OFFSET + BASE_CONTROL) #define FIX_PATT_VAL (0xACDC2019) /* Status register */ -#define STATUS_REG (0x004 * REG_OFFSET + BASE_CONTROL) +#define STATUS_REG (0x04 * REG_OFFSET + BASE_CONTROL) #ifdef VIRTUAL #define RUN_BUSY_OFST (0) @@ -65,16 +84,40 @@ #endif /* Look at me read only register */ -#define LOOK_AT_ME_REG (0x005 * REG_OFFSET + BASE_CONTROL) +#define LOOK_AT_ME_REG (0x05 * REG_OFFSET + BASE_CONTROL) + +/* System status register */ +#define SYSTEM_STATUS_REG (0x06 * REG_OFFSET + BASE_CONTROL) + +/* Config RW regiseter */ +#define CONFIG_REG (0x20 * REG_OFFSET + BASE_CONTROL) + +/* Control RW register */ +#define CONTROL_REG (0x21 * REG_OFFSET + BASE_CONTROL) + +#define CONTROL_STRT_ACQSTN_OFST (0) +#define CONTROL_STRT_ACQSTN_MSK (0x00000001 << CONTROL_STRT_ACQSTN_OFST) +#define CONTROL_STP_ACQSTN_OFST (1) +#define CONTROL_STP_ACQSTN_MSK (0x00000001 << CONTROL_STP_ACQSTN_OFST) +#define CONTROL_CRE_RST_OFST (10) +#define CONTROL_CRE_RST_MSK (0x00000001 << CONTROL_CRE_RST_OFST) +#define CONTROL_PRPHRL_RST_OFST (11) // Only GBE10? +#define CONTROL_PRPHRL_RST_MSK (0x00000001 << CONTROL_PRPHRL_RST_OFST) +#define CONTROL_CLR_ACQSTN_FIFO_OFST (15) +#define CONTROL_CLR_ACQSTN_FIFO_MSK (0x00000001 << CONTROL_CLR_ACQSTN_FIFO_OFST) + +/* Pattern IO Control 64 bit register */ +#define PATTERN_IO_CTRL_LSB_REG (0x22 * REG_OFFSET + BASE_CONTROL) +#define PATTERN_IO_CTRL_MSB_REG (0x23 * REG_OFFSET + BASE_CONTROL) /** DTA Offset Register */ -#define DTA_OFFSET_REG (0x104 * REG_OFFSET + BASE_CONTROL) +#define DTA_OFFSET_REG (0x24 * REG_OFFSET + BASE_CONTROL) -/* BASE_ACQUISITION FPGA registers TODO --------------------------------------------------*/ - +/* Acquisition registers --------------------------------------------------*/ +//TODO /* Triggers left 64bit Register */ #define GET_CYCLES_LSB_REG (0x10 + BASE_ACQUISITION) #define GET_CYCLES_MSB_REG (0x14 + BASE_ACQUISITION) diff --git a/slsDetectorServers/gotthard2DetectorServer/bin/gotthard2DetectorServer_developer b/slsDetectorServers/gotthard2DetectorServer/bin/gotthard2DetectorServer_developer index eb17f2c0f69e39a4dad86b07cc525e1d5569c52e..9c580018e2c86ca6c1b8c7d866404bf4c8e4ab8b 100755 GIT binary patch delta 17809 zcmch830PHC7xr0)E21b~k;_Ga%cRVc6DTU;kme9LYvr7oVWKHESaNSpIfZ_1?Pw`d zp_VC{m=u|kO=gDX&|qeu=I2o8S5}q-|GUp!_i`}pd;aJ9pP$F=eb3tOp4Z-M?S1yS zy3XtBIm~h*$eABhGqD8C_81^bx+6WJyR82vdr3$)a$|G<$!b=C{6_Q zqmd%A`FhG0pEO@W%f+A;{b-vgXfaV$GKFVgoVv>vik<>m|TnTKh9rj$x#H)Nr7dg>j<-Xv@QqLQ~Z&LUEXF-ileTXps0M zY%s-^vjW86d9@c1M}Th^P#i`AbndBs(*D6Xoix zfS9KA3|Naj9iuFYV}mG&vWbx~0pd!G!^yOX<+0B?i|FMlX?|QZ?GeRs{aQV@-t4I= zXs|;u%~@|o7T;KJ)l^|zLou!adUwqiw)oMiGE3yeFQ~6eDnf*J!W2_^uD>EG_`_+p4ymh`6+ zUj>x0{_LhpYTaZYL!{2_lh2yg;?$t>&?CB z8Sj9da>@=A<5T+4gQ7TPI86|qsiXbNzr)12vA5ECOQ)H2+B7jMbt=sg7gOVCf$;AT zr{;%>PAzR>T!+piL_vqq9?DgJQPUxtUKQCLU-Z&*xw*GeTnV#?;Iw4gA~Mt3sO87R zoV0CSWZPWrk!^FeN4Cw?9@#cmdt}?LyW5u2X*iXNPdZJdk3~x7-s;g%VedRtE&on@ z)j3xFs9lDu--luv2aCe)^~CHhBh~Y@k2kwmJu<%ZmvdFkI3&{3d#G1K#oY8vy;{F; zF|t~}GM3f4%2-zGH^#DBt|3B~cTEXUdRZ0Ad2}A8hV|cFs~qj{d|_|pif$dm%B~5d zh<#mOQ!Qa)eFvMEpD|d?Xe>@-%%Cul*=-3F;Y7DhYL_ssc{`KLP7LT7Dz0^(Pkl=A zdR!-aR#+YLqYuwema+NKWg}U}=0}%}V;P$tT{e+rY<_gvWR|h{(Ph(|GPn8Bg)^Dx z=QJU@Y!=Jd{OB?}%h>$rvUx0H^P|fag-P>MK>6bLUQ1dPjFa}qoZ;u8*cvNl%ki$2 z*5iAtbo=tkIH%1i5*vFzV%bucspqv#gx{NGdD{@R4ll6FqV!J_eM~;xCOjl z4C<3gpNYkN+Nwvx#NIv=)o;Q?R9{$@al+m=T|F~S?CtBXUJMgo_f1oO4HM1!C8!yS z=-#ildLv9M=@*H4zN23oHKUU_*UzRZWx}(6tiR*qW{UO5-pYWrd(F0{Tzmu3tAA?a zM&V%@f2x@4n1w!KasO@hrs01dSu4woBWq)sabzP{W*pgQmKjGjfn~;#ZR3>H9obYS z`WZ&HGs}!4+l^($k?qAY)vTSo59{vkLH7)Q84+lf9Bc_$1?_z~3_d2KXz+CxMSLJ`H@B z6uaKE^LY4zBQ60SU|bFSDdS&(KVtj`@CS^q1Mgv61N> z7`Q*Y^Iz^%#d)cl)xNaP4A zGJD1`_5_Y*>5J5 z_W`cYI1AXscrY+A9szud7l)C+*BOrozQ%YW@NbMK1OEbSm;T!{JY438CxL%roCkb? z@dDs;jPrrdFn$rZl5qj>_l!3JpI}@J?D7?N03T!dt|GJD^GkjxLqrAR_kllW{2}mu z#`}RkW_%EMALGNodl?@G-p%+s;CC7S0KALwS>O^K+ZEF}JZ$HPOTb$hUjg3C_&4B9 zjIRS1F{TY>&sP|G0v9m$27Z~bFYs!{R^U~PZNMw+{Ll&y%NR!kFJ&ADyohld;0263 z0?%cf4(wpu19&#$-oUdM-v|68C3$V+uw*Yn-b{nwEu!nEd zJ%^wYztImjvVZ((fTf@uUL;D;%CHYFS4?I511#%rlXd+pz*2adYzt(s+$MYdK!D}d z+hmr{11zuICc781qH?pimOYcAM9yS8wG-8oKcoz?t5XlD(;~&?$AZQ3Y0c?zv3c5y(*3ec4-%svuTL|PX`l#R zVinI$_fyNyiQ>m|obhoq*BIwfe$G!n+IVC73|~ixpW>q`X2;K-if1!LQO=0O8NFok z^r!oY4`%qOTO!2|B3OhjHjCXKHIgwE&*g;INoRqFiJhX{;90NR;oZX_E)h91(QfqJA1Fnk?(6S9Ios;>#zJ4U+UHm(Zu;z>{gRuG-WNWD~8P>YyHu z6l0#cM<%IWn5BL#pMr(o)6r6r{`5rI+KP7r)swQu?WHj9$Z+*+q*%YZi>uMv)`8@$ z9rU0C@osUTxN^|6;u$j%miRt1m()v}7BvH!}H%o&Ws}903fZ2-E3`7Z!A%#MGHKIwKA& zNK)rID;&IJ0KFh`mZXcK=bfs}8h>wLi*w?+J)vv{9_#^%51(`@*sVHf9DW3U& zIJq=N{Ul1NwYz`re_^<6a@n#7^`JgBQe$o{^B0ZsgC*BKFjx#&-c&snB_7OAa8~gF zaW+3jJ#p8Jstg&ml{{A_7u}g)h-6-dNpVHCRi6}pkGp>NI2>@E65MqUipN(*QxoB{ zOjmH$Kc8Xi0qjCFUC;Z9n!USr8}+l070fp zb*0OE`3b!VYxGiz*F;cHQLs+0%HN|h?;bVu?op#$QN>t+S{Fp)#FN`5D}ALPhH_j2 zF7p5S2U9Dg&RW^oxmLR8$P>|G+2UZ#IDIXtcr8_ZCYlG-OT-s7AcsgP3ZeO8SP@Rf zob%*hk)Kqm(?yZ;XU~lYS|k!T=v|ZkbYHQ3Lx5x+*br&T2=r6L@~8bg0L0}V!f_NF zfTNjS8wW|oOB*NJ>QoM1h&)+$S8j!{ZF<$WypcsQVQqJdSBoQ?qG+A?YZDaVTaog* zJ_D*3_7^)|_xEzd{X=6fZF7|ksAK$>$N7k z=yfwre^FqQ0C}>n9~W($BrZ>GEv~)M{La+Ipz^v?94*$*!MxfWq~d@lXLEQg%!tz? zdEi~M6-V%6`50a z_e>KB8&YKf)n#MUkE6w*xAl70#?t|px=F^DZide;eXi#1ileVxj9T-rR=T^Oxbz8G z+sJp~)br6I>0NzYG6?_U7S^s{bi=h0)mB8bf7?}2@)8wq>z$te-gucgJOQ~@?bfFS zYzfQwL3o-ON;_Q7QJ{ut49k={T{{uSUhq4U3ZzOI{kNOx0h6;Tu|dR6qGWKn%6Tx_Z6LhZ%H zia6?w=Uw99p)fet)rXE!Z?W%i91R!M_iOU+NP}dXA6Bx{RcB zPM(f+IVZI$r8??Ro_A9Wow&^1K!b3NTX^fZ?y16}sjne97OE?2^o3GRrmeBA>1HVN z?O4%dx7(pDbC+qL?5RWfQIj96n7^-`rQ!q#AdPgyHRa3x?=tQ39kHr!o${o z+wrCe>!N%M@-t*o{+oenM!)?I6v?W*PP|901M25K1< z>EkdZd*W&HuNjuKNYw-k*pH4#C};$?&(|093P|D-#A^mSdY zE5tQu>>-?Wb@q|}xI6o2+1X;n<5o1SY-azR*j6mO}E%msmX4#TzNX&DZj3DD824P>2IWn`+oBh8+Pjk z(y&t8Z{(=s?v%}>I+UqyO6CpSzQf^EXU2=94eedaht_-mnYBgU)VprCKY(t>TVl6k zmKQHK&b{ygy85PdUIpfJ6FHw^`B*`l8vxGpj1 zd*b4FtqIN!GW9KbDS80!mMxV~w2Szy!Y?vQD>s=BcEzke4cV!#mDW>xD_`eUSi!a6 zSsry+EBQd86#ePHDw*o_F5qg&e#Ba>S4s9G)@~ikeynCJ`w=U&E|>jyh4I=gW^H)` zieL3QHSUO_(iYA~JLa2Br)ne)FkwN$iCt6cDV#2#ig#@L`>U$SYA%0F8iN3Nr${m* z#k%i88+;pk}2P{pVzI7q8#*8tmmN-f2fLQCfauzhb~npqTjo1FIk}W~jv%WJ4wiSv@ zVm%9570ymR^in(nQQTQqaatP>itusfj9V5NWcvOw>ECFxJt)qlCGMl7AzkZe#suW_ zdrhTO{5$r{McI7)x{~t($ItQF7!y4}zhMxAw69Fmtjqs43nJ@LYU4V3s4Mz)eewls zh4pGRy>{YaA<_~(DUeKBHRiF}I6+*#>95__i0W(GJ*n~kSSQTPPO4wR-=>XF}K+Yb%*V)5a?jH90f6=+aYCBijD#KbmCPA*% zQfTl;^WxbH*NT0pw|&VHImH9y-Z*WNVjhXNe$x=4fd4BB? zAjsP?`tmj@;qNyfa#&`(0Wp(hd;=~ zFP~+82A*J96N7AZLbS8i#w!r(m?+m-S7lyJ(62x=+%&~`t@4zwyjH1wZ>FB%rCVz) z%e!06-ZgTuG@M_&C$-Pw>-fW0kvF8Qe>&H^@>5!NQ%e1>$v-zF$7L%kPIj?~DoB2@ zDcS#P^5cf&SeUGTxRRId@TDf?bIMTr%B|X=W)wc?bV8V3TU?N`{%)_rEdwe)<%`9Q zSLgur%)r9KkuKBs-+I7U2VBOoUUk($%l4yReM%GNIp5jf)z7<_R2GV~{LEF51`@{3 z+2YcT7D}Sq`Dgs8P4I71oOg!WN&nCT%RAy$#@!N1 z`BU7@?;sO>4mU`2Dxutb{_Gk_DB;gtoo>QM^3|cdfWASJJyQ^B0Nal;aS1N z7M!8MG18}<%Q0HWyddVmfwW#Qk4(&EVi*%)W~FQ7oHXd_ zv&_q8UQ6b|rLw})a`R3zZ!Ghom?zH+esb~b$nYm7>My;~)iF$j?dAgqtZU%m`la48 z{W-%p=E2@u&$%)L?;P{GGcSR8aA>Vp47@AgX#)dciZgsmHwRKFCET`Vxpyk9ISYN? zZLjL7uYINY!4z9h&1i|E*C?$j9PXu~mv$?hO75CZ3g;uQVb2)pV#^;ymp;}k^j{>^4ju93XtS;lKcXb*~YlZ za<7S{|Hfo<6z43-uP~V{qC01{h}r-qPmBY3Gn3iey2*GS zt5;*WD`!bAVKSR`H~E^Y&aRx}LEgh;9xpffPgk9zxy~S4K4mhil9Q};PoN~rA&%lP zVU<~sKxwis_a$K1PBMkHic|Y0Qk>-sN3m*i)SyIqpqc*02y*wv?B|?X=ZCX$YMFK} zk?@xLTP-$;=165JPNMYg^0k$`)cH^Dg?q02TDO7Rio|4Uf&5DQCQ}HJrB>3|!&qF=%SBj-uohuE z!bb?-ApC@&3?{`7AsV4Gg4=oYP5QfQ9KbT8YaGI|I<9d`78+gS7?v4b<3yGjUE{Va zGrGndSY~vMyRgjY8h1~M`nzk~n~6r(xW8s=N9!97oT_`qN{B^z#-&y5s5kk_uXf}$ zdn<+>!(&!5wX_u4r)KogZlzG7kN%|&d~7)=&QDgfM^mx20`H|%xgX5b%2Fv`^84a0 zi2Tj&Kxy)O9c`NrCHit&Js&x+&*GU8U(JDG(iez&#ULK@!DIuC~8uhb0&QbCZ;uoiTjHu~p^rmGN zM;W|aM76;k1S;MT#Hc;r$Io0>wF8Fg?I%j)Rh78V+H@GX`Zb#NEUj5_!p%Zxf$ z&N8D8e#|nX4j#CZ4jy8nQ3sDXb?{rK4rY|;Iw*H%-dbTgb+KGPnxoJGUXi5@$|%!* zNvAQEKRC*;Gs`F|o!FILCW}Y1Ga0YVoXo!)J!p?zU1war8H+UlLBSPZKZIz6&Ikh# zCLlb8uoR&XVJCunT)a_);fqAwqixDEfFSY{lTPRV!JHfJ!=I4<`j>)YlAeW&S*gTqrx??I`S2a>}wLi}rw+2M8|YH<&m zY#GNYk>5mjt&=Kf%Mq*ZXP`^If(@=ld)A=Yg2r`Vrm~Z9z|pYM)cL zR5_y^o}k`zE(ARlhvJDz?tI(A=Zep2r+Z?wgV)pgqplAJ}pms`t`;6wE6KE>&^74aws@{waYyz)Beg!byRdGzE{|f za1!APf@v~NC=lWiG7yF!OhR}TVL5_ZMVq47+ZQA&%Zw^&V_6*)jbNcsMWb0}RM7;M z8CA3m%Zw_T$}*#hc4nDTMZ2}W!-CX{iAELe*V?%t4bXdA$taQwQfO(~eH2BOu}JVf zbd;C-p3+JbX-{O*L-vUr#mme`dQ|N)W4X~4r^wjQ<}%N)*~uuXU1P3#fV12jmQllB zkIi8|?>61}N`FX>uI@^wR%#=%D8aIzZY8*WFJ-~kUs5+8xwfI|zh}{d%~x;~J2K8x zsM2p*@c^=E3kOhROCfU%2YyJtc>ulKYIEH}-8GcoWa~A=p6x3wdmw3+cbUr0kCUqT z526yw0ghq=%vC=%h-Rc7;V8q3uXovB#sV-Zvg>a^hOeWgJ1GuN3(yJ&)2ikvLESAX z-q|V2$+U$DJJJ@`55@Uwv}wDRIfR7j9i*KZLgBPs!}m758(azOE?I~jHk9HToN+%c z#v^@Ix@#!mTi@lS6~jnvklrp2(*>bF!U%*32-6T82ul&xBD{{U6QLa8Ai^<(N`#;C zN`1!C>9!4fjLXTHnj1Rf;an|o0{J(|o%HC8&aZ?@+ zZ8ak;wAF-$N@<@L=}McGEt+ZsR_n>9TIeKOnoT>#%)f^Sy#b zjsS52LMQ@CU9gWP%Gy-#qh2a%nerjU%39(#yma1&w9qU3>`YVwe;!I>{nrm)c{!i) z2?72ld|H}#kZw`<1bjp%|43<~yp7+boKRI7DL4jH4$sswE2!A_Cw%t16jUky9rCA= zG@nDVdIRgqpB=2FOL-B#^fL03M`<}yJ_)X&QGRutRv_i=Ce)ReKdedv;>siW90nUb+@^>8LE#lqNsie@_o`N(_V(I6w4p~+KGh78e0A43MqhiN{?QE*|b zmVTUy$xr+FIPDETHVsY>m;bz%qI@%vlu-1KOx_9EoSmsvd_|d{2Y*e6)W@c1)nCIb z_kTq5`3AY357+j5LwkIche*NaXL_=g__70|pZ_gN+c{j@^DX75$(dT>2|RC))JC5` zcA=$PPtX`rzZt6eoJ4*jI%|n1sXLw39zThsGtf#=<$O7l+9 z9+Gn*y%P1pf=OCc&m*X$SLJFjFc?x18+5? Uft*MaHo?8nDWx~O)obei0R^_1^Z)<= delta 17957 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 #endif -enum {READOUT_PLL, SYSTEM_PLL}; - // Global variable from slsDetectorServer_funcs extern int debugflag; @@ -363,6 +361,8 @@ void setupDetector() { // Default values setHighVoltage(DEFAULT_HIGH_VOLTAGE); setDefaultDacs(); + + // Initialization of acquistion parameters setNumFrames(DEFAULT_NUM_FRAMES); setNumTriggers(DEFAULT_NUM_CYCLES); setExpTime(DEFAULT_EXPTIME); @@ -376,10 +376,7 @@ int setDefaultDacs() { int i = 0; const int defaultvals[NDAC] = DEFAULT_DAC_VALS; for(i = 0; i < NDAC; ++i) { - // if not already default, set it to default - //if (dacValues[i] != defaultvals[i]) { - setDAC((enum DACINDEX)i,defaultvals[i],0); - //} + setDAC((enum DACINDEX)i,defaultvals[i],0); } } return ret; @@ -509,9 +506,6 @@ int getMaxDacSteps() { return LTC2620_D_GetMaxNumSteps(); } - - - int setHighVoltage(int val){ if (val > HV_SOFT_MAX_VOLTAGE) { val = HV_SOFT_MAX_VOLTAGE; diff --git a/slsDetectorServers/gotthard2DetectorServer/slsDetectorServer_defs.h b/slsDetectorServers/gotthard2DetectorServer/slsDetectorServer_defs.h index efdb32ed2..dcfff7bd8 100644 --- a/slsDetectorServers/gotthard2DetectorServer/slsDetectorServer_defs.h +++ b/slsDetectorServers/gotthard2DetectorServer/slsDetectorServer_defs.h @@ -10,7 +10,6 @@ #define NCHIP (10) #define NDAC (16) #define DYNAMIC_RANGE (16) - #define HV_SOFT_MAX_VOLTAGE (200) #define HV_HARD_MAX_VOLTAGE (530) #define HV_DRIVER_FILE_NAME ("/etc/devlinks/hvdac") @@ -29,7 +28,6 @@ #define DEFAULT_SYSTEM_C1 (72222224) // chip_clk, 72 MHz #define DEFAULT_SYSTEM_C2 (18055556) // sync_clk, 18 MHz #define DEFAULT_SYSTEM_C3 (144444448) // str_clk, 144 MHz -#define DEFAULT_TX_UDP_PORT (0x7e9a) /* Firmware Definitions */ #define IP_HEADER_SIZE (20) @@ -78,6 +76,7 @@ enum DACINDEX {G2_VREF_H_ADC, /* 0 */ \ }; enum CLKINDEX {READOUT_C0, READOUT_C1, SYSTEM_C0, SYSTEM_C1, SYSTEM_C2, SYSTEM_C3, NUM_CLOCKS}; #define CLK_NAMES "READOUT_C0", "READOUT_C1", "SYSTEM_C0", "SYSTEM_C1", "SYSTEM_C2", "SYSTEM_C3" +enum PLLINDEX {READOUT_PLL, SYSTEM_PLL}; /* Struct Definitions */ typedef struct udp_header_struct { diff --git a/slsDetectorServers/mythen3DetectorServer/CMakeLists.txt b/slsDetectorServers/mythen3DetectorServer/CMakeLists.txt index 883f21614..687e9de86 100644 --- a/slsDetectorServers/mythen3DetectorServer/CMakeLists.txt +++ b/slsDetectorServers/mythen3DetectorServer/CMakeLists.txt @@ -8,6 +8,7 @@ add_executable(mythen3DetectorServer_virtual ../slsDetectorServer/src/DAC6571.c ../slsDetectorServer/src/common.c ../slsDetectorServer/src/LTC2620_Driver.c + ../slsDetectorServer/src/ALTERA_PLL_CYCLONE10.c ) include_directories( diff --git a/slsDetectorServers/mythen3DetectorServer/Makefile b/slsDetectorServers/mythen3DetectorServer/Makefile index 70c908db0..c3f79b8d6 100755 --- a/slsDetectorServers/mythen3DetectorServer/Makefile +++ b/slsDetectorServers/mythen3DetectorServer/Makefile @@ -12,7 +12,7 @@ DESTDIR ?= bin INSTMODE = 0777 SRCS = slsDetectorFunctionList.c -SRCS += $(main_src)slsDetectorServer.c $(main_src)slsDetectorServer_funcs.c $(main_src)communication_funcs.c $(main_src)nios.c $(main_src)DAC6571.c $(main_src)common.c $(main_src)LTC2620_Driver.c +SRCS += $(main_src)slsDetectorServer.c $(main_src)slsDetectorServer_funcs.c $(main_src)communication_funcs.c $(main_src)nios.c $(main_src)DAC6571.c $(main_src)common.c $(main_src)LTC2620_Driver.c $(main_src)ALTERA_PLL_CYCLONE10.c OBJS = $(SRCS:.c=.o) diff --git a/slsDetectorServers/mythen3DetectorServer/RegisterDefs.h b/slsDetectorServers/mythen3DetectorServer/RegisterDefs.h index 43e42df35..854de5380 100644 --- a/slsDetectorServers/mythen3DetectorServer/RegisterDefs.h +++ b/slsDetectorServers/mythen3DetectorServer/RegisterDefs.h @@ -1,11 +1,60 @@ #pragma once -/* Base addresses */ + #define REG_OFFSET (4) -#define BASE_CONTROL (0x0000) -#define BASE_PATTERN_CONTROL (0x00200) -#define BASE_UDP_RAM (0x01000) -#define BASE_PATTERN_RAM (0x10000) + +/* Base addresses 0x1804 0000 ---------------------------------------------*/ +/* Reconfiguration core for readout pll */ +#define BASE_READOUT_PLL (0x0000) // 0x1804_0000 - 0x1804_07FF +/* Reconfiguration core for system pll */ +#define BASE_SYSTEM_PLL (0x0800) // 0x1804_0800 - 0x1804_0FFF + +/* Base addresses 0x1806 0000 ---------------------------------------------*/ +/* General purpose control and status registers */ +#define BASE_CONTROL (0x0000) // 0x1806_0000 - 0x1806_00FF https://git.psi.ch/sls_detectors_firmware/mythen_III_mcb/blob/master/code/hdl/ctrl/ctrl.vhd + +/* ASIC Control */ +#define BASE_ASIC (0x0100) // 0x1806_0100 - 0x1806_010F +/* ASIC Digital Interface. Data recovery core */ +#define BASE_ADIF (0x0110) // 0x1806_0110 - 0x1806_011F https://git.psi.ch/sls_detectors_firmware/vhdl_library/blob/2e81ccbdbc5cb81813ba190fbdba43e8d6884eb9/adif/adif_ctrl.vhd + +/* Formatting of data core */ +#define BASE_FMT (0x0120) // 0x1806_0120 - 0x1806_012F +/* Pattern control and status registers */ +#define BASE_PATTERN_CONTROL (0x00200) // 0x1806_0200 - 0x1806_02FF https://git.psi.ch/sls_detectors_firmware/vhdl_library/blob/2e81ccbdbc5cb81813ba190fbdba43e8d6884eb9/pattern_flow/pattern_flow_ctrl.vhd + +/* UDP datagram generator */ +#define BASE_UDP_RAM (0x01000) // 0x1806_1000 - 0x1806_1FFF +/* Pattern RAM. Pattern table */ +#define BASE_PATTERN_RAM (0x10000) // 0x1807_0000 - 0x1807_FFFF + + + + +/* Readout PLL registers --------------------------------------------------*/ + +#define READOUT_PLL_RESET_REG (0x1 * REG_OFFSET + BASE_READOUT_PLL) //TODO + +#define READOUT_PLL_RESET_OFST (0) +#define READOUT_PLL_RESET_MSK (0x00000001 << READOUT_PLL_RESET_OFST) + +#define READOUT_PLL_WAIT_REG (0x2 * REG_OFFSET + BASE_READOUT_PLL) //TODO + +#define READOUT_PLL_WAIT_OFST (0) +#define READOUT_PLL_WAIT_MSK (0x00000001 << READOUT_PLL_WAIT_OFST) + + +/* System PLL registers --------------------------------------------------*/ + +#define SYSTEM_PLL_RESET_REG (0x1 * REG_OFFSET + BASE_SYSTEM_PLL) //TODO + +#define SYSTEM_PLL_RESET_OFST (0) +#define SYSTEM_PLL_RESET_MSK (0x00000001 << SYSTEM_PLL_RESET_OFST) + +#define SYSTEM_PLL_WAIT_REG (0x2 * REG_OFFSET + BASE_SYSTEM_PLL) //TODO + +#define SYSTEM_PLL_WAIT_OFST (0) +#define SYSTEM_PLL_WAIT_MSK (0x00000001 << SYSTEM_PLL_WAIT_OFST) /* Control registers --------------------------------------------------*/ @@ -13,6 +62,9 @@ /* Module Control Board Serial Number Register */ #define MCB_SERIAL_NO_REG (0x00 * REG_OFFSET + BASE_CONTROL) +#define MCB_SERIAL_NO_VRSN_OFST (16) +#define MCB_SERIAL_NO_VRSN_MSK (0x0000001F << MCB_SERIAL_NO_VRSN_OFST) + /* FPGA Version register */ #define FPGA_VERSION_REG (0x01 * REG_OFFSET + BASE_CONTROL) @@ -47,6 +99,7 @@ #define SYSTEM_STATUS_REG (0x06 * REG_OFFSET + BASE_CONTROL) //Not used in software + /* Config RW regiseter */ #define CONFIG_REG (0x20 * REG_OFFSET + BASE_CONTROL) @@ -57,17 +110,13 @@ #define CONTROL_STRT_ACQSTN_MSK (0x00000001 << CONTROL_STRT_ACQSTN_OFST) #define CONTROL_STP_ACQSTN_OFST (1) #define CONTROL_STP_ACQSTN_MSK (0x00000001 << CONTROL_STP_ACQSTN_OFST) -#define CONTROL_RN_BSY_OFST (2) // assumed for MY3 +#define CONTROL_RN_BSY_OFST (2) // assumed for MY3 TODO #define CONTROL_RN_BSY_MSK (0x00000001 << CONTROL_RN_BSY_OFST) -#define CONTROL_STRT_EXPSR_OFST (6) -#define CONTROL_STRT_EXPSR_MSK (0x00000001 << CONTROL_STRT_EXPSR_OFST) #define CONTROL_CRE_RST_OFST (10) #define CONTROL_CRE_RST_MSK (0x00000001 << CONTROL_CRE_RST_OFST) #define CONTROL_PRPHRL_RST_OFST (11) // Only GBE10? #define CONTROL_PRPHRL_RST_MSK (0x00000001 << CONTROL_PRPHRL_RST_OFST) -// #define CONTROL_MMRY_RST_OFST (12) -// #define CONTROL_MMRY_RST_MSK (0x00000001 << CONTROL_MMRY_RST_OFST) -#define CONTROL_CLR_ACQSTN_FIFO_OFST (14) +#define CONTROL_CLR_ACQSTN_FIFO_OFST (15) #define CONTROL_CLR_ACQSTN_FIFO_MSK (0x00000001 << CONTROL_CLR_ACQSTN_FIFO_OFST) #define CONTROL_PWR_CHIP_OFST (31) #define CONTROL_PWR_CHIP_MSK (0x00000001 << CONTROL_PWR_CHIP_OFST) diff --git a/slsDetectorServers/mythen3DetectorServer/bin/mythen3DetectorServer_developer b/slsDetectorServers/mythen3DetectorServer/bin/mythen3DetectorServer_developer index 100d846746fc0cd1dfc591ec4c979887053e8af0..82e842cba6d00ba95229eead78bcd8f43e7e47fc 100755 GIT binary patch literal 147760 zcmeF451dt1wfN6v&RqV(9pP{;isK-N;9o>a9skT#$Fj1tm%X$s`~xb9NHUt4#m$DI zG@~-JG^3uC`STT-mG&%dH9o0)Ma5GPkQx8~!T+d$!2G^zopsLad$@OI7*Vv}Z}@D^ zI_sXZ_u6Z(wf5R;|2gxHJK-IfOva1<`gx!5LrZz;W9avH=$tTs2Mv}?Mu~8b$y(IZf@|L834g61<{J$AZ^1hdge$TJXc=_S| zG@VX?SMTa+x$?VEG?CvY^1GxJ+)EO=qzp-uDP;24C^c{|DgN!>9%-5G=KnaqNs8$^ zaMsK-51ci9|5-CJ9?@qYLF@3&_kB=MirYmY&pVduI}F~> zu5xK4Q3d@wg#V8rjU*LF^3G6_{2duxya{$~<|@34|C$UqoaI+#@RbC+#wjbSUXK z#dw}F&EWVV^3l`Z0Ox_h221Br8Op6l)2w0E8S-f7ckTsY&L znR8oaTzK+(kDYbF>=`GYaptTU-n41woPWXWX>(i7xUgl~wCK@_50c$kQFe1LIP1I_ zE#BE@&$?*tx!&BC3(uPKDR0IlGh4{)?3tHLKYRL2@7$IPX3x_9=X!JJTsU)f%h~*T z#`Nja&py~Y`+_+$W_xpHTzKIH7lNHhhKC(CZSLH&&X_GvozpV+>?z*N*)v+E&2G71 zjyHGaIkV50C7I8<;Ea}wW>23v{cLZRRAsg|cgCz4XSH}|oO!{8E#4f>7lK+YIL|x( z{4?fwXP+~p1p-F+Trj7_JO7MX>wGHoDQG`GdgP+nbLZMqv!TbE6J>bO+*vbb%<;}>xnL&GO`mzO@-1QH z`4`O+gt0^!a>iL_&7k;c)8<}urt=&53%Q!dTwZ|}G2f*{t>MolLZn~fMe)L=ZrUw1Iz0e)`D+s)21UCz8 zM)-Jv%~psGju)qmzavKW^Cnn61%b`EX%^TVmg5B$2ZX;91U6^oB!SJ*Iay$Fp7=XO zU~}wF6WBWP(*+i1jKApuizCM0xdIQ5;8_A&Mdt`y7vWn3-X(%B5!f84%LEojl)s|D z<|MWXEKU!93j`LYg}*BWHb-iqz~-D@EwDMb*9t5S5r5YUERH3Aiv%{u@kW8`Bm7MQ zo1=7#zzq?8vA|;^_%?y9U2YfHoZCAE7N?iLlE8aKaGSsrB6z95;=J*9kHF&e^0!Q2 zaoYG>F0eR#{H+k!ocGlNi}TE1yTIlUJ}j{LMvn_@{rEb8%?3XwusMk91vaN}gTUgT z^S4>xxFbNuCdlA`KVM*Rr1={lusHkt4G~xd6a3`_mVp3&BLz0+Juk2gB*qAQRP;=P zz&3ywFYwV3exks~MDTtBH%IVffscz|e{1IhfmdA9*uI~48_MI)JM5Uo1^eF`WJ+tN zdPUD~F6J5+%nw4Zm_yccX_FBhVJEWKjVyKtG~~a{PV(L$DP-Bu6OQjUa2M=e%GggFHtz>z;zD1ivy2v;E@g- zIPfS34jnk}z@r^_R|nqBfyX%T?hah2qS^GF}dS%!&OoKCJd@BiqX}Iqdqi&?&S^ zS|~PLc#>V$A@Lbrrgx?F9 zaC1{fDO2MGTlkGMs)qLCn%hKM`XZBsjDObHP?6{d6m&(G8V~@w-()75uUne znLgt|m&ud*78$vZ=nOkM+qJGY%oo|rho@9{=U(bJiTX|CoxKZdf(hQ5U@vrLJUTP3 zusYZi8JFKqX;>DV+OW*uRLnFk7z_`Qmm6xw7WS@*;As=a7C%ZIAEu5E&+BOAcdg6A zO&x_zbkIKxy;IH?xw5(5C z{;!b#EAu)MUcD0KFFG1fKfS`6>@&nXq@B->+PS{L%N3W@c&7^u@ZbBNn#%NiCZfl$ z>m@ypK+hu%J&#nO=g*9ZUas+mKDwmc8{&JxV@ujgufng#m$U~@bheis6B!&R_0I=S zB4ba@>nOE5xOL#3p4SmP*wh|8)YM*h*!k@letULaM@tqSJO@2bA!D^gPp%9ItD-5*&aRv9RrFh!e_Y-yX<*DTj{Tx+;K z&DH1nB-adA%94I2e1faT_3_S*@UbPd(_q>eS-HyE?|JBZ-jR>zBYwGU#n>;GwBu#c zj=cY{z5fF5zc8<(nZc;a*9+16LPz*iXM5w~Ht8dBLU;I3bYGuO$=tJ18@COu)W(rq zt1Q1v9xpp>`*M}G{Q!0beo4R4xL|Kjcs0r|UMtu7`qD_D<$y88h04md zltJ%@As4`{8MR^J3uOFv8BJ=pox0HHiro@9l(7ZA6sbc0uo3&2#eUXecS)M(hb&L* zc(~cAC;for8NAxm?$<>5+go(Kl3s4lvzLrE&mwQ1S<=zgRKRD# z&+P2yg`Yu=UuEur-}Jq2og;ol0UKz?T*}O?1=ite(q1!oq}xcp zB>jr?YtrqcJ4nAF{TJy@68stppMoVRUVO)R@pE`lf|j4Bc=2=N1-~in|Ht9QVt7Gp zC|rzvfH%lxPVz|Vc}w)H^pAe2v)#W{ev>-VHZjkl{34!_Ur4Hd3ZC7{^O{%md}$DQ zEQxW($DcZUTq1c_u>C0+D^2vFv&uL^$KmkT{PPxc(%&$CY_T5!tk^dmtmD&+|1+~a z*!7UH8Fh-r1&lqSKFP}zb`zddDeFbratLJ&rY%Wo&wg8;XJXGRPxZeTx2|9Pd(S`V z-aKPf`XB7K;O_XN=Pz29NB6pL@pJvUa4iS%uJ?2v8iy?a&f-p%>ZyHoeS z!t>i18{zjRFg`Ekc;f5o72ntIcexkf>oUIc#P?M^zOG*J-TVx{W`gsV+s;i(>NN>)gUAIRvL@KHt86XYyF5wKkJF*Nen;SO00_5hql8;qj?K$i65HS z9rL67AEPrrDrQ3R6U3it>-0nFbYmatROYYa`(-1aJz&fcz;}r^4I4^3;okyBZ8ON~fv+CE>hv@C z+R51GJlfNJr_SCHzj}kyo*SZfLduhN_C`zpq+`!0&O<*!+>|!L*C7DbxS$SrM1K9i z-(;G9_{)P@TK|@5yZkT2od*_Z%i{}yJd^fYBtA4;`uHNxEU5fU^iE-5*ZT<%Hj503 zy^3XJpjUWz)+^jhJchABu&I-=!5c?^Y0oYiyL_|m=!ZV&tgm5=NIk+$OWG&&E9Rvi zipQw-@>Y1>cbAEy=NJS zbfZh3Umtz&e}WCZDQ$xXsxDNtYi~Fo-XLArs}H(x;9FQ1et|CBTCNM;klNn$4R5#% zyg|C~3v}Vue=%K1`;lLyj$cUEvAmzD=trjWnNL29>$ck;bz<0VzwCdW{4P)D_ZGK9 z)#~~s>bl@xtgdPK_zHErGF``B$XPX>T|s_dPUqK+eAMn(U!&*#x)1$SwYq+lx?c4! zR@cWFTZhD7MlrS~1&oPq0Iax2KaN|v~E?@=mHsUcu8}Rj`x!NPG4`)s{WFERL1K%b7L%uRD zl=z#>>GV{t&oh!gW3~oppiVl*%$Kgud(m7=6XQ_gND{Zxaamc+uPz$XREcq>=H1-5 zM6|}h@=e7OE#5>t(dKzBvbsur80RK+#UGZsCiGRvN7g+uZqjuf-95(|EE#jkxHVV& zR=(RjBR#u?&7w9%ou};Sgej_sN_AZ7lc0xL+anCGOkupda)xlpdlWzM-!r|>@n zM)$zq(^S&mWuBk7y6OY%E8~fRmhm+!qn$F^9X_^O8PuVX{GzoYP3<9TMkr^OQ1C0j z%NmTQz;mU{2>8x)EiVvR+>IuOl6=#n@s_cGru&r;ufxDs1dI{60>~B%0PCsJ%~pK&o=4W z8Rfg+r9GYl|2%lE%4@-Y9X_t=gf{s2LMLlju+fYCy5I%Mkl$Ia5Xia+?%`jZ;;y!L zmh;Yf-XSUPW!;6mL;V6-55m3HX*IuJlg)>#$on4y8Uog7sy(uRT8@$mEqZh!6W9 zv;7yb-iZDNT|>uZzEJMJ!km@LskF-me&5*CK6nH5=eMEq8}h2}F^?7NaQyDjtl{Fk z`g3n`l{^#U;%5f%47McsUGA|Z@%>i@axZoB{@{Iuc`|{I<$6y|DL*n-${&~DygKIL z;m3bBoSf;xU%{N&J)L*wM|#WhUjf#7%F~{BEvz{#21pi)b(tbeZZqx_Z%z7Gl9&GMxXO;@umau*UIb%JltO1c2 zWh*#&SJqv$iml};>-wYnUcSrwOL@2c1?GXAd?f#2tm6_~rSfI3KnNZ8bap})?XbKS zSuxt|zWx>R)MucRzEt{Czdv*;Z1Vh1ljp7cj_;7jbKKYQthO8eTFQjE`+G4fwfgtCRPl{JLV`73SL0d`tPtE08f=>qtEmu7#gGQ|y=Z#J&jq z*>@ug(2}gbb$PwTc)itVMxMkUOn7bnAnU`4mCwt_J{s|Z!%nB(aUOM(qWK}?eIhF{ z@1dcL_uNQ4#D^^B zRaB0YS4$rK53T68t;bFb#!d{vPLKlRF`gS#IcC18Opf<98mMmwuM*yxJct};-|u`7r$Ow3w9P1NQw&R6B>CTI`J+1`mr0*s`xm<2!6rOsHi2tm z6SO?qTHBm*4yGJy_feC9Q?fu`L7z7?pOk;Mm0wM7;`dpfpV%qduyGD{NXua?OIz}r z_CGS_z=kz6E*6^x&8!VlJH|C$rz>lRl(+X;*=8RTKfvsx>^GJ7le)&`3N6?_wVBHQ zuKJhpc8%pP{tCLA+MysPw^RsFp58k0`!5pAgY zG@kYXW`8*`IbsZ*R)&;c!MBXpDoynki64`T*DA@rS$*H%r~CCNV~OACI@$j07h7a& zf1`Gb^NP#Zbf2F)0XeSNe>{Y}8iT#s4SPi@i&xS+XN(G!J710%Bvj{!!86y5`v_EvaLU}+y{z;A{2`8ofwPJ#3O@FFo# z>M zn)@)kh}UyYvAl@Sgiktt5Bq$?KTtk=6CDs5#kY`re6Hk8f2jAvhOy>D?^(Bv3~0L_ zZuwfAHu0w{POJIOBVY2e zzSGK-_|G~=*Vvz=z7Bq}@>te!ZjmEAM95v(?r(KGvjb4~H@C4WH*1> z7Fgm#*m93?enCP|K zy_~cId(Dz|-MVet%YJ`s2J#f?4r8gh?wl?kDJoplQt>7l8@Rz_MeTdus*7i z>@#kQ*7?M~p^W9kKaJM2mCvV*<+pJYL)jap`B#3YyESm7{_H707nH|hUt^mp_BFPt zVqasMD)u$DsbXKTsrs(iS80Fcx7k->m}*~{Q)DO*wWF-@+os;7oWwL^`-0yfwxmII z@G9fG^$$tEZF}0p$LMx_*GshXAli8#{SispH$ZN6{tQ|ZS&sXo>#aQN%M*KPV_>zH zHulgM0&^c~Gxm*iF|mO+TRv6%8Icq18{j2Ay~e;q*2T^e(@SKUwx^9#_Lg__S@=!e zlV>Z+Klz27o$d9k0aQA%8B&LeI#FegC*e`2*{<8HZjv{=On8LOitSQe;0z9x3u$l4 z-^RvQvN=`!p>4`v(u?vXrq}7%P}*8`bA7&Y-Ba`M-V0TpTZ=q3AWwTBPoyNC0WT6d zW4rhlqf_iR`&kn{*?v})rN<&V7m987yY+>oy;7{2%m0`6~K}f2y$P zXRO1bpXiF>ML%PIN%T|36||AsC;BLfnI~;j!4``wm(Hah5&wp^*BJYUxEFth`X+wV zBhtS3QA1ODULnsApNqX8>;dM=e2>URY`;U<4;=Xs4XXS18UM^DO2$Lx69tbnwM&w7 zXF}!>n%Nf%k8`CbC7uTl!FAEt1pnDjFoOQn#=~8|x%6X;s=TMZiR{^rXpH8;*BOn~ z`f;U;GPz2=3#DIKPAnPzCH=ejW+Fdv{|=n=@4z~b_QaA7@ug&b-J47s$b8xp)!R?| zcHXUAN5>XdXe0G?CAQ$U#RjXV`B+I?n2)7$gg+{ah3KlBbck##5RCHZOAlV`y}D?BA7 zZ3K^BlbsxCbkYu0?WDvP8TW}!itHx(SkY!i`dE>s)ZP=BGhi>0&JXw>Y52RGl_2)N z;=9hCQvV}1|L*SZNc9V`n|HjO z6!XMnC*g_JL;S2E*b*75X&G-X=V8(w#>3`J*ZTj8GEl|emvun?XV{0v9>l`!{k{6l zk?j&aFYPMw6#1NyP7UXN{@BK1T^;>BdshEczz#QvzZksQ$((|WS&KT?ru*!{bH-jy z;xYUd#eojDdT4*`^qKfeA`7zjRqOkX6i;LMGoDtBxuj$!mWL}v|Bct0f6RZA$+lRI zjGtn!EAr9Nr9^IBU2^mk9>p{{Yv|^+}|52 zyr1HY>)TX3Q|Qp|q1Rn!3gtfIdE-fkl1?Cbt}Cxk+;`hE zg+6FF_e`PF47b1Y?iq%2&lEb_aO0fk&NG~QrqCS2xn~MpWVn&eyO$cyJyU3&;RZR+ zwHmJ0!F?&hi9D)pf3uw_bk%u!rjYmN{u;+Alj-KBdaqJ7>L? ztjls`NqyY_y+^lvY?$=%y1(@Xr6pI$*Lcj~<%0ihY7hTc>;mgLzkgnI#>kEPjx9aN z`1)RK>Ag{3p|sy?w)FAO>G?vzKkz&5Yf_((Wr>;Mxaf?o;Ge{1B;Lg}_C;cUTlNtr zwA@loi^}QGtZZk^kCts~ezbi*9Qi=mvwBg+FP$=&&(|`3ZDlxXm$VF9yQF1sUQx4G z^2CqLzN;7I{LU%oNcc|Oc|VFF4lYK1Y{|;C^;Ot)Ps_FSRXV17Fe*!YrE0wMAMS*& zwm*JpRIZ#epfO7=xB9!{BPb94WVF~?w}cj3>!!3Uffm*nCGY&x-dT%WtaapKZ6p^_ zow4!I5dO1M{q0eoU6S|l$^Fsl4%JWvob0tSdOnt z%spIQO}<#O!+1%`wXr??N4`6(jX0}7-W47PT*Ku?>r+eeLPs-kl#1^^)b)OpxAF2x zqxXLDx`KSN!n6$R?sQ%4^P6(e~eL<*ugO)zNxNrFnH! zuFNazb2a-#wqO;{t#asFWzR9M9MdBCD~%ruJXsei>$o&-dmnL_O9ptsKLiKNj>izV z;jheTN~{$)e?9QiO-a4tyb6y;&+6}WM*BdcX$|?UacEx?(WLaG`T(uVkp0F=8z?-? z@_2we9&qaQK$J(~SESG9*pB|YMcQcM_sjb4Wv!eCNZLReGN1DRNmEJ3lTIVeA+?gO zCEY?w`tQ2^w(Y+|!@2!;z2V&cdz|6i{(GX~-2Qui!@2$U6vMgw_aTNG>CktC;oScF zXv4Yv_d5(%>%9A(2=}J#zfYPK_22J67a3plrvFwMI~^JO7;l_T&r-^6`)SV$L7UnnUbC^X{xeliwE$I ztW6nQ)HZLiau|2TbKqLeCdW1@y`_lGYrnv|<#TgFi=0=Q*msbuL9H0D*QFz0S12)7`vnRZvivzR`}bu z!0Xg`8>)lEpA%nvN&DmY(e>l#uh3^X^R-1}Z_y8Uw`+WM{g?R$2q$3}ZX=aQ_mEbQ9wt3U+Dsa-kaOcn4W#`@ zhmx8}Cy`Dgol9yV6-if;t|i?_T1>i=w3M`*)J|GQ+CcKZM*T@+NE1m@Nd?jgq*F-K zNpnb-krt4yCM_b}Lb{#QMp{N%O?sTPp5%R<`jhgc@ubP5BS^=SP9~jBnnk*V)Jj@N zx}J0s={8b{bPs6->0#1yq|KxO-=O}a2GV|{LrKk~lSrqL&Ly>wili$^*OG1|EhgPb zT1r|@YA3BDZ6NtqQ-9JJ(nQi!Qh{^==@im*(j3xdqy?m_NsCCgkZvcnk(QBGlO89n zCwbqb{-iuV$Q2Y$-nUjaXE@Na=1G58O_ z4;s7_nD47;K7R#XZSX&VR~ozm_+Eoo1M_hzef~kwx;1_{0 zhWhR+z`r;6RbW0CrT9+Z|1!AdKXcjJ4IT*mOM{02-)is(U_SPw?}os)7(52}CkF2c z{3C<+0{#z!_W@pH@PWYJHFzrUcMLuZ_*(`a1AMi??*aar!T$z)mBFV1Ut#d+z;WE= z9N_teKM(kFgD(K)<5f!kT;R(L{v`0H4E`+e#Rks@o@?-zf#(?fRp9dtz8d)B27ep) z9D^4DPdE6-z-JhI3-HGb{yFeR4E`1HDF*)+@COb4Bk;c&{3qZO4PFM!hl{i>_X5Am z;8noyFt`KwSc4x0E*Sg-FdwPXch> z;Qj`m2u!D`d42$xZ!s!-3h-9b<64F;bL{F1@v0l#4I9N=dS{v_}^gFg%W zgu!0`e$?QrfFCmW8sK(=Zvb9n@Q;A+H~6Q(@%p!0ftMTpSHOQa_&30RHTbu{e=+!v zz)KBY3VfHr_W=LF;AOx|4E|r>I}Kh1e22knfq!N2!@$2V_)*}+20sP-p9Vh%e6ztX z0sq+GSAlOdIP%43;aogKLFff@TtI`FnAj9Y=fr*pJ(t) z;ByVW0CrdvBm{yGY3pmE7WzW3;jxlK&Zo*St zXI{qdo(j%SJ$D7T+7#}$;Ib*)^WfN5SXM^J`J3z|EW;fMj{SsXxLM!^rEp&dH#miR zmUB9Xq;SDA`Cw=Y_i1p$Qn=rN8=k`54=$I&z5m&KP?y480&bTS?gnrpQn;7FjZEQ= zeJ&paDclTjqf)qUfeTYO@A-U?PvItl8=bBf*VN;r;{MUMbu^!A(fv4qKlO z_DO&! z;qC_4n8JA*^1y?xg}W8p$5Xg<;Lc0o9&O79vr@QzcjbfgQ@F|CW~Xrf z4(@^!t`*#z6z*nlpGe`>fV(h-%l&sgn47{K4X!1Hn+fis6z*H#E>7Wo3+|IC+*9B# zN#W}5&Ig}L;hMl*n!@e7G#`9Ag*)gk`QWk?t_9p@Qn;Uj`)mrg7TmlP?i+u~2gMZb zAK*Th!VUU!KDa!EI|AJ2Q@H;3K{ zR)YI-3OAVgUXjABp^Ph2xcvX*gRi7;CxE*ug}W5oS5vq};1;HEe+Boo6wdo=KKObH zcL2C=q;MyLyE=ut9NafkxSPOTlfvB#?prC`W^mW0aQpl%AACE7I|NCi>v{AW6}o4M`2$^hp!0&9?=*?H{H7+xNVd+W%33zUD$&_X&fJ;$4mSVQHD5Cn zpQ4cQ_ns52=Q*-}*Y}HnyPK0tXh_d{r}qsoM-}MWGRBM!J*+j?HO*T7)NabJG7nd^ z{PfyM=B$D(>@i{ewCvGVK0t@ejnz+Lj)pld-Qzg{cuOa1LRkknPS)Y1>0Q#UYbFNC zbF871J&2o~Iuy$5AZsHlKKJhO=Wdhzq%p5;jx3q~wK=k?bxohK(Oq2+kLs%XWc;WO z3TK!bn+mO4qq^5~78h-!dxz>X#k_o1b{k&Q6eC^?mpq&F{BT)=Devi-QS2qKbE6tK zLmZwXV;?B5x5Nl~{qD!g-+fIyd!D)GVazoTWsZ3WbIo#f_y+G+u>P~bFL)XD)^~&? z_Vow1v9Oc^JevP+9mxDW z_-61j|9>2^p>4m-8X4O2f;p3<{q);8>`jyJ1uLCaR@+9_EG)e%I;)2IhZ{TF56B{0 zQqPULe*it={Q-QxvW|DV>Yv~pT*8wG*D2p)(>(}k%lJ-DeLHKRH?U@iZ}rGt9ML_# zDXM!m$21f<4`WG=?{Vj3ANho#Ui7^>ea`qe$M{%92j%<5W&Fpcs2qO6-m`i9g#R{= zulv>)98!H9acYgatmjPYTPz2$+{@Wovd%%)sLS`2+hkn?-+5F$JMx{Ablr%oi{N+R z!>Cu5L^_<+geQ@ZtlvNxkXM$B&pR!Zx z7OzFHI)46juH%5M4+O9Ler@n_X01ks}cXA(qfUWWDaa>a87==ZowwV}s(J2`p3*}j$M4?e1+IBnZ?Dt;~N z9VuJ-FWQlE*w6SH+Ob+4TQiiQG9)&~)<522x}tJv>mNn7Y;BF~pJaVc8EvwUtXmmN z_xFzeRHIGSJc@4U6&iiucx{o;x($!XNc1Q$+n{>*3#$t@Rcvuvysky;EqdbZKgdhh z2c6CISfBJcsjo+UMn?5X+U3qSZ(ZE)tkPFD(2q@&whP2x;VOQM)I)Se+vV==>*C|% z`Te?NOxmQiCmGuTZQ_0#cBj>&Y@HqZ>}zeU9r_pdIo;|E@~=9B%zGP?J@kA#vgzSq z^Sp;c(T~kl+M~)kH@*X2xjn=;pkL{BKY4nr(Ffnp^ zd%e=(zS4DH_jJiOkY5vB-So%Zw!7F!Qnxm8m&iX#Y|3h@i|FVU$3B{^7yGzfJbewc zYnwmZGd+E>*UvDXsAD{lV+|mwH~qirkfTd_51;fZyyiFMbxpK4cANf)^&p~aa;}B= z^s&Dy`_AQTFgd?r;?QEQ{^R(&z{wiK-^=>Nt~H2aFy%nsOGrnM9%n7VdeTDRH!|JS zLwP6j`{|@s(rW0N#dQd2Iq+nz<4HKUp445&vg#YN&p&$*?}(o)@B!i{8@#W_xzh$u zMc9_I!@#W0)~SYYY$K`55kx z?$Az&?mRVlZ1HV_>>E+GE+&py+-hT(8XKEEq(E#?_i~?rNTe^a8s;I4WXxwP|%DC-iN5478Py8PlE6F&4 zekJ2?U98_Zmb{8bQm@OYuZ+WXmHdfod6(zvL#vMyBjVeP>I;VJJ2^{d3H2#t{F+Zx zk5$2h3sSoSu!;MaTHpcAL)GzEepDt$i~N!Q zhR*g0qqfx*`AubOLnnEdY#r5&Y?&-1`WeSa)K=IS@x4a3_>!+WcEw_$eUg_qVvIPR z_MjaS8~(xW>k&Q6KD`?vzRP_ymeH|4aW`!DX_g1=EMv^()EKi*yy$~(8v7-x7t$vZ zJD}_i`q`exv*|Nad!ZA-b4}{Uh|aPPsNMT-*^_T^Q(~i~t;C@?<3;epb}f1#aD9H; z{zJbnapc`mEdQ*Z(>D&xHD{B!OM}E+wAlO#v0qseTD(GZv0RQ^InlC5NZBR!8k+8X#dNQK54vZ(PIS-4 ziq&MkqD=Oczu)WyfA>MpzuAZSUl-M%Zxp~gjrlfIv^`bo@A5aX6F)F|t*sJyuo%X6 z@vIMhg39F0-P5q$WBfj}9et4bE%cW^>%I*OH(-;MUyi-~g}qZn&-+*Ds>{`cL>yxL*LZSh>3w%JE&$CiGA z>{X$)B7J?(h4dJraIt(#COQ)eUrNu~?D8|6nE8KquQz^QV&>_yK6~N!rRkS>nN}IA zRT~2x9QoXl-|W=q9;;7xW1o8ZO3``7+%b=e=lh=UEMS}xyxOVzvWc@rCa!1M4j_8wb?xigrZnRtMC-LuXyw|5bxv%j__!rxf9{c2XR_T)itB=LYlloY^ zT>Yjg+xE%c0^wKrc(VWx1N!!06MZzXYUyLO&y9Ij)qgJP8dQmGs{bhS8|DLq#6_e2 znrp`6o0rjdgw&54b7A#42Wubt_h_AzwU6uTy%BwUVO1~XYTth`xjLwCa#gsaf?UDF zigFe6Y)8x0A#Z-U@`iMsE8FcDqWND;uHM@>x$>UeR<4AH73C`C*^ZX0553NE)mPup z=||KjmHBd+OV|?4CA<-Kvd8{wWR?EwobKg2?W6Wsm;V=eIQ#$eu-AT6H95R^2lH?T z__XfX3GI9Xvc4bZk@~EmWL=6pC-MKnd5ka9^N+vlo>y^v zB3VoM$6IABCHr>R=Ok+>W$mcuZ|kR)PAOYE+Nb%;KFE5Hysc+VEOZjPlkYncTl=i=yd)m{{2RqnZ8SdPquD=;9dkmv`#_J5dqeiixVcT`|f_LAq zI3HLsrp=u9-;FP}4#1Dsh}k-TIA7vX75AdWaVp|ntefuIYvuoS330ay^QJGd-hBw` z-3PPYoz$E4?!m^UcAt1%%#Vug&Y5au>!AME>Q!xhG5L);($=_ezO=;jmiFL^AXVLEf;>+s#v#$3_Ia!;Z=-+|t zPl@g+i?�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 qM<2WciuYYkl?di5l>qL+3&EbduOiqF{@LR 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 b0X_r2Df1&8{#M|!@!r#cHe(_YXCD7Aspf8h literal 133968 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 #endif -extern udpStruct udpDetails; // Global variable from slsDetectorServer_funcs extern int debugflag; +extern udpStruct udpDetails; int firmware_compatibility = OK; int firmware_check_done = 0; @@ -33,8 +33,8 @@ int virtual_status = 0; int virtual_stop = 0; #endif -int32_t clkPhase[NUM_CLOCKS] = {0, 0, 0}; -uint32_t clkFrequency[NUM_CLOCKS] = {125, 20, 80}; +int32_t clkPhase[NUM_CLOCKS] = {0, 0, 0, 0, 0, 0}; +uint32_t clkFrequency[NUM_CLOCKS] = {0, 0, 0, 0, 0, 0}; int highvoltage = 0; int dacValues[NDAC] = {0}; @@ -333,18 +333,41 @@ void initStopServer() { void setupDetector() { FILE_LOG(logINFO, ("This Server is for 1 Mythen3 module \n")); - clkFrequency[RUN_CLK] = DEFAULT_RUN_CLK; - clkFrequency[TICK_CLK] = DEFAULT_TICK_CLK; - clkFrequency[SAMPLING_CLK] = DEFAULT_SAMPLING_CLK; + clkFrequency[READOUT_C0] = DEFAULT_READOUT_C0; + clkFrequency[READOUT_C1] = DEFAULT_READOUT_C1; + clkFrequency[SYSTEM_C0] = DEFAULT_SYSTEM_C0; + clkFrequency[SYSTEM_C1] = DEFAULT_SYSTEM_C1; + clkFrequency[SYSTEM_C2] = DEFAULT_SYSTEM_C2; + clkFrequency[SYSTEM_C3] = DEFAULT_SYSTEM_C3; highvoltage = 0; + { + int i; + for (i = 0; i < NUM_CLOCKS; ++i) { + clkPhase[i] = 0; + } + for (i = 0; i < NDAC; ++i) { + dacValues[i] = 0; + } + } #ifndef VIRTUAL + // pll defines + ALTERA_PLL_C10_SetDefines(REG_OFFSET, BASE_READOUT_PLL, BASE_SYSTEM_PLL, READOUT_PLL_RESET_REG, SYSTEM_PLL_RESET_REG, READOUT_PLL_RESET_MSK, SYSTEM_PLL_RESET_MSK, READOUT_PLL_WAIT_REG, SYSTEM_PLL_WAIT_REG, READOUT_PLL_WAIT_MSK, SYSTEM_PLL_WAIT_MSK, READOUT_PLL_VCO_FREQ_HZ, SYSTEM_PLL_VCO_FREQ_HZ); + ALTERA_PLL_C10_ResetPLL(READOUT_PLL); + ALTERA_PLL_C10_ResetPLL(SYSTEM_PLL); // hv DAC6571_SetDefines(HV_HARD_MAX_VOLTAGE, HV_DRIVER_FILE_NAME); //dac LTC2620_D_SetDefines(DAC_MAX_MV, DAC_DRIVER_FILE_NAME, NDAC); #endif + + //TODO? + //resetCore(); + //resetPeripheral(); + //cleanFifos(); + + // defaults setHighVoltage(DEFAULT_HIGH_VOLTAGE); setDefaultDacs(); @@ -369,10 +392,37 @@ int setDefaultDacs() { return ret; } +/* firmware functions (resets) */ + +void cleanFifos() { +#ifdef VIRTUAL + return; +#endif + FILE_LOG(logINFO, ("Clearing Acquisition Fifos\n")); + bus_w(CONTROL_REG, bus_r(CONTROL_REG) | CONTROL_CLR_ACQSTN_FIFO_MSK); +} + +void resetCore() { +#ifdef VIRTUAL + return; +#endif + FILE_LOG(logINFO, ("Resetting Core\n")); + bus_w(CONTROL_REG, bus_r(CONTROL_REG) | CONTROL_CRE_RST_MSK); + usleep(1000 * 1000); +} + +void resetPeripheral() { +#ifdef VIRTUAL + return; +#endif + FILE_LOG(logINFO, ("Resetting Peripheral\n")); + bus_w(CONTROL_REG, bus_r(CONTROL_REG) | CONTROL_PRPHRL_RST_MSK); +} + /* set parameters - dr, roi */ int setDynamicRange(int dr){ - return -1; + return 16; //TODO } @@ -406,12 +456,12 @@ int setExpTime(int64_t val) { return FAIL; } FILE_LOG(logINFO, ("Setting exptime %lld ns\n", (long long int)val)); - val *= (1E-3 * clkFrequency[RUN_CLK]); + val *= (1E-9 * clkFrequency[SYSTEM_C0]); setPatternWaitTime(0, val); // validate for tolerance int64_t retval = getExpTime(); - val /= (1E-3 * clkFrequency[RUN_CLK]); + val /= (1E-9 * clkFrequency[SYSTEM_C0]); if (val != retval) { return FAIL; } @@ -419,7 +469,7 @@ int setExpTime(int64_t val) { } int64_t getExpTime() { - return setPatternWaitTime(0, -1) / (1E-3 * clkFrequency[RUN_CLK]); + return setPatternWaitTime(0, -1) / (1E-9 * clkFrequency[SYSTEM_C0]); } int setPeriod(int64_t val) { @@ -428,12 +478,12 @@ int setPeriod(int64_t val) { return FAIL; } FILE_LOG(logINFO, ("Setting period %lld ns\n", (long long int)val)); - val *= (1E-3 * clkFrequency[TICK_CLK]); + val *= (1E-9 * clkFrequency[SYSTEM_C2]); set64BitReg(val, SET_PERIOD_LSB_REG, SET_PERIOD_MSB_REG); // validate for tolerance int64_t retval = getPeriod(); - val /= (1E-3 * clkFrequency[TICK_CLK]); + val /= (1E-9 * clkFrequency[SYSTEM_C2]); if (val != retval) { return FAIL; } @@ -441,7 +491,7 @@ int setPeriod(int64_t val) { } int64_t getPeriod() { - return get64BitReg(SET_PERIOD_LSB_REG, SET_PERIOD_MSB_REG)/ (1E-3 * clkFrequency[TICK_CLK]); + return get64BitReg(SET_PERIOD_LSB_REG, SET_PERIOD_MSB_REG)/ (1E-9 * clkFrequency[SYSTEM_C2]); } int setDelayAfterTrigger(int64_t val) { @@ -450,12 +500,12 @@ int setDelayAfterTrigger(int64_t val) { return FAIL; } FILE_LOG(logINFO, ("Setting delay after trigger %lld ns\n", (long long int)val)); - val *= (1E-3 * clkFrequency[TICK_CLK]); - set64BitReg(val, SET_DELAY_LSB_REG, SET_DELAY_MSB_REG); + val *= (1E-9 * clkFrequency[SYSTEM_C2]); + set64BitReg(val, SET_TRIGGER_DELAY_LSB_REG, SET_TRIGGER_DELAY_MSB_REG); // validate for tolerance int64_t retval = getDelayAfterTrigger(); - val /= (1E-3 * clkFrequency[TICK_CLK]); + val /= (1E-9 * clkFrequency[SYSTEM_C2]); if (val != retval) { return FAIL; } @@ -463,7 +513,7 @@ int setDelayAfterTrigger(int64_t val) { } int64_t getDelayAfterTrigger() { - return get64BitReg(SET_DELAY_LSB_REG, SET_DELAY_MSB_REG) / (1E-3 * clkFrequency[TICK_CLK]); + return get64BitReg(SET_TRIGGER_DELAY_LSB_REG, SET_TRIGGER_DELAY_MSB_REG) / (1E-9 * clkFrequency[SYSTEM_C2]); } @@ -475,6 +525,25 @@ int64_t getNumTriggersLeft() { return get64BitReg(GET_CYCLES_LSB_REG, GET_CYCLES_MSB_REG); } +int64_t getDelayAfterTriggerLeft() { + return get64BitReg(GET_DELAY_LSB_REG, GET_DELAY_MSB_REG) / (1E-9 * clkFrequency[SYSTEM_C2]); +} + +int64_t getPeriodLeft() { + return get64BitReg(GET_PERIOD_LSB_REG, GET_PERIOD_MSB_REG) / (1E-9 * clkFrequency[SYSTEM_C2]); +} + +int64_t getFramesFromStart() { + return get64BitReg(FRAMES_FROM_START_LSB_REG, FRAMES_FROM_START_MSB_REG); +} + +int64_t getActualTime() { + return get64BitReg(TIME_FROM_START_LSB_REG, TIME_FROM_START_MSB_REG) / (1E-9 * clkFrequency[SYSTEM_C3]);//TODO which clock +} + +int64_t getMeasurementTime() { + return get64BitReg(START_FRAME_TIME_LSB_REG, START_FRAME_TIME_MSB_REG) / (1E-9 * clkFrequency[SYSTEM_C3]);//TODO which clock +} @@ -623,7 +692,7 @@ int configureMAC() { calcChecksum(udp); //TODO? - //cleanFifos(); + cleanFifos(); //resetCore(); //alignDeserializer(); return OK; @@ -894,6 +963,192 @@ int powerChip (int on){ } +int setPhase(enum CLKINDEX ind, int val, int degrees) { + if (ind < 0 || ind >= NUM_CLOCKS) { + FILE_LOG(logERROR, ("Unknown clock index %d to set phase\n", ind)); + return FAIL; + } + char* clock_names[] = {CLK_NAMES}; + FILE_LOG(logINFO, ("Setting %s clock (%d) phase to %d %s\n", clock_names[ind], ind, val, degrees == 0 ? "" : "degrees")); + int maxShift = getMaxPhase(ind); + // validation + if (degrees && (val < 0 || val > 359)) { + FILE_LOG(logERROR, ("\tPhase outside limits (0 - 359°C)\n")); + return FAIL; + } + if (!degrees && (val < 0 || val > maxShift - 1)) { + FILE_LOG(logERROR, ("\tPhase outside limits (0 - %d phase shifts)\n", maxShift - 1)); + return FAIL; + } + + int valShift = val; + // convert to phase shift + if (degrees) { + ConvertToDifferentRange(0, 359, 0, maxShift - 1, val, &valShift); + } + FILE_LOG(logDEBUG1, ("\tphase shift: %d (degrees/shift: %d)\n", valShift, val)); + + int relativePhase = valShift - clkPhase[ind]; + FILE_LOG(logDEBUG1, ("\trelative phase shift: %d (Current phase: %d)\n", relativePhase, clkPhase[ind])); + + // same phase + if (!relativePhase) { + FILE_LOG(logINFO, ("\tNothing to do in Phase Shift\n")); + return OK; + } + FILE_LOG(logINFOBLUE, ("Configuring Phase\n")); + + int phase = 0; + if (relativePhase > 0) { + phase = (maxShift - relativePhase); + } else { + phase = (-1) * relativePhase; + } + FILE_LOG(logDEBUG1, ("\t[Single Direction] Phase:%d (0x%x). Max Phase shifts:%d\n", phase, phase, maxShift)); + + int pllIndex = ind >= SYSTEM_C0 ? SYSTEM_PLL : READOUT_PLL; + int clkIndex = ind >= SYSTEM_C0 ? ind - SYSTEM_C0 : ind; + int ret = ALTERA_PLL_C10_SetPhaseShift(pllIndex, clkIndex, phase, 0); + + clkPhase[ind] = valShift; + return ret; +} + +int getPhase(enum CLKINDEX ind, int degrees) { + if (ind < 0 || ind >= NUM_CLOCKS) { + FILE_LOG(logERROR, ("Unknown clock index %d to get phase\n", ind)); + return -1; + } + if (!degrees) + return clkPhase[ind]; + // convert back to degrees + int val = 0; + ConvertToDifferentRange(0, getMaxPhase(ind) - 1, 0, 359, clkPhase[ind], &val); + return val; +} + +int getMaxPhase(enum CLKINDEX ind) { + if (ind < 0 || ind >= NUM_CLOCKS) { + FILE_LOG(logERROR, ("Unknown clock index %d to get max phase\n", ind)); + return -1; + } + int vcofreq = getVCOFrequency(ind); + int maxshiftstep = ALTERA_PLL_C10_GetMaxPhaseShiftStepsofVCO(); + int ret = ((double)vcofreq / (double)clkFrequency[ind]) * maxshiftstep; + + char* clock_names[] = {CLK_NAMES}; + FILE_LOG(logDEBUG1, ("\tMax Phase Shift (%s): %d (Clock: %d Hz, VCO:%d Hz)\n", + clock_names[ind], ret, clkFrequency[ind], vcofreq)); + + return ret; +} + +int validatePhaseinDegrees(enum CLKINDEX ind, int val, int retval) { + if (ind < 0 || ind >= NUM_CLOCKS) { + FILE_LOG(logERROR, ("Unknown clock index %d to validate phase in degrees\n", ind)); + return FAIL; + } + if (val == -1) { + return OK; + } + FILE_LOG(logDEBUG1, ("validating phase in degrees for clk %d\n", (int)ind)); + int maxShift = getMaxPhase(ind); + // convert degrees to shift + int valShift = 0; + ConvertToDifferentRange(0, 359, 0, maxShift - 1, val, &valShift); + // convert back to degrees + ConvertToDifferentRange(0, maxShift - 1, 0, 359, valShift, &val); + + if (val == retval) + return OK; + return FAIL; +} + + + +int getFrequency(enum CLKINDEX ind) { + if (ind < 0 || ind >= NUM_CLOCKS) { + FILE_LOG(logERROR, ("Unknown clock index %d to get frequency\n", ind)); + return -1; + } + return clkFrequency[ind]; +} + +int getVCOFrequency(enum CLKINDEX ind) { + if (ind < 0 || ind >= NUM_CLOCKS) { + FILE_LOG(logERROR, ("Unknown clock index %d to get vco frequency\n", ind)); + return -1; + } + int pllIndex = ind >= SYSTEM_C0 ? SYSTEM_PLL : READOUT_PLL; + return ALTERA_PLL_C10_GetVCOFrequency(pllIndex); +} + +int getMaxClockDivider() { + return ALTERA_PLL_C10_GetMaxClockDivider(); +} + +int setClockDivider(enum CLKINDEX ind, int val) { + if (ind < 0 || ind >= NUM_CLOCKS) { + FILE_LOG(logERROR, ("Unknown clock index %d to set clock divider\n", ind)); + return FAIL; + } + if (val < 2 || val > getMaxClockDivider()) { + return FAIL; + } + char* clock_names[] = {CLK_NAMES}; + int vcofreq = getVCOFrequency(ind); + int currentdiv = vcofreq / clkFrequency[ind]; + int newfreq = vcofreq / val; + + FILE_LOG(logINFO, ("\tSetting %s clock (%d) divider from %d (%d Hz) to %d (%d Hz). \n\t(Vcofreq: %d Hz)\n", clock_names[ind], ind, currentdiv, clkFrequency[ind], val, newfreq, vcofreq)); + + // Remembering old phases in degrees + int oldPhases[NUM_CLOCKS]; + { + int i = 0; + for (i = 0; i < NUM_CLOCKS; ++i) { + oldPhases [i] = getPhase(i, 1); + FILE_LOG(logDEBUG1, ("\tRemembering %s clock (%d) phase: %d degrees\n", clock_names[ind], ind, oldPhases[i])); + } + } + + // Calculate and set output frequency + int pllIndex = ind >= SYSTEM_C0 ? SYSTEM_PLL : READOUT_PLL; + int clkIndex = ind >= SYSTEM_C0 ? ind - SYSTEM_C0 : ind; + int ret = ALTERA_PLL_C10_SetOuputFrequency (pllIndex, clkIndex, newfreq); + clkFrequency[ind] = newfreq; + FILE_LOG(logINFO, ("\t%s clock (%d) divider set to %d (%d Hz)\n", clock_names[ind], ind, val, clkFrequency[ind])); + + // phase is reset by pll (when setting output frequency) + if (ind >= READOUT_C0) { + clkPhase[READOUT_C0] = 0; + clkPhase[READOUT_C1] = 0; + } else { + clkPhase[SYSTEM_C0] = 0; + clkPhase[SYSTEM_C1] = 0; + clkPhase[SYSTEM_C2] = 0; + clkPhase[SYSTEM_C3] = 0; + } + + // set the phase in degreesif custom set + { + int i = 0; + for (i = 0; i < NUM_CLOCKS; ++i) { + FILE_LOG(logINFO, ("\tPhase reset by PLL\n\tCorrecting %s clock (%d) phase to %d degrees\n", clock_names[i], i, oldPhases[i])); + setPhase(i, oldPhases[i], 1); + } + } + return ret; +} + +int getClockDivider(enum CLKINDEX ind) { + if (ind < 0 || ind >= NUM_CLOCKS) { + FILE_LOG(logERROR, ("Unknown clock index %d to get clock divider\n", ind)); + return -1; + } + return (getVCOFrequency(ind) / clkFrequency[ind]); +} + /* aquisition */ int setDetectorPosition(int pos[]) { @@ -924,11 +1179,10 @@ int startStateMachine(){ return OK; #endif FILE_LOG(logINFOBLUE, ("Starting State Machine\n")); - // cleanFifos(); + cleanFifos(); //start state machine - bus_w(CONTROL_REG, bus_r(CONTROL_REG) | CONTROL_STRT_ACQSTN_MSK | CONTROL_STRT_EXPSR_MSK); - bus_w(CONTROL_REG, bus_r(CONTROL_REG) & ~CONTROL_STRT_ACQSTN_MSK & ~CONTROL_STRT_EXPSR_MSK); + bus_w(CONTROL_REG, bus_r(CONTROL_REG) | CONTROL_STRT_ACQSTN_MSK); FILE_LOG(logINFO, ("Status Register: %08x\n",bus_r(STATUS_REG))); return OK; @@ -990,9 +1244,6 @@ int stopStateMachine(){ #endif //stop state machine bus_w(CONTROL_REG, bus_r(CONTROL_REG) | CONTROL_STP_ACQSTN_MSK); - usleep(WAIT_TIME_US_STP_ACQ); - bus_w(CONTROL_REG, bus_r(CONTROL_REG) & ~CONTROL_STP_ACQSTN_MSK); - FILE_LOG(logINFO, ("Status Register: %08x\n",bus_r(STATUS_REG))); return OK; } diff --git a/slsDetectorServers/mythen3DetectorServer/slsDetectorServer_defs.h b/slsDetectorServers/mythen3DetectorServer/slsDetectorServer_defs.h index 916e8c6ff..5e5bbe40f 100644 --- a/slsDetectorServers/mythen3DetectorServer/slsDetectorServer_defs.h +++ b/slsDetectorServers/mythen3DetectorServer/slsDetectorServer_defs.h @@ -23,42 +23,46 @@ #define DEFAULT_PERIOD (2*1000*1000) //ns #define DEFAULT_DELAY_AFTER_TRIGGER (0) #define DEFAULT_HIGH_VOLTAGE (0) -#define DEFAULT_RUN_CLK (125) -#define DEFAULT_TICK_CLK (20) // will be fixed later. Not configurable -#define DEFAULT_SAMPLING_CLK (80) +#define DEFAULT_READOUT_C0 (125000000) // rdo_clk, 125 MHz +#define DEFAULT_READOUT_C1 (250000000) // rdo_x2_clk, 250 MHz +#define DEFAULT_SYSTEM_C0 (125000000) // run_clk, 125 MHz +#define DEFAULT_SYSTEM_C1 (80000000) // chip_clk, 80 MHz +#define DEFAULT_SYSTEM_C2 (20000000) // sync_clk, 20 MHz +#define DEFAULT_SYSTEM_C3 (125000000) // str_clk, 125 MHz /* Firmware Definitions */ #define IP_HEADER_SIZE (20) +#define READOUT_PLL_VCO_FREQ_HZ (750000000) // 750MHz +#define SYSTEM_PLL_VCO_FREQ_HZ (750000000) // 750MHz +#define MAX_PATTERN_LENGTH (0x2000) // maximum number of words (64bit) +#define WAIT_TIME_US_STP_ACQ (100) /** Other Definitions */ #define BIT16_MASK (0xFFFF) -#define DAC_NAMES "vcassh", "vth2", "vshaper", "vshaperneg", "vipre_out", "vth3", "vth1", "vicin", "vcas", "vpreamp", "vph", "vipre", "viinsh", "vpl", "vtrim", "vdcsh" /* Enums */ -enum CLKINDEX {RUN_CLK, TICK_CLK, SAMPLING_CLK, NUM_CLOCKS}; -enum DACINDEX {M_CASSH, M_VTH2, M_VRFSH, M_VRFSHNPOL, M_VIPRE_OUT, M_VTH3, M_VTH1, M_VICIN, M_CAS, M_VRF, M_VPH, M_VIPRE, M_VIINSH, M_VPL, M_VTRIM, M_VDCSH}; -#define DEFAULT_DAC_VALS {1200, /* casSh */ \ - 2800, /* Vth2 */ \ - 1280, /* VrfSh */ \ - 2800, /* VrfShNpol */ \ - 1220, /* vIpreOut */ \ - 2800, /* Vth3 */ \ - 2800, /* Vth1 */ \ - 1708, /* vIcin */ \ - 1800, /* cas */ \ - 1100, /* Vrf */ \ - 1712, /* VPH */ \ - 2624, /* vIpre */ \ - 1708, /* vIinSh */ \ - 1100, /* VPL */ \ - 2800, /* vTrim */ \ - 800 /* VdcSh */ \ - }; - - -/* Defines in the Firmware */ -#define MAX_PATTERN_LENGTH (0x2000) // maximum number of words (64bit) -#define WAIT_TIME_US_STP_ACQ (100) +enum DACINDEX {M_CASSH, M_VTH2, M_VRFSH, M_VRFSHNPOL, M_VIPRE_OUT, M_VTH3, M_VTH1, M_VICIN, M_CAS, M_VRF, M_VPH, M_VIPRE, M_VIINSH, M_VPL, M_VTRIM, M_VDCSH}; +#define DAC_NAMES "vcassh", "vth2", "vshaper", "vshaperneg", "vipre_out", "vth3", "vth1", "vicin", "vcas", "vpreamp", "vph", "vipre", "viinsh", "vpl", "vtrim", "vdcsh" +#define DEFAULT_DAC_VALS {1200, /* casSh */ \ + 2800, /* Vth2 */ \ + 1280, /* VrfSh */ \ + 2800, /* VrfShNpol */ \ + 1220, /* vIpreOut */ \ + 2800, /* Vth3 */ \ + 2800, /* Vth1 */ \ + 1708, /* vIcin */ \ + 1800, /* cas */ \ + 1100, /* Vrf */ \ + 1712, /* VPH */ \ + 2624, /* vIpre */ \ + 1708, /* vIinSh */ \ + 1100, /* VPL */ \ + 2800, /* vTrim */ \ + 800 /* VdcSh */ \ + }; +enum CLKINDEX {READOUT_C0, READOUT_C1, SYSTEM_C0, SYSTEM_C1, SYSTEM_C2, SYSTEM_C3, NUM_CLOCKS}; +#define CLK_NAMES "READOUT_C0", "READOUT_C1", "SYSTEM_C0", "SYSTEM_C1", "SYSTEM_C2", "SYSTEM_C3" +enum PLLINDEX {READOUT_PLL, SYSTEM_PLL}; /* Struct Definitions */ typedef struct udp_header_struct { diff --git a/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h b/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h index 5dad01efd..580fc067f 100755 --- a/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h +++ b/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h @@ -103,7 +103,7 @@ extern u_int32_t readRegister(u_int32_t offset); // black // firmware functions (resets) -#ifdef JUNGFRAUD +#if defined(JUNGFRAUD) || defined(CHIPTESTBOARDD) || defined(MOENCHD) || defined(MYTHEN3D) void cleanFifos(); void resetCore(); void resetPeripheral(); @@ -118,14 +118,6 @@ void setROIADC(int adc); void setGbitReadout(); int readConfigFile(); void setMasterSlaveConfiguration(); -#elif CHIPTESTBOARDD -void cleanFifos(); -void resetCore(); -void resetPeripheral(); -#elif MOENCHD -void cleanFifos(); -void resetCore(); -void resetPeripheral(); #endif // parameters - dr, roi @@ -208,14 +200,14 @@ int64_t getDelayAfterTrigger(); int64_t getNumFramesLeft(); int64_t getNumTriggersLeft(); #endif -#if defined(JUNGFRAUD) || defined(GOTTHARDD) || defined(CHIPTESTBOARDD) || defined(MOENCHD) +#if defined(JUNGFRAUD) || defined(GOTTHARDD) || defined(CHIPTESTBOARDD) || defined(MOENCHD) || defined(MYTHEN3D) int64_t getDelayAfterTriggerLeft(); int64_t getPeriodLeft(); #endif #ifdef GOTTHARDD int64_t getExpTimeLeft(); #endif -#if defined(JUNGFRAUD) || defined(CHIPTESTBOARDD) || defined(MOENCHD) +#if defined(JUNGFRAUD) || defined(CHIPTESTBOARDD) || defined(MOENCHD) || defined(MYTHEN3D) int64_t getFramesFromStart(); int64_t getActualTime(); int64_t getMeasurementTime(); @@ -425,7 +417,16 @@ int setPatternWaitAddress(int level, int addr); uint64_t setPatternWaitTime(int level, uint64_t t); void setPatternLoop(int level, int *startAddr, int *stopAddr, int *nLoop); int powerChip (int on); - +int setPhase(enum CLKINDEX ind, int val, int degrees); +int getPhase(enum CLKINDEX ind, int degrees); +int getMaxPhase(enum CLKINDEX ind); +int validatePhaseinDegrees(enum CLKINDEX ind, int val, int retval); +//void setFrequency(enum CLKINDEX ind, int val); +int getFrequency(enum CLKINDEX ind); +int getVCOFrequency(enum CLKINDEX ind); +int getMaxClockDivider(); +int setClockDivider(enum CLKINDEX ind, int val); +int getClockDivider(enum CLKINDEX ind); #elif GOTTHARD2D int setPhase(enum CLKINDEX ind, int val, int degrees); diff --git a/slsDetectorServers/slsDetectorServer/src/nios.c b/slsDetectorServers/slsDetectorServer/src/nios.c index a9efa5584..a375c9052 100755 --- a/slsDetectorServers/slsDetectorServer/src/nios.c +++ b/slsDetectorServers/slsDetectorServer/src/nios.c @@ -10,7 +10,7 @@ /* global variables */ u_int32_t* csp0base = 0; #define CSP0 0x18060000 -#define MEM_SIZE 0x100000 +#define MEM_SIZE 0x100000 //TODO (1804 0000 - 1804 07FF = 800 * 4 = 2000), (1806 0000 = 10000* 4 = 40000) u_int32_t* csp1base = 0; #define CSP1 0x18040000 diff --git a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c index 3b5f4d3ac..0be28f545 100755 --- a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c +++ b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c @@ -2393,7 +2393,7 @@ int get_period_left(int file_des) { memset(mess, 0, sizeof(mess)); int64_t retval = -1; -#if !defined(JUNGFRAUD) && !defined(GOTTHARDD) && !defined(CHIPTESTBOARDD) && !defined(MOENCHD) +#if !defined(JUNGFRAUD) && !defined(GOTTHARDD) && !defined(CHIPTESTBOARDD) && !defined(MOENCHD) && !defined(MYTHEN3D) functionNotImplemented(); #else // get only @@ -2408,7 +2408,7 @@ int get_delay_after_trigger_left(int file_des) { memset(mess, 0, sizeof(mess)); int64_t retval = -1; -#if !defined(JUNGFRAUD) && !defined(GOTTHARDD) && !defined(CHIPTESTBOARDD) && !defined(MOENCHD) +#if !defined(JUNGFRAUD) && !defined(GOTTHARDD) && !defined(CHIPTESTBOARDD) && !defined(MOENCHD) && !defined(MYTHEN3D) functionNotImplemented(); #else // get only @@ -2453,7 +2453,7 @@ int get_frames_from_start(int file_des) { memset(mess, 0, sizeof(mess)); int64_t retval = -1; -#if !defined(JUNGFRAUD) && !defined(CHIPTESTBOARDD) && !defined(MOENCHD) +#if !defined(JUNGFRAUD) && !defined(CHIPTESTBOARDD) && !defined(MOENCHD) && !defined(MYTHEN3D) functionNotImplemented(); #else // get only @@ -2468,7 +2468,7 @@ int get_actual_time(int file_des) { memset(mess, 0, sizeof(mess)); int64_t retval = -1; -#if !defined(JUNGFRAUD) && !defined(CHIPTESTBOARDD) && !defined(MOENCHD) +#if !defined(JUNGFRAUD) && !defined(CHIPTESTBOARDD) && !defined(MOENCHD) && !defined(MYTHEN3D) functionNotImplemented(); #else // get only @@ -2483,7 +2483,7 @@ int get_measurement_time(int file_des) { memset(mess, 0, sizeof(mess)); int64_t retval = -1; -#if !defined(JUNGFRAUD) && !defined(CHIPTESTBOARDD) && !defined(MOENCHD) +#if !defined(JUNGFRAUD) && !defined(CHIPTESTBOARDD) && !defined(MOENCHD) && !defined(MYTHEN3D) functionNotImplemented(); #else // get only @@ -3188,7 +3188,7 @@ int write_adc_register(int file_des) { uint32_t val = args[1]; FILE_LOG(logDEBUG1, ("Writing 0x%x to ADC Register 0x%x\n", val, addr)); -#if defined(EIGERD) || defined(GOTTHARD2D) +#if defined(EIGERD) || defined(GOTTHARD2D) || defined(MYTHEN3D) functionNotImplemented(); #else #ifndef VIRTUAL @@ -3722,7 +3722,7 @@ int reset_fpga(int file_des) { memset(mess, 0, sizeof(mess)); FILE_LOG(logDEBUG1, ("Reset FPGA\n")); -#if defined(EIGERD) || defined(GOTTHARDD) || defined(GOTTHARD2D) +#if defined(EIGERD) || defined(GOTTHARDD) || defined(GOTTHARD2D) || defined(MYTHEN3D) functionNotImplemented(); #else // only set @@ -5567,7 +5567,7 @@ int get_clock_frequency(int file_des) { return printSocketReadError(); FILE_LOG(logDEBUG1, ("Getting clock (%d) frequency\n", arg)); -#if !defined(CHIPTESTBOARDD) && !defined(MOENCHD) && !defined(GOTTHARD2D) +#if !defined(CHIPTESTBOARDD) && !defined(MOENCHD) && !defined(GOTTHARD2D) && !defined(MYTHEN3D) functionNotImplemented(); #else // get only @@ -5588,7 +5588,7 @@ int get_clock_frequency(int file_des) { break; #endif default: -#ifdef GOTTHARD2D +#if defined(GOTTHARD2D) || defined(MYTHEN3D) if (c < NUM_CLOCKS) { c = (enum CLKINDEX)arg; break; @@ -5600,7 +5600,7 @@ int get_clock_frequency(int file_des) { if (ret == OK) { retval = getFrequency(c); char* clock_names[] = {CLK_NAMES}; - FILE_LOG(logDEBUG1, ("retval %s clock (%d) frequency: %d %s\n", clock_names[c], (int)c, retval, myDetectorType == GOTTHARD2 ? "Hz" : "MHz")); + FILE_LOG(logDEBUG1, ("retval %s clock (%d) frequency: %d %s\n", clock_names[c], (int)c, retval, myDetectorType == GOTTHARD2 || myDetectorType == MYTHEN3 ? "Hz" : "MHz")); } #endif return Server_SendResult(file_des, INT32, UPDATE, &retval, sizeof(retval)); @@ -5618,7 +5618,7 @@ int set_clock_phase(int file_des) { return printSocketReadError(); FILE_LOG(logDEBUG1, ("Setting clock (%d) phase: %u %s\n", args[0], args[1], (args[2] == 0 ? "" : "degrees"))); -#if !defined(CHIPTESTBOARDD) && !defined(MOENCHD) && !defined(JUNGFRAUD)&& !defined(GOTTHARDD) && !defined(GOTTHARD2D) +#if !defined(CHIPTESTBOARDD) && !defined(MOENCHD) && !defined(JUNGFRAUD)&& !defined(GOTTHARDD) && !defined(GOTTHARD2D) && !defined(MYTHEN3D) functionNotImplemented(); #else // only set @@ -5639,7 +5639,7 @@ int set_clock_phase(int file_des) { break; #endif default: -#ifdef GOTTHARD2D +#if defined(GOTTHARD2D) || defined(MYTHEN3D) if (c < NUM_CLOCKS) { c = (enum CLKINDEX)ind; break; @@ -5654,7 +5654,7 @@ int set_clock_phase(int file_des) { sprintf(modeName, "%s clock (%d) phase %s", clock_names[c], (int)c, (inDegrees == 0 ? "" : "(degrees)")); // gotthard1d doesnt take degrees and cannot get phase -#ifdef GOTTHARDD +#ifndef GOTTHARDD if (inDegrees != 0) { ret = FAIL; strcpy(mess, "Cannot set phase in degrees for this detector.\n"); @@ -5714,7 +5714,7 @@ int get_clock_phase(int file_des) { return printSocketReadError(); FILE_LOG(logDEBUG1, ("Getting clock (%d) phase %s \n", args[0], (args[1] == 0 ? "" : "in degrees"))); -#if !defined(CHIPTESTBOARDD) && !defined(MOENCHD) && !defined(JUNGFRAUD) && !defined(GOTTHARD2D) +#if !defined(CHIPTESTBOARDD) && !defined(MOENCHD) && !defined(JUNGFRAUD) && !defined(GOTTHARD2D) && !defined(MYTHEN3D) functionNotImplemented(); #else // get only @@ -5733,7 +5733,7 @@ int get_clock_phase(int file_des) { break; #endif default: -#ifdef GOTTHARD2D +#if defined(GOTTHARD2D) || defined(MYTHEN3D) if (c < NUM_CLOCKS) { c = (enum CLKINDEX)ind; break; @@ -5762,7 +5762,7 @@ int get_max_clock_phase_shift(int file_des) { return printSocketReadError(); FILE_LOG(logDEBUG1, ("Getting clock (%d) max phase shift\n", arg)); -#if !defined(CHIPTESTBOARDD) && !defined(MOENCHD) && !defined(JUNGFRAUD) && !defined(GOTTHARD2D) +#if !defined(CHIPTESTBOARDD) && !defined(MOENCHD) && !defined(JUNGFRAUD) && !defined(GOTTHARD2D) && !defined(MYTHEN3D) functionNotImplemented(); #else // get only @@ -5779,7 +5779,7 @@ int get_max_clock_phase_shift(int file_des) { break; #endif default: -#ifdef GOTTHARD2D +#if defined(GOTTHARD2D) || defined(MYTHEN3D) if (c < NUM_CLOCKS) { c = (enum CLKINDEX)arg; break; @@ -5807,7 +5807,7 @@ int set_clock_divider(int file_des) { return printSocketReadError(); FILE_LOG(logDEBUG1, ("Setting clock (%d) divider: %u\n", args[0], args[1])); -#if !defined(EIGERD) && !defined(JUNGFRAUD) && !defined(GOTTHARD2D) +#if !defined(EIGERD) && !defined(JUNGFRAUD) && !defined(GOTTHARD2D) && !defined(MYTHEN3D) functionNotImplemented(); #else // only set @@ -5824,7 +5824,7 @@ int set_clock_divider(int file_des) { #endif default: // any clock index -#ifdef GOTTHARD2D +#if defined(GOTTHARD2D) || defined(MYTHEN3D) if (c < NUM_CLOCKS) { c = (enum CLKINDEX)ind; break; @@ -5843,7 +5843,7 @@ int set_clock_divider(int file_des) { FILE_LOG(logERROR,(mess)); } else #endif -#ifdef GOTTHARD2D +#if defined(GOTTHARD2D) || defined(MYTHEN3D) if (val < 2 || val > getMaxClockDivider()) { char* clock_names[] = {CLK_NAMES}; ret = FAIL; @@ -5861,7 +5861,7 @@ int set_clock_divider(int file_des) { if (ret != FAIL) { char modeName[50] = "speed"; -#ifdef GOTTHARD2D +#if defined(GOTTHARD2D) || defined(MYTHEN3D) char* clock_names[] = {CLK_NAMES}; sprintf(modeName, "%s clock (%d) divider", clock_names[c], (int)c); #endif @@ -5895,7 +5895,7 @@ int get_clock_divider(int file_des) { return printSocketReadError(); FILE_LOG(logDEBUG1, ("Getting clock (%d) divider\n", arg)); -#if !defined(EIGERD) && !defined(JUNGFRAUD) && !defined(GOTTHARD2D) +#if !defined(EIGERD) && !defined(JUNGFRAUD) && !defined(GOTTHARD2D) && !defined(MYTHEN3D) functionNotImplemented(); #else // get only @@ -5907,7 +5907,7 @@ int get_clock_divider(int file_des) { break; #endif default: -#ifdef GOTTHARD2D +#if defined(GOTTHARD2D) || defined(MYTHEN3D) if (c < NUM_CLOCKS) { c = (enum CLKINDEX)arg; break; diff --git a/slsDetectorSoftware/src/CmdProxy.cpp b/slsDetectorSoftware/src/CmdProxy.cpp index a2c9e586c..62ddd3786 100644 --- a/slsDetectorSoftware/src/CmdProxy.cpp +++ b/slsDetectorSoftware/src/CmdProxy.cpp @@ -404,9 +404,10 @@ std::string CmdProxy::ClockFrequency(int action) { std::ostringstream os; os << cmd << ' '; if (action == defs::HELP_ACTION) { - os << "[n_clock (0-8)] [freq_in_Hz]\n\t[Gotthard2] Frequency of clock n_clock in Hz. Use clkdiv to set frequency." << '\n'; + os << "[n_clock (0-8)] [freq_in_Hz]\n\t[Gotthard2][Mythen3] Frequency of clock n_clock in Hz. Use clkdiv to set frequency." << '\n'; } else { - if (det->getDetectorType().squash(defs::GENERIC) != defs::GOTTHARD2) { + defs::detectorType type = det->getDetectorType().squash(defs::GENERIC); + if (type != defs::GOTTHARD2 && type != MYTHEN3) { throw sls::RuntimeError("Not implemented for this detector."); } if (action == defs::GET_ACTION) { @@ -433,9 +434,10 @@ std::string CmdProxy::ClockPhase(int action) { std::ostringstream os; os << cmd << ' '; if (action == defs::HELP_ACTION) { - os << "[n_clock (0-8)] [phase] [deg (optional)]\n\t[Gotthard2] Phase of clock n_clock. If deg, then phase shift in degrees, else absolute phase shift values." << '\n'; + os << "[n_clock (0-8)] [phase] [deg (optional)]\n\t[Gotthard2][Mythen3] Phase of clock n_clock. If deg, then phase shift in degrees, else absolute phase shift values." << '\n'; } else { - if (det->getDetectorType().squash(defs::GENERIC) != defs::GOTTHARD2) { + defs::detectorType type = det->getDetectorType().squash(defs::GENERIC); + if (type != defs::GOTTHARD2 && type != MYTHEN3) { throw sls::RuntimeError("Not implemented for this detector."); } if (action == defs::GET_ACTION) { @@ -475,9 +477,10 @@ std::string CmdProxy::MaxClockPhaseShift(int action) { std::ostringstream os; os << cmd << ' '; if (action == defs::HELP_ACTION) { - os << "[n_clock (0-8)]\n\t[Gotthard2] Absolute Maximum Phase shift of clock n_clock." << '\n'; + os << "[n_clock (0-8)]\n\t[Gotthard2][Mythen3] Absolute Maximum Phase shift of clock n_clock." << '\n'; } else { - if (det->getDetectorType().squash(defs::GENERIC) != defs::GOTTHARD2) { + defs::detectorType type = det->getDetectorType().squash(defs::GENERIC); + if (type != defs::GOTTHARD2 && type != MYTHEN3) { throw sls::RuntimeError("Not implemented for this detector."); } if (action == defs::GET_ACTION) { @@ -499,9 +502,10 @@ std::string CmdProxy::ClockDivider(int action) { std::ostringstream os; os << cmd << ' '; if (action == defs::HELP_ACTION) { - os << "[n_clock (0-8)] [n_divider]\n\t[Gotthard2] Clock Divider of clock n_clock. Must be greater than 1." << '\n'; + os << "[n_clock (0-8)] [n_divider]\n\t[Gotthard2][Mythen3] Clock Divider of clock n_clock. Must be greater than 1." << '\n'; } else { - if (det->getDetectorType().squash(defs::GENERIC) != defs::GOTTHARD2) { + defs::detectorType type = det->getDetectorType().squash(defs::GENERIC); + if (type != defs::GOTTHARD2 && type != MYTHEN3) { throw sls::RuntimeError("Not implemented for this detector."); } if (action == defs::GET_ACTION) { diff --git a/slsDetectorSoftware/tests/test-multiSlsDetectorClient.cpp b/slsDetectorSoftware/tests/test-multiSlsDetectorClient.cpp index a4b417382..a6492ad2f 100644 --- a/slsDetectorSoftware/tests/test-multiSlsDetectorClient.cpp +++ b/slsDetectorSoftware/tests/test-multiSlsDetectorClient.cpp @@ -4044,8 +4044,8 @@ TEST_CASE("delayl", "[.cmd][.jungfrau][gotthard][ctb]") { REQUIRE_NOTHROW(multiSlsDetectorClient("delay 0", PUT)); } } -TEST_CASE("clk", "[.cmd]") { - if(test::type == slsDetectorDefs::GOTTHARD2) { +TEST_CASE("clk", "[.cmd][.gotthard2][.mythen3]") { + if(test::type == slsDetectorDefs::GOTTHARD2 || test::type == slsDetectorDefs::MYTHEN3) { REQUIRE_THROWS(multiSlsDetectorClient("clkfreq 0 2", PUT)); // cannot get REQUIRE_THROWS(multiSlsDetectorClient("clkfreq", GET)); // requires clk index REQUIRE_THROWS(multiSlsDetectorClient("clkfreq 7", GET)); // 7 doesnt exist diff --git a/slsSupportLib/include/versionAPI.h b/slsSupportLib/include/versionAPI.h index 7a76c0f6a..82056f70f 100644 --- a/slsSupportLib/include/versionAPI.h +++ b/slsSupportLib/include/versionAPI.h @@ -7,6 +7,6 @@ #define APIJUNGFRAU 0x191106 #define APIEIGER 0x191106 #define APIGOTTHARD 0x191106 -#define APIMYTHEN3 0x191106 -#define APIGOTTHARD2 0x191106 #define APICTB 0x191106 +#define APIGOTTHARD2 0x191106 +#define APIMYTHEN3 0x191106