From 3a8c9540217a4e0037719dda46ed1c1c9a3b130e Mon Sep 17 00:00:00 2001 From: Jakub Wasilewski Date: Fri, 30 Aug 2024 10:52:26 +0200 Subject: [PATCH] boards: antmicro: add support for the Myra SiP Baseboard Add support for the Antmicro's Myra SiP Baseboard. The board uses Antmicro's Myra SiP which integrates STM32G491XX MCU and its SoC configuration. Signed-off-by: Jakub Wasilewski Signed-off-by: Filip Kokosinski --- boards/antmicro/index.rst | 10 + .../myra_sip_baseboard/Kconfig.defconfig | 10 + .../Kconfig.myra_sip_baseboard | 5 + .../antmicro/myra_sip_baseboard/board.cmake | 10 + boards/antmicro/myra_sip_baseboard/board.yml | 6 + .../doc/img/myra_sip_baseboard.webp | Bin 0 -> 34810 bytes .../antmicro/myra_sip_baseboard/doc/index.rst | 260 ++++++++++++++++++ .../myra_sip_baseboard/myra_sip_baseboard.dts | 219 +++++++++++++++ .../myra_sip_baseboard.yaml | 27 ++ .../myra_sip_baseboard_defconfig | 10 + .../support/myra_sip_baseboard.repl | 87 ++++++ .../support/myra_sip_baseboard.resc | 17 ++ .../support/openocd_myra_sip_baseboard.cfg | 13 + dts/arm/antmicro/myra.dtsi | 17 ++ dts/bindings/vendor-prefixes.txt | 1 + soc/antmicro/myra/Kconfig | 5 + soc/antmicro/myra/Kconfig.soc | 18 ++ soc/antmicro/myra/soc.yml | 2 + 18 files changed, 717 insertions(+) create mode 100644 boards/antmicro/index.rst create mode 100644 boards/antmicro/myra_sip_baseboard/Kconfig.defconfig create mode 100644 boards/antmicro/myra_sip_baseboard/Kconfig.myra_sip_baseboard create mode 100644 boards/antmicro/myra_sip_baseboard/board.cmake create mode 100644 boards/antmicro/myra_sip_baseboard/board.yml create mode 100644 boards/antmicro/myra_sip_baseboard/doc/img/myra_sip_baseboard.webp create mode 100644 boards/antmicro/myra_sip_baseboard/doc/index.rst create mode 100644 boards/antmicro/myra_sip_baseboard/myra_sip_baseboard.dts create mode 100644 boards/antmicro/myra_sip_baseboard/myra_sip_baseboard.yaml create mode 100644 boards/antmicro/myra_sip_baseboard/myra_sip_baseboard_defconfig create mode 100644 boards/antmicro/myra_sip_baseboard/support/myra_sip_baseboard.repl create mode 100644 boards/antmicro/myra_sip_baseboard/support/myra_sip_baseboard.resc create mode 100644 boards/antmicro/myra_sip_baseboard/support/openocd_myra_sip_baseboard.cfg create mode 100644 dts/arm/antmicro/myra.dtsi create mode 100644 soc/antmicro/myra/Kconfig create mode 100644 soc/antmicro/myra/Kconfig.soc create mode 100644 soc/antmicro/myra/soc.yml diff --git a/boards/antmicro/index.rst b/boards/antmicro/index.rst new file mode 100644 index 00000000000..34beaee93d2 --- /dev/null +++ b/boards/antmicro/index.rst @@ -0,0 +1,10 @@ +.. _boards-antmicro: + +Antmicro +### + +.. toctree:: + :maxdepth: 1 + :glob: + + **/* diff --git a/boards/antmicro/myra_sip_baseboard/Kconfig.defconfig b/boards/antmicro/myra_sip_baseboard/Kconfig.defconfig new file mode 100644 index 00000000000..21533cc29e9 --- /dev/null +++ b/boards/antmicro/myra_sip_baseboard/Kconfig.defconfig @@ -0,0 +1,10 @@ +# Copyright (c) 2024 Antmicro +# SPDX-License-Identifier: Apache-2.0 + +if BOARD_MYRA_SIP_BASEBOARD + +config SPI_STM32_INTERRUPT + default y + depends on SPI + +endif # BOARD_MYRA_SIP_BASEBOARD diff --git a/boards/antmicro/myra_sip_baseboard/Kconfig.myra_sip_baseboard b/boards/antmicro/myra_sip_baseboard/Kconfig.myra_sip_baseboard new file mode 100644 index 00000000000..5fce139d966 --- /dev/null +++ b/boards/antmicro/myra_sip_baseboard/Kconfig.myra_sip_baseboard @@ -0,0 +1,5 @@ +# Copyright (c) 2024 Antmicro +# SPDX-License-Identifier: Apache-2.0 + +config BOARD_MYRA_SIP_BASEBOARD + select SOC_MYRA diff --git a/boards/antmicro/myra_sip_baseboard/board.cmake b/boards/antmicro/myra_sip_baseboard/board.cmake new file mode 100644 index 00000000000..7595428a879 --- /dev/null +++ b/boards/antmicro/myra_sip_baseboard/board.cmake @@ -0,0 +1,10 @@ +# Copyright (c) 2024 Antmicro +# SPDX-License-Identifier: Apache-2.0 + +set(SUPPORTED_EMU_PLATFORMS renode) +set(RENODE_SCRIPT ${CMAKE_CURRENT_LIST_DIR}/support/myra_sip_baseboard.resc) +set(RENODE_UART sysbus.lpuart1) + +board_runner_args(openocd "--config=${BOARD_DIR}/support/openocd_myra_sip_baseboard.cfg") + +include(${ZEPHYR_BASE}/boards/common/openocd.board.cmake) diff --git a/boards/antmicro/myra_sip_baseboard/board.yml b/boards/antmicro/myra_sip_baseboard/board.yml new file mode 100644 index 00000000000..71575059420 --- /dev/null +++ b/boards/antmicro/myra_sip_baseboard/board.yml @@ -0,0 +1,6 @@ +board: + name: myra_sip_baseboard + full_name: Myra SiP Baseboard + vendor: antmicro + socs: + - name: myra diff --git a/boards/antmicro/myra_sip_baseboard/doc/img/myra_sip_baseboard.webp b/boards/antmicro/myra_sip_baseboard/doc/img/myra_sip_baseboard.webp new file mode 100644 index 0000000000000000000000000000000000000000..855cfe2f097b3fb63881aa24d8da1856d06724f8 GIT binary patch literal 34810 zcmV(vKyd0SHdtL51RUx~|aI8WX5$>|sT?sY%^_twW>cxmP{lSRquyI>8W zcCEz4q2a#IXXn=*>P;Voe?8^X@;^WQZu*5BmIx@|C2u;zn1?w|5^RB z@-Nlz{h#t4AUqfQ586*)k7a(V|6}}j`Tuj@#`CZFFY&&>U#=hcyt+J7{cqR{_7AK- z`kr6DxBa;I8~ugr)8uAa%6UjuAVuPjK3D_R?4>2c3gWWo^ZdID2nX9o1I$iy^yzaSz803zi0{ zyWCBffl$EJN3?z&r`ll3&C{T8Q{zvUfv@3Qdj~ z-WufZOQ|v6X_{{1m$XL7PB6tj*#O*A*+W>~{KyujG03!5{ryf12$BUw&hbQOHEn)q z*Uxv1onVD-d^OJ7!G@Gf9`Y5$1l8_O>c}rzmM2lc7U?ZMIXr(`KBK_59m<`Xb19LB z&Z{RXw7&C7;@-zjLDUkQl;o!%amOjG<0G!yqFP_b_?^%73b$S;LoC>A6npycxwyzk`+3+XivG5-d@>SWuDmY zuQP1J7%G9P;>F+pH-_%HHNo)v!NAO}$rc&N=Vw@Ju;I)KfkYObH~qN5WAHTDPg14e zzMQhQMG$fjQNLedM;bP9$JD(C41<3+8 zE#pJy{-3yol(>H{x0(ahuQ!D=XfB}R|FmAI}>t8>EC${Gic)m~WkEE?qR{d~Nwclu+=(Ccd-j~wwi zQr``{(#l!?QYd@{+>lT8eeWqH3 zO?SFRxU|E4jcqM4cQ|@>wY{9z=)|>6Q;!!T;J6-14hvXko4o< zz@|dLcw#=XfUKQ)d3j2*FzQ8t!xt(Zw5*))(@E( zI!T{1WdRDEf;?y)#P=y8zhhvr+)i?|E4LBvv>Q;^4GfX z@z69s2w0bLx<3Tl9VVA+pl;e7heoc@YFE&<`4>&tD9MpKYtGGpfl7W1lkA=&43nIV zLR2dD$}t0$SG4HBUV&+`UvBq32nPVKZ;d1d*<>Rr)>pL~`mEOSfmw?W zf)-opxQC`T>NHb%$OlfQ%K^C>S%$k4XX(Pn!+O|I*d5Cz7uriUuGX!r6<)V6uqmx* z#>Uapq>O?lO(?3bu5O|p<;ONRW7e2)1@1a!N<5Tz2Zp1yc*3?w*?Q9(NOoYSHip}l z4V#X5Hs%)rKJuiW<#@n4j>=#bPX@hNej!8y)jGBjYCetj(tHanZb2871d(!FBZla2 zfs}1X0-*-36BEb&pd5ITTYqtKmKq>a9C^+Q>WiP7uXmc(T+NF#YtJ$N3o|+$1@MYd z8PfgpNf;*wtGYCk#LccIpegLd%-R>`zA$l(k@Z-jv4#5q!zDGuB!NK*u9m7-$8gX@ z8yNHYjSw5f$EQePeYyEdu}Od zv`s8w3O_LVB&JL>9^aM$1z9l7%|xGL7+snk>O$?EFiO$`YQwDxbqsP7DBZV1&3j9LTh~q=3H`9^B-MW9eEXcp+L?G+r;q zJk23cyUlhGSrbIYr_@i2CKhM=%SQ@j<*;Gb-S!7uDexzF=Fh(|Ds_>{wzgEJWHd$0 zf}|??f!>joMoL{NM(0dAwQ);O4=DR@t%QuWO?w_a({(qRvhLC(@@kV#Zps^tjpT6X zi3VZ8hB?fhd`HqHKHv2x*km>BWS1%o?w5m-L}6+cLnb<~_l?=l$ooo^tXIIPF`9va znxU_@nvndZeBUlbiw)q~Z9Z&v82r{G}8a z@4Xa0*%jDzJ{1eE@>S!duirThOc_7- zgs0fcjdtaRBX|3o{R>blUJ6>Rx{-_7eEE+(Zdd_(j9d<{wbBTF{jh-v%O<<7tWBtE z2#t`$cSqbgVA+2x&!E!HS~^SlRqRG7Cmc}j%So1_atd+6EcBqbOvo8ts*7RBY|NRK zqSVzgFRGBg6K)+sBO6{<#0jPi&6>H8vIC%zcCfY`<)W_2PN$E5Ju#JT{+!)lthqEO zhv`<9hYxulOY=E5^f_ZDTbER4pQM(>2t{eY3FNLdtu(1hxP*EYMut zGT|T+Em-pG3l*;fHkw}s2u3oq1)}jT02eo!MA_dHJ6x^GKY+kfrMfU48@RBTW{m&N zL%DK!&|!jBBFSPG#hg3#xGUJ&zB3g%Nl3^V{oY$jQ#D)?<~iPP0Xk9`Pi2(7bQTSj zDu##TVVcJCp+l_Rr$Y#+FMK=wE(L`)kQUO!2;opH14y=`_)*3(r~#WiGRVI6GeRVB zIt4cB1zhwRwa60Hh5We2(a5I)HH&6S%9S}*UUa_@8?0bwz%?W##e-efj%|QvT(uia zU_O_g3+*uprHG|YGt<2{g>mXqWm0t2v=cgg9Yq$`#i)N0@Q^t3bX#q;zQHr^KDe-X za^qNdKU0qg5LDivW@g>Dv1*4hqf>!I>X zYZd#@txrq9UB?yVe~iB}uthH@P3r(g|IPI8@S@0$VRUHy;`SuVa%{16C;!5Ku~|vh zSb3vwE7t(YXoxp=WYuSZzrvZ3|0>!eev0~oH}Q3=7*hcF1g=hqZ&7z?0a}!WJ^q7> z+q=x*9W01I{{Fw+o}$m@9azP`{5iAPH}l7~+nicyi-{XS=9W|J6hZLCcXChRn+=d( zQv_+W(hgWWUaAJy{6BH*Q;uTX`{(txiU3*u5}(|C2E-u|Fj3J1PYawM!6Q$B(1?^iYvqbnSJ*7P zu;=ss65=?9`B9%1u*7xnI9ir6TifTX4mywCNNPJX$f>IgAYl(Ix)*j({28zoAu#Yw zB2m@VpS?SS*ok1kHu{~gkb>7_Y{7`XI&)1__?EQmTq%7&LEMFe!GdGe8I}dU=WuF_ zHqDa0kZV!@PNkc1pigwx93c6W(Fm0d*fypmS5MZyjN*@xo#o#+-zzZm+|oT$lj1P* zLBQF1LPP8p5&#}quPGDKd!2TdfDXKWtSyAsbwo8m(C>7hT_Q1#j;;F<@%_WI8U+{7 zm;pdWsd}ZjGeDwi(Dw_bW7vhav^9Fz29g0`GgZw3%Y?1}N_QmqN3_d$h&cQbK7)MK zBGsc#75mR$fWjHhWU6m~UJaF9WwzlFoutrs14qPX7NfrXbI4Gb?@CYbeHll|ePK_} zTmc9cX^inad`@K6^mq3^n|YGE3x!t<_xC!o0;e|K!g&fFU0GKrbJZ*Q_&r)GKS7XG zSD?Bb!xek@u$Yw|WN9YuTbN*a2|wk{j!G`<4O~@6L{-{_phannk&-=8R`3REk5%Xo zp4pJ!LFmsiIg!mYR{sC%hIIOf|i zOVAwbI2$IZEp&N1%!M>v!LR;x%pR+*!TOwK4fQ^L8c0z8>~1WK@GGxSyAaik2B4=> z7VCS}`?pCZ?Afe1M%{YD2pE7d|M<#8pzhtb`x@g6qWM|I3Fx(&!d9*ejAlBa2$ivg z(#&LYBbgjp&rW)3p|sT!s_e)F%#!`VDFAPa`;!N7xcFdI9j&IQJuD=-&1TkoMwXZL zrH1>%*=IjrUE4>{zO6062IjbM2@*5phHKE2NxnK)ubrUWbQAu524%`H%8>K-^(wMd zu$rU4a&=@Ty`mR0fA@xV(ZW&1zlRqa&!vm0dqej6pjv0NDAuTOrZGG!Z)!bhekoiX z(bkeHIm~pQmD5Gf0A0u3+EV3_>U)HD=+6Ki3wQwj_ToT%DlLY2=g2jEZPksrLo#6qzHG3UX$a$@AbUw>hbR0%BmUanT(^tj6{K1Mdh9;MWfK8ovRNK zZCfhKkZtv-St5Vm;*w>y$sO-gI!ZAy7%0&3D#vZfxHv1M<|K@G1XrC^{w`dS&%Eurk$7k!m_ZFm>^g1mhFW=IAqmsv^ZndGm%pN*QG01 zh@LV;hr-gJNIdsZH@COW0Xt=G`v#mk73cc=iCOWRaeI;o<3_f$2`W3xs7#%62cX4- z_SI^+fMH|gn`%za64X!$dwq9jq{uSov*o}$(6SWj935R3cQ+%9xAZ%MBH<&QwyBqr zpSFV;$>1q$<8-RK&jZC-KDfD|8prQfc$-A*c9*j?$iG%9CuEz? zbk$ZE)W(!db!FGTb@zECP2Hd+NnhJ+3c~|OCcrpawSzFv+}xLD5hcWHsZl=FpvtT$Eg6H_$nUM?Rtj8Ze^u2Ge4{W*rCqjt{AH;(X0!Bt~mGe#8Fz^ zq<;6llzPjql>502?Z`)iZtWnV%NTlTnfl4wj+qo(eCSREtdL6qNB0&G7+)_8Zc91D zz)g+Gi5E~eEdMHDR&g1u>ow@OUNnFV7IN3w4hxX{y4lC?ugyuWjZc0SQ|d22mOkEn{{{V^R2DAOmAGlb}^=w&ad z#9A+sG_f2)4r5f})ZAvcqz=9RuU7zVIF`Q5I%qz9E&&?=Bw7GDQ3kb%{-Iwig4&#z zzz+-D)5bQ9v4pPRax7`siy7re>WvH)^Nr6rO&m8AJKeCC>v$R#Je%q9lv$T=^XV&1 zhQpT^C@qvw(OVM^6`!661CLEk(X{+7>^)kuqK!;kT%zFE(Nvbz$4z#DHBvy~B9Iz9 z{tt)+MtDOENd%<^E%`~61G*Q=_vW(O@WiBp+il&_V%;*hlWHNiOqMi3xol-dGc zpFWme__{lPrwh`CzWsrsaJ_%P+77Hk0I{1si}myy%a1=DkV`7TR$1v*(k5j1mSU7i zOr8c8pCrN)v-m@eL>X2=QG+b(6V<11Mj5befH?>ajxrM%5u~FxFhJ_qg(@Rm0dgRm z2R7ZzzMok^2{JVVc7ByNSdRYDDE7Q4TjuP~4-_*EUbh-lq}$>Q-q^x;JDwXf^20nh zt@EO_MywfqQqR5qOi;Rr$B^-&T0gB;88Z&jM3Q2In&A5k$o~V7&Do;u@NXRYk1rlL zs?*ma^o&G}yc+ly!pZ(D>+_;h892(8*GFMF<=oeA?c?+T2$Hw zs$H~^m(Nqd5H}w-%_})w#d(bShUu6JRz8zFu2^JQPNyos3)n<}(|Kh4 zJ1(-e{0fpTc8sxgH&FJC>58qRfRekg^NlHP!^-=`MOE9iF$>`8IBIP4LB z+4ZVi3DLpN1XY*ppgMm-l>`=+0CuZitp{r9w@vloih(?cpvYK>iH4N;OWwc`0qM-> z9GJ)>y~F+I_5nWaJ*9sscr*wd-#gQlqsOM+A;!tMKAUvF^Qn5H8@^1U zdkr)S`>dqZN;@(ofGKfvsA5Cvy~$4wHdUzR@3+;7xP{*DZI)cGl!(R(-xBRi$Y5w7 zxvsKGJ89YPbCcz4Q|xH2_xBYyTyi>+G;!*$SJC4xy;F#DgzVoZlT7p}R3ILJ>c`TP zzLhdxZ}gn5P&Wqf?$HQEOxl67sTNwXESG6azUi^wcG{sGT6U_^AdoO-ck$d%*51;8 zsv>+kt+)`NnzKP$L<+gS_J*tk^=@{j7WR@N2RX&dW^VcYZpU zG$ELRig9dBIXhnlcPPm&YYFjX@esCnO7=n@wvDtaHGegG)3qi)OS7bFZ5ox2Q|3Yq z+x9=Jhx%BSfSF3XcPeNoM4|0H3b*epgoRvF+9U*2pu&0uD)A#!ObW{OU>;T`LyLaz zQF&?2Cn_c1Zu`3pC%%gwgesEuvFyRyC81n~;0cR~-^tv`*W@$k-42l?_C z==1%p!g^_28!Ky%u83BN0aNWxL24D?(@GQ&X~)BYSN5Pr7S@9pt3=hN_KIS%l+!?N z_4ovoesGaVQgt({mfK7gwbyk%a{fpH` zGCEAaSg{$_Q$qBBs?O)Sw}_y_Wm-6erk~66g5q7z;=Jx{c93y{tIhA!Hu)mHV_@dL zCE+^DoTl8MdCxUcu}WNcmmM`+5eTS5GD;MF`kndnaB&-NH7Q-KRLUu9RTIiiZz|~z zVnMU7%_>=Ld1~E_awGA9ps|*kA$d)0J!8u;t2lOtE?xe~^p8qRam-8@{cjMwolon= z&gi@{Ezy8lA^WPFVX7sq%E2i?FL`{7t*+4vIJfeXS?+a{Ezok+ubTu$n=QHD6ZoU< zHnlZopBf2BR5SH$8wgoZw|t!vPd(Hux7Ro_`2A#;HImJAck#o@2e?Y6z=CB zMI_rRNa6Kwet~0R6?Pl~p)B1P*b8**a{`Bujg$_6islCbq%yDK-+fWk{%KtObj==S zLRr8Y8ydjs-!CvdKecsSmPS>eI74uxIt=67@EcJZ`ItJ0l+Wv3_7 z6oqJT-vI*HhFL!Ut3eb!J?Mqtih16KEM1!Y=yg9hi@awM03qzb$fHIH>nZyL0-OK$ zxJbiKZD3`6*|lWrsc?R~RAZZn)2iNpcIg|HW&fvp5ur9S-yf4Cu$F?meVtKZ^%Kto zn2FtxTI`xmZyr~FdHg(KUiyu_8uP z6fO>#^<)V0Ih4DAKu3$k0vf@>3}hPHwA>dBVmAR55^@kB_7+%!h3=|pQ-m)&!T6`R zglc&?mp`F2(Y_NEDf@B5_o~o+?~O+@faxf4bnSwC@#j)9uuhLhbjKDtGuXtCv_3S~ zFc{ipU;mtkhr3d3>*y4nqEILO; z5rI)k+TM<96rZW^r*1k~LM zsM8EuyQcfe@Ich@p)+MgZ&83FbMSyJA()fMJM2xX7qF|NYd> z4S^l0h8a4iI-!PFQxq7*3eE_On*OSuc0Y#Cu$78Utf$NLcrUjlzP;X)dmgR|)sdzd z2}E`GNy<&AqV937Yp-~IEaGMA%vjM#QRISrQ|DhgN*FSJ<;uA3uE+s44slS%_f!e0 z>}0XwWTBEKZ#W61HhGlug&!K1t-bdM?Vw)eB6P>_aZy_F*^vwRKxx_`fWni-p{0IR z)L1YACj!2sw6r>0^A-FD+Ng?!vkq5(+~ypu{M)a9%5+RImjAjDnQ*Epgbqa)l-bfy zeZAvdkN{~*xn30m?E$ey;V2$bqJL)~Q7uug{|~6Vx^PS+{J0d`k7A&q|7K`EwUT)D zFHlI4;61H{$M*)|6}lHrWklrB2#Sy&9*jKVQ#mzrCmr7pYOJaME{sc71X-TgrPHtn zI-TyecDNloeFfk}y29kk)-mge7#$DKufJyuo`mL~VedY8n*2XK%LR~wpakgSEEE;! zAgGDa?`^bb=|q$JHl60Hr0oz3NC}rq6|RMMUOTm_LavK0eMzww+O?9$&o;(eSxMvz zC`+C_X3^(bO{HH!a!-R5KYVz){tQLq&!f~ml0SV*6MF0U6S*~pPA_<1N=l*cKxwS| zsdn@QrQEUCN9+o{_DTBujl2kK2)=*&j}B7o@H`X-8e^1`mmL@gryxds{o+6CIZWw| z`tjsrL^{y+eXRNUL*Cq!v7tQ1jNob705F zEa(m!;jV`2YXJ+J&!r7q?peZi%HOxo4Y-r@KZGO^syS=b4Fj$UM32|jpU&kG89htovKHH)G z;wY}Wp^k>Nmt6&NGO{)(nHroCF%|DAFZ^hztpXGN79MxnrDix?1Z1#or`z57$lpL> zOx-i!xqe=3AJlMQ5nA%{6}lemsdo9B^CwxqD#u_;>`#Cm_`o@kM4`Yi7qJ~Bs;?^2 zvsaB4pS{ykRYpD^&&ex8?ebQe*1wEJMegqWsndU4u9`1ZU+-so(uPgImPRh z8T<&XaJw2(Z=zjpdKd3MjV>cyk$&GoEC`5~C^Sww&yW@%zg zW`)kzV%n)zl@pgmjHHY+6ECTPI7f06V)MbVgtH7I+oPr^u)dH|{O7o=6lu_=(CWV; zp!Sz+g$UpJ*+CIQDC+U{p&8EC`~f2|d%WYj4|D-~V+{g`yCp8NVm)j9J8tM(!t$x8 z^jh>QFfR|3KU6NRc)Cl>t&dOxIVy>Z>_`eMm`IT+qN;$jDTd{QTK3>B`h8va27H0B z`gqKV!N3PFOI}CY325`g8!sN?fvB;DWr+g*BQKSpB<{onBH^w#EnSenU?e8p+p)i| zs0uzY0eKm@sqUKGwCWVO9=wvtJw_Rgyi0TZPb^4yRV8_%`2KzA1?&jEiUtm?55y{k zLK@9JERO_0_SkrQ));Hyefy-{ygy?!!UCQ52m63bUs3;l?pUP0jNr+#&ubX^;Lr&! z6l4CVSjX}5=lCl@?w}V*8INSX%cLD9-CbS)ia$d5_O`NA+Yfaqq6OPS%X? z$Iliqdck+wmk$;ZC)CQ==g9?w$YU!OGA~YEK;9f@en!IkgQ)`rHr=$J(%fBp|3z4W z7}2w-rOUgI)WKUG*2zH!gdk=?7ZMSH4R9Hds|1Cb;A8<;)kNThQ=Py&<2UZk99cL! z)r!B92aN_WA5}^4k^^Q?6-G}@LTKXNxS&CwhE@~qTK9C*X-oEvTz8M2uM}m~7T+~G zV$e=4lOI0l%9$^DCvOLmmn>0-YLv6yHyqUrsSxWc z8h2AH0JWeM-w+7lMrx_+x_VT-#6~_G^Qh>N`$>yDE5t}zl!Ih6JhXBLF;SCvA9dB0 z-t=1TKq&Ix=D+^X8*g`+y2PtMSW^WcpKIJh?eeF{gz*4CQheMOZ^#!a zgMcTukxehD($wqC*%BDVzEy}<>*CD`y`WiL^gTqVNBq-2yu-JJ+O9moFMm`TLYRP` ze6{`Juu}O}9IvV7JAeYNEDqsTS8pn+6fRX1ETH}X5PzcpL{$@vL3;E$mI4y^b-@A_ zbAofwSb;8&L=4|lhwsyPW}ULuVbQTLh3IT{!EcA5F|4XqxBI4g^JeC^S+g6Mx z@&klk{UgBh_Es_d0E7XSHYI7dnLj1eGhZ|!V!+WWLKcnFJ<{vP=7|HU@A^o0_Dx6J zpYfu{TS)b+?I(5W7CW`7YqCzy&G2v}Zh1l*<6E%ps9Sya^5{T^rPW1d0kae;Dg%?s z$8Hi{ng*BkI#FcPhGdRw`7&8%dGb}2qzVmzd|a@2G#Q%Z{BoMZ4uP)(WdgU{+B3?x zQLO(G&c7tsmvCdyepD~c*V}O##CP+ZBr`;Z@?{D-?*`Zr5vS>O1%}UNKT(3OON+pl z8ABAE^8vEruc?QQ8R_ihPRNc(OpSOb#1*dY>F@=KBnA*W5@}tJ*Px@q zBS)0Qpye1-N;ePgC2hk2aWR3@wJhQo(-U=zDA6c6xMW#p`bc)4rO9k2#+6UnE{hVt z>;L#2$%TomG>i1>AWZn3UoQn(%r1)&%){@N5YJMR#6@leVGS#nJ#q(LqJ=n$HQ=L# zj8f!Uc{ZZ2_(cpCz#mvm{efh^R?q9RC9t=AL*#k9zgrd7Yz6%ri@*y?hVmdVXpN))9Bo?bJzMl@C@%=h0f~ zBmh<1a$RvZ-%(mhLId%l#!zt}Wm2Te9P40mdkuU$ab5wo71Uktd5XU|w6@9oyF>S( zPI)7?&ld2Vu^Ng(eC1YFS)B+cVR`K-MOsHeFZVeOA49NB{m?8SSA?30-9B<2(nuP2 zKfRqps2Qs)6BH$ycb5zxgG6lc4SdE{wTd`QkgylUU85-#E<3$MIPb7Hx)s?JW|x#MG(K9o8kH@X zdWil1!~O*A;S0B$z<34S=w{K0^QWRQkL;MfaB`G)>n*^R+ko&}3-S#FbXUNB50~g0 zU6ALptT2~DGIqF~z1}`b&ZiZnGvmOBjlSs?wj84Xi4I}_2}&Iid(^ha(Rb4+$$c9KP?^*|A&7+%fp4)&@i57;YgLTl%4V zYL--~@DPWR{K%h-@~Bab5Ue>BN)CW7cnLc9_hv=O-ZNjH@F{m_pw;*yi82Ecp6L z!W$N4M1TK*a4lincg*g-=l=?F_z2sbBF;T$Vq@y%dd8qH?wP7E@11#;Tb4NjN&!X$ z6EVQZdYQP0!g$de_ElJ?xcxy&!j!4V?oU*3Z-({lfaK42NzY^9UaNc#wJ5| z0g>i9JA0rOjG7G!#cq5B$ znyf{px4vO;|LM@V`!xNi)eQ@yuj~>G91IetLsoN$CuLBWIPyV11Z|`B`wxa;SL$%X zV*%c_>#XeGyf~W$R+`3=H^b;jm$WML*j7fk(oW=c#pA(h5?0W%uJLTJ#9*J{z}!q-9N~l>>|?lM#jY zT$u*SrJiMBk)r~E6MWrls~oTexn8CY$>J;}Vp-`huKr1DDP^>fJY-L^br=Q+ zUHKe!lvMQU%F&!}zlSj#8WZClT59+^|48vSprhgTd*5!5cX?>YbY{65-6gRb6ThBP8&m(ZYGDJ{xS8>ViA%d8ZH|ZWK~+UdTmld^B-n0q{1((&vKmbFw%Vme z^X=Ue6v_uBy+PAwF_-{3$P;N}vG*+J!fl5b6?KRK)7h=%iytOju&Yga3R2_-4E4YX z+qOI6kT58vnxorKLu5ioUrp?1Z@^G#mJ&Xu7Pk8w!@T~oX$!%H<{VoVPocep7Jox} zNavts2xJivOMKoo8hvNGQ<*w{ZdYOir*n{`;)GsZA(wbkFn%61BBLWrjPNiQZL8J3 zC^*6rv>2MjVikqdH#pAqimSohdju;f_OK%}G32JF&T4IA>XGB_*1k}H@9$iQ4cN!U z$hi_=XB$X>GKgFpjK#O17QWW#p26F%QQO6V9yMEHwGGm9zJ~|D8&3Zqi1o}K2QT}< zKikvB`O^>aC}{lgHLuTiL^3qAroIra<9DH_1lx~I409bx6YZ=XvJtTB_1AUZFMT97@tAn)6NaNj4ORpPSF<@WFJ;S?x+A5be* zem>ul^Tk};u3A_k4}vt@pJP!5oUoT?t2zT~ew@YbNM3{&t@5wyySZaj<=$fVD!FCf zD@~lzPh!#i2vc*9SCDX$E>PS|oyil6zzOwD+XW9}ati4L4@i~|!?!w@+tPhV+WPC* zgyoLR)hCv9H+7&@KPlPbEn--7G{UXAQS=$qWaXmW`?K-KQggI7=YtA zrx#T>W*~WHDXn5-lqzBDZ+)2q`6k-f42N1K_lW;x(_b)3ci@|rSb*E;IAKR%BJ1XT zoFE16Vtv70qBj64DQ9!J{cK4ducZ9}&=fekLF+g=Sui50%VkSQfTnqga-E}`P@Bf++*c$t0O zn&0g4=>Z$;+^lA&U?1dv_jZ%a(Ga7$?-)s~07u*}9AH?1*Rpkfu=A;XOW z$ts3mi5|0<$Pe|$?AL$yo9y4TzI{i+YPm&qK?g1>r=L|Iy6zl2-+so(jR-$X+#2kY zQ7t@5Y{%E7b1c^U$cpC7x-qRs;P~D`HT)NrYn&30ZHLM_e=YO+e+OuMo;y&xjT#Y{<<4d}L&ii5Oz zP1H;ZUDtHp9PI~wed@#EY*wS4I06~#A|H`{6Pw55)#OPNt=l(WSdAwDPPTPO&|7sR zo*18{F#*)}4Prtt%Jri}o4M))4K;8(5b*veVy_>5dm2>tb3hIV>-16>#O zM-^oOem=N}3-Xp{iOC7sR+s1=ZzYLZL!+z0*0?UPRvwWF3PZX<(SzFXLp(+??lbR% zDD~bH$AO{hx%5X;qJC_*l?EpUFO%dytLsldcd#ZT#)J+((?fJu{`{wp`n>zft(D#& z%^zi?7X4}ftVD>|yU8sv8wyX1rl3_OcdZqUr=|UWr9M7=Jyq7D)!dm{6CKp47-(Mvty52y zoHvP$*f>df$f#mhqqLF`%lpp@mr_)pE|V|eI)t1i`S<_?p+=PLzyZYpyc)vlE9Y|) zJSA90R;5WrvtZ$1gyS_W5oIuV?%Qc^1su^pswvLNvPVTs>QVqTFiV_b{^!l5-l^`U1&Yu%1*;gurY(=_ zEKy#GQhvXG} z5t%Px)2O=!NF+r0d9j4yp`i)0WS{zse%j;b1S`5S2N>~?0p+;=Gi~wb!UEfe-XB6Q`s^~BWkjcVlc5E5sh{72&?gy;;U=+ zHH5xk5}ET-vnp$R>z~|x$u_O!ECTXMXE8k3P0)QeiC!AE4`=?W$t_kMed?uhBS>L+ zx}en;!9hGbE5gfPVzG#8mnFAP7~7-i1Scq04~kH3N}u{Umg*20q#NjJp8}eAb0Bj)d+0UoW!PxOBspO3Tgbfor%)}i zn>B0fS+F!?$?k5wQGrLsrdRB2=Z&&?*nQ~1l`Kqw6rkTser$I`s)-$tl;!U~yf>DH zzxJBDfjaRS1%W197dhZ0M!1VHs_GjgN~)_SuOgZspspm`zdKr^>r_lI#h54)*{9O& zMdlMQA{uOhEj|)_KS&$dTBYTC24yjxc=!kK6QMl|08zwW>z(GBH6)$1!Zmr9_d&x3 zE4`!Oc9?N3atD5huhCbEPdJx{D-XtzQaanU`(qjOG6jBxK! z*TJ`CCBs3eg-mqB{qnlShANqf!Hp9By;u)Y!`{K3`5#)oaA*6E%doa{F~JQO{Qhq8 zj%(Mra5ui8{Y%Hval}^R9=7Oqt&VR~yQ&rQ9Z8S$i-PaYR$zr5s7^(;ozRQ@76G)Q z_zdy2ySW|pUT9ioh3kTv@_{+&L;$S2lS}?OTMD1|&}(VqKo~TnFobj<6sf@$pQ1}D z2AX?JDEW_RDNDg;ar`&)tA}fT<9>G*o>zjC@oMP96n?g8x4oi#D9=3xjuUuT-=plYLDg&~`P>1R z!T~B`1nOI`M>tl_Fzd#MMwUVz*s{5<0tb>y0BBGs;@P zt6n<`=+b)fY`w7LDu-$Nq3A*|X*;A=GW@(_A(?8@7jNLGSfpZ$LHkq#y$Y$(C|NF_G7l zERr9xdI}z~>Eck!f6qYiMF69-U{DK-r?~}Z#c?*0{`J9&5}JEawh-FzqcOSCa+0C1 z)QN~UKI1y0VijID{R)-BW5_|rjUHNM`)Mfj)q2V@#lXOh>-Q-@=#>?hHvjp_Csi1g5D7{bxDXY8ch|ua{jlARGgk zpNuuvcpuckuSE#0?c`5Uwzy=w84Dsez^-c{V@yR8ZAgBYNubF%W22`@t!tHgn&(Y9 zy~fW}o8cxf35PU~v^|oj;uhu#wm@%~bY6<^N#2HG5#E)u|7|7%PKPva{_-q>xARt& zesNI(`KHL7WZ+O0(y3>`5k~04r{l;b$NDO!xCM>)W+By!)(}KxOrnwG@)ryamFh90 zy46DCe*$?hR{*6w(S5G#WWy>9aOW?@QtKU~8mk`K`@xbfeN16vi8FmS9y`$;93kt* zgY3+~Fk`o0vt%(6v2;wy1X6v5#Of3{wu8Rf;(NZ@HM!W7T-6~qWXp+kpvFlZ**`sM z(5ra-k_TN11_Vk`5O(0_v|BknjKLqj$&Z~EG9qm=s@1iTd~(g=ZBUWXB4q}8`t)Y46h?{&(-55K&1<31am2YN;o#r?PJKY8X<%D&LO?slpNi4`q z*2V6yrZrq>SaK^Py$wOmeoKg+SuAIqi9`skeK`Jhe?=SLRhMk1gY!@aeZ^3IlIY_y zV?Mq1ep7830!d@yZN+@w8S2$MVzR?HHpmdl|d< z71g3nUI3god~Qtq;CQx?_^kY*1al;2P-ICIq^$=X-Kf!hOK6gvv-~~EbWc|$P}Cl? z=*nbx?&m_osGi1!84AgcC60oo^~fP0JJka}Raf-Nuyx&a2}t47v8^|%4HbkmjM}WT z{x-)!dg{3RKYLg=Lt#YbM8St+6FHrZ!>s&7rutD%$Kh8XtbN^PAE~8>6>h0_YQm(R zf}|B(R)Fs*k=_$0)A ze%hxXEv7;uT98%ss#1x<$nltQZe(}wu?V47t4BlXEW=h zrixoyQ(@I^^YU4sF*|{8r4kq5`shq4i-w(>yZIe2L4hWHAxCb`5GE~mB%JmCpkL)E zvcwUUA*uKQeDP#S$_>=It5ZKMeV3zr*~8!m#C0_!BuJ#^fZi6lxPd;b6b)or_{t}U z0zDp8%}`+Tw>!meC9GQ}8_DW3_Vod1$?^eLX63mi;|+%W$XaNt!++wAF_vBn1%S~k zUZ6;;nFxmB@6A$(_;mAFu?0aI5=Rra1Na*|$n{H+06{>$zn>ypwu4>mgke1!hsZvQ@C#$EUS}B$m1H-^IWdoydA%N13xE?FtSRjR|i23{T$827$~T zGD`K3uKl(VdS?BU>h>$7n>*4-+KD6-Ip;BfwA>a?`%JHEIZ|JE<%7=hOJ_VH86L#Md~Y*Ds7Gu-PC(01QYLw1Zs` zZhf-v^gC#`VL;mK$Fbs8p!3tshRmGcqkN}?IbTgn3H&rws48AZXY8Wq1mIdw0{y|H zWx(F6#TL7!lDD&;2;hn+xmQQxd*WPAxc<(HkrKJ|^6+TWLWLq%y}Z0YVV+wah?Ts~ z4xgs@gy;g>SU|7H&P(YAu(ewXV0W)Br^q82lp=nnP4dy{*7za}7BGD?#NsU6d^`|W z670t!Ez!!3#?ZRSb@yn#9z>8%AOns6=w-UTe!tuqf5$ej1#2ynIvefW>{dCg3@myD z;&B_`8;}N~z*C8Or$tX==XyXuzg7f~-!DXzPzrMFW3Doa10YPfSFjr>X~0dBZF#XB zWfNvk9O;+V+7Q=V(w7whl6n%;a6XA7JDdtbN9I6-ygK6g>yWW2GLggxEg1*Thg;J)OsPnH^B~iy@`Ik1*ToF17ToLlgxhe7y`#WZ@@q zu^wh=f(tW_;(2r#T1v4a>3mLFJgsQKSD`=7wbliw^awkx?jv;1VtqtH?c3zZx;Wlu9DYlWcmna+;_p>CLi4BB9XR7V7FFa@T{2=c*f|F$ssL%}#8NEo4nRhe*hd3vKQw;O6yyal_MYQL+J+*MI=uO|5L zAqp{h9s1utue@Q6EOi)a(l$BQsr}-+4_IU4n}Lk0FQ5j_#2F~EQC3yhhQzk&HT{9Uu>VYw!FsDOKzTpoWe zHoxtTl9-%*E=0MQMMbn_LpsZ%N%>Q03Lxc|0CO*^0{jSN98<=C zyvyg48;@qTkmsUleE&t<008zK50x*w4~-&LR;8NY7yeu1IBgR?SPaM z>FqlmMkZEm?((tTm%o3}^hR1kNjMq-oRk+M;|nJ|w@L1Ih%YcY99UG#Z4(hsf4kZU z-3XQ?3?6X#diX9HBn+&Bff$KdT@+V)#0s&)(nhkb8Y7f&$nuTHnmu4HD_hwnJJhv6 z(wOw2b8m7Clfv=V`KIHP5Rd2uh7}o$K_wGdn%49~pQaWD3T;|Wx)C8>=mlhV?{g>s z1A~Wmd=7_mR?=!svd;D!BQ06u{rjuBLQEIkP)12o(Z+3nJHsveF5C;#@G!icXOH;W zv`*u)x4uH#pM$rNq6%6WPOQa`-z(lYQx%`eK$+gr=!ppX2L=+kk(V|h8%X_25cWb0 z)vyCVm)$m$*~^krc&$>0p7V=bAo}FT(NQh>it9z!hl7*{6E~;6wCs5V&*zM*mr2=}3LjPECpWqlPyocaG zy(}Cru!*L@aZjciXt<@s6lc5zqMS?cx;4xioy2uI*nL(b$l{`~6|)q$i1Xc(U9sUwx~gR>$q{kHWW z7N$19SLqYttHS%pLRws3E=E5FA49a-7`$na6q*N7Y`i7y1A_@bQpkf9Ihoa{2}s%( z8`{k#KjjGJeTBgJxPRAh%5RGk?iJ0ZOYw&;E3R}L9;D<$!)3+WVpY9I63`H~0o{np zB>ASO5RKBCU6-K?ze8E}u6M7}fs#iV2FOxNVnpVl^d#C7D7)X%}*x$ zyyHl{>aV%HNU#3*JetL1AJ3u!*Kab!Dn|9xb?YQ(cV(YW4v0HQl@fV$rFsr)z7s^a z+7NSAOk4ijb^0k3IHY4W4I@${<`#i+)u+1$PHN2|>3VjkX|7$6a)`*p{xSEiwRN&P zJl*Cl#`oDmZw~(NH`21*U!o_VA%2LC#O8kb@@i+u;#WpEy9yD`)<4BwK7bgPN>;)R ze#`xqth0JlK<;q6ee*m;q2tB+G!?tPxLj9YgBdDHfqc?5Nw;T~jNp#u1SQN27mGcL zPudod=xylKH+vote{91C_jgIa_z+ITs~^~(cUKJ?t;;v7`VKAK8@;TqBEJl@EtHU? z6_4DJxFuhM*@wrT7PSyxz>5K}!Nn)kZ{$4J@?WS-vKJpTh0P3w{g87i%+Jk=xji?8Lk@>&U`Vk16LYat07p(7?a%7AMeeBi zB?X;Rc`O0=n+4L6I+DfNOw{GpX`Yv=< z@zgJGDPb4zSzM_Vcq)sCzNHW!Wsvxw>?LfBujMeDUe~C9A+M@=B{M<1EX(lZylv7h z2n&i~Va8VWgh*2*3o$D->i?MB z9&}s?6kqGQBhE`}&fB-fnSy&Okq8Z2sRTY9Uz(Xo_8;EX{-PX=Yq; z?yf{Xcw769&d2{$5@G7wha3Mxn&5P}ECXRl!_5lM2tX7)Cn(Jg);mKbZewDM*v~3r z)1^8;w-UmbUIi;uyiJ60tZQLmyeQIp3v5p6xWVG~cng!Yanx(td<`}@bDH+EZx$09 z2dtr9;V$v{Ah1i>RQgomcrhJTOu@Gp-U9&9-q(rKs(hpe8x1gU-aQ64b$EzIr4g_t z$`Um59kba`H454J8v)&@s)!Zbwbv~SX4(mU#zsxw!RW<9O#b?t6)GyrBk7q(5-YlT z6kFrCG98clZkuA8rcYdXr)`rNa4gwx7AI-9N<6lr{h?t#OP1w{%_==K4_JG^Xo&@>5w-MY=$rbtcj}HK158ai*e=qMa;0BzF*{ za?vr+TYqs8!lW7UMDAQYM)yNcKo&cj91q?>=gs*X9#c1rcDADD8dPgWU2uyTC>LQa z>53>e&l%^ z{HPagPoHlIjsVxG?&W(>rpu6+f?0(ZtI(X!A%p4>haAPCfOkOhcpSS78!N;!ik#`K zw{KOzI01gH?0=WO>5j@W8lt16YxO;XwX?Z%Z=espQ$B%CL%u`1ESwGK3OJzbM^qz+|#?nF;Q%_h{L)$4u6SJ|5FZPv?nTzy^0xhM)XSw8Zd(gPql_;k zwFUiN+-G~z>7f0!e~9FFFit-8iSiiVR;Id{*TEzJA_OHd=Kx0C`8QEkI>*@YcGhil zpV+11Zo*`uqK4C51`Q1PgpN^CZ&)|Krc)H|cxkFi^VH=V49NdPl=e^j*-0#n@VMh8 zHt^M3=~?^c7ng#9Gt#K{mZqoCKQSbVQ(%X$(9X)zC>9(kDh zkP;L_kiTd;xt9?0jbgc-QJ>L(yB`AYhs+*f_PGgi3*doXA zWROa8pY4}0jX7y&pFa!MsiIgQ72Xo+z}oLEsA=|-v0z)$Gfe;h8vJ0u8r50!S>^gi zI&{V4sFWi$8JKOl%sc%$$ZK<8c0yE41x#fDRgNv#x%#AIBc?7%6(ix=S70Hg1{5-R z?ggNKywz*wpZ%NG`NXffe;5tZO6{b{=DC}s9kKvJu&vv+9 z^V4l6?5rJHT9rcp>vz6u^VpV_Os6Ot(S8RW_9KbWebkxhq}B8ygVN=}1{s%VOu(E_ z*H8e^w1t7^0p)xUGwfInLUJ&3Q zr;Q1OUPcV{I7TRug!KHLNm{p``Hgs-O9LYkjFco`2)`(7jT8A_Q-a@X zzOBJElFFM`8NwVyZF^ejYA?kHZ|CjuFqV+hGH*kljVjx#{cX`DW|_}k-LX{3?3A-J zzC5Ecz;HYnm6n92^!)qO$fb<7{ZKPaAC=j;6#cWDIGDI)@!l8~O-Chct$M~?Z~PCz5p_$Q@rW-j;5F_B#*?(NQ2r4gH%F$CY|PV|Ek?mwE(G8)J^)3;~~W6 zO2!SEWGZf9HesjyKNSbSVlA@qmWayephyE-nju#FW?-F{;aKm#lm0da>vQ zvxbFFc21~(A|TS0p24_0GTm1XADJ#p+u;LuhCwkb9sFpBG-$LO@Nb#m5F#aJKFwua^t`4X4zbM_~u>Pfxz& zrcfZ!*ThD&r2-N_i#FY%iim~}*;UcpwXjO>jvvnsr8RVG=xQ-mS_1|$za*SoiX47Q z-A?&-=!`fzMZT>M%f7p7ifVFTUYFIF6-x2o8Of+^naR_4j>OlT0?3}u{B(u?=x?7W z1XMk@PTngf7G79FdbhG^Bb1|m<#0oYo*!aIV`JzN1s9uY@+Dro44-F(T(j_ ziP^P+e!0oK-Ov4qt7D`aCx}+*SFYs`fNVLK_yFV?Q#&Gh@+GMf#q2n?G9gYfqDSSm z@Nke)eGTM@u-vyuQ57VzN{+H;M>|Hi)x-cVR6kn^E}b{RgO+DlfKE%Mt*E3>E5W>S z{IQkU=wo;0`Dhy0Hi)LYJ_0Frc<=uGu#k0Q-+#bteQuXP`b&XgA((Q$z&a_K%r?{<dIcNYGcfH`k$C#zh_mv&rpi~~Z9 z=zX3$sWoFLz+0bR|H}$$FemNap0ldOG)D*$etH3Y>xKF~0oAn&hQaehSrZ@Co#z%x znxn_}f6WV7h52egE-=^PIC>qeUw=u*yyX4ZrZ)vKAfN)xT81yluoB=~>Zo zlKc4exj8S#GvfUs;h}- z-+8>q8-p|uE5&3>6V!;Khp`;VKE!hbj|Mbw%6K^>A0?&MpbZ$Kga;rL$19UDV?G-1 zJN$>F&$B`)(lZ|}_PHStZ$k(V0*cLcsJmND4YS}$D7#w9z0!3m@LYbGVDy|)1;HX7 z2};YF8NH>a|MxPS@FS4n+tkV^jo-Bi#VgZpx9>y(e-xn9e=Eas?8;j#VRF@RoqUphkkJU~nq5gRFd>J?m+h%MT!!k1YyOYD7MV5#IwL6u z>Ua<$u9d9$CA@A2(Wms-T)p8g?(giZ+5Gn`pW6i{erIoCYwfYZMx1=VG-5P1W-iZII#RB9)&09c ziq%QjG5_xlP1chCRwunhP@j;z56^$upjG|^{B9=Z^2nvZ7=?v3=45C65<8wfX zF;ku~?J(Vi3xZ*#uYWaPIexuwpK`1<`$twA;52JTyb# zvajITO*o9$9MOe=^w@gKA$K%8W|Na2qM3)*tlg9?bVf*w6@_T`a9PlTZdnO^;j zhzcdyx|7Ir9W*np9oW8|)Q8D1n0F615P+hIQz|3|ExWkYS{OM2s49LlFKqCx&QFvK zf~DWr`Y=}uI(1nXJvodwNl#zwwjI;)biD2~sC@^lT@WDj`|#kxE@3L2 z)cw7HFj&}Bq$Wt6!gX(DulH1lOQyhTPyl+7Q5d&x6b!4mm5PuOY}I*A5RFJP^(-B7 zb@&}qPerT0{UUk1>J0cF>#G}n$i9bEhY3bgYg`#%AT0z>AY zY9Gu?R_n0`K!3G~*Ble)ssJ9?yv;fmV;pQEeVgz3@o&5cvU4;l5uFvKadF6oaD5fg zY!w&I)~c(mx#jS!|CJV|RKO2~5&)2LpO9Fp0$Am7*-1S*qqtj-m&F&G*2+b)3T}W8 z5p|_gNLOc9nn69Ob{i@PbG`cFILAlE@J1sh?sdg2Kb&}?ZEF3=HJOmU!~tdjS5h9^ z8I5bdD+?1x#c2b>tjaKKD?GP@4TK_^-@W%Hkc)JLc?#DkR^0Pk-v?Ge^#6(A ziI#l?)!o8da)O340B9{L@5Rp+$4=_0=^rtP_~6z0-c)I93Ndc^G)cWs#vb4tW{jm z5}>@(473Jhx`p&5qnC8VK?N0px%i%<0Mpq{8$Y%*8&*Bt({?eL|!}i)hD@z#OAw0x7|p@nun!I zDJ|?tPRk7_OD!A1-}_Tc!kG-Y(2Kn3VMC8P@fWJac;pe*P#Pj+L53sVjHDA;cFKlu z=hw}PC~9GK06fCyuKcMr0WdpT#Zm@pdlxzk>!k)R2@sW+_H#4tl@z5Zjy$@F1?GUcG7aXo`xuL&%TOz}>aruec~xKyxb z2IK5N8kYtdz!SuTT<2bWm1>DjXjl}-y%4Iy&(oFY#)p?jOSMcvBf{ROf<1i#w`s)* zWo-=6pQ&dKicN5$v7<;Vqb0NN-tv#X5JX*^KZq06y{Vs1t9Hi}`S6qfmXD`M%uJ}B zg?ax`?3NQnP;;A_af7v-`T^R%@ENg=-3&bTv~^XBrC}co<2@(*{h(Oso=JGKn?ys@ zKD|n}dolK>sq2Wq_Vf_BU#noIDQzh+aBm7b!=Ib$8vR=Ki}RpKO?mwS3m_JhjShhP zHnPV0hNmA8+HTIZlIuQKrWiu=$BzzY)qL06-m__Pe7SrQk&Mk6n7yK`B?31jO6$Z1 z^43NzLvfP2EB>W;74n2}NZtt4eZXoV{L`Q{E~)U?Vy&-qOaSzf%n*O+*3$eMlZln< zDsoO^SCSCGb~o=?-Kka#Via6#pBf-@R)ULA10uhs08-1o^fyNs^52+_7}U2X3s>|h z&6fRXUOMA6Q57?bnF8;}Z&?cOeTOt-GO6Ec@Tl~v6}PWhAIEZ@Z*IOSYaZ0<3q?3< z1t6@d1>P5UIw=qb#rCe$O~JuKujhF{whY!XNkLWPA5Vc&I$>Th347wc!W8SZxfgC> zc04#YrU}zIHBkfcy=BTf-=g}cjgCe)5vHvl zyz0t3ARIH`q7(39IWB)HkPfK4vx{7ay8pmzB_}yBoPyyFUl3GL1y0tFccF?wRg28; z0Zvcb4Y&@vup0DndH?Y@AW5FcZ|x1CIEe7m%|F5&j1b617Z$aUjF&~um-sJsltiJu zHXnR8?l20j+I)=uhVpzBjgIUX3zf=@s4<)M4%uDI5*^|XyxAa5h(Wnc0-3+R!XGN! zZ7h8G5fC6?CKL=#4E4Ko!)wdLSX5-q+q@cV4Vd?wx=D%%|K*$iWHrxq7JFV~IhQ08 zB`%kaa{LF*wXjnX^{`%l#d zN(ujZD=Hw=#g8Pzo^{6onIa@ZZc_b8A0aLudy+Vv+}?7F<@I6pl}3tjqXo_m=gKwS z&Ma30{a$StN3CF<`NCi=h^JZ{K9yGUrB+_ZHpN*AVNY-coBsR(Hp=5vLmyY^9<5_^ z$Jgm$=0`qY0H>3%3cl!}4Wq<-@f~Z$l+c!qsB?sU1B2s4ZWaA#D_x$rAYHsjeM{dMQc0qV&46v%tc~c7c-P+2JbK!kT9i$H5mT zRNVL4aYJdB4nH3NGAQO4p+d)zL$pEG7%PBXmTZkc%$^g+S4WGUyyBGZD>H2P)fjkK zGwy#V%Oy?sw^PCB_65a&-4<>s8o7g7MD4AStJK)=AkUCETax%2+ zp4sqI-|I*RTbo8%%NKyW&ps0u?6@Q1&eaR7=?Z4*W=hLHf+9PSLc{_XI*~NjgV1RT z1~7(*^gD(k_ejYK5Ib;lH``2S9Aty9|DY-2l7E^2MD}h8PPr;7xo-@iahEo=weFT{ zK8-UuRzyiaUV!MPX)|%n+D5QCgp>8G4WzdI)Z>6#V=Et{TbG zw^?jRq+CxIdDj|$xb|ckF;IeCPGokCZC`e)@k8G{9!T~e>M!`sAGv#OR}XB2W7{Xj z_&L@v9ZgHRF$xo{C&O8@q7~Ye{POyEc<8qx=pLHeB?Yu|KNHN}xX2iOBLm0jLVSGELbSsmok&Qo zMSf7YAVUL4VQ1!T-$c*(U}Qj7Z$ZEW_Wbj?T8}~5G&zI@Lf>y4$o64o=q`d%&7@Wdikt4McV`Ho%_=|8y4stbq4RsH$y$@&L z``}i}^vn_d{0dn+FpBEKM@yK9Ak@X|oUZ+j0E*Ljrl)o&wOEL%>_N&O?}XVW%alC8 zT|v=ajxG;SiK{>#NIcplabOb-Xz>|q~EF7qaBI4 zapg%!N`;@Xmxo?M4t_O>mpDoz+mo7v!4DPxRzl>smJ@@?+DR`s!>H1@!K{~mF z*31-kT(|MfW5WMlU%O@32G{l5TUuNGm6#q+=T>}32*OP4H+M`HBG~pfz`vNFsSpp0 z1xLHCTgW|tjL^rttQ`P9GSLGum6%kRfBp*&>BX6QxGRSaVl%XrA95?t2V#u4@h`ad zi~~KcUBPlvd|aTS!5t=v)QDO@YVQK3zTyvQVq|YtHm**n9fE%wB;)HglXPL-u!FIy zg;%D~0m6tk0i+_M*x(?)|EndOUgWWVf8dp}%RbuM9#$QA3o=PRBb@S12zU&AWHc<3 ze_+L)58VSi!CY|a0xGrEB$?gnGFn%@+?f8rFal1MpKtKPrUw1TM;w?Z?eo z!5_(g@Gl0*5fwamx=%_w?y}U|`{?2ytG~eebsfoUTumPCRFe@tq?8SZai9FU5X7UJ zdbmD#VrPs?xu?#?`k$vaYL+BGLv$GRhfR%ESc>_9SnS8Y*GQA?TTEgzFPii5UzjwB zn}@ZCR_niHW|Rs>8LE;2k+G{aoK@);!hYd%v*H zt|n?|0SB81hOfiLHU^CVx0@p`3yNKtrWG^a`Y95cgw?aFE1$@?92A0F`C zhq)EEDb0)QjV@AVa{dvgdQDHiZPmjeMv4xHbY|EIRc7`20pDLn4(BYbW9e;;r{%`& z*TKc@EXe;%tj&2lRbNRd2Vd5_H&CCmA|EAv&3@@y6rz$_QUeXWC$m+A2%+-`Wbr0e zR{@0^qq&j~Wxm_-PoS_x9jvrtZHA#=W zNj5mFyD2wV@-th=3->ks?8=)a3p;Wram+%e$FKk~ax?2BNXy>Q!6s?ZEQA2LuBB@s z^UDd>72{)EQFq@Yx(NY>i>A2M&1EFNOKtBOY1K@v`o{4QL7@W=dKeo21`%|Q3ZH!% z&a9{y^tU9<_X=qg8~0Dl-ZtzBGU;$7Bi2U`os?ELj==4Q)H%bZv!ob2J1WHEc6TQk z0z7XwBqh;1c~X<>5*7?rHQXS!rOf%Zz8)ujDJa-tmkVCJr zZ)KLSBdsmUjY)~DcYu~JJwP#y4++;HL3yDfjojVxv?PS{$+(7AV{ySs2~9)mq$PM7 zMtmF8>mr~IP>WedS${l?L_6>zwU7-?q6dtuEmEt=j|~#b#P!C^T>#=oOXUA0y_KO9 zMQ2vG6ey!??B>QIEKUU56!TTbQz=Nkc@N~oViZ<=|BXIp*IbAL zv37Dg;>N=%_2A{DjzH|@d=7@PGvKiRCwN&39>uVmk^yS`X)j%arQo|31&n72dM=&W z(jnIO%N+okr_NEpHAKbCcEj}Q;GYD*^8u3h7{)If-m%R zoN!VlBH@dWf$WTdyj4hxh3i2lV{|8@M%#g|QFL!{3x(`HhMz?ts2IP%-G(2PFV2dp z=V)bK`@Ot5pu=R#6IfrTcGvhMxOBmaJW*t^3Ih9*R4V}!O&5L>OA(sG<1#Jg0eHoj zEceZSt)W*m^GciUx56K$?CzQaxymb|T5K8eS|D&2ad(ibYPpRN10p~n;;b~X90w=} znHtA$X`nLTG$^pDQB?N)N_m04$YguyX`-WLDP)&ff-Dy06+A^7d{%h3BIq-) z4W)aga@sAdkYP+4e7ABNa9RO?8#Za5*NNVlozZn5fbYw-&b_}e^Bm5k3O@I|0~AMn zgqdR#J|5fo^Z5`O=N$kl^EqYbHp^?Vd{SD|M41E)4FC9Z)eg>(aBhdcdc46CForz9 zCt%JdrkSd{OngVTbyYu`Htu^nJ*sGL4T>mLlP{ijyG8y(#==@P**B2Tk}Q%G;zN(? z)YZR%#UVN>96WDDyQF;gLID1W3_5zak}D{Iw)SAewxFWMIM6Z;tnBc9MjbTsIj*dE5Oj+HNw_Ndp;%u#|AhZMeu1Dj4l73@SB#w08be3V;8^D zhv;Uy%21Z8jjmOslTYy#s5PVi1E*-mE`eASwJ*gu3o(*w&uWkQl|%m#jzZPz(`)yS zQ7<{4`b!?Z*tL4wM2m&zpMr0I>?y9nE^J)UJ8glp#5}%Km-NS26ZqrE&1Dp1d-_d# zl4AO)?G}ZA6hF;}nqk@I(OuD+bz4ppLDpdrhAOZQ8+=HT#J45io-8C_@8I9J5#J6GPFAiDbTL9X$uQ@uaBXHio3lCDZ2D6=U3Xub1F zngg$!?`KOZd9}CGP1IZlxSpq;ZOOgT+CHEF8-)z?KmY&$005L>c9vy<0cs^`M!Qzw za9Vp2%POGDb=Ug@Iq6f#Uoe&i4;-ut|5WqKG*Di@h{;a0!v6$3y`Z2M53k50Ycy@$ zbGC$a@IMfD&pReJv>a`Py7X5;2rPJ_LU=OQ1t&X1-3Sb>!`0f(p(>M|?gMLrejs^Z zFq5cu1@x1)Bd1x6{VY5qkOPKrDoIKLrG)+{Z3)SU7eq8?6J0UNQSak9pW0KW1lH2| zMb9YI?hO_y_aH0?n!Pn~&Fib@7i07`KBLqCZ1c?oZ;0$E!)bHAHsUsBR;K6Q&Jbqk zye>3TKq!?lcH=bGeyyXKftY^xd&wha^FR!Atp7Zhab6)6KY+LkN0*sgh2T1b%OFAR zuV@F+zDiSG0*nW!6Oj?wInz3D!9CYn#v0l?*qn%J)dcFoFa{NJ@J8XsvQJltkz@mx zAwle9!=zJWzieNMtPw3NN_PLkUr3$++DYZ2qiZ@aOnIScnX1f-2u+q1+G_foK0R`V z)y=h-6aWylq==99VF)d^-n3qhW5iBP%bM?k9dioCRvE;;h?`IDHlZ}cfu#?iILr`* zsfZl>DQf1ILLu}nU+1j8c25wl`_uQNnlhhSL9*zx`TixS5Ax{alMD}OeL9?_-d(;* zWCUyl1Emmn2gF8}GT-jh-;tdYP!!ep0V@{FDJ0^>o zVCB}QFiKNko(p3i$HCrL+mkmqmR0RH;MSm2YDcCdkeE?5xY!e`n8=?lZ&(O0&|~6^ zq2!;G+|4w(ZJr`KtciZ9yK#05X%esri0rXqvNaqC}d_k#$$_iR?fR8vUZrpL)W~(_q1E^@5Z0AS0K(2@5S8ofjLQ!8-ZdmyMi#Q_wZA9EEi9 zei^rwqmQXperqCkRtG?-ir*u4>@m^{z}3xmiNn1*mV9iE+e6*TI+}augAAU0(k?~R zNTc-l?+%IEoqE~%04R64%_vl6Y&X$S;Un5n$Kd*S^rMEK8jgOdv!p7`$vul^Oz$+# z-eMIDo(3m-M|;44MKqpD=)|b|BWIN$1G2LJ?H#Y6-28@F+2Wc!TVNvmxC-$eJy(z? zvbSl4Uv(Ix{yo49Ec|V+#0)8}=h)2j4PtZ}Tpg6znjn0lB8`AFt@rvZdmkZCXt|gi z!GYt#Spr0367eEiBgpD1JQU|6jb`H@0000005cG@g%nmkb(VgBTOi0e?8#`cX**~9b8WsNY&4x0k} zy?ugP#jiiL$?Zl=nZM)`pv-~llQv#ULMXwh`VcO^PNO*<9o8=v08o8+Cy= zEt3P}S@04~8@cnDl$Kp6+4&^OIOf4reoFmX%&FK(YyCLqz#AK=wS111#S%cfgUG}J zHvO1;R#VK#mN{;|=UNT?i-xG%vUAgWTAx<9{o1;aTwS921VN-(7taD8!giR6Ycy#( z>|g^4=UZO(X9*2?{JQ1D{+RKeP#YWaiJ6#@UTENj*H57A+IJ536|74Exz5^P9y!2M zGq4WxvKr=`C{o`$t*7n&-S8Kk>vyC&8a}YW?3*2n<$5Q6 zgsy!`MVgZ$>KM3+*So*b=}}OH7{khTwT=rjTWMVW=&2W}x`@W0e4tSLtgF#KI%WbV z+^5Z2vD(|Tcnx)T23?d#!N!g6LQ)hp@S)#$Lm|VAW8x71d77Xd5QqgVeEDlv~pB!Q@_6O9ve6hK4C zJDB5pV;~uc7-LH=q2)b^vpOgna0{JYf(HhCYJ>E6Rpju1asV1e>KV;h>dX&08CF=o z@EsUOxxcd?7!ILGR?*ctq0?7XVxrXKH}kJm19RODd)my-$f}31`mXiY)DOdz>(h@+ zj0dwz5b-1-3C7MW(uWS~&g=w;KQFOqghWfhYuxgru~~W& zmR4$PS}2G6Jd_;Y+YfYp{%}S0jRldu{duJg`wd7!8|-SstjKRq|JlwS9C5%>MsD-! zBTMCRKqS_jU)O?#?%qxa-UmZ(9BC;h3+@!+q)H@!SThlH=thPvYH*x23&%Z%^Lyt+ z2!~;>Y!%%_n>;b^RAM8>13<7OU_o1FD^zWPiDA}DTKP>?;r-i!&$VL$phho^ya>W= z=F@vD!J|C#6UbshM^S`UND0CMnw$+hI*_K3Z2Sq3mp^>uzm4JWrQiAKi$Sy0JwEfF zJ~G(0eJpHQ9rl5A{ovc0cREb6sM& zf1?>_VU1?#QRyJhU~Di-PV2R4=^_`}xQ7Ip*9cj7Tmc01`8Wz}EV&2VB%0&If?3vcOe`?H58^&xlNZkH&}EJ3~Zun-o^BmDZ}5 z`va8^1+v+O@&Me@xn*@d}9x@qjty6~X4om$~Cu)GUKEZkL@|JTb@V zh#$-m0bt!urCBLmSJ;nfwmYlehmu6zCw<6^peT?=WrNSqE4%bbQH{Q@m;4aD0j->R zLeQ#jn(ouD%}^|_Xo`iB!sL$<$n0km|qRec@0zkcs5^&#K>^xH1qoa zP#;aEpgj{H)@SZKPya_t2)#+}?kMB-A-2I77+YZHkzve?Sehd(cOzmu+k)G5ob~>oTk3_7||ozkfWE4GR1P6Wtu+4Q;+7xR|>{Z zdhp6AlN=)&UENQp--IWw0o9TB$AOyzwvH`T-dkNuFXQ~JG?&syO91fHMT8&BBIwm7 z-C6?kg*_`su17$rNLOv4F9BFYBih3Glh^6DKvtL?$SK?<0{?Rc`@p8lu7;*x{Kjes zV|j|_66*8f!hl6(?vNaS|9&vL)(X#9Id3-lJk$`AvCbbT z&mxTmrSGT08Aux)hZoQi@Z}~EKF-@K1>*Tgc>Q+_?0G#eG<4WalVXzD;jk~x8mwsw z{U|qI#{F?q96oc}u6tL+BhXF<+Go0Tux{ss;8Y`~{@o&BUrQ;YJB~8gVZsqn3N=e7 z(5pZ46%yfO+Ta(7BF*xWLb6*oEr6=&HfoT2;rThv#XSF9Uw+dTjRd2O_z2KzF!m4~ z)SA|C3UALVNBGBDH8k8U9F&4id;2d9&cJVeQq{S+eOkb2TO;PoGZMI@yj%Z-FEaqn z(4n_;i=o0q9%##@=*ua35{5Uf(0+ncEl)9VSFNxG(*Ax8ug{_8Re4Ycl^&4(gL#Z^ z=h(e=i=P<$c!Y`<>&%SqE$_0Ygl>Yx>g)PVDxO&E&dAXDc-YZFCp$IMvVmak$ASY} zbI_-ji(ctz^IFr8RDqlKo{6qS4?pe5RC8D6Vp43#TE^3xavlz)aieqDCS)nG7)9-y1Mi*FTH z+jEj}Z_gv=^_S5GW^F2Lzi6=K?az94X?hs~S2E&>X-uoAJY*)X4CHSxUbs_}7!Trq7Du*l$N;F_^=7-|){6$>|_nVI4LM`1xA=O@) zsH5NFf8x*!!(QQ>Xd^68pAPpwGY8Cu)c|!XdaX~l*xbz(1=9ly2A^C4kt@_;sFf42 zxyu0=-)gqTV;t*=5e6MT2I?G0BAteoc&srJa}I_b9D~W=_g|dd|K`GqmHN9C;_VJxm$3V`sr>U_#eiWMa+~Bv5$S9_CC^q z>m~C`F{P}W!c;h9PJPAby){#K(Rpe?v9;};gV%{e?S9UC=!Cy0*7Uod_I&Z*f)th5 zeFG$|?*EV!1|LQa*R~9l7609kPDc6$K>c~qmN0oQ=a&*RarAc`u5=nrJ`Gh9sn#k0 zroob*_%hdE5UxIqk+=@3BPnF3%ZEc)3uaZA%4z5;Qxc^}X^++)mkF&j>f|UWM-DSf zCBLk^II`P^hRI7}Jcx5kTNAV>K-6;EqBXrb=a? zSr6J8*vhBG#@vcV1no8}84jhbY-QwqZ&?H0)QdXM49@#IfrFW-(5#`&nHTjUUS7wN zoj{$?$zCj9F(Vbpg51Bn0n=uH?RoB=Pv8Im00000arvlX3mAzU_hV``5$X+(mx}(d z^1wY*A2MJ%BKrggRQ#0?G7DMcPJ$|W@`u0iMeGX6=i01@2>$#7{+)N$_Q?szI#EU9 zbr7G8knF2KXh6{Yk>VqbS?ohYl!xNaXL6IfJpl-2U>Q1t_in9E6(}eL2g#Ew%uy+T zD!j6*YkVRYuG;pF6@P`5qiN-M1N>>ack%MX7 zVyT@tZ z&zI@=NPfgp1#59O;6ydQ(NBi7Y28%Ez3a7JL zQYUm`6<#VQwasLEj4LFk2o6@LZ#x%tz@i*f(}0@>SK^+xnfy`J2tD4MhY z6h^=jSZjRK(v^kn$+(!BuNDWXZY64Fb^--rIIGYzJ5wa8O)_Ak9Zd%ubNNG> zQjw^4XImXh0tz3HhNZ>zQ;gmFXWN;VT8Iow=v7&qa0w!jS%ba|}dvD@n9K8RGN^eiVZCfv8JnQGygz2DHhNz`_. + +Hardware +******** + +Myra SiP provides the following hardware: + +- **STM32G491REI6 MCU**: + + - ARM Cortex-M4 CPU with FPU, up to 170 MHz + - Clock Sources: + + - 4 to 48 MHz external crystal oscillator (HSE) + - 32 kHz crystal oscillator for RTC (LSE) + - Internal 16 MHz RC (±1%) + - Internal low-power 32 kHz RC (±5%) + - 2 PLLs for system clock, USB, audio, ADC + - RTC: Real-time clock with hardware calendar, alarms, and calibration + - Timers: + + - 1x 32-bit timer and 2x 16-bit timers with up to 4x IC/OC/PWM or pulse counter and quadrature + (incremental) encoder input + - 3x 16-bit advanced motor control timers with up to 8x PWM channels, dead time generation, + emergency stop + - 1x 16-bit timer with 2x IC/OC, one OCN/PWM, dead time generation, emergency stop + - 2x watchdog timers (independent, window) + - 2x 16-bit basic timers + - SysTick timer + - 1x low-power timer + - I/Os: Up to 86 fast I/Os, most 5V tolerant + - Memory: + + - 512 KB Flash memory with ECC and PCROP protection + - 96 KB SRAM including 32 KB with hardware parity check + - Analog peripherals: + + - 3x 16-bit ADCs with up to 36 channels, hardware oversampling, and resolution up to 16-bit + - 4x 12-bit DAC channels + - 4x ultra-fast rail-to-rail analog comparators + - 4x operational amplifiers with built-in PGA + - Internal temperature sensor and voltage reference with support for three output voltages + (2.048 V, 2.5 V, 2.9 V) + - Communication Interfaces: + + - 2x FDCAN controllers supporting flexible data rate + - 3x I2C Fast Mode Plus (1 Mbit/s) with 20 mA current sink, SMBus/PMBus support + - 5x USART/UART (ISO 7816, LIN, IrDA, modem control) + - 1x LPUART + - 3x SPI interfaces (2x with multiplexed half-duplex I²S) + - 1x SAI (serial audio interface) + - USB 2.0 full-speed with LPM and BCD support + - IRTIM (infrared interface) + - USB Type-C™ / USB Power Delivery (UCPD) + - Other Peripherals: + + - 16-channel DMA controller + - True Random Number Generator (RNG) + - CRC calculation unit, 96-bit unique ID + - Development support: SWD, JTAG, Embedded Trace Macrocell™ + - ECOPACK2® compliant packages + +- **128 KB Fujitsu MB85RS1MT FRAM**: Local storage for data logging, allowing non-volatile memory storage. + +- **FTDI FT231XQ USB to UART converter**: Provides a reliable USB to UART interface. + + +More information about STM32G491RE can be found here: + +- `STM32G491RE on www.st.com`_ + +Other board's peripherals: +-------------------------- + +- USB-C Connector: For data and power. +- SHT45 sensor: + + - Relative humidity accuracy: ±1.0% RH + - Operating humidity range: 0-100% RH + - Temperature accuracy: ±0.1°C + - Operating temperature range: -40°C to 125°C +- BME280 sensor: + + - Relative humidity accuracy: ±3% RH + - Temperature accuracy: ±1°C + - Pressure accuracy: ±1 hPa + - Operating temperature range: -40°C to 85°C + - Pressure range: 300-1100 hPa +- QWIIC connectors: For easy peripheral expansion. + +Supported Features +------------------ + +The Zephyr ``myra_sip_baseboard`` board target supports the following hardware features: + ++-----------+------------+-------------------------------------+ +| Interface | Controller | Driver/Component | ++===========+============+=====================================+ +| NVIC | on-chip | nested vector interrupt controller | ++-----------+------------+-------------------------------------+ +| UART | on-chip | serial port-polling; serial | +| | | port-interrupt | ++-----------+------------+-------------------------------------+ +| PINMUX | on-chip | pinmux | ++-----------+------------+-------------------------------------+ +| GPIO | on-chip | gpio | ++-----------+------------+-------------------------------------+ +| I2C | on-chip | i2c | ++-----------+------------+-------------------------------------+ +| WATCHDOG | on-chip | independent watchdog | ++-----------+------------+-------------------------------------+ +| PWM | on-chip | pwm | ++-----------+------------+-------------------------------------+ +| ADC | on-chip | adc | ++-----------+------------+-------------------------------------+ +| DAC | on-chip | dac controller | ++-----------+------------+-------------------------------------+ +| FLASH | on-chip | flash memory | ++-----------+------------+-------------------------------------+ +| EEPROM | on-chip | eeprom | ++-----------+------------+-------------------------------------+ +| NVS | on-chip | nvs | ++-----------+------------+-------------------------------------+ +| COUNTER | on-chip | rtc | ++-----------+------------+-------------------------------------+ +| SPI | on-chip | spi | ++-----------+------------+-------------------------------------+ +| die-temp | on-chip | die temperature sensor | ++-----------+------------+-------------------------------------+ +| FDCAN1 | on-chip | can controller | ++-----------+------------+-------------------------------------+ +| RTC | on-chip | rtc | ++-----------+------------+-------------------------------------+ + +Other hardware features are not yet supported on this Zephyr port. + +Connections and IOs +------------------- + +Antmicro's Myra SiP Baseboard provides the following default pin mappings for peripherals: + +.. rst-class:: rst-columns + +- LPUART_1_TX : PA2 +- LPUART_1_RX : PA3 +- I2C_1_SCL : PB8 +- I2C_1_SDA : PB9 +- SPI_CS2 : PB2 +- SPI_CS3 : PA7 +- SPI_2_SCK : PB13 +- SPI_2_MISO : PB14 +- SPI_2_MOSI : PB15 +- PWM_2_CH1 : PA5 +- USER_PB : PC13 +- LD2 : PA5 +- ADC1_IN1 : PA0 +- DAC1_OUT1 : PA4 +- USB_MCU_N : PA11 +- USB_MCU_P : PA12 +- SWDIO-JMTS : PA13 +- SWCLK-JTCK : PA14 +- JTDI : PA15 +- JTDO : PB3 +- JTRST : PB4 +- FRAM_HOLD (ACTIVE LOW) : PB10 +- FRAM_WP (ACTIVE LOW) : PB11 +- FRAM_CS (ACTIVE LOW) : PB12 +- GPIO_PC10 : PC10 +- GPIO_PC11 : PC11 +- GPIO_PC12 : PC12 +- PF0_OSC : PF0 + +System Clock +------------ + +System clock can be driven by an internal or an external oscillator, as well as by the main PLL +clock. By default, system clock is driven by PLL clock at 170MHz (boost mode selected), which in +turn, is driven by the 8MHz high speed external oscillator (HSE). While the HSE oscillator is +capable of operating at frequencies up to 48 MHz by default, in this configuration, it is +specifically set to 8 MHz. + +Serial Port +----------- + +The Myra SiP Baseboard has 5 U(S)ARTs. The Zephyr console output is assigned to LPUART1. The default +settings are 115200 8N1. + +Programming and Debugging +************************* + +Applications for the ``myra_sip_baseboard`` board target can be built and flashed in the usual way (see :ref:`build_an_application` and :ref:`application_run` for more details). + +Flashing +******** + +This board has a USB-JTAG interface and can be used with OpenOCD. + +Connect the Myra SiP Baseboard to your host computer using the USB port, then build and flash +the application. Here is an example for :zephyr:code-sample:`hello_world`. + +.. zephyr-app-commands:: + :zephyr-app: samples/hello_world + :board: myra_sip_baseboard + :goals: build flash + +Then run a serial host program to connect with the Myra SiP Baseboard, e.g. using picocom: + +.. code-block:: console + + $ picocom /dev/ttyUSB0 -b 115200 + +.. warning:: + The board has only one port that is used for both programming and the console. For this reason, it is + recommended to set ``CONFIG_BOOT_DELAY`` to an arbitrary value. This is especially important when + running twister tests on the device. You should then also use the ``--flash-before`` and + ``--device-flash-timeout=120`` options: + + .. code-block:: console + + $ scripts/twister --device-testing --device-serial /dev/ttyUSB0 --device-serial-baud 115200 -p myra_sip_baseboard --flash-before --device-flash-timeout=120 -v + +Debugging +********* + +You can debug an application in the usual way. Here is an example for the +:zephyr:code-sample:`hello_world` application. + +.. zephyr-app-commands:: + :zephyr-app: samples/hello_world + :board: myra_sip_baseboard + :maybe-skip-config: + :goals: debug + +.. _STM32G491RE on www.st.com: + https://www.st.com/en/microcontrollers-microprocessors/stm32g491re.html diff --git a/boards/antmicro/myra_sip_baseboard/myra_sip_baseboard.dts b/boards/antmicro/myra_sip_baseboard/myra_sip_baseboard.dts new file mode 100644 index 00000000000..e2d011fddf0 --- /dev/null +++ b/boards/antmicro/myra_sip_baseboard/myra_sip_baseboard.dts @@ -0,0 +1,219 @@ +/* + * Copyright (c) 2024 Antmicro + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/dts-v1/; +#include +#include + +/ { + compatible = "antmicro,myra-sip-baseboard"; + model = "Myra SiP Baseboard"; + + chosen { + zephyr,console = &lpuart1; + zephyr,shell-uart = &lpuart1; + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zephyr,canbus = &fdcan1; + zephyr,code-partition = &slot0_partition; + }; + + leds: leds { + compatible = "gpio-leds"; + green_led: led_0 { + gpios = <&gpioa 5 GPIO_ACTIVE_HIGH>; + label = "User LD2"; + }; + }; + + pwmleds { + compatible = "pwm-leds"; + + green_pwm_led: green_pwm_led { + pwms = <&pwm2 1 PWM_MSEC(20) PWM_POLARITY_NORMAL>; + }; + }; + + gpio_keys { + compatible = "gpio-keys"; + user_button: button { + label = "User"; + gpios = <&gpioc 13 GPIO_ACTIVE_LOW>; + zephyr,code = ; + }; + }; + + aliases { + led0 = &green_led; + mcuboot-led0 = &green_led; + pwm-led0 = &green_pwm_led; + sw0 = &user_button; + watchdog0 = &iwdg; + volt-sensor0 = &vref; + volt-sensor1 = &vbat; + rtc = &rtc; + }; +}; + +&clk_lse { + status = "okay"; +}; + +&clk_lsi { + status = "okay"; +}; + +&clk_hsi48 { + status = "okay"; +}; + +&clk_hse { + clock-frequency = ; + status = "okay"; +}; + +&pll { + div-m = <2>; + mul-n = <85>; + div-p = <7>; + div-q = <2>; + div-r = <2>; + clocks = <&clk_hse>; + status = "okay"; +}; + +&rcc { + clocks = <&pll>; + clock-frequency = ; + ahb-prescaler = <1>; + apb1-prescaler = <1>; + apb2-prescaler = <1>; +}; + +&lpuart1 { + pinctrl-0 = <&lpuart1_tx_pa2 &lpuart1_rx_pa3>; + pinctrl-1 = <&analog_pa2 &analog_pa3>; + pinctrl-names = "default", "sleep"; + current-speed = <115200>; + status = "okay"; +}; + +&i2c1 { + pinctrl-0 = <&i2c1_scl_pb8 &i2c1_sda_pb9>; + pinctrl-names = "default"; + status = "okay"; + + bme280@76 { + compatible = "bosch,bme280"; + reg = <0x76>; + }; + + sht4x@44 { + compatible = "sensirion,sht4x"; + repeatability = <2>; + reg = <0x44>; + }; +}; + +&timers2 { + status = "okay"; + + pwm2: pwm { + status = "okay"; + pinctrl-0 = <&tim2_ch1_pa5>; + pinctrl-names = "default"; + }; +}; + +stm32_lp_tick_source: &lptim1 { + clocks = <&rcc STM32_CLOCK_BUS_APB1 0x80000000>, + <&rcc STM32_SRC_LSI LPTIM1_SEL(1)>; + status = "okay"; +}; + +&rtc { + clocks = <&rcc STM32_CLOCK_BUS_APB1 0x00000400>, + <&rcc STM32_SRC_LSE RTC_SEL(1)>; + status = "okay"; +}; + +&flash0 { + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + boot_partition: partition@0 { + label = "mcuboot"; + reg = <0x00000000 DT_SIZE_K(34)>; + }; + slot0_partition: partition@8800 { + label = "image-0"; + reg = <0x00008800 DT_SIZE_K(240)>; + }; + slot1_partition: partition@44800 { + label = "image-1"; + reg = <0x00044800 DT_SIZE_K(234)>; + }; + /* Set 4Kb of storage at the end of the 512Kb of flash */ + storage_partition: partition@7f000 { + label = "storage"; + reg = <0x0007f000 DT_SIZE_K(4)>; + }; + }; +}; + +&iwdg { + status = "okay"; +}; + +&rng { + status = "okay"; +}; + +&adc1 { + pinctrl-0 = <&adc1_in1_pa0>; + pinctrl-names = "default"; + st,adc-clock-source = "SYNC"; + st,adc-prescaler = <4>; + status = "okay"; +}; + +&die_temp { + status = "okay"; +}; + +&dac1 { + pinctrl-0 = <&dac1_out1_pa4>; + pinctrl-names = "default"; + status = "okay"; +}; + +&fdcan1 { + clocks = <&rcc STM32_CLOCK_BUS_APB1 0x02000000>, + <&rcc STM32_SRC_HSE FDCAN_SEL(0)>; + pinctrl-0 = <&fdcan1_rx_pa11 &fdcan1_tx_pa12>; + pinctrl-names = "default"; + status = "okay"; +}; + +&vref { + status = "okay"; +}; + +&vbat { + status = "okay"; +}; + +&timers6 { + status = "okay"; + st,prescaler = <1>; +}; + +&timers7 { + status = "okay"; + st,prescaler = <1>; +}; diff --git a/boards/antmicro/myra_sip_baseboard/myra_sip_baseboard.yaml b/boards/antmicro/myra_sip_baseboard/myra_sip_baseboard.yaml new file mode 100644 index 00000000000..5979e67fd17 --- /dev/null +++ b/boards/antmicro/myra_sip_baseboard/myra_sip_baseboard.yaml @@ -0,0 +1,27 @@ +identifier: myra_sip_baseboard +name: Myra SiP Baseboard +type: mcu +arch: arm +toolchain: + - zephyr + - gnuarmemb +ram: 128 +flash: 512 +supported: + - nvs + - pwm + - i2c + - gpio + - usb device + - spi + - watchdog + - dma + - can + - rtc + - sensors +testing: + timeout_multiplier: 3 + renode: + uart: sysbus.lpuart1 + resc: boards/antmicro/myra_sip_baseboard/support/myra_sip_baseboard.resc +vendor: antmicro diff --git a/boards/antmicro/myra_sip_baseboard/myra_sip_baseboard_defconfig b/boards/antmicro/myra_sip_baseboard/myra_sip_baseboard_defconfig new file mode 100644 index 00000000000..163b6236b23 --- /dev/null +++ b/boards/antmicro/myra_sip_baseboard/myra_sip_baseboard_defconfig @@ -0,0 +1,10 @@ +# Copyright (c) 2024 Antmicro +# SPDX-License-Identifier: Apache-2.0 + +CONFIG_SERIAL=y +CONFIG_GPIO=y +CONFIG_CLOCK_CONTROL=y +CONFIG_CONSOLE=y +CONFIG_UART_CONSOLE=y +CONFIG_ARM_MPU=y +CONFIG_HW_STACK_PROTECTION=y diff --git a/boards/antmicro/myra_sip_baseboard/support/myra_sip_baseboard.repl b/boards/antmicro/myra_sip_baseboard/support/myra_sip_baseboard.repl new file mode 100644 index 00000000000..7d0aab51693 --- /dev/null +++ b/boards/antmicro/myra_sip_baseboard/support/myra_sip_baseboard.repl @@ -0,0 +1,87 @@ +flash0: Memory.MappedMemory @ sysbus 0x8000000 + size: 0x80000 + +sram0: Memory.MappedMemory @ sysbus 0x20000000 + size: 0x1c000 + +timers2: Timers.STM32_Timer @ sysbus <0x40000000, +0x400> + frequency: 10000000 + initialLimit: 0xffffffff + ->nvic0@28 + +timers6: Timers.STM32_Timer @ sysbus <0x40001000, +0x400> + frequency: 10000000 + initialLimit: 0xffffffff + ->nvic0@54 + +timers7: Timers.STM32_Timer @ sysbus <0x40001400, +0x400> + frequency: 10000000 + initialLimit: 0xffffffff + ->nvic0@55 + +clk_lse: Python.PythonPeripheral @ sysbus 0x40007000 + size: 0x4 + initable: true + filename: "scripts/pydev/rolling-bit.py" + +gpioa: GPIOPort.STM32_GPIOPort @ sysbus <0x48000000, +0x400> + +gpiob: GPIOPort.STM32_GPIOPort @ sysbus <0x48000400, +0x400> + +gpioc: GPIOPort.STM32_GPIOPort @ sysbus <0x48000800, +0x400> + +gpiod: GPIOPort.STM32_GPIOPort @ sysbus <0x48000c00, +0x400> + +gpioe: GPIOPort.STM32_GPIOPort @ sysbus <0x48001000, +0x400> + +gpiof: GPIOPort.STM32_GPIOPort @ sysbus <0x48001400, +0x400> + +gpiog: GPIOPort.STM32_GPIOPort @ sysbus <0x48001800, +0x400> + +greenled: Miscellaneous.LED @ gpioa 0x5 + +gpioa: + 5 -> greenled@0 + +nvic0: IRQControllers.NVIC @ { + sysbus new Bus.BusPointRegistration { address: 0xe000e000; cpu: cpu0 } +} + -> cpu0@0 + +cpu0: CPU.CortexM @ sysbus + cpuType: "cortex-m4f" + nvic: nvic0 + +i2c1: I2C.STM32F7_I2C @ sysbus 0x40005400 + EventInterrupt->nvic0@31 + ErrorInterrupt->nvic0@32 + +sht4x: I2C.SHT45 @ i2c1 0x44 + +adc1: Analog.STM32_ADC @ sysbus 0x50000000 + IRQ->nvic0@18 + +lpuart1: UART.STM32F7_USART @ sysbus 0x40008000 + frequency: 200000000 + lowPowerMode: true + IRQ->nvic0@91 + +rcc: Python.PythonPeripheral @ sysbus 0x40021000 + size: 0x400 + initable: true + filename: "scripts/pydev/flipflop.py" + +rng: Miscellaneous.STM32F4_RNG @ sysbus 0x50060800 + ->nvic0@90 + +rtc: Timers.STM32F4_RTC @ sysbus 0x40002800 + AlarmIRQ->nvic0@41 + +spi2: SPI.STM32SPI @ sysbus 0x40003800 + IRQ->nvic0@36 + +iwdg: Timers.STM32_IndependentWatchdog @ sysbus 0x40003000 + frequency: 32000 + +dwt: Miscellaneous.DWT @ sysbus 0xE0001000 + frequency: 72000000 diff --git a/boards/antmicro/myra_sip_baseboard/support/myra_sip_baseboard.resc b/boards/antmicro/myra_sip_baseboard/support/myra_sip_baseboard.resc new file mode 100644 index 00000000000..2d794d7c7f5 --- /dev/null +++ b/boards/antmicro/myra_sip_baseboard/support/myra_sip_baseboard.resc @@ -0,0 +1,17 @@ +:name: Myra SiP Baseboard +:description: This script is prepared to run Zephyr on the Myra SiP Baseboard. + +$name?="Myra SiP Baseboard" + +using sysbus +mach create $name +machine LoadPlatformDescription $ORIGIN/myra_sip_baseboard.repl + +showAnalyzer lpuart1 + +macro reset +""" + sysbus LoadELF $elf + cpu0 VectorTableOffset `sysbus GetSymbolAddress "_vector_table"` +""" +runMacro $reset diff --git a/boards/antmicro/myra_sip_baseboard/support/openocd_myra_sip_baseboard.cfg b/boards/antmicro/myra_sip_baseboard/support/openocd_myra_sip_baseboard.cfg new file mode 100644 index 00000000000..dc278051fc9 --- /dev/null +++ b/boards/antmicro/myra_sip_baseboard/support/openocd_myra_sip_baseboard.cfg @@ -0,0 +1,13 @@ +adapter driver ft232r +adapter speed 1000 + +ft232r vid_pid 0x0403 0x6015 +ft232r tck_num RTS +ft232r tms_num DTR +ft232r tdi_num RI +ft232r tdo_num CTS +ft232r trst_num DSR +ft232r srst_num DCD + +ft232r restore_serial 0x0015 +source [find target/stm32g4x.cfg] diff --git a/dts/arm/antmicro/myra.dtsi b/dts/arm/antmicro/myra.dtsi new file mode 100644 index 00000000000..70f8beabecf --- /dev/null +++ b/dts/arm/antmicro/myra.dtsi @@ -0,0 +1,17 @@ +/* + * Copyright (c) 2024 Antmicro + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include +#include + +&spi2 { + pinctrl-0 = <&spi2_nss_pb12 &spi2_sck_pb13 + &spi2_miso_pb14 &spi2_mosi_pb15>; + pinctrl-names = "default"; + status = "okay"; +}; diff --git a/dts/bindings/vendor-prefixes.txt b/dts/bindings/vendor-prefixes.txt index ee115b920f6..aed12fa9adb 100644 --- a/dts/bindings/vendor-prefixes.txt +++ b/dts/bindings/vendor-prefixes.txt @@ -57,6 +57,7 @@ ams AMS AG amstaos AMS-Taos Inc. analogix Analogix Semiconductor, Inc. andestech Andes Technology Corporation +antmicro Antmicro anvo Anvo-Systems Dresden GmbH aosong Guangzhou Aosong Electronic Co., Ltd. ap Angst+Pfister diff --git a/soc/antmicro/myra/Kconfig b/soc/antmicro/myra/Kconfig new file mode 100644 index 00000000000..5dd9da98770 --- /dev/null +++ b/soc/antmicro/myra/Kconfig @@ -0,0 +1,5 @@ +# Copyright (c) 2024 Antmicro +# SPDX-License-Identifier: Apache-2.0 + +config SOC_MYRA + select SOC_STM32G491XX diff --git a/soc/antmicro/myra/Kconfig.soc b/soc/antmicro/myra/Kconfig.soc new file mode 100644 index 00000000000..adc05f48a5a --- /dev/null +++ b/soc/antmicro/myra/Kconfig.soc @@ -0,0 +1,18 @@ +# Copyright (c) 2024 Antmicro +# SPDX-License-Identifier: Apache-2.0 + +# The Myra is technically a SiP (System-in-Package) that consists of +# the STM32G491REI6 MCU and additional components like FRAM. So for +# Antmicro Myra SiP Baseboard the STM32G491XX SoC is to be indicated as +# the build target, but since the Myra SiP is what a user can actually +# see on a board, using only STM32G491XX in the Zephyr build +# infrastructure might be confusing. That's why in the top level of SoC +# definitions (for user-configurable options in Kconfig, for example) +# the Myra term is used and STM32G491XX underneath. +config SOC_MYRA + bool + help + Antmicro Myra System-in-Package + +config SOC + default "myra" if SOC_MYRA diff --git a/soc/antmicro/myra/soc.yml b/soc/antmicro/myra/soc.yml new file mode 100644 index 00000000000..a36bf71cc87 --- /dev/null +++ b/soc/antmicro/myra/soc.yml @@ -0,0 +1,2 @@ +socs: + - name: myra