From 621eb129764b90ac464d91b134f06291b01b082f Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 12 Jan 2020 00:30:23 +0100 Subject: [PATCH] fix: lf simulation, wrong offsets in majormode --- armsrc/felica.c | 8 ++-- armsrc/fpgaloader.h | 80 ++++++++++++++++++++++------------ fpga/fpga_hf.bit | Bin 42175 -> 42175 bytes fpga/fpga_lf.bit | Bin 42175 -> 42175 bytes fpga/fpga_lf.v | 104 ++++++++++++++++++++++++++++++++++++-------- 5 files changed, 144 insertions(+), 48 deletions(-) diff --git a/armsrc/felica.c b/armsrc/felica.c index 91b58d97f..d42640532 100644 --- a/armsrc/felica.c +++ b/armsrc/felica.c @@ -337,7 +337,7 @@ static void BuildFliteRdblk(uint8_t *idm, int blocknum, uint16_t *blocks) { } static void TransmitFor18092_AsReader(uint8_t *frame, int len, uint32_t *timing, uint8_t power, uint8_t highspeed) { - uint8_t flags = FPGA_MAJOR_MODE_ISO18092; + uint8_t flags = FPGA_MAJOR_MODE_HF_ISO18092; if (power) flags |= FPGA_HF_ISO18092_FLAG_READER; if (highspeed) @@ -404,7 +404,7 @@ bool WaitForFelicaReply(uint16_t maxbytes) { Dbprintf("WaitForFelicaReply Start"); uint32_t c = 0; // power, no modulation - FpgaWriteConfWord(FPGA_MAJOR_MODE_ISO18092 | FPGA_HF_ISO18092_FLAG_READER | FPGA_HF_ISO18092_FLAG_NOMOD); + FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_ISO18092 | FPGA_HF_ISO18092_FLAG_READER | FPGA_HF_ISO18092_FLAG_NOMOD); FelicaFrameReset(); // clear RXRDY: @@ -471,7 +471,7 @@ static void iso18092_setup(uint8_t fpga_minor_mode) { AT91C_BASE_SSC->SSC_RFMR = SSC_FRAME_MODE_BITS_IN_WORD(8) | SSC_FRAME_MODE_WORDS_PER_TRANSFER(0); // Signal field is on with the appropriate LED - FpgaWriteConfWord(FPGA_MAJOR_MODE_ISO18092 | fpga_minor_mode); + FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_ISO18092 | fpga_minor_mode); //20.4 ms generate field, start sending polling command afterwars. SpinDelay(100); @@ -720,7 +720,7 @@ void felica_sim_lite(uint64_t uid) { TransmitFor18092_AsReader(curresp, curlen, NULL, 0, 0); //switch back - FpgaWriteConfWord(FPGA_MAJOR_MODE_ISO18092 | FPGA_HF_ISO18092_FLAG_NOMOD); + FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_ISO18092 | FPGA_HF_ISO18092_FLAG_NOMOD); FelicaFrameReset(); listenmode = true; diff --git a/armsrc/fpgaloader.h b/armsrc/fpgaloader.h index c91fb3315..90d020333 100644 --- a/armsrc/fpgaloader.h +++ b/armsrc/fpgaloader.h @@ -21,10 +21,35 @@ #define FPGA_BITSTREAM_LF 1 #define FPGA_BITSTREAM_HF 2 +/* + Communication between ARM / FPGA is done inside armsrc/fpgaloader.c (function FpgaSendCommand) + Send 16 bit command / data pair to FPGA + The bit format is: C3 C2 C1 C0 D11 D10 D9 D8 D7 D6 D5 D4 D3 D2 D1 D0 + where + C is 4bit command + D is 12bit data + +-----+--------- frame layout -------------------- +bit | 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +-----+------------------------------------------- +cmd | x x x x +major| x x x +opt | x x +divi | x x x x x x x x +thres| x x x x x x x x +-----+------------------------------------------- +*/ + // Definitions for the FPGA commands. -#define FPGA_CMD_SET_CONFREG (1<<12) -#define FPGA_CMD_SET_DIVISOR (2<<12) -#define FPGA_CMD_SET_USER_BYTE1 (3<<12) +// HF / LF +#define FPGA_CMD_SET_CONFREG (1<<12) // C + +// LF +#define FPGA_CMD_SET_DIVISOR (2<<12) // C +#define FPGA_CMD_SET_USER_BYTE1 (3<<12) // C + +// HF +#define FPGA_CMD_TRACE_ENABLE (2<<12) // C // Definitions for the FPGA configuration word. // LF @@ -32,32 +57,34 @@ #define FPGA_MAJOR_MODE_LF_EDGE_DETECT (1<<5) #define FPGA_MAJOR_MODE_LF_PASSTHRU (2<<5) #define FPGA_MAJOR_MODE_LF_ADC (3<<5) + // HF -#define FPGA_MAJOR_MODE_HF_READER_TX (0<<5) -#define FPGA_MAJOR_MODE_HF_READER_RX_XCORR (1<<5) -#define FPGA_MAJOR_MODE_HF_SIMULATOR (2<<5) -#define FPGA_MAJOR_MODE_HF_ISO14443A (3<<5) -#define FPGA_MAJOR_MODE_HF_SNOOP (4<<5) -#define FPGA_MAJOR_MODE_HF_FELICA (5<<5) +#define FPGA_MAJOR_MODE_HF_READER_TX (0<<5) // D +#define FPGA_MAJOR_MODE_HF_READER_RX_XCORR (1<<5) // D +#define FPGA_MAJOR_MODE_HF_SIMULATOR (2<<5) // D +#define FPGA_MAJOR_MODE_HF_ISO14443A (3<<5) // D +#define FPGA_MAJOR_MODE_HF_SNOOP (4<<5) // D +#define FPGA_MAJOR_MODE_HF_ISO18092 (5<<5) // D +#define FPGA_MAJOR_MODE_HF_GET_TRACE (6<<5) // D + // BOTH -#define FPGA_MAJOR_MODE_OFF_LF (6<<5) -#define FPGA_MAJOR_MODE_OFF (7<<5) +#define FPGA_MAJOR_MODE_OFF (7<<5) // D // Options for LF_READER -#define FPGA_LF_ADC_READER_FIELD (1<<0) +#define FPGA_LF_ADC_READER_FIELD 0x1 // Options for LF_EDGE_DETECT #define FPGA_CMD_SET_EDGE_DETECT_THRESHOLD FPGA_CMD_SET_USER_BYTE1 -#define FPGA_LF_EDGE_DETECT_READER_FIELD (1<<0) -#define FPGA_LF_EDGE_DETECT_TOGGLE_MODE (1<<1) +#define FPGA_LF_EDGE_DETECT_READER_FIELD 0x1 +#define FPGA_LF_EDGE_DETECT_TOGGLE_MODE 0x2 // Options for the HF reader, tx to tag -#define FPGA_HF_READER_TX_SHALLOW_MOD (1<<0) +#define FPGA_HF_READER_TX_SHALLOW_MOD 0x1 // Options for the HF reader, correlating against rx from tag -#define FPGA_HF_READER_RX_XCORR_848_KHZ (1<<0) -#define FPGA_HF_READER_RX_XCORR_SNOOP (1<<1) -#define FPGA_HF_READER_RX_XCORR_QUARTER (1<<2) +#define FPGA_HF_READER_RX_XCORR_848_KHZ 0x1 +#define FPGA_HF_READER_RX_XCORR_SNOOP 0x2 +#define FPGA_HF_READER_RX_XCORR_QUARTER 0x4 // Options for the HF simulated tag, how to modulate #define FPGA_HF_SIMULATOR_NO_MODULATION 0x0 // 0000 @@ -68,17 +95,16 @@ // no 848K // Options for ISO14443A -#define FPGA_HF_ISO14443A_SNIFFER (0<<0) -#define FPGA_HF_ISO14443A_TAGSIM_LISTEN (1<<0) -#define FPGA_HF_ISO14443A_TAGSIM_MOD (2<<0) -#define FPGA_HF_ISO14443A_READER_LISTEN (3<<0) -#define FPGA_HF_ISO14443A_READER_MOD (4<<0) +#define FPGA_HF_ISO14443A_SNIFFER 0x0 +#define FPGA_HF_ISO14443A_TAGSIM_LISTEN 0x1 +#define FPGA_HF_ISO14443A_TAGSIM_MOD 0x2 +#define FPGA_HF_ISO14443A_READER_LISTEN 0x3 +#define FPGA_HF_ISO14443A_READER_MOD 0x4 //options for Felica. -#define FPGA_MAJOR_MODE_ISO18092 (5<<5) // 01010 0000 -#define FPGA_HF_ISO18092_FLAG_NOMOD (1<<0) // 0001 disable modulation module -#define FPGA_HF_ISO18092_FLAG_424K (2<<0) // 0010 should enable 414k mode (untested). No autodetect -#define FPGA_HF_ISO18092_FLAG_READER (4<<0) // 0100 enables antenna power, to act as a reader instead of tag +#define FPGA_HF_ISO18092_FLAG_NOMOD 0x1 // 0001 disable modulation module +#define FPGA_HF_ISO18092_FLAG_424K 0x2 // 0010 should enable 414k mode (untested). No autodetect +#define FPGA_HF_ISO18092_FLAG_READER 0x4 // 0100 enables antenna power, to act as a reader instead of tag void FpgaSendCommand(uint16_t cmd, uint16_t v); void FpgaWriteConfWord(uint8_t v); diff --git a/fpga/fpga_hf.bit b/fpga/fpga_hf.bit index 7e3fc14e2223e60a37b3427515e38c4d3dd62f4b..ae66d510fa02ca3e7181036f0f8e2bf134ebf884 100644 GIT binary patch delta 33 pcmdmgl4<`*rU|AZMh5x{hWds^3@Hqp3I51_XMoCc8Zamz^BD~o92f!^RFWBl1Q>7wmIkn#Pym?1PC(T#VV4DqGBrTV z!Ka3S0is3-tOExDwTp5!VDtYAIWRFWH83(_YS7N2f7uM z7&uliK}A+DJz!A)sp()n!?2M-=K!|>(;0?l1_drI1EB*fn;3K$xEYupF&co>91vZ@ zu!}+O0QUy48YL!;1x#-kb~5mRO#Z-<08+ys_=e&41iJ(Lo0#9QoMto<(c8fMjNvDP zoCE(9<_j!f_dHrK!?+pbFOy|FAb&A%7%-g(*x;bEfLnp-2Lm|aC@{(~Y;Vwg!d<}@$I#xO z_<$pW=^98Rfjfff1jHN<4jzV$3^qsj4VZZvPBR!C;4ol5A@GU8ritH>`4S}IILPi{ z_{U&>RQ?0=ABO)-_DA?1Fn@9Q%V6)qe}MS{8`xhfSl=-GWUza{vw`_d!)pdR1|E>6|yFuxFZ#bCdHX92SY!!HKA2L1)izaVybFg#%R!C)uA-^2`NFz_>g z(paOt0{;=_OAKIhI0T-6{N=#Ef%yr?Nd`Lyo(YU996uTC9QY?NAA;D`z>>nSlR+J3YI)EqV6frf zX<$}>h#X*k#|)158M03p{xjHs-MrwZro9*c1m-6UKbh=6BF~r#Antj>@Rz~Jp??DN z6Q+|4n;iJSY9RhP28k~Vfd>pb7|a;D8<-w2bTBA2a5OMIVA;W-$H0An=^VuG9IQte zb}}e{-OSL)py0q2z;p!^%MM^SL+lb=!mv|7&4GIY(-Ve91|B0a9?0L z28oLWB1;&4Iv9aM^$E*KMxz2fkm8>Lat_=RlwUydmj=TUP+WlW&JmDzJRtspxcL+$ ze`yFTfP_W^^8751<79;EE)`(81yD^FJOAX&;{}rh_S0f zuYr33(<@LqKtHh`WI46(pP)7(i-NL2i~|XlKwlz_ox$#$h{y zt^;=g(*a2SN)S22u=#)r1GkBg4?{DP&J7NQBnO5K6LdCkvoW23#QO@-H4Hx;%ozAh zm~9x&GuR*C+rX^U@Z*AA1OEhOs9g;VZy0`?*fH>LX?_DL^p5avVSb~so5{|Je+Bac zNd96J_`~p*!PtTS1GA05e+K&l{2!XXF#KiF2bH1+T)=s-ktK&=GlP}`_ZFr#47M-nPNMhjLzyxA|3Qs1mnilQ}Ob;M&!NI`8u$w^xq^5@f zTzDEV9bwqWq~pM?0LxztJUI-%8H^bCH!#aEfZel!`HcX$#9p9$0Fu8J$o>IIG4L0F z%0sZ5VQK6F^9xA+g4JKVKbY$n?l%}e;Q0uSxa|)(elUMv1eclM`m0gz0Y?Xu5<^FW zmI7BHlLAu*g90N*2h#&cID_i1#SA(JI1SuV7u!^%poQKQP~5 z_$pxkg#RP+4u}6L)(7}rAlF~N8SEbLHZW%}++Z+M;Qhv|!E}mYQv*)}a{UF$-5do@ zA}s9;iU&N5nM4>`85A8j3Xtos?G3sQI6atx7^ZZnD{xja88NgpC@OGxAlF}@8U{>A_17*2y9V9`%pMGv7|a@Y7jSDZoMK$m$b(*gF>oGX z{>bo$!5UO4fEe}+{3nFb>n{Q4B^)oAv>f~=FsrGYTws*JgI<4u%4ZdZP6j0h?g>t6 zOeaq)D&UyF^gsZdzo7M(1NVidEeh)yv_XnRntEB3oj5Ka>Ms^hnF%V@O&D4kG99>u zn!w=`z!3n;U$FX%yMcKD!wZm`o47R~wKq!r^%GQo2{0dF_{d=5z(1+^$by#|pgLFh z85^WdVTIPq6PQyNZZepGDh`mP#ts}4m{IC4JqGRuCk2KM27LzZ22lQDQPSdQK(4n986Es>oPaKouE>0Mj8zJ5vHwe=+1aa9?0EVdw=_*%O#p7&;jh4sc9> z*I%Mw_c-zkFuO6_WHNK`pTMocdQxDMgU$qISpCJggyAP6$QR5{8h*0aIq(ZGKWX{d zQ3tBXQ0lKb2EGH#8(?v&pm2i8h(o6VUVpJ_FzjN;Yv5kMq`|ODfvJIefwBcdpVQ(7 z4wU+9Gm}mO7XwoRiT z-zVlD4EGuALG2A_{lx%j&oAIV!Cb^~ufbe_{|~r4G=9MIgP8$RW`gT4M%@PP0wx)O zRtCij+#i@s82S~q9^fr#(t_0Qkorrvf%`&Jslz@8RRNGl19u~n62q-%i22KhAU^S5X3)})(0WRmgH!!Ve z=uS`q6%Go}`iq5!VKc~I0!%Cn8yFNAxDB{K2^*}23DQ1f;04uRb`AU+m_dySs{{NW zm=`ddU@&5k*}%-e2yP!j>#qiW2j&Y5U%=%&^9PPU47Lp11;Ws@3ah{Pe=vVw_}^%( zz;}Y%h~W&VM|ObQ0Mgz7*I(fN7sDfg-7H{dtYf&{p!R^fgGm7r&Y=1WRMv4DFdbmn z%%IS~Wx%Av&;;taFfb`W@)xN81+FhP2t7#H&7k1m(ZJNeFq4Dr0QVLq14vvrh=Q9C zpnB&q!*5XYje%K#;e>aP#X?>PR0(&2~2;F|h?zawh>1@3>n zWH`-W*1)qtc}>SJ2fHKuo0tV4?L%n&^?-W=(;J5F2Bid!HYR0`oj3H3aPM(4g2crG zRv%DY90B{Qn?a?FgN3Qdbz=k118znp3t0P5js;W~a91$hV`!hCyg;LZNse(_gYE-v zOC}D8IiUX6X9k-C{07V?nodiYfa>KQ2CxVNvk;_x2M!L#4EqJ_8Tb!?+8Y9( z#*#Bq{|nqo*}!~-;dFzMgH8jJ0>e)xIZ%jcLE;P4{{q!tp!O=mbq37_jsh+jmT92& zssWP_B%DG0ukEe854kIt{z3YT6`=lCi!P}DWdO-vp#B#$PR|{f%%sK00qV_90L7^d zpAaP8LH#diZ|eucDF&kkME~navlYZHX#WdTZ9QQ4;Q(%;7cl%`uw&qF!svfZU_Qd| z(y1oYP|AMGl$*O;t z;{wwbhP@1W4%}0m*dTGi!2+$n!2K^KT~M_y!myP=$AMd@3!1-R^%toB)$oErhd~Ea zkwM+82WcOI`d^?PBKrj8FD!)`d|v!Q%}*eG#tY2Lkn1md2mT4dPZ-`Z7(4J?U`}BG zbujrSFtb783)24r)nAbQ7Xt?`(J$y$}Jo(nO-&QV$kd0Uckf!i3<%x{yM|ZeNg2A=N@n?A%}sRfrAT@ zzo7LOsJC^7shvad5Jv&i9mefUxgZe@h&hn@%l4svh4Vdz^9|+?cr%!TKs_=AehX$T zNdDr0^uItk1zgB9@E>4)1L}Vr;D`6WAoZ6msJ8mY@PC2*1DzktRt{$x>_Ige10=q{ z^%s+_3&bx7Z86(pRY^%rOi@pw zHw-%)^b9!Um^2wyfO^mk%n8W-FFg-%nYo)mZwluOCLV<@hP(@)Mi(S5I3V?x19&WM zBZCfu27{9V!$Q!wjRBJrO8o_DIlN)~!Jx;$JAs*p;WUHYf&LB543PWiUL+5u`dFJOAYu#-Ut zRApx{bTVjx27-|5FApOJ{sqhrL5;uzIy0GHFdSquc)}xqTz~x&uy5eMAp8e3;C6uj z0CS1LKL&OM)bT^`sM-eRmkhrd><{oXf$BjCBTzpDss7pkDkU12o-piS&_B@8$HfmC zNOa)XfLwn;M?sH(hBXdwurTm2G#^lK;IKlfzZkZFYO4yNTcBaX2OOSEMhZO>loxP# zAlF}?SZo^k1(?qWd}6dapwr0A(sD?kfPrU0GgAHa2hFN6I7?xV^-SiTC_ z9^k)$-2eKOV3)wN05nv^V1I>Yf};k*O$H-})(Ol=_16{--3E>TrW*{~7<7+tIWUPZ z^f4$ma6Le-zqU2#JHSn%tMybC*)v@vih8hJs z2L1+y0){`J3L0hn@HZ$A!iLv)wlKFaoOCb(4Y*;czc_Y+#t)|mEoo>}&~osY!h}+P z>4W-Kf56oi$Al(OXGGC~>jD!>{RJ-hK|^plUK|2UTNqjyG#xlfxUke;41XByICL18 z6_`%26p8R1U`DII_%|?uJ2hUQ{ujef4Z8#U6POYGFUFq?bq?|q*i*pOG0z2oCEyW7 z{wqva>Mst^uptKna{|W>20I4s6aPQk{uj&720I7-8O%8i zKN-|OH5zjNi^-0$za{yB#195LMxGXCg@7L{asoUp+{pD8lU_sj0;LxmyBPEuc%L(A zFzh>^*TC@rt^PW|ZNPR0)KEOYWg+0)uvtRqfR_amX8m=CVLPb#RKNrt4}ZZG(1cWf zZEv-G$X^kBPvCol?F+sN<}ib=4fYTDexTG}kmCIfs7yF>^aJ+-P^4U0dw?0a|J5S@ zfd2qk0AFw~bv!hXo;dcZ70i6}iP`er!-U$5W09RXY8h$g_9^n7R{D9#% zhuty$CusH8A^s1|kfuJ*8E3Nve;Mo#=zKWLfK-1mfrkX&fX5Gc8<>f=71n-I5sdTuMu}r?7x8-92W<88n{&$ zezMdb@DV_*zv>V0e_({Tx&Hw72Zp~4_6Pe9!0Ru@e+>T*m?!Z4U@l^KGr?Mg=MQrM z!y5*3Pz&S(B)$#^ykpp`q~z7Hp-X|OfnfoIh7p&-f|VRf4>)$f#t%=ho?+OmpyHur zz~rE?Krw@Z!-z?tWdVcA0Z!2PA-LZJ>VIu!QgZ0npv1w@#h}o_v4KgAVKoP+L&pFc zKLq!`%pCMK2q!VUXxPP|vw>fk;ne}N12!Ab#t$?2KQMn~_=&}eW&h*U0*bI zba6U#Ur+$W4r2a`VRM6;6XzBt2d*7X3JM%sn3@qPJxm7~EDo?6AdMe7K>ALpAcqcW3 z7~qm0QGYS~1rHl?gSuT{f2lB?1kFUCj2~`bQexn3;8I|@!Jx#T!NA19(8I6@G>{0L z|MFlx!mt@MY#6{4!qCgG*nuMeG$!1j;LwdSez=iAIe{~P$&6txlX3z_0h0|wFQ~s0S{MTj%r2`rU zPI?N>3~NC14tz}A4B){ur18UT44MoY4oU_BElipW91ctZifs&mS6NO$=us3?rtq z4fap?e<06)ZDmxvz)`{+>u}vc`2YuK!n#F4_W*Yx>in1D0nP%ZI}D&Pe2qdT8HP5d z+yk@W^IxFx!wn1z7&;r696e?@DG72gC>?g_X2=1RElBfUzZi@dcpI1>f`->Dcp9XY zm^vBsK#oV6{{pqu`8IIBVffu)cL6m2HQ`4G*k4HVU;i15kLY}4wo`cTV0?(>1G5do zIR@hcydRjM^Ir`tISe}*lnk_bm=-g2IP5df?O|HPvARJCR30MDe{B>{0Chch8dftY zUFkAp;&JE}R65AL0Y3l5!o#qkL4iSvfe*C!LWhwXG;Xs95~tAo1sXrxz+k|@!@$hI z@qobyv?@b^;RM5^1H2oUVe?;-pgB9x=o9lFrh10`2iAhZ8C2);e}LCttbahGg^>Oi zcp=9P=3k&XZUN5^<^o9l1sXr>29F=YmTl~Cdc^`-(c!TJx&PG+8uK(@0%bIv1Ka{k zpcNf@3>+Jnk|6EF1EOnKIzau?2BsGdkby*|HwwEO^c*xcz{U?5MBgx+0JXy#m>+@W zB0?oj^*<|mM8!41q$ z8D<;UHSupkUcb?CKu?Ifwdth-*gadBo&_rHEX!si7vd>EcI{A@7d;NQUf3KBjZ;Q9+RQo(cu zG;sjR=Ae#-A_I2<(m1;= zU^;PN^8tlP+$>DcdIxFz@C9fnrh$J2^DBmb44YQ)KSW-?@rS`)06ZM}12k;d$n=2W zhk+e~e*?z&;VkB74WL0e{t3))Ky71CUk17U>d^Dyp5pXG0o4Bjbu>V$H5|cn$KdgK z(EQh41$_tZD@w19V1B~!7Zf`ekosQ?Kf(1ExW5dp0>Fwv zHOMi@{4!+xP>F$i0n-NtQ2&d&f$0UfBZj(uV=tusx&oQJ134ZvN-SN#bO^FO3N(JW zl|dQQ_k{Uf?MuU64sdT2dHqI&nFIes=BKc5e#Y^$!4Bk}7tnD(h9xXN8SDy>mu);@ z_^Dv$$v=tt6l82!Ltp{p8_-bj0p^derpRXj(3}hZfo8<|4aP3edO2j(nDKNsBp0*%9%ghBzdJNW}#U2Zo9x#H}yn)tlfQw4dxG0#h zfvJIELxYY2w}j9kNW3#}fakwJ#XB?#7BJ~R3bX~x2bjTm88m(fNl~D=El@dM0Gdx> zsAuF4K-6FV82*8lZGigA=Ns%n)1BWK?l2fLfM>+O{U%WTwX;P@p`%0T5l2Upo`Oe* z&?AN&3`z{#@ctKQ{%co*7NZ1*+XIFLEP0F)3~na`H?SmtMnNCJ>o10#4O*c7&O3wE z2lPI0>|uJxumNPw2Kf37(KigA87u^P8ki3-yl}7);Avof!*Y9}(FFbtiWeZ|GpPRh z!DRk~|AX=$f%^>hhxk7*|6tkUV5b3MK*r}CK>aTUqYL~SnBOY=K4A2Le+y{+n1GRp z4yYdoU%#=VL5Y*Qqv^4L1*4JzcMFq>z>WYV6OIkY_1DG{22lNVh{1qCMSz=u$0ZhHi>eQ}|29Q2Y;I6}z)=CqU!eJ~j|>J!_zl7JmkDSh z%z@)GgUJORS`LE3k3miB=^IwfDc@7*KoKyrFSri;P zQ2Jjx8I(XvF2QRr9W*AKQc(g=grW7njC^=zFdtPqdBQG(X9lwh!^s<)B6LvKZ!p<8 z=ucvP&hS&o&VzrB@{@*-4R#6q6PS_vUkXMXJT1(M3@03nn0Q*4AAshmK^YcSf3a#X zY-3Oa%^+B?^o1yH;z(pV#n5+BzYT5u2E&pE8Wv1EOw9sIK4_RQonxA;p!0#lfC;Jp zwVy%#K*x_J8;1TS^#dFQOn(`sG3YjMz}FwH0I%OLec)5!EXQ!X!4y=E-IKW9VDmr+ zrT_JV#fpL7!21EiZw4y|{s!kK46j(~8u>RcL+dZl{MYve;|Kgdob4F?HyA(U|G{h* z0ItX?n33kcwn!{w;|>&(P1us4$j0r!BywOI6S&2QH2<}SK~aGF1CuPneuu;W?gLCB zjN1jkBZ|=a3)25mVCa@`Vqn<7qQJ<_#Kgw1@qtbOw*kuhSA)?5{!Pq$9G@FN6 z8oYw_zo7LOBew*TvOtHc5+gT*(h`PU$Mire3E}k@blKqqCY`1Z2Bk*s4NN)$Gad8_ z(E48tIt<)md!-4yYKn-I(1OEqh`25!&hVufTez&ucz!6Zy6*OBhoE5QW;CaCe zpZ|KJ(9HlIEz|?8b9lhLhe?B}u~9EULyKtvB!6|Vo@r=SP-u`+VC!I9#GnD{0&@s7 zDdZ?{C^R9~Z!mW=C^>L}mOZaz&;oT!xfnV)@<5AbH$d7g4x(omPO}&|=m~JQFui0j z0#(r3489EZjXVpu;p;a*rTYE`U(onm9K-el{2#bMjS4viFp z6$Ba>4scs>F)?gpP%+?8U_-3mVAwoC@d;@ChQ#&`@DQAl;?f4y46Y0&4~RLS`s=fR zL6g4%`w50m3=2T@7X!;DhAj*_3MlJ0MC={;F9?5O`3qV<|DpK;Q>=jXN%@D!{jc8) zMhQGKm{}MOHbDF(aFo&b0M7!%{MQtQ&5Vi-90^VmENu)64{#T7Nq`n2I&dJ*e=%-v zP<&uj!8eb2dqXB@&7>4VUsJ*Z&J4u-*As@_jG&c6pyrbUI8M2lnocNu(^OzW%zrif zV%RjnX9@F4hF>gJ4g3q(EfvmjY@EQGzzv`OddTpD!Jf(gKx2V|4~H74+5#=4uLBJl z!0WGP4WQvr{t3*>K=qdcza(=?!bt|Bl%6@<@cFNF(6U1h=1ERRCUk<9ZA@Td2Z=an z%-}+r|LSB=2lqjmdO@B2DNMNxjZBLiBqkuue=TU#P;}r9aJs_K$^hH>x{pgv;*vjdYyz$ONrR>b_*mjypHY{1L&KwU)#ei7y`41XQ$ z1No8qUthr9(GlPV4I3JP`e;iTPA)J`;Bi4-ztO><$LP@@q`=SvYR)wXdogu6C^2v} zF(IwrXk^fJ;0O?!!r0270qQEYFf=+S1aJs2!RNo$fVLGRaNJm@}OlK-yj_^A(rzCHZ0()<%X}{*uwC;rOsjgg!DC_Wi|)+ z4Y(gF{H_G8f>TDSzd+R%&#&Nn4reDAKj6Q?d=IovFGuGGqW+q~u%AJZmBV4u1(r4m zQ2t`N!*HF$w2h+xR;Ms9%yHPxpxB_1#CCys%7jeN(BcP%=?n@T9R*Ad0^s(ug2*|B z&CCiZ90Foz5+*~YBn~i4Zctgkv4P10Qm(ELUDNQNVZ#L;5$5*{w;8Ms@GB^vVYtt@ zVFJ$vZfIYxf#E5`Z$>*N{{^BCSY9Zo9pK-<{)geWLfs7h4bBS?>*xP7SU2dL>NWs1 zk`M6zVYbk?&9J$F=L<7z{)-`#VK=yG#GC^fyEwqTjmZEsz`lTE17iJ#9>Z=%J3Jog^*qk8a8w|V| zpe95EbXy8|I8=eB?gX3PC5;s{Z<+ansgXoUS1`#bOb2ZQ zt3>X9eP%FV;1OWvVK~fSaFBVIux&^^fQz;uCO3zIH`MgY?tj_nM&Co~F> z*KcfZ&|Sdo!E}jnOM|`wM+Vb1g{>Vrpgv;(WQ+*9{_q308PhpXg1o?C$aIEbvjY#v z?}++~;TMC=B>pALr!M^Rv1{X5!Tf^Z-vPM>o(0NPkT!`21E{vL7vev{{6XLkk3EC_ z5l}-h(T;(?1%3Qb2izS1?f;s|{EXpcgPjY{43zy}jCuteGD_+Uoep{qT+^72D0DjL zIB?8C?tkrM&`;pF$Ys*h3)%#Cf$53E$^bnlhDl6_@k55K4EhcnADGM-T3d7-xB|c% zroan1pzT9Q|I4ny2ej?$1cMy|&jIEK3@;e$ICK^;BlW+K#}B>yCoq3u`O9GE4eEbE z)<=Q*Uw;`4LDiNC(^&>12c7_C6NZlr^$GkJkn67cs7sF4`tfDAr zdXd2>f@cPk3d7GvJqLaPMEwO?`MJ-5e}eauhMx@k9QY@3KXLfYpa-h#ko#W@MxfeC z(E+sV8CnooG4MAqcR|M?SwZ{1l$$&r2uXOfH7Yf5|#(}!2O^JW&PoT2OI`M zybR5Z3l4A?aB(wi=+IceZP3((Sbw;mLGgh`0h0_MuEl z?+u2aZWpK=Gk(QWAuI)2NWVb7f_W8U{O~iVDZ(IqfZ-E^-3k5%(EhIkI|g|H)c%(t zsMlu40_uqIR4~gi$R4U+!jIDb+Ag5zz){L1(6CiN`2epYlK?}zLM~{3B~t%uJA<+V z$A>Nfh5Z~04{;n|l38Q*f%nXw zfY)E3eNvBjb~5WR{61j(fM+|ihQf^#pgI>eRtfHZG3;yNZ(x4I@WTT%6vO=%GN?O& z8KwTR2Q9e-7nO&2KQMm*^=>Zk!{@(1{jc2&dQ9A{OrQ;kdI!83n2xh_9nky0J(mf! z{{@=udc&|&Ko2w#_O@X~LS6%R3lnVr7i9e*Xy-3@E8hVw25|lYttn-L<}XnH>o+Ja zK>G)OfY#SFFh3D^!D#2;4;nv2UOx|Ah7B4&Jiz>gVGn498_N2PvIctvmJ`fIpl!}*)%puxuUprO;l>;d-&ro9aN89)=VOvvl! z6%;Z!7?=(+G#*fRz-_?9!?Kw{0aS(~^}qJaP+lTY$@I^mwLuj${{>ndq4eZZKf?bNx&QT< zVF9QQ%L8giAK>58yoTd9gV7nDt%&~D9EL3np#B#qTQTY$;QnGHpV(WkIvT%z<|TXgCYBoO=SZTGvg6O%5Itkk`*|Y*0wxn8(G&(76CKrNy)i-2dvDfZYGu z-Jt$}^9GX{LuUhc=^bbxhmwQV1U5EEUzmf1g<&g;q65bTCK1j?h8zcO5hie7#=}bp z(f>+d_`zVtz}vuWzyhkj_#2otI1VrviSRXWqpv>{V1B{`p7xr;_>{rY!On$$BI^8? z6=*q%3d31Y)|Z2X^%%GrAp2!NaRuy@Q5qQ`gy2(pv(9{1GYw> z{a?uI4;k!S{3kF&w*v?;pJDpRum{u;L#n_2C>V4298mtya6$kSr_Kr-Hy||{()zVHv3ZRm3!bp`A(b1gC-63Wzx?ID{C!HEdm=TfuybX&JQt#c=s{8wZ{b z!U~{Wy`T*^@b!nF;ZVCn{2Q9rDEx4+J0QP-`2egugse{%mlTOz-k)w99C># z(qQOj09R!2^@j`$T?`rx+y+c1Kx?)g7(k3>(1LRVSpH(*O<=gqpad!g-+-!G2c80E z4F<4#HX!<6pyJ(>0lfbUyf6T?e&atAxFZJZe}UE?f~LKGaN9BbYv5nN|AyPn0X*LO zf%$_&0jR$NT7S5^LFW{>{@TT&^niPjlTO2H4sZno-M@T-^$f>m2AvZc224Dl_45wg zi*iLa9FgTIlI-2dIz~TIDLT3ZGqNrfTk(I$4dMH zZ9-9C*5Lq&fZ7QVHK6_%ba}%cfq$TVZ4W^G6mWsxjCTG8sQzO3#bDORzW_XtXb0)X zf!%Y15i*v`XTjh+g$^i}wrZWt?8dN~XZa^0La>M7p zK7iIAHt0U!0`33W2CBa@lI}m#4ijg71@J@|Xh#?m z()k-8fAN8$=^yCW4UoV7Gt?j8|HvM|4&F-+I)4Kc8c=^(IPffB)?uiI%ztq~+I5ii zhq|C;hj$qEF)U=@NMMd(*$%46KClTv)IioBLeAe{+18S|fFlF6{|n^iYFPe)^uP2D za2hzBVc5iwFo9zMlMi@e*Bi8t3>=2A^&313lus~xW3XPJ^8kMS24egW)c*n%aiDG& zgB=g{^@rdwE1oH!X)j3e4mwH0$bn}fa{UEr|7gu&0?qFzIB0+dqIWVZa?lV!T|ckq zpgBS52@`1Oj004LgL)+#$m55QB@m#sM&PM2&@|yj1_cKWp(g11UP%AT2DI+$0chP9 zXrUD7{0$=po+fTR_5e`6fbReD(gRI<{nXg+#eb>!$%3C6c3%FInjb;>Uo*h_m*qgS zU7+T!H3QECW)+r`3`!0>H{kUb1E{&H!=T&1^nhbW!y*NZ1||ju&_YCx2H5x^X#F8* zsmTlhr6Y_R8MGWY1h_!;*8&F(5hfwX{4!|$1}JNj#KdZL(nP|kiUK~*l8dZatJWrf}|hV{;!^f zW>DlBG4Mk=s+&MPGNk!0(6V{12TCs(b~Gq}7O1RXSjC{!pz#1{{RYEk22dJfI>WHL z0n$EXSPW_(Dlnab?CDz|2;RSZrn`XYj>L8c#Z%mcOmi5PD=41ma9DH#qGkmHsQ+dA zfVYDA9>f0!hCld!G0QQ$pJ4ogCxh`66L>uUhv*tmseZ$6f-vaZo_z=Sw=utM_#I+* zjlV${I(`URzX4h;&+?P;p2PVD;RpPG80{7OK_%o1@e7dg4e0s}aQ<@W2QPzUu3@>( zsC$6J0k-~70(}04?g5SjwL6@k^@pJS%M74ZC>#kW=Wj6R9MEK71D#oLPZ9&6Fpk*6I2lzq$`p;l^z`ud{0HnVRTE77*57`fZ&)?V&nzIA> zqW*yV1=wDD(EhLY44Xl#bUr~ABK~Cl%+S+d{D8ZH8M=NRw0@)efRY0D4yJbu;Dv}A znBE9%*B3K;jEpe=+jE zQ2xX87u2Q&75E^Z@_#|}zt(}$Di8m}W<`Zx40av-8<^KJoC58GUcf908Q%bnA8vQh zGvHn#q}#Cbf?fb_sob#sfM5+y+cN43jy)oskO2_y%bFaC?KU z0{0E3NetUSgK`y2axBw8b-@j;8c6#PJpTn+ZK%N9!|>6=#({q$^BRZC5}^8vIS3M8 z(EZB{{1>oWH>J7i6{J1BM?g)}UfpfeG3X!#aM*WCl8a;|l}0BZf5p1vx*8 z57e*x30XGJ!*Ca}Ui}%QJhTvaz_9~#nhj_-0nS|;6poqBiVuL0+Wcq zUdTaGDh#tBj7yOG1*yM4>r%KtM`ksFf+dv$R6%o1K|X)uBf|y~GPOt;*#k&P54>bf9IQ-zS2Mw!&8p+_sNg~6E z17HSH|I02xZ)JxT(@TzB4EmsL%Nh)AkQIsW@k1|$%?_X~u1p6SHZbUb$^;*V2Jiq5 za{p^PXnQ6+85c3xuz>0U?jMNpLm`Ln4YmqA9?X|O+m;jf|1ifX9fx$p;PYP#7@*sG z!P}M{_;)bBg)Z3RhSpyUte+V6O|W0U|AP4&Xgn$bw0?uZ9W)X4gBf0bO#m%BjNlGo zy5X>$QP+X{1CtFy8)SdVD@gugV3@$L9dt%V0@D?StsLNEqhu0V84^K@fsa7)mx9Ov zhRrNG4&0(lCmc3)=p=x~b{Lu!6b^73BI>UNpmNNCe-862hF=YK9{eA;?U_y=0GEeQ zyBZiCF#LuLeLPY4$zUf0s=pL|3V;R@nV&$$Hy8y#JEx2t_%AerCY9_Nz-7xn24hgA z0PTY`vLtY9Y*3oOy@cr*Xnafoyh#~cH*H{g2x%uYuqrt0JOHk?-Z<=1&@%w5*$rJ| z4=L+7SQr>Kf{xt)tts6It_vWI6Hr|MA3scB_{p#dv|ITN$b+DRr2a7c2JZu6egNCQ z401DQ-zaQ81ys)e0hNbH>*qn|ec3Pybz{l3D zVFC>!a4cZb0JX;sfcszI{spN2^@G8tfmeY!hwBvhJR;@{PzMUs(?nW-2p*3*z+3@Z z0t%X3_`+}(;xDBB*AE6O$Z-&_88)5i*~I(?yuX_tW&UdigAyZ01D6KqkVpXzo~8pV z450qk2U!2>0W0YI4bW_tk_N|u2MP)r3`_@@p!o|r|CPWf2Rha!K_imO4s`y;1CC1Y zp%#$-7bH$0^_K-`^pc0+A(w#*j{x%#j)RaBIgt8a^`Pqb0`nbE{RKJB5i+mWj5PoC zgTbzWM}awq;ZVb-27b`;+f$&{*Cy2QLtW4|84K{SQQQGcB8;sJxd*rnnvl-l*m6L3 z0mlojD5mxX(3%q^IS%kHfGWiLjWY}znsgX68ki(lK!<2@gZ3eU{f@GK`BQ++6rQEb znLekwj27{)SfHhFY5{m4(F&56A@g6Ll1=yn(;vv9Yj~jtU%vtB4p@OoNEOh62N%96 z%u5(vf)&AX$!+z z2Jm7Ar18VOpt*?vA<(f=`Uf~JFoE_sD>!fqq4vKl82CWz4^J`LG4z4X-+04d1v)bX zb^Oqae^U381&GR5!w$5O8M^-q(*LT1jUSpqI$|Kj{u7+h_Ah%hD1ioElo~le>&&4m znUUtdK>aTb0VWoXP6idoLd1pOfkZCE_#x<607%!YlS#?J1KbgF&~uPRo&RFc1G`7* zAcL8M&II8n96uev3;R*W4?#zGfg%MY)eL0_Al7dzVEMraT9(NS+LvU<$ zqz1bFFadmi6wd<=3oag}1_lKI4k4x!4U0Lza}&_w@b6)M%raX5Jk|sqKZN(cK<6Kx0UacD0kkNc#TeA_ zfv(?ZWyk@It{mjpz^%j7bwF5T%k zj)RXMf_hszpixjC&=E`w+zOz1bIATL==cVt|7CxGr+`@ov|)+?JU;fHVI$Z*u=)$q z+v5Mg3_2LrmZARuJ4gg&{E!uTTCWGQ5yM~5u~DG&d%@#}pcAFQ?3O^gbO^9~~pq*l*`s-hVeFO6Yfe$Qu8{|Pv2ymkU!T{HU4gxC} zeky>n9VN!n2V1cf+p+aJ6;20d$ZQ zKhpV!A3#l6#{2`!4>-V!X2Jb022hQL=zl!{k77alU*L#);&igXE(7WOUWODdP;Y`8 zG_JLife+Nbc*fGnpqIdnw0_=%u@}4tN(r{@3pCgW>9xW8Um~Dm>m0cQoQ^PTWCX82 zJO=K6aSI@ye+W8AhW~&tXnYLp)CUYF7{Lrg|BK@zgAFLHZejS#0(SEkhL4buH)#C@ zTE79Rt@tMhAAxmhzJMk!LA@Ky^AA5jwtY1?fe!Ko@3KLxpJ&<1qzgJN>KZ72fz}@$ zLAV*5PbCDGKu#(K^*zDIYE2M&>d*;3-#g#EZ~*r|5&Co=pOJcV7dz) zi$k2>3!47|?e_Bb5Wd6+?RMQ`INkx?5e7fM7u=Tthui*$bP1O?F02e)I>P0(UR zP}aM_uoY5&9f0+}4mUJ&>Kx-XVLApna}VVAvkjXeXFkB!Z!Bgwy};%I{|@G-48IqE z*BieBt>^#^yde5tpq7IGKj=(U(4iLm8-!m#`jwzk0(>?vsQ>kUf&B}fAI)D_z(ZA_ zzRdXr;JN_5|0{uEhl8GgN6Vy_3ZQ{R?hOp*KyzD1Kx^Y+=Wi%5>~_?;Q;`vUpvod9V5i`xK}zd-X}pi&(?4+3I<`i!vt1$_Pd z1<+~@$oh@%knYI`hVP&QMo{`+{~PQTctGnn&VVN_ne71b3+^q3)}!~#CZ7v=ok%`7?!;B)R97!({d8kkf-=SMkkC@{h6uQj0BK~ZCZmjY9V z!XgKbiB24#^P`%$COE(+V*GFo!)*q;1^gSDLF21-2l|_s6% z5@OjhK{rAA2b&N>PlI{^=Nshp8<#=#mm(97!e$PeL;MQdEJ~m)Wj+ju^&4}*Gqe1K z!G9S3v)UhNFJuHCnwC-VA@-wZYfdKM_Z;W*4_^q>KB-uq9`2^bSl#t%VD??8Je zL1XV61xzBKoj49$2~6<%3$(%nGXKTV-k|uQ;{{U?!=8p@1ul&9d%@?kH9t^z;9-M%VA#i?-vB!FmBpTc z`v7wN1uExx<|wN(oNO>E@Snu2!tj&9$e{jCTUs z{8xg;1TIz3{Fejw1UArMnzDlj+WApB4jeO>R9Lz}LvWz8EI>Un&Kt<*NBsgVI|TK= zI+#HFQ`mMmjc5oMkNN01F-oo$odV?nt!G%46RIx z4$=WkCJgP2nhp{Hi1qWJ^@ouC%WRNJoXMnREqK)j^7=#Qu;CMigW!Ych1r-+I_z@L znS`?bkj2iye~$BWj-Og~pksSM{Vy|6TLNkQ#t+c?`Gd`d3V$5zSwIJIFq~nuXV5u- zdVa4`BliL>4$!fO6EqZF=!#8E$ARbc>T48 z;TOX`NB<4Nprg)Z4)C=xp8zc$VBnj8y#DZigYkl%lgvU6M;eS38cuLaF`R9%UBGjL z8D4*Z`d^AJ9K}pBplvB9ID$ZDYk+n)B*5msK>L?>LDp~BF!VDhADEHARKe6Lpx?mZ z0h|8{>ZH5eMC@@HX=D(O2avV5Jkk6n0&0ut)rv{jr1An#xP$6(CB^NZQ8;e3Pf3!b0NUl`6Y+B@(( zK;Hkgi9z8&2FoEvwT2rC3>lyV*$F!MYXa)}!$qK@lR$;1(uIx%Y!4hd81+~{XJ|v( zB#`+p1xF4BB?g8D76s6q9ZwjV8}trnDj@2w9MCE+2k^30Q2qk--@)VaJPpk7`U`YC zplt(x0eE}V-UIRh%<#$=wtj>49>bdkYlWT@%62UOo9sdD4J(H8491}IHxTs~6KJ*z zJZuQ=h;87~VCZ&GYCxPH1sXqG%&?+ig@6_hXdwrv&gEcec39A$fpUIS2Lou0J$UX< z52Qw$p&4|s0@D1~1BM3-77jcdj5-X}pkc8M%vzueP#SnZ<9^_F<^#qJ4F5Uo8~8st z!@DPcn4qUC!^aO7Fq{@JI>a-f8NSh516035%mL3=o?vBQSi!JJfNKqCniAaqa?)Yy z2d$z+>VNrwh87JvbiiF;odePaOd6oeL?$8cU$%2tK4I|_u1F?GrNCXmB<0cGpt}fl z|MFo5gC-t><}(i9V|zC+YcL!J-8_QS|JuXw1+;$Nfw=}!k$vF)0rDwmA`IUDdcgF6 z!N5UJK^nTO1!T@?Q2m88|1|-0WKDxc026rNOoU{x^y72TW{oj`>-=-6H+RgO+B1<>d>y#Hmw zw3a~=G{y+JNF@igPBIuc;65WbUx4Pn<}#=|a9-d7Uo->q zmk2{IlQO8I3h#eCVK}+LAcY51je;5s{1cef7(f@h@T2ZuhIA)E)fU*zPa2^8N~HSh zOoBNB&mrana1{Vuzp)uKQ3zkZ!NJhfp|ptO3F!QJNdHSiU=@S*Le%}s&4*MTbeJeX zE-I1+Rb#hCS$o;~Y>NRn+fcA)KC^>U9Oj2{s!d(yeRe8 zW(FMw4G!?NL<<-+7`zymnir^mMt7m}Uy${O`U)IAOqUt9A5i?j;lU=vFug(b0Vim6 zgac?n0A&8l#(@WPe$)mA0}z9w;V`4g0UZP8OCS{t3=SygV>8+v;0JBK2HhP4p0fj| zRq*-^1{((s3(#@REOrZcb}(r%oK~Iw2()KS|AEF2wmO#f4d5P`0%Uvxyncg0=Zb_e6CXqK37sPxCT;!2n+7x27bwq!Wxq2Ivqh`Xxk6ljKS0W-$@7xTjdKOhGoE`Xd5fV6%C zTvR&oOk{r2aPojr0^bbgCk{UqY(O(L@cIi}0SD;-AU<6x2fmg)?;g5W4=*Lw^SI6N8@& zc8>frm_Y-HpdDe%i1izwJ?RYm$Cy7b{^76};6Kv*al#)4@QyHe{RN)?n!>Fh^h#lu zqF#&lI-wT~n;MiFcv0_90c~+Lg|rW^a2u$db=b_L1j=7X{jcpTx=fJ$j4Zkg+zw6` z7&dVzp5R0~f5Y|xKWP2N7Ra$tpoJU;KQQi3VF2~NKpTF+6GjX_GWLN^=|P?UQt&^? zY~=7~g1w6WN#-J#zYWG8cq+IBAnR?w>kkEVk8u}p$uMk}&^-tmKjhfLpm=}_dH*tK zjRynh&KH*Lpf&#mLU$N83xH2VM4A86c_0nye{DFSW5CV8c90R&1L8K|l7Os>gPcEa zw}2mXCBcpZc0&9OOo=Q%7&e2>353qIf$Fc{pn7==Xo)pwiP{$CH!MFL>_C@=q0WCb z@c#mxxwpXn5&sY7{R;mYH-Qdsgsx$Lu0M3}Zee<;vV%j<48%~_ybyFgEo^@!^!}6p z?k!Gl8o>3}Hqhd21%-oMNc9(Z{;ScOf$4w%{I26k0 z0$t1j8mvZ||AG(ULKzhdkaZ47##dO?*R8!n0q!b zya25y`M`x#fB7+NZqT{L4c@v7Y9oR6GITL0fX=sp)?d)|hoEg=NM{MIYgqV*3uXQb z-0cF@Ur@#ihC`5(ppe#Y{AaK~!v7JxUKBhu{e$5j`2G}jc>fFT9XLY=TrdzZbk( z;{aseC2 z-uouf0KWGPz5W9A{@~%P3LeCg|K$cvLDdfKKG#!I=L7 z-=6|nNYA~1NsH+egK`6M|H}ciMF=!+4ozdAHe_=HTK@}F7l5Xapy|1UNk*aFL2&|V z{|hw##qGfiIscIV1-BK$`G(D)oyhS17kK>!s3d{r9nk%i&_V`Ue=)HB0xbhb;J*PX z=OO*CZ474{j1_c#AjS`;GHe6gN0tD~U!e6rtqkT297z4I8L;?*y4itg0%$Q+0w>b> zy+=S>jT)fK8*~nEGcYkZfEMR)BK5zPz)muRx_JZh8Ya;EGA~m9>jf;0!PUHB_~l^N zz=zcT`oeGyv}^;iB?sL9ssNwg%Z;>uIg?=}19&$14P5a@t08dwwXZI;$aMC2t6Qb z!0H2G6tMa*hBG)E5Hw(MfV#PXfx&@6fPsa95yEg`VB`QVGiGF9aD=Kkn!v;Xs?R|? zyx|ND#wO4{V@If6M;%xb7$X_N7(^Q&3R1Qv!344|?Y)M*Eut`0f|8kBlictCzQpa33=1I4L9gO7qR z2g@NwDC01z(E+f?0hqs>SQ8o}6v8+}n_!G)mV^TwAdv=`znmBpQ2Y%F0E0#j1tty# zcw9KKBs5AWxN!(JAs8l&oCaY%R8=a%!Lhi63iudkHHy?AQ3YO*#pqCbX>8RBVyRV zli(~NdO#48zZkIPuY!gMQ0z27vMB=t8)ITaM1q(EYa5usCc)aqn%LlxASNLSzQ&$` zfx*>*wSX~(!JR?$0GJWXAaa1EfWe0$oB?i^s}n;)gM2AG?j zSQHvL6r4B&n!pTj#3?iifJ6{#SREPz6hb&enLrGKP##ey28V+p3LzY<3^0E&GX@+8 zF%acpbw*+|geZt|u!2V}Kz`$3aAFVuXI~Hll+i%f>VZW-(je^W#Kh3hprF9P!31I~ zP|yG|8o?qkyIeu}D*~LGz{L(Iqp>G2LPVhcI*O6MSQ{7%7*2q59LORtW-(yoVQ^*; zIDlXzFmQlH!17?ifPu$>nE`xz0XTnMU{GP;faEx^JOcwOqoIROfv^b6Q4k{l#9%dK z@Nf_oU^xI)!l2BWaWJYNtVeV)h+zO?uy`Dh0x{t64(iZ>2fV-|U!bnq1O^pGs0h>` z4wocBi3T@C!443E#f?$0!zDpbqQy;75MhpMfM5uVE2F3bm=Ve-=->bn0WqM)FmNb3 zae&9JAq-Z9Ru4rd9^;|9|=a zm;Zk;8E`ekFm!Hnn;m|;VRH_Map){E1FqfJ#^=27=Obr6f*Hoh47eKWI=}mqw?BFN z6U3Ng{-pP(b%n<<;f+t;RKnFTG8H(?5m0C0Jc!1S;e`901*tkltDxa(u$3F&ni{mG z9Bvzy`V>~fLe+4v6fw#)xGM;rz+k}bVnC{nVcOv)!_7gjm!TDOf&e@nYO#1V3N3J1 zA&ALVy%}UH8r%H2PJ*Ttqh2A1F3=r z8|1*i#9#p0fxy9V2!jEQ3y@uy^(j=O0aErlFk-8hp*1x$E&>>_)ypt*z|LWCaCKk_ zU=(3+We~(_4U|?f#Y!FCbkzmARK#XDVU_h#l;q@|<0afGRid-F|RnQI)yBHYV zSPC0u65J&Ok6|!i;lt?0RM;>lL0y9L7zP8XCIDN#46Eo5LF{tCS}%k17Y7S83>_HQ z7!n&K64)dd+b|eVH4Lr^EESA$4DJnr4=@<8w84m0FT*QnHV#IpIS!0y^)kGIcH)5L zFHqWWXcSOz;SgkEL1#egN(TmJhJXVi2CO`c&KL|(B4q$IbvZ!QF}z+zVZh_d2~-`! z>tz%M%q~U;%xnc0ff(d~FMq-O?wY`2!N|wp+#v7(g8>c000u_TQ7G~OK; zSQ!jK2c?NH9K~Q9g1X1mnI++%gn=86U^4~-p1(i`Z9!{c%mM~%kOQL!s5%DK!r*!t zg#q`MgG+#*2#YJDAQlEJ9U`^GkmJ0GMFDza83O})y$r9Q5%sczt1ok~!<7rBCcKyo zX#R3w^uVYBPQXN>5$tmifmt2HML^O-W6bIpCQ=JG1G74YiTs7D z0aeHFdKr}gR|B2Oh8``i;RIsvY-G@I;DU6TzzPvH4X8im2hCt`??+3@aS81P}}t zp+>L>Tn$Rc3tGUdF*1Pq=5Y6bCfh+<=)kk?P=*9(Qv!nk%p3s*b_2#U48;sG2Vjf~ z>?Vw77#ta74nbO)91K{@aZwOF16sTWt(O_F_)5ruVIqry186HK)I}g)LP8Z500Ip< ziX0pcjIeT^0an1mbTEM0}2n1x9o#U)tM#s*BG5C#nl4Gf?yto-~a;>aBP zoBMAuyD7x(b|Njrp*q98sI!r11|Md`Ec-25n9uPHXc^Nc* z-NLXCZ(auHK~Sa!G2o5{Wns{*Xwbw4%hV2#gGV6BP|F06cDM*c0RxtXCu0n1+uh%Aheso`p{IG_v|6c|Ct#DKxcld$Sh6{8_A8UmvsFd71*Aut*OqaiTz zLIB)eVgk(*J3&YM(87S3;lKeN4x~99G_ZU#eTL%oNWDph754HS7t@Ojh=y2eGfdR$&0_?9r6h2`0 zP$Al>Y7P~`XSDpmUm{W~e5e)gpkj3}l|R%9A8M69qxBcT^b9JWNva497(ipbk@*G; j;DuDo1`H0I_-%p6Le;YxFf0I1!$HhBh?tgwC}RKsa>=^n literal 42175 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 BZ6g2x diff --git a/fpga/fpga_lf.v b/fpga/fpga_lf.v index 1df5394b6..da681321c 100644 --- a/fpga/fpga_lf.v +++ b/fpga/fpga_lf.v @@ -18,7 +18,7 @@ `define FPGA_MAJOR_MODE_LF_PASSTHRU 2 `define FPGA_MAJOR_MODE_LF_ADC 3 -// Options for LF_ADC +// Options for LF_READER `define FPGA_LF_ADC_READER_FIELD 1 // Options for LF_EDGE_DETECT @@ -50,32 +50,106 @@ module fpga_lf( // to the configuration bits, for use below. //----------------------------------------------------------------------------- +/* + Attempt to write up how its hooked up. Iceman 2020. + + Communication between ARM / FPGA is done inside armsrc/fpgaloader.c see: function FpgaSendCommand() + Send 16 bit command / data pair to FPGA + The bit format is: C3 C2 C1 C0 D11 D10 D9 D8 D7 D6 D5 D4 D3 D2 D1 D0 + where + C is 4bit command + D is 12bit data + + shift_reg receive this 16bit frame + + LF command + ---------- + shift_reg[15:12] == 4bit command + LF has three commands (FPGA_CMD_SET_CONFREG, FPGA_CMD_SET_DIVISOR, FPGA_CMD_SET_EDGE_DETECT_THRESHOLD) + Current commands uses only 2bits. We have room for up to 4bits of commands total (7). + + LF data + ------- + shift_reg[11:0] == 12bit data + lf data is divided into MAJOR MODES and configuration values. + + The major modes uses 3bits (0,1,2,3,7 | 000, 001, 010, 011, 111) + 000 FPGA_MAJOR_MODE_LF_READER = Act as LF reader (modulate) + 001 FPGA_MAJOR_MODE_LF_EDGE_DETECT = Simulate LF + 010 FPGA_MAJOR_MODE_LF_PASSTHRU = Passthrough mode, CROSS_LO line connected to SSP_DIN. SSP_DOUT logic level controls if we modulate / listening + 011 FPGA_MAJOR_MODE_LF_ADC = refactor hitag2, clear ADC sampling + 111 FPGA_MAJOR_MODE_OFF = turn off sampling. + + Each one of this major modes can have options. Currently these two major modes uses options. + - FPGA_MAJOR_MODE_LF_READER + - FPGA_MAJOR_MODE_LF_EDGE_DETECT + + FPGA_MAJOR_MODE_LF_READER + ------------------------------------- + lf_field = 1bit (FPGA_LF_ADC_READER_FIELD) + + You can send FPGA_CMD_SET_DIVISOR to set with FREQUENCY the fpga should sample at + divisor = 8bits shift_reg[7:0] + + FPGA_MAJOR_MODE_LF_EDGE_DETECT + ------------------------------------------ + lf_ed_toggle_mode = 1bits + lf_ed_threshold = 8bits threshold defaults to 127 + + You can send FPGA_CMD_SET_EDGE_DETECT_THRESHOLD to set a custom threshold + lf_ed_threshold = 8bits threshold value. + + conf_word 12bits + conf_word[7:5] = 3bit major mode. + conf_word[0] = 1bit lf_field + conf_word[1] = 1bit lf_ed_toggle_mode + conf_word[7:0] = 8bit divisor + conf_word[7:0] = 8bit threshold + +-----+--------- frame layout -------------------- +bit | 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +-----+------------------------------------------- +cmd | x x x x +major| x x x +opt | x x +divi | x x x x x x x x +thres| x x x x x x x x +-----+------------------------------------------- +*/ + reg [15:0] shift_reg; reg [7:0] divisor; -reg [8:0] conf_word; - -// threshold edge detect reg [7:0] lf_ed_threshold; +reg [11:0] conf_word; +wire [2:0] major_mode = conf_word[7:5]; +wire lf_field = conf_word[0]; +wire lf_ed_toggle_mode = conf_word[1]; + +// Handles cmd / data frame from ARM always @(posedge ncs) begin + // 4 bit command case (shift_reg[15:12]) `FPGA_CMD_SET_CONFREG: begin - conf_word <= shift_reg[8:0]; - if (shift_reg[8:6] == `FPGA_MAJOR_MODE_LF_EDGE_DETECT) + // 12 bit data + conf_word <= shift_reg[11:0]; + if (shift_reg[7:5] == `FPGA_MAJOR_MODE_LF_EDGE_DETECT) begin - lf_ed_threshold <= 127; // default threshold + lf_ed_threshold <= 127; // default threshold end end + `FPGA_CMD_SET_DIVISOR: - divisor <= shift_reg[7:0]; + divisor <= shift_reg[7:0]; // 8bits + `FPGA_CMD_SET_EDGE_DETECT_THRESHOLD: - lf_ed_threshold <= shift_reg[7:0]; + lf_ed_threshold <= shift_reg[7:0]; // 8 bits endcase end -// +// Receive 16bits of data from ARM here. always @(posedge spck) begin if (~ncs) @@ -85,12 +159,6 @@ begin end end -wire [2:0] major_mode = conf_word[8:6]; - -// For the low-frequency configuration: -wire lf_field = conf_word[0]; -wire lf_ed_toggle_mode = conf_word[1]; // for lo_edge_detect - //----------------------------------------------------------------------------- // And then we instantiate the modules corresponding to each of the FPGA's // major modes, and use muxes to connect the outputs of the active mode to @@ -142,7 +210,9 @@ lo_adc la( // 001 -- LF edge detect (generic) // 010 -- LF passthrough // 011 -- LF ADC (read/write) -// 110 -- FPGA_MAJOR_MODE_OFF_LF (rdv40 specific) +// 100 -- unused +// 101 -- unused +// 110 -- unused // 111 -- FPGA_MAJOR_MODE_OFF // 000 001 010 011 100 101 110 111 mux8 mux_ssp_clk (major_mode, ssp_clk, lr_ssp_clk, le_ssp_clk, 1'b0, la_ssp_clk, 1'b0, 1'b0, 1'b0, 1'b0);