From b2b7a468eadde911ed9e3561c337c394086d5a99 Mon Sep 17 00:00:00 2001 From: Ayush Singh Date: Tue, 1 Apr 2025 23:47:05 +0530 Subject: [PATCH] boards: beagle: Add PocketBeagle 2 M4 support Add initial support for the PocketBeagle 2 MCU domain Cortex-M4F core. This only adds support for A0 revision (i.e. the version with AM6232). PocketBeagle 2: https://www.beagleboard.org/boards/pocketbeagle-2 Signed-off-by: Ayush Singh --- .../pocketbeagle_2/Kconfig.pocketbeagle_2 | 8 ++ boards/beagle/pocketbeagle_2/board.cmake | 10 ++ boards/beagle/pocketbeagle_2/board.yml | 12 ++ .../doc/img/pocketbeagle_2.webp | Bin 0 -> 26912 bytes boards/beagle/pocketbeagle_2/doc/index.rst | 121 ++++++++++++++++++ .../pocketbeagle_2_am6232_m4-pinctrl.dtsi | 17 +++ .../pocketbeagle_2_am6232_m4.dts | 61 +++++++++ .../pocketbeagle_2_am6232_m4.yaml | 10 ++ .../pocketbeagle_2_am6232_m4_defconfig | 18 +++ boards/beagle/pocketbeagle_2/revision.cmake | 10 ++ .../beagle/pocketbeagle_2/support/openocd.cfg | 7 + 11 files changed, 274 insertions(+) create mode 100644 boards/beagle/pocketbeagle_2/Kconfig.pocketbeagle_2 create mode 100644 boards/beagle/pocketbeagle_2/board.cmake create mode 100644 boards/beagle/pocketbeagle_2/board.yml create mode 100644 boards/beagle/pocketbeagle_2/doc/img/pocketbeagle_2.webp create mode 100644 boards/beagle/pocketbeagle_2/doc/index.rst create mode 100644 boards/beagle/pocketbeagle_2/pocketbeagle_2_am6232_m4-pinctrl.dtsi create mode 100644 boards/beagle/pocketbeagle_2/pocketbeagle_2_am6232_m4.dts create mode 100644 boards/beagle/pocketbeagle_2/pocketbeagle_2_am6232_m4.yaml create mode 100644 boards/beagle/pocketbeagle_2/pocketbeagle_2_am6232_m4_defconfig create mode 100644 boards/beagle/pocketbeagle_2/revision.cmake create mode 100644 boards/beagle/pocketbeagle_2/support/openocd.cfg diff --git a/boards/beagle/pocketbeagle_2/Kconfig.pocketbeagle_2 b/boards/beagle/pocketbeagle_2/Kconfig.pocketbeagle_2 new file mode 100644 index 00000000000..b154f4e2e4e --- /dev/null +++ b/boards/beagle/pocketbeagle_2/Kconfig.pocketbeagle_2 @@ -0,0 +1,8 @@ +# BeagleBoard.org PocketBeagle 2 +# +# Copyright (c) 2025 Ayush Singh, BeagleBoard.org Foundation +# +# SPDX-License-Identifier: Apache-2.0 + +config BOARD_POCKETBEAGLE_2 + select SOC_AM6232_M4 if BOARD_POCKETBEAGLE_2_AM6232_M4 diff --git a/boards/beagle/pocketbeagle_2/board.cmake b/boards/beagle/pocketbeagle_2/board.cmake new file mode 100644 index 00000000000..d1f7b9aff41 --- /dev/null +++ b/boards/beagle/pocketbeagle_2/board.cmake @@ -0,0 +1,10 @@ +# BeagleBoard.org PocketBeagle 2 +# +# Copyright (c) 2025 Ayush Singh, BeagleBoard.org Foundation +# +# SPDX-License-Identifier: Apache-2.0 + +if(CONFIG_SOC_AM6232_M4) + board_runner_args(openocd "--no-init" "--no-halt" "--no-targets" "--gdb-client-port=3339") + include(${ZEPHYR_BASE}/boards/common/openocd.board.cmake) +endif() diff --git a/boards/beagle/pocketbeagle_2/board.yml b/boards/beagle/pocketbeagle_2/board.yml new file mode 100644 index 00000000000..03f54cde3bb --- /dev/null +++ b/boards/beagle/pocketbeagle_2/board.yml @@ -0,0 +1,12 @@ +board: + name: pocketbeagle_2 + full_name: PocketBeagle 2 + vendor: beagle + socs: + - name: am6232 + revision: + format: custom + exact: true + default: "A0" + revisions: + - name: "A0" diff --git a/boards/beagle/pocketbeagle_2/doc/img/pocketbeagle_2.webp b/boards/beagle/pocketbeagle_2/doc/img/pocketbeagle_2.webp new file mode 100644 index 0000000000000000000000000000000000000000..34ecf2d1e0004f6811eadc40cde2e682f869a19f GIT binary patch literal 26912 zcmV($K;yqsNk&E(X#fCMMM6+kP&gnAX#fE5RRNs=Dp&$i0X~sFnMtLiC90{}N|8_! z31@EC=2iGQ33*KFq}c@S#Ap1y-EPzVFL)ZMcy;nVD7_8md;J%yFE9`99)&;b`pxqV z{NMeLthfCyRo;Lf+Wjv*Qh&bsjCsv^#ea*SKkNUJ{|V&p!+-97!TSV$PyGY^m-k=Y z@AAJJ-(T6ctbeBe+y2AY7uY|k|IPmu`_KN1->2d~>i?GYBlLgopZGt?`~d$i{$ujR{k)YnW7atTxc){pp$b#ZkCVJC zLpEKZ5K!F`P5Y9`FRocP`qpUsr*t-1?M34lGQJ^wpf7LQ1dF(($c|s;i&BFw z3npKe6Gt2F7QVccD@YD%I7^43qkS2JgtW%%lVx6ri8TcBm6Jfz#UKWDoY?mNSwl*4CQP|B$Y zhu`Wj_ZUHzhI391-8yD29s|a^sB_8hWr@@Sf3l*g$**93cDHwUpZ5xYsYp>UWsuk9 zl1W=!rHTTW33do$3mpBt-d%OONEl(yd*xm%7WuMPN~QtbovYjKnJZ!iGQ# zxs*{LpI`BRdu_#v!JqoR_B5guMjiS#vg=6m(c-iqOIvh*N*+G#GCXs;53b^D9AFG? zSo&Cj&s!5Z3-Lcha8eMX26X0}CGYwy7O9$91WY$Elu@kZXcf|XSGq!Ep0V`EDD~~{ zY^goi*Z6=hbgCC_w(DKXbgDuuv1hy(mmk$VF={?Bhd5y>T>Ly9ZVE92Z&mA^R&kt* zBe&pCMxvQp;BjOw0rwyY#Nu%#z2|L3S&lw9J`uecf2uH`9rEpr3ze2PVQJi73_R{i zSTRF4-Ov~NDTrx77;_p=~5 zB9(o0d0NC`yTr;B8X6^G7mj{p>!BQ8*}!rV{r&rLauAv=StHt6HeyJ|cO>`9NzKoVORK>|Ait`tE zzp)3~IC7wxv^o2*{|>A1?3aJ&BxAbjge{fP2)1}VaVn4%M`@LSTllln}r)xXw zh7khkKl~TLCGe4h{W&YFtSEdwSM5MnAe!Uv-)fK6_RV_yWQ-8uDKXs{Ol*Y9eJ4j+%Bw)ir2}e z%}z*cNKynK=k6mFUrmi&AW}(pHR%oUB64Ca%n)#?D~inHobsC+F!iX0T{bP$$^;as z@02z`_l=p{BoQYdrr^~^rbw->2J2=URyTe_9K<^q4+GB}w;t^xbh12sy93MLcA-y5 zFD=pJ@83f+jP#Gdt+fz#GbfY;YSLdGdu?~agCb3T=WibxllCUaTQUw=eXhdv0!*-(!0Bg{g1z+c{76QTdAZxPg4+;|iHDFgGGIOj(k zEN5&k9k}SUzBX2%|8fc+&N>dibwiAp_kmI_#96c=6>pa6WaN{6T$}p;9rc#6ue*}P z8CKuW!!9bSA1etkZ-g&Ik7St}dhV`i*| ze{saif#nHW=MMz~^NXw+Z#j4#g|@S~_JuB5sr>8$K;v7Xu(Qtr`^>wPk2|og8+N}( zeSBxfu9Frg8;uX9erRh?2?M6&kMc{z)A zVT){DS@`oc+^L~9MIEifoy_g@It^UkFa%{OH9sEvK?S=-cYA%<8F2_^!_1eeFC-{; z+<9Tn@?}vAS%RM6Xs!ePONvpRUfixe2FC}oXc}wJByG&QUD&mpPqS;GHou=@Nlzc3 z*}SIB4d#}#OgY~r_@cM}u8eu!xOb>QI`?x4h*TJBK{}lX_Z`^i7z;p7iidLxb;fwZ zYEkZbc0MjiY`C{@0Wr_rduQ%RUzd{5El9Cxl#2K-`|gYyRGM9lw=3GY@!Vc>Kj>t> zl$vjvE=5dFXSA$cTcO0N4}9Sq-YIr0O#yvGeJ(y)$dSYbWtO6eqERT6N+JLN{`>YHiNSy^NEc`aKmY;(k2ze8MGTeMdoC~k7j4of7HqE| z?(JmjJyc$FXAQTxi$P!F&o<>C6K#<-HR^W0X{88scZ_zr2P*j|j;NHPtlgxHof&u- ztdUbN^_Y!bn_?$r!rJAfF2>d|>bpX+rduAQO3X&r6>U?N%9{1>A^*Vwj2io}$Tjcz zfm%vp=H*Htb`3z-x5t6Z1Y@6Dd7P1TV|)zeo8#&fg2?a+x_I9Uov|1?3|qwxa{D){ z2>kH#_f(fS>f&}oW~A7=3SmRKUwzOUSGg&rO5cBp}xzO`2A&#x@Xru z_M0Ku_~jjzI2@2i?mQ4iFeg_|*X7}sIMJ_ckhbvOy`9=z>+(%C2umf*j)EmY*_`W z0c_-`@nD^r!=$xH>qC!I(kNlDBeT;32}|odARj27766$-x}4D+a9i(>`%e zkTF23Y!8O=OHvaYN@L!{8)6ilNYd*^%*_3${cOfSfst&}9xgYY(7wBeU@ z3HvP=QqiDI;m%SRe`>MxsF{a;y*}&`=#PLA5?rS%?N<^PFg~nh_>Y~7N+*tmM7tfT zyXt*hpwO+*2}j{~!R)ky?Q%f>mV}~FrjFB4kgbAOF%@`K%Y%h#u~6vIZ2`pHB&FQp zEFL!0x_Kf=UQ^!72&pU0_4M#dlv8^H;mgV9U)8=vBEV;U7eYse4k^fV||Rj z$44HnrAg)$z44IL?t#)}+u+=z3fPZz{wvuKfekK2%k1Dh7HX}+@jp7&#?J^+U>Ke? zZ_!1!IL>Q=oQ-2M>6QyJx%2kJp#OyV`>ig~ZgC~~&}*3(y4nVlih0iK?(5-SZS+fu z$AM&XNpzZxujCZ1$MQzhtNGN8xZ(;wEmJliwL2crT+Y{V%g6!%P!s|ZzN?oD+zhlS z3`lY7D{yUfW(|wibZfR}w*=htGI4(`_IufJb>+d%g939lom8c4F!9>F-}peiJtJ}!DH-?I2%<<)cS$S*);{k|16lZ<4KO->JdAR={Tc0Wa%aWKZ^7lb z1~ojyXgvwe1u<$$_?a@iojxV7<&bDVmBX}a=0CxIrUzyftT|fSS=Ouy&#C2)dt5o1 z=-;uwf=QC^+M$SFz1&`HAa^$ni&^Yp?39RJ@j%Fjm0h3d2X^(8ol^ph_FKFXyDYjT5V4~(>-p~>jt<(Y26DVA=exU6vs5A!O2UYI1|03|Y zB5-;|Fmy4v;5f^zLXjC77hdB;(w+3p_wt;>kd{9!V@>Ud&lmxZE*@7j2bJKCnN5YC zH6VcRUV)LWsY^r?x3&A_PX8|m%{Wm8@c?I0RWeGW+5dQ8VUm^rxz**{s&>*>c5d6L<&_06b z%S)Co+fmGSI8ZeTuR}y1<>x+)d9(RIh`p^b_WE##fj;~H@{wfxt&6a%~ueFGrFcLRGASf$W*qDdRY|V zt}4m0mHJ5nxS!Lrt49zlg}K7w*8!l=_tqNKsu$oFMIup5>HJvxTRcM^)v|wc z3Hs%3Gl752p*0gt!q^ACa^tp%;gRT%^ikP|S+zs+fV?Qit$A6+Ha&75?w1JYnGA6j z{79luD5clKF&sHKD7#6pCII=j>KyLSPYzdiz+e9BaHL=i?MuKo-<|3fx_tZFeFgMd zc()$>_SAY)=}R1@-ksBc3>~TWLVRk_WMju!^-;^VMz{e4_w+HVWspZed;33^ewY1g`=m z8T?#({q|hvZ-$+5Q zHiXqR?RB0FdgVc}_;unc3=bR$2Jhwn5EVhZdw?X?s(7Rb&Ws!~_XtV%F1n&x# zMS>RroF(I}gE@R}#j#(8ym9=ncLAk_1PoZtw@i*n@Lsa4D@VHl%`beyw}Ix zmRH|1vgfw|pO~f?R;pdiPheX(c8t|3!94_I(ab`Ojlv}^>yhP@VkEF#8Dx38A7BhJ9<&w7gF>j#>fh~y_DHRe8uWtrYw3XH-&|3ney%Wu7v+kw7fIbEA-I)j?xOgK|=Pa}$1^Zp$R0 zjlmlqvosjSRbIn?WRj1cGuana@@IOOxMe|T=*s;pZbe#Ux&6MpcKCInkyC;KBGb5M zA6C7^wFCmh*-KU~ftF=II(!H{k&EpXVQ&ko8t_y3J%ACJdWD6gd3^yU#PvbdfC^R9%u0~v>hVNzUoZ(s(zugM2B}88Z35&40OuC^Na4ht;BpfC3g+QY6u4+^`1=>qG?* z=jMv7QFU7$US=>;0QxpxrZKK2geG&c(B&-uowxuu4;#~gp@YD(*6tm*sDNq0+v8Y; zA9i5lp6E$I6kc-@HW9u%vxfy!HCv54ks$l)L5(nG8-rsXcV^ucawovt5a&n(V?W(H zN{3)J#@Ez~hm`Wm~I&>A%G#R@4U@;kkvE$v~(mHMe5L7;TP-Q`7mI#&fR znrPE8B6aFQxIt7~eRTo^B+@*gjY)0L^ZOtY$z0YwyykEH90v34>^D5ZJ+2PI>gl8& z_ou}#JTQ)eSwQXZHQJkbR&1iFQ~$|K)9lk(QUZk|5Gbd8g9|myWF6i~SUu^4=8|(> zTha@;L{8i7Wc|)pNL{SVX%HHVML(>+c?!+Wi*UNBJ00MsWd`{kPz-kcLO!PxK5aGv z)HV(^4(H*|nX+qu=_iQ%ZC8X9eF3xA<2Lqlt%8};mJE0L;L*fkK9KhubcuP9CAdW5B1LKt((YkXk1GPM;^rj5NUQt`rv5UwCq4cuUW_ zqdBl+gkU`~zsj(4usW3blhKY~VOq)Vc}-VH| zB3Ah>;A8TIg)!R;M}hGN@*~gY&)}MM&Z!0CQQdeK0MWq?-JdZ1J~{LfU2B`Xc-w?q5U7aQH&Fc*2lx~Vz~1vM2U3R}o5xpVqYK-0d zNuwJ%hLnLh{0&t6-M^=HJld{Z9LSjbL3JPJ?- zFcm7XIYqL6cffgpkfO}3qj4xHqR+ZpaEJRFCVX(S8l>kw1}Dq#(k-wLmCWmncPK_5 zEH4-_;_W|DQQ0YU$^lV?7)%UEJX)&3Il1DUne^NJc95oIObHcsK0|CDp zY>Ii0aYykRCk0*jOB)nu#34RTK0ohs?**L<`im_ut zo#0h`RsUoDk#sc~G0|tDF2$7i*XY00!9eoyJK55IVZV=8hGMfSNowLYc8C+M<7pA= zk(aQ&6;3TUO)**bAcC*)T5r1#j^@>mC~x??RTWI!zd}pKdpM`QY5G>KhHH!nEr{Kr*htFBVNXK&r4CN@CO;ArHcHDwn7YS1ibkJM=0*M95$CMXB<&Kw9e z>b&`SYYqgAM9KH&{JFM%JRMt4KV0}LQ9SMWXVGSu=g^=(%+$JBsu$osl2_OIY6TXwbc^ zvuLoE8)wa-8TegJ!@Cyd`uN{Yu8`M6#ngnGVXZPB$||(vngT0Nd>^D)I+v%kOx^W{ ztZ7QKb|&E^C6iFtkDI6EX7y1BXTryJcmFQ~BnuQcW)~_gT?Pe+ zh?PVgHB+wXpQUPXak769{b7j}T#kj82mFnDrOHmZO zEnD0djTf#r;oL28=vOWj?%!f~6EU}YIBFQiZbr0J??h5ySmqxqKz*id0EowjfL<-` z^YOuuw~e9;`AZAI)?|6?(Gb^c(Q)g7N9D4?Wn@+UBAtJ?Am_)!_Gp&d{y?W0p%iOw zny3QFk1Lq&vz|qX8=r3mm1(NXI_)?tAt|YMuI{D^7d2J1R1cawB?*zg=-kU&xNbI} zBHuS*ngD&xyyW+_#Id=hC|CC^;+korTjIZXa83<(ozSXLSP|+KIuwR$irFTx_`rIx zMHl{m2@}4JB38n}=H^XMyiwNa@do74R>%AK>yHTuj~HL4d;9U&z}))0z&vZUWI8yi zJ=2hy$s9K-SN??ja50=gB6yEu`tsx~sd~@T8)>+}1~_u)dV>BRq8EVpggbN3a_FJM@vw53%*T}@W#(_-dN$vd78nqoQ?xpEcJmno62M)`2d ze7f{OjM+YfdM1)J(1TWB`1#!kuS+th>KTUfo><3{EogYE6#YADhs+Cz#s+e1v z?mhm2%w6|oHT?wmkGR!itia%Oa8Tq;wWQ=)OTYve0t=_D(BVDNbW|DI56RrJI< zQp{2ZFF{;31_J(#?dbRetR|^oflPn?2rth+Mk@g~iJ{>2nd!9ojqu3zENf;g`QajC27UH~+o3cjY< zGI&0brxPf%bp1mI|Fwnr?2GFJ_$}&Mj6uP8NWYbE{;QNDa}cZv<#7L*nr!V?yJ%R3 zU~kzSyWulm(!;*d^rk(v(`=0#GC|Hbc{3KOVg`W@bok<-o^jUGrWd_1Hr)) z7pVM^+lE{68XDf(PeVEr6$k=^xMPGt)i`eB+qarJRd|O_O!`ShV=O-3o7~^`(2_6h z6<+(7@kk1nhhP!AvGDGC16xlHC&=cLR+)N!Zk-nEN!t@{uy zDMkKYy4XbEIc=z*LM9ipVxu(w%+@Xqd7j}9(z%g}zb1(!xTWkv2Mk?z0-(m>!P?aZ zQv)e>mwf9i_v%c63aR7)oYXy3!hHV#@c`udZNvy50Goaiwg{};Puo?036Ltg5*?Fa zKztMyN6jL}A2pmM3gcz3U7>30#~WzihlYSNi%R2#KUMJelft9-R&u{y+C|+nsMZ!4 zGSHlwpiXK(x?G0L2-63Qj41$^2Uo*5mAi1pX4!K7E>Z)x(&I4{tIlr{B@uL2bb=A< zA6OJ`NOJ2au|=mch3jEXd@21;DbyBWtgg?&-umftEIft)--jlbwa7lyP|NjRB#!ayUMz^RY+r5)8>r9Iy*VA~q zgy+vn&#mqs8}*U*dKKO+RP_2d?RsOH(N&o}pRu7WcJp#eVEqEW)&CIMUM@EVvywa?s-JMHEo{$1T$OgnFKG`^8dyC5@fO z!xL5pQ$R3PPFyCZY?EYLr~sgNRX4Ayc!eJ&-R)@swaOd;vr5gVBM(VDTNEBx%a|IJ6gPeu$ z1ji14NJt4d8wDMb?pr)nx6!A=?%Hb9dwt_X@w?`lP%ej(8sD@=T&}qqdLA}Myx`CZ z8CWe+#1oYHYFDNevF#5W7sRZ^eGCKQA`wnX7Y;cIXHaVC?1^z)SS^!6QB5(tOTC!Q8o7=Q_53*f668@KCsIy42i zajc(3f~@FP6hw;y5~Shnd;nE3JEm4?r|LBz#Z~d~+X+B)!e1#IDobe{wK~@EgDj={ zUhKd>92=X(zH4IQ)fe^$7U^Y+4qo;ClG7&iUvCX{`oAX#SuuOi@S_?ezFeIBWb7D- zuSBtp>E;>8L>YXq0#E6#!29*`Jygqmmb+AzmKo+{+~dZQ4CTaauz%6*I{V>*QrcI- zLahnU0~&00W5M0eFQCuk&G^um$xRgbXcRpw@lu;RX$E)+r$`Xb>~)ABz4u`&n;2$W zrqP%Ux%3WKWu65*Pja@#D91m_wl?%_cb^7wEE$_5PAO-+$DsTRwu)}n%kTo)e|vOq z*F#WR+yV4`5;^mh#mH1Z%7fT&dYlgmRXk8Vt+3gmof0LOHLIJdYf~o9(X(Sfs6z#7 zP!Yp6zVS{IB@E}4f0*vidP!^3c)w(4UiMIpwbW^t9i?1LDL+-<`4MwYZzJ@bZDK|8 znd>fb7#u>0EasWImC2)8Md>ZHtVLZZu&JI59sWhHwU4F12u|ii3Ei67oc%N~_QCYu zY@Sv`j0wOqNZx)u@$~ob5INtj?QYDL^{IXJHqSY!qYVPk;8%ci4i;Dhxz=2WmmmUj znlJP7G9(Ox(lnN0i=@SXTqeGFc#WJ9X~VIam7qO9=vsnP*F~=Z>A+UkfvbVGxtY^h z0mKKOp;?;rDFvSaE#jh7wWGeGLrYP9XEm5AjD%4tpdnFND&s`rDs>IPrPxOm$BU4f zwM5!8kA2UeVl4`UyD`)1BjpC@Mdpsf{FZu@-Zn*9b~sB8;t+0%&iO`UHiL+W<9Ft{ z4=RgNX|3sA;l3JV%^g(SMnt$Qc042%82_b7@}HXsvEiM?3B8*RsR1b-CqamPBGSJqpTF!+*MmEUB1Da3Hj+naW51z#@f79^hy!5Eeh*>H*u@ zOd%d)L&pLT`+cZ|MXt0yJx3ofh#$`Koqzb8>7-Z34tM1ZORY>rP$=Qwd$LPnQ}I{Q zD_i~Z+ZM&%Q_qS?`IK%#63DLxd>&0#I2Ebsl&<9sNTND?P%9W{rJ=Wrl_y2(@>Z@6}( zZAsd>_FB8@Xprs7S~C(>%^q;b92YQ6>jVqSC^8SUbSvtC3T6N$ZE5h6l=4^=Rj%b< zltDCy))9ImnHGUK!aEMSv8qgib)3t0kC`7mWU^ zOTP*V{YOpZwo(lQ`~i^bmcGk)$6^>&7X!Ikb#Zx)Hh461NdQSEBou;V3D%0qBmX_c zMi^EM;w)N=lg{NFDZhR*AH<_u(!0KJ>V*!UpOlDiiSvq@*1_*3mfRft-ac|5DgnNu z;QjL*l2B$3W2!2K+PC}!3VKbE^E5a;P~h7i9YoiM3%Bw&RdbPV7U6;HCX(ycWQLVj zbb%I`--p)hl!-7Pp#?s{k=B0a|0iPDTfKr{r%?uwb#Y7P(a~ZV5Y66+yyODOJx1S} z`cT9T{lF@&lkG#l@+A@sKKn?D-R|l9$2KvnTZ%Tc*w7F5dopMOd{!_fHV?9@70ZhX zS-*(q{K694bGP-@4h7b<01(rC)|Ou-wP7GIOC7qTRgPND`7@;KJX2Z>Ec{3Ivtob3`}awh}bi8|++%XliA z`R1XwPxgh(Z_#YO<=rmJdAN)g0r5|}INC-Sz%_^bcM7L0)(sGD@;N0AcHf}5k*lJ~ zaeW?_b9DkON(1Qn==-}Dh$8lIt)M_!o97IgxJgZ&y1MQ?t@t5L@6DQh! z^vW)T_A<P_2})HOZijQpfIkYEm@ z!{Fe4d}O6F&L9gMoNR^@r+HmGfXesoDXs;1W+nU2I402Q6K;7U?mbtBb2*3Ff>P;a zy4<~R<&u9Ol(;nO+$dZ5vKA*b63CRe(t#};){$y=|GkZbbWzQ^AET!Z5`+`{O@Ml1 zF>(7GIQpG=ANc;>k-3bg_x_)=qnLm&M*WA1desoW!vFTCjK#aP1+eDKPOU@|x*VIG zYeUBGc9~=|!gh0&fk+j?CFd6VP`te?(HbhNWVSUw97DHv>Z$?&b+51*#w3|srl~Zs zduONA#EFcks?LKgRACZSbEd&>_)pVF9FFYeolz#&?SCqza_8NUxxG{`%oy+UnK4R6 zjDtqWHUWrwisYH#rnb7n7loM+n)nR*6gRBX0_U$tb+f%O>I4^~4l@ZVrrsA>J5e?x zN3A-fl|1gFT$-%$={NvDv<2DA07qMxlLr!*9%RF2ZH;Nc5RiE5;6cT#KfZl*V2V~f z(tF0=6|x_JV%k$+ZfsAzb}VU7dqQKQ@?gF0fCI-KUw89_xLsp>7PEj|iT=A3y3m(r z*Yjmj!H`JCi1T&UUYcHn3=2Y6s8^eK-iUXgD#_4$z;!VO>hR8TK3s4uJNKgc z>jG4&h|`+kH^Nn$q57veFg4E?@_VQ6e!VHay4!n6JgzSG<%EB2aBuk73oU-nP_1z$ z`gI6)Ut<{Lpq{^5(-=%GF*FEN{<2>?K89Iv2eCBTbJb)57@18c0L9g{zNr3AT}%bL(;n4R#*8rgTdduVEeJua2t7(O-*tH+vtmN z4X$kY-{P<<=J#OKNq(L5B04*d17Wx-oP&{oa`<>)|Fb- zh(F{T>{H2_Dt2fqsB*rxNRz3ZL8K)b`d|@vFO!@il zfFE&8P;@kQaf08-hJXlUP%2F5?w&RS(Q4^_A^5KmO+|J=O(o<_lF~@?i;N*%uk36* zIue%NgBthiOy(9vh&>#PJ44mS6=Sn1me# z;pcTM6lAdZ^MHKY?P-cgalUst$42T!(G*7R<%bTz13epax^s?)?86T*$F0Ry;T@HL zBHF%U_WTO0RL#1KI*I7xS8QSt`$|^Ri;!aoQ_F0(6ZuOrX39Ja7$V*R-QkJ^@j;8g zU$(B$WJZVy3GC!}y&}Owiiz7D((M&47(gD*oW1`*74|XkFzE6GQ;=u#fnWpMNFjVjEf4%Z6VUt#n~Fo5EQy!n6+vR~PApNsqeh*?;*=W@8ip!@UBP zPSX4LMlMF_>Ah|QRSPxFsz$;2l=a-mbOS5g-IzSpR{=vHKsCn^6LG4N&ycLD0gypA zIHhyXi88gfH@e@U4h|H$k=a^c{#|W7Y8fET=wTDjow- zQ~R}B0zf(X7Ka)CM>Yyk<%I{hTRk6p1XuI#`$9xI{=iJkmOK#SL#8|2pc#{mgQ$T5 zmx`q8BPKVn*klVfS(aNUce%y|oS~f4*({+bL|IG)_+j2U(@aryf9^O!T`5|_{;bDE zhc<}pyeoFh)87SHdIl26gG0aGGdCTYyI{u#z|G5^JMS1h4P`!od!}gFAAI~fKr2F) zI_r&C1bbqAE2{nAk58mYNFHwdX@MD~w4q2^ChBrQ2!P6typpGjm1r)_DFS~3Wc#D3 zSsHpoll4aVl>REBFwkC3A}aM$z!S9YKA=P1AACo$%AvNmF-s{F5Q-52%8PFV0tv8p z$K4qfo>pMEpc#L-FeM5<%EwK%=S@UMFo!?}0`mFj#0P)%BLOFqfpPSn01HpF{B0}$ z=#)-1>5&@#P!SOKNOp9byTg)WDPHP1PIPV{j3Na&7H{?PITr*$>j2A>7Q9(Owr+$L zd6xZdZLImaqQ^dD;;v?8fL`XdbD@JnmCjzOJY#%?uHJ61QBi)q!1i+&x@jYrqy5Cf-8G`m86vz?T@ADB zzte;RN|Ja|qSP>VMG#1g(p$>7Pf#OTZ2clA0tiey@Xaj-Fc0`2w?LRDw z(|cm^zgW{+2-#{A8SqIIvPHU6P{20=D#8RV5Vbpp4Vj)OdV`gtA|DppfebyrM*;7d z#7j{`;;+Cw5iRNc!K5$YvmFsZE@7BQQIXD37rN(bE#{!hz(3BRB&eNVc?a2Xh6QH` zonZ7M8L#6%m5BR{O4B-2^wOo!jkryTmEITdn??=Lhezg|mDVMlIn3W*g>%RAGM?-H zHUF{~yy+D?Z19P~oMgFn-p$qeR%gZJ=lHtZ=`i(5@G~#N$`P-tY6|m&+3BrR8mM%$ z9qyyBYBU=ib~)X99I&QhBI~;M0843zm#V}xxcW?e5c>7M;5{>ss}coJ@y9C*DTip%h^9Jv!A6Yu9lYb>7B-cJ&+omCDZUSD9A7DiJ$s# zyL@k)goLe479)Zc+MgBN(g}e*neAQji%nHZp;~GG^=iVdt2h;WFbzRMV)&AE!$K84 z?Am_HIIOx?{oYel-=lsnRs{|mi(5TV_UYGjm98Lv)2HeMIl<}|z;PTPetW5gFLO&8&X9!-p^1Qd!svM>8LsSF#zspW^wmq!V}fXA_)mUxJ?7Y4RG9);+w zfPYl|rguTu?MV6GU01~i*b8zFH#(K_fMU(l5;+jNSC;nYU6+gR2e2Ra?^8XlZ0nx6#8G~yLgTiJs9)QPxlr44%?S*?GzUIOMwIios9JbhCIN82!?q5^M5s0r4yZq2yE=Rfatv{n1g|-gZnUV z?MKfDQc!qJ8v&w^$s0Y@YfBa|U?GnlwqwBeSqlr!8{#Oqw}dJ}k0W8qn}W0GTXpwU zCrtR})C(%Me7XV*iX4>}Zv)C-68IYo{17U@(XzWs7WW(U!RV{Zba9Anw(}qc)1t6c$M{^R=r<^yU>e)6| zSA~Ta>D)19=v+Eip1VRbi?DP?K!lBOR3}0FdoAgd-mYi0va=xfmHAt3eC$E|NwtSx zU4QFkX>=b(C?tDFd(K&4&APlXp=wlT{?}*6m4s8Dla-T5B7oiL$xz3f%H;??9KU}& zj*!9y61y9<^og9Kx)@Q0T^1*=$dW5mdw;p5 z9Q*z$*SK2djPyjRJGaXz<{=sy8%{ktP%W2->XaNzBg(iX@~U2x!)NN~W<;)uzG1ltKmbvZpjRn7*4KQ9 z;?ZnzaOTbc}b=Jy?P>Y+V@8*Nhdd_vF3G9m(*NzY3;mLT~ zU?(OaWPSGkkFTN~t5!7;u>cy-7zHxWd;gvkHMObVjTWpanh96zC+RQ@0qF~mg<)4Q zML)m(8Uj5(Qn|h&V$yWzF)Li`-6`*0zY|UOdK<+d@xj(iV8Pt$$ z+mzvnJ|f`fCJ1QI#|xV)DOd#8ajclGs}a4FCU=Q6O-0EN=3JpT$SphFGl8t?f5|}v? zCDh_DLzel3Zf&N94@3+5%ZQAiEcap7g_T$0*zSALqeD$H7SZC{-f2nKVs_?N6#lZ-Y6mo_?DyyzsqD{%{N9U{WJ62a^uI}VIiMDh z2%qjG^^>IQ+MA>123M`oQ9*$Xv+Pd`uVvM<}eM0mK4kn^l zC83xJh!CiE(=f*Z`~?OB9?Vf_7;er5npvT2z_9Xi{J!ujWQ5<3>TuF+k!bWO!Y=RC zflt4B35QQv?HZmSj6&_P%KL%aoiI;+AHz zR4P62U+@1#JZW)O8LSv1(}mk_OoOk>3rl>!pGDjaVc_oH^ zzj3wp9Lf*!nwxt=6EDYa_xiF()20I6a=|GaT2y0s`aixd!D|dgRQAFqmyjGeF*MUfKO}z;hRqF?H;cztslu#rYCkgQ0Ra&=F zur9iDD?6*GYQv}!8=3R-iJ{Ji+A|*FdjWA$Cge<4pkQ{>Nym*HTz;XO4#-y?SND{` zyOUs5e0o;oxomf*;s2hEL&hIZTZw?Rp9BNAiqB9%mAi)9Gyfw;zbd@P(4vlrY&k+d zn8m?`s5QH*zWe{gxo92*;YUpUIo>hyO%$edl2Q$%2< z7N_wm+#m}=2JunhD^q&#e)?U#pvh`~gZ>szVlO_4ICaE6iu^n&4TutQNYo9s0%X9f zRVg7+wc?&N<7}K05zl{+xiXvU91o|)AiY|D*E@LU57tk$bu?P~p14{>4?c^m?-f8W+@N(u*kjOM?U+^#{I5p_}54y#p`wUDgqGYKlsu@*}0`XZF^h~API-Hs)0$!kX zpl`LMG3=gD2i&DONcQ=J|GFT2@x*&FH(|5xFF9mXEiLOJha({$HHh*7H*L8e;N9;c zogrRP3*_%WJh4}EbYb&-^RUq%iuw}pH=uOpq(WvPt9R|6@+^y>>|z-Ai?FS$6>QETGbrDxn)&U}gf&&G-6>5dP+M3=7}~{>dKqrXj?$3W(jBp_B|$ zil5D>I~Zf%?zZvo)j}-S>Q2uD_8w;Tj`&~MGrc6fljgRneQG!5g6T)-GEJtW9X<1o zS5@r1us4FO1H%rJ;XyTo97>4&>VAHQxgD4p8%slH7SxhKn~-+rx$yB(jE_{Wy96BS zrLh*#;O*kJl2x08n9dDu_|0IH2Na_pFVX0j4DF+btG=JF+KIGUQhyD?HVOE&2s4bS z0f7m5v6B(ZUIACbJevp|$jtglnX~Pf2c+mA#vPeVUq>tIk7|t(8xMc559o)aOAAI) z*>qddDp5pb*hXz`PYmJLgQneRLMU3Eu;cT^4Au9A+j%E|q$uxod>AJySp|OrT`h4e z{gsCT-DwY1$SSWmXe6Vj>j0xv=8=}sXKpPjI>G8VRy!_wSRK&-^`N6^lcb9oJ5T?{ zkLC|+wum&J-C@_-#?Hw?Uw+hXC=Tr67x#{}UvMkG8&9$TfwAK`DvbvW$-~M?Y=aHJ z9u+`DJ6;lbp8Yb?1O8@~ou@WoFwglQ&KTYmjCf{+@FBC^JAGqMNpKm&%IFQjs0BVu zHG%2&=1pwU$nn}osPkMRHS*k~tMR}wx1cQP(f58stNDPPu+&uZOU;feOIxbPLRkBX zO?Oa%x{D$4VwA@sMp3YjlA?`)+!C@wF=^;zytRXPcrACKN1W~5!mZTD7k-da$WkRZ zOEo0$G?1p0^bC9{b%Szcw{~2F@X!!;a{p?3J>LLmcj0>0Ojof%6Wtq25JvF{p*RC2 z@_lui@Q!xT39zuqfE3@}*IJLCoWf<4s}hYbLEmKRp#Nn0g%{9RIkh+i^g?F+kw6@7 zH7h0j?VcS4_tY9^UCbw(D%@oh^)Fr34+C2E^a)ej0(k4r!CaFfo6IeRMM$qAqKt?v zr$0T)uLxRJmJX{(CmoT1$>I|@e|>b{w~RHho~fmdw9$El4NLnJKK*2Ohf>DEH$%_f zz@E;K2;5rAaWM^6Hz{&>4Us47UM>58w9_;d}3Vkp(Z4v|)~jdP7@ zWaJgo$r~Mk^;A{-CwOKv;r!Q{by7r3nYCSG-grT8zCa zFV}O~?&z~GH&6(mG3qE;Nn#|Sey(HO9d-8w_VsWKoi0Mh()eazOVLOFDeXwRe{hs8 z`(O^G)3>?-!l7`ZWRXo4r=_PCTl7BQwQ1#8tfpvP>0xS%0OokUBOIdb@oB#@6*7Akm0Pxau20*^UJ1qxw!ixWq zXF-)Qh~t6pfMVY0$^>3s4hw(@hyVn=^g(-e;|#N}&BL#_;4-%wn-HT}Y$F29c$Tir zvYv)&b{6h2uV!a`<0VB&b=vwf89^lq4>*a{Ri(y5DRQR6e9b@A_ABf<2MPt+8GGi@@9s*I?%mRrftB<=aK4eIPBk`0;#npjH3FxZ@VQ1y|4rZ9 z^NS2pgbkSn*|a^CK=oJ4>0;|oq6gMZmX3!#zXXk5Mj71jnDrtad5sDL3B?Ga_lgd^ z226B-_+t&#=#2yU!&mmkhlgYQ_a-s{azl|)zm$oY*%=VZXLy$8=z0AfJ~rD4)(k#} z4l^&Was+Ma=3CSQxvlSrL*07EN5(BA4{5mzO)*h@l3~_Ayv(ETxs&k&Me_Fm; z)15K8hr&dRRm)BR@j^__>m?}ZO`&l4URv(c$zvrn7eHyg@obYDttuZ@@u3jn4w0mA zmcK)V=?>dtK+*a{U_(#rKx`qZtYj36fJJMv>YGf)KU;l$H|L=Jc+$Et`kzyVUsB%l zp?_cA;vpGq(9d)KLM;W-E>>XmT(j30Cpt})2kI?q)n#Q4U3us5wEMZylR&cD+!=%H zfk9}NG{#a4^Qsx!$e6aF2eW@aQ{DoFYt8b|L5$nG6)4>kPfoq6aFX8)I&DUy0x)}+ zVB$;7#E=-LCm}8fha{U-Av?R`DG9`sGa2nidA0zS=P(Q0h~rZMt`Ez&oSWb9v$JFOQ^`^~Z-~s6VMTf+?Z>GzC(3w%I(D7) z3die$7E18>EV_v$qbLodmo(b#7rS+D8g$iPhVU3BcDnV~aMR+}ux&YWsI)~4_2J0| znwu|wvUyWqpt2e5G`#jQ&SftqL^I>0?GiQbOcGOLd?OfgyJ8S%0{l1}&=Yl=8!4;F zFn%vgNDoWq@$j-VcC$9*`W8@erli|z-}_mKy@9v|LDc>U)MUrhR5tpt+mvB_;oDlC zWC0im*LjAra6*5|vyG^@xpM)B_v@Eu(j-IgpvawW1YwN<4%@cYwti0e3HktS#*P1e zk)N#FVG&4LEmZ@ZHh+Yo!7yu`Pm=w9^o;fUsh5XI<0!GIfxNy{Er zX8~G2NivHt^E;<2Wk{Q%JuhbQ0~ha3LLR$1vc1kl%87Q$r4;C*Dc`Neffr@wNx{`# zh$wO(tDY}sVe&)8q}2-qo65ec!)d!|05H20TJXkN?W#JQ`oJ_2xQr8(;^JlHLgnrf?_ER;AZCec`dUmT3CIP{M zSz(4xy!od%Tm{P*G}EVX|5AJHs^7F?J5kt#y7%_8A0G=pTmKHVDYr^#lr{0|oIjvb zKA9>p9uHOv-0!OuxDQT3rBBMLOz(uE@1ZL;?9==ZK2hsC(G`-|ZCTCIoATg;q?1H+ z4g}RU_u-|!V_)HU?Y*qbh`zSzx0lI$nh~G5XbrX)mQFo60?4FL4J}C+K;S{rMSp=c zlvec+d$6~cbaPx!5Hv=akwy3!3w<~rzc1iys%a#$I=cMSQT^#&{#dL?6LI=JCgxY( zq}MBX;|Nd9gg0mh#q^?5F{$qE4WC2K&nN@0gl`wb7+P}rYJjodrIxi({**iav25G6 ze%)1oq&A2>f>JWo$cOC}aoZXNmThJ}r=(0a0XsMZ-J3$$i2&&2qy#i@kYzZuk|0oE zs|50|Nw8XBAf=Xv{Lf+Bj5KsiM@u-nui}$PoDvs4w^9;pwB$ei7%kg5Tc%7AMxhWa z^4^iI4<^F>+s-Z~gU%!_m)#b1Rf|m;W$6-Rh}tHv*3sA2VRk*V7Fw7W$@M*sa|=^f z?V>nSMFuC>3>{|iC|siCkGEfT78c9?LNE~$Qq@vS8MT`u9nmiMhq@adpB^?xGV^?C zNHRVLMC^yM+rkYL?IfC35&n``y7GU*M+U3ONe=4!4oS;OR~dV&pLKhU4^4adL*@s! ziqMcrgjAQ&JnkEVB4Y5kFqdu4VM44Iin+nL6de}znBE3=%=^e$XD*#9+W%XPYRc+C zgKZC*Ei}s{w((MUWj+N=z~cK}2ir|@-fwv@F=#|ht272Xa}S_OD~h8XUHLT6&*g`? z+W;#ZHl*UP+77>fsjs_gY;*oE<}U~l9)oK?H?&bN$`*o+uI(8o{kc{7q|?;uVC8eV z)qXGhu)~B2E&>4IbqkXy0cxCIh~TAT`|=_AFjPYa;T*n+6H9!gupjoU zw{^!RVahtLvpjUaAVOh3G7$iG(A& zF_t2}5hmu6|9KWux^fE2^`3pel^?l7ox6))GJW2Ffe&FWU?I0cyQY$e2I+J^qWO_T zia@8p1pE}9|0D^jaJMvIZ5iR*2mF_q;xCInmxn5w?J;jQfIkZ3U#F=db9=nRHN)Cp zZ)s2Q@lEU&nH`L!z5lRf98A6|{?^GpqUi_yEpW1A6plUr9JUfER#HlwMURysif$o8 zccfe_@=8OhGXdc;w8qEI#Om*9BtJ5Mk}sY(EuPw)@1}ev#aLxtqX&BHs(DQ%DZ0m5 zf^>DE1;;-YyA6|UfNx~WFzh$1xgG~JUA2uc3ssc^Y2QZm(#hKi7Lc9q@!b&ZgPH^@8)^?$ z*lT4?apKIiG8Wu`@N4VRZA|h=a0mf#Cr#PkcymZ#FhbCACH?84UkC`WsOq7W^hQfy zwLP1L^>&lX3eWt`Lk|rhkg2;&qs^TYwi;V|6C0Xxm1Yi9W}K|C)uq~vWDcbfU)qNm zI25?WXz6z4iVKg07+zD5u$KrK6MtN#G>v`EyOglSj8%!1|4H3fy_X+RF3}C*f-$&H z3;qQGLpE`j(gDF+!nzU$^Q17^v5`c)qv{z?{>v4zULPEB4)bm#U{VqqA+gm7kbK+1 z*3~j9n7HsZTD19oE(eBCSW;0;;Q0kI@BYSl&<7jE!r()RU0(GxWtWeM*K0go2$7_OBB`u z3>e$7!ljwtvnnUm-)B)pzU8QPw~S8eTj=frDbMU3N%KLo>o+<_zwA zQHMetDusD&k8h@m_nc{EM^aFVX5`~+J%r4~QTtEsS!Xq<;{%iY?3!Jd@*9^DdAc9_ zTQY%70gxjB_N{0?HYzEv0-Bi2RAHEyvxUKWa%npYy|wj}qE8<76{sT+2P3vNCg|c# z90Gw&NSu!C|2zf1ktli=Ic)ZQ9MlX@CKms6ALfz6yTro#4%9lrqM^jrz%|Gt0202< zkAJMjutuaz0W_!$9qJ|FUGgqqm)3=#9sAVbR3|H=ov&Jmr2?F5Ei&~IEwhNrlzvnO zGUbx|1^LuV!J?dQ66Fj;H#uotqAwj%*E9vAfP1F0V4$f%IrLHxj9|vV)4U0* z=1GYy`~NgZ z$=U`WQ9MG-@!k`>EdO2$7kwEDhJgnthn@P-qtL-jWDFv6#Eezmw7j5UX=Wq_jF?Ik zcs8u0>xhJJcA~IQ98gpCvzohYfCeL}2YMb;zMN~Ks8p6X07i2oWpdOa)K)=+mzTag zOnfyvp29y2JID8vInXiAEzI-D4;UFbv#s?;uZ=tEY7K62BS?FN$&!8S%ETNb?-u}R z!;V;BxwJr%8|F;Fj7vA!%Z#{I%E8*`7p~O1Ot+$p2>I7F=zB#{F?kB$GZ|L4*TPX9 zMJ2oWwJ2l3v_dQxk9?NVr8VlpwJ;$OJmZ!)6r>Y9ymQoaV}^P~bYc>4V1seGlvxG?#xTbrQ=S|*|8eq9)|i}@a{UVTT}b_75S z$bhieo<&S{?Ezzd4fF&yZiSvjuzPXTLM+GTbcLjXA=2Rg~IFI&CUzgGBw zc^|uJN*|be@`Cc*yA8ty!mS#%KoE8Iw$2t&wq{NtL4JAWGJVR(6>NOnS+2Ae7GQU1 zbaTzg5kwX(kCS{6cfYVhf%gp%u3Rmx3$qK{4mwZD8EWptU2k`U*Tzq~<{HxQMw;L9 zXxGyH;Wyuo(dG35{o0kXj-+bYd2^l{^tXmH)fiU(=KubZ+Am_$0o;>3Hz_try3+h; zegMNJkpg*+Zas6xg}qXpF|H6RXn@Ieg~Kie(auw=uEOit0ZNm@gx>|N)-Ovd)58y} zBhFwz=>555`g&`c{8z{M63l{xDcqC>S|^;0EqEI$bOZO-eMTE9CekRVlzpu&H`lxK zCY^+_%>dy%H|mSMwM#WuohCYTi=(3%$58}-v$axVbk|N zsJ6xT9GR4$d1N&hnRRc+FBX}axs~?>ApBPq0c*9!n&GVHdQeLFU*_&-=RF^fAK|jC zYZ@e=yB&#^)U$4OZ}fqpF8dwt3Im)7vQRgK!`5A(qx6AK{VNrw1RHmL4`a;~42SZM z02on$h$E3jG?g=Z2oHTSQ+X#PiBApc6DrNQZ3`Y>v3X4$JlC$I_iABwh5I^)kp;=s zn|WnZ3qs*MM3;d`IN?T!`Mj~(X>-kE00JP87p?u3&kTWrhps#PC5fC?#GPYBmO1|* zVI+cYOtqV=bEn|>bIE{Xdf>Zt5l7H0F?+w-y^}hU>iv0Rn^9NTsuWi33tdiJSi`4i z)vMEos9>~u(SHhOBX`d+Cvjrf@vIyIJai7Babc^T;$gRs06HS3v~jio&)P;T-^(`d z;lX%^9bO%oo8J+dRh7?8OR{Kf6J}?s$N40ZHst;Zg`Mvp9s{en&_7{SH>_UQp7HqR z$Eq4GX z!UjIIOC4hn201@e3^)RX?`*p)ShafJWaYkB&ss)I6H7%QKYZnsyzk5k`nu0R;TG6~ zeN_~=f>qflY#b!F97}sr!|L>7jP#A1*LkP#B^4jN8oz27Olr#@S<^l^A zOqG;xgovn?Xo9>CK}P(qSBh5Py9e+0YeTPe1>l^8qhr5LwnF4Rz%h7*v>SzE#xS#b z(}e&9QvmYGHiR?3I@4S@Z=)4C34niwdVU6aE6FqA(|m{dZ!SZJ>GZxiA9Q@Kb)yO)PwI-OejsSC%H zado)mGlUuR{lL!nX-Y{vtpE6=nLUqV=Y*jHwJ(J(&BcJKTlN!p$YK9cY38FB>G#;q zHbC?1>fT_b8M4ib4=eZ=H{NeA$k?Ry_#}|#0}enk8*{BPLL@1;1OQ_>+qv=wDt6H# zNE+m>B1`*=V}enD4nP)`LvG{XiKV26XJeSsTYeG7LToXiOpOArK86K#?08boQpv3& zMvcp&?~BvNN@8*?X9$wIT`!rCzQ&6Ryo%*Fa?-k^14LKbKqpF6ey0mm1=<1VzE<0s zh%~ZH^A*@HL$Q+rbwPmZ&7a$}e?PdZP-DUWq||cp+^O}K+dski|MI!?i^2=szXR5C zjn;ea!NIOT-{~UsLMhDY!%a!ulwE&{7>bf_mP!8$ytfz46V9v0C)26!YB(5LhvO&? zj6*tckU?nC-FE_#i zssofqZm88Jxy%UC)jLX1_8E&oD1=FqJ4!beNu|ROd@O-^ZBr-018LHBm9;~LDvM&z zb#Q5IKWcWG83;&wvDmhS91{#%I6B!T&#aI5u$sTeKH0*jk z3Bdsjff2#_+KMbqYIG5DGOTwi3qUEM@eQcaznq%{HHzoX6$hF-%K*QYZVePH9Ov)_ z2((X{mFJ0a_bdJ)x>V#J3{VX#sAYSk>;-AZDThb&u7KA^#JtKE*Y&){Gp$IY<{qog z+e^y(U$2YNRM=(m=h(T-qvirEFZci{F@7rZVX#w8Bpx|UfJH1rdW?2-Z zD>Y>bS+V!dauE(|r-BGPfs}gK{d~KrBB&p5009H`yBf?Pa}#Hneh=RNO=DH=u;FQlTUK%qzF&1|t3KG(LF;O51Sle?PH5`#lSQ)!0Z>W35%zWF6%^ zoXuBPmZsAcxpV3bg=DY|Hd98CefvmnSVj_cuj&HdkbJ65Z^*?U@7x|h<2Htx zTa}H+K$G@x!#Vm=xo8Vpin-=#?fyW9NheR@tDl=d;yA_^5D%2m$b#l7zlqoV4B%wd zcG(}FfXW@n8nr!B0aNB*01;&LwUwTQrMhdU(kDP{>!$kevDwI{s{9l2@1r7Js_f*c z69SDB6+80n-y8DW3y#yMeGd()exyBE$oHf2&1e_p6O~mjw!smq?|{ z=76GuA&m(nrp4L`vc6^mg2()RKRR>9l3#zgegmJ9P!Dj+@4m|7P;&&cy-87e`-n$|r?fF9)UQ$EHvuA0qMBI7Ge~oJLDEb$30m!QjkoG*}qD1Mt&YLC3 zaP>EfMwLwb3)B~w+_0e244sIqg3Zhp{~@2v;C9E~hyNSF{E(BUTiW%cUh$I|ib&nf zb{i4n{ZNJc6Tp<9^FSu(2Sslcy%Qz7@^xz3geA2Y6cw()r*El*>sNMLQoTOmRIe_n zmPUK#Hh38h%dQ6E^3-W>^oKbkdtf-xQi-%lG6Fsd^z=_1e(oW;KEjNp5R^I@a8ZYV zr`hFVm&*Xagm;uBq*kV>@#e!~YCjt!X(Fs<#u}3R>8)tr9$c^rllW)%U*k}B&!Q3I zsZ*VRdFb{>T!HFO099bz}I#CY?E<*bg_wCsV9V8$L!F zE5JS|j%)`@x3hrcx59>avd$-Ywmkh@obaSP2xDj+A=K5{3IsX?BR6SktJV5b z;a_X8vs&QQqF80p1qqY(T)bIALpB@`$KYfUMG8(Shc4JG2`^@x_`$Q%vk$mMH)Z@H ziG>M_I}PC+z9~XSHApWx*ahP<&KD`r)fMFI#e|C#;m7)D{0=XiA7p(Pph^mmpCW(d zutJ&gquUKJ?qhbSnO7v>1XSdWM`Agf=bnZ_f z6~AZyb)>XEq+R$N#vFm}u)I%c!|m+^eigd$XmfVnklmo*kWj>@0r>BUMg3507-lo< zTL=S5U*|PhH1=j5+t*f7nomXJu@!mcD+E6DF>v2BDvs{@(QzPMLQkqFSuQ5z2}YHA zXjtLEc~i0IV;T-cKJIm_VRYAnF;|vsa{aI*$E1;Swk8*PJBh2mfvm8En)hye?{DZD zm$2~HyU-K~?W$Q?EOCH0#qG8Ks+@*V;Rw7sRDa{uc1Uu^yP#1z*h+##_Rcl>-Bs`s zBJ=B|G94Plj+inUmDmRinVv5$HH-r!5N+MVj@)C(#02p=BUsJwRB|2U*RsKgmE2lR zm$B6SN_z9?H^X`E2pm^y^j)+Jl^HyeD?RUC?~Pc&Jw0~Vtr^eXBEQ`?A9B>S!LKl> zFuoP~a+%W50Ojl4fQ^f8`-{|j2aD!D#`y;A)K_O>MVp)o+dlTI5)+~DUnQdw$%H14qmfo_GSg2npP~CjCjMww)(tnRfLr>sa$J8Ou|Lj@8q8 zUwEVNIP{5@;u8U7*Fz`(R^Lai3}Sr1Z^L;p3d+P{N5|OVB8Mt5Q7A*LgtWDB{a(a? z#=>+r87WYv$vZqQ{N1NbFR2lP0gekttZOen$KqNkq}LA_u&Dml_Yl{m5j(tl=R2&! zm=2+|2rSUSpRpJJA}WJ4I$8azko|v|r~fZGk0rOHzI2{SVsnl|c^gb}6deH6u4=R2 zPOxCijd42BC30@>GY#9pU84O_MB-)3Q*3n+!Gh(Bbg>be$%yr1%ZQ8piWuZbWX&4e zb0tS~RdeHRo8>-BmL!K-f}(UN(O9NmCrexu_|0~MVy5WZhq0dODL`>wU98HS_ai;$ z3!{lV2l7{VMS9@>c<0-%7-p)`wI6?*sca3^bP|WN!qV(Qo(Ki1HN*I_`z>xV_Ia;%B6vLXa5e)cYms2f zh%&j%20T9pSD87edLF02ZGt*M4&CwU-N!e?H$kQP?D@cWe96?x-EgDxv+E1=lMibAjZZCOO4)H@w7y00e0 zD^oLp_$5w3F2+$Y#`_!Bn-4H{!#MQ4Vir;nlVmfvY`PxE8R*)oN2b3KiXh+TRT_?; z=HH&N@!kRTGUPM~HFCU27oExHlLP^qo~?Qz z`#fA9OGODjSbuHnMSc2D5qU`suSN7F7%6~GRX8UZty&BIoIOXXy0->;( z-)nNq@X%@Auj!OPi45msDNSQ_V5RK^^>=^05h364_y2T0)JmSm`F&|UqAlra0|6!2 zz$Q`3ki1=JW99Z=;jLSGk>x^ECE-cgBS^lrh*j4}38*)6j!H8j86(Tzs5+1U(O^%@ z4aT}y#h_CPZPZ{(#Qjy_?VUKv!EY2BkMvSniP6N?{jRiY9H9ow1-7w$y;vaGrHe!^ zf*oElyttdK+MEsHeF&@`GV8n=K3(1O#Hu5TJ0dQ&<~H6+X%f&IDe+mRH6EbC?U1l! zPMlLAvD0%#R&Z;XFs`Yhr}}xCf6}3#s92yj3i<%&Y~su!B6Z>(u?DFc00@%uyMRwA zc3&1!2Fz3Hlm8nO`aF_<<*dqbOq7fh*#2(&ruB;MK$kL17k@D)$)A$Oa|YaaaN4uQ ztN(_5RIsfHs`_&3qm*;`CSMVX%!_sVvN(p?W3)rZUV#gH^1_Bf7$z^Zc-r`mX9b5rEq)8}1B>S|hr^Ti!yZZ?xlA+NWJA_m{(6MgE;E z`NgYHRl2TmS$P7ytkVX@CF#UK=*r literal 0 HcmV?d00001 diff --git a/boards/beagle/pocketbeagle_2/doc/index.rst b/boards/beagle/pocketbeagle_2/doc/index.rst new file mode 100644 index 00000000000..ecd9542919c --- /dev/null +++ b/boards/beagle/pocketbeagle_2/doc/index.rst @@ -0,0 +1,121 @@ +.. zephyr:board:: pocketbeagle_2 + +Overview +******** + +PocketBeagle 2 is a computational platform powered by TI AM62x SoC (there are two +revisions, AM6232 and AM6254). + +The board configuration provides support for the ARM Cortex-M4F MCU core. + +See the `PocketBeagle 2 Product Page`_ for details. + +Hardware +******** +PocketBeagle 2 features the TI AM62x SoC based around an Arm Cortex-A53 multicore +cluster with an Arm Cortex-M4F microcontroller, Imagination Technologies AXE-1-16 +graphics processor (from revision A1) and TI programmable real-time unit subsystem +microcontroller cluster coprocessors. + +Zephyr is ported to run on the M4F core and the following listed hardware +specifications are used: + +- Low-power ARM Cortex-M4F +- Memory + + - 256KB of SRAM + - 512MB of DDR4 + +Currently supported PocketBeagle 2 revisions: + +- A0: Comes wth SOC AM6232 + +Supported Features +================== + +.. zephyr:board-supported-hw:: + +Devices +======== +System Clock +------------ + +This board configuration uses a system clock frequency of 400 MHz. + +DDR RAM +------- + +The board has 512MB of DDR RAM available. This board configuration +allocates Zephyr 4kB of RAM (only for resource table: 0x9CC00000 to 0x9CC00400). + +Serial Port +----------- + +This board configuration uses a single serial communication channel with the +MCU domain UART (MCU_UART0, i.e. P2.05 as RX and P2.07 as TX). + +SD Card +******* + +Download BeagleBoard.org's official `BeagleBoard Imaging Utility`_ to create bootable +SD-card with the Linux distro image. This will boot Linux on the A53 application +cores. These cores will then load the Zephyr binary on the M4 core using remoteproc. + +Flashing +******** + +The board supports remoteproc using the OpenAMP resource table. + +The testing requires the binary to be copied to the SD card to allow the A53 cores to load it while booting using remoteproc. + +To test the M4F core, we build the :zephyr:code-sample:`hello_world` sample with the following command. + +.. zephyr-app-commands:: + :board: pocketbeagle_2/am6232/m4 + :zephyr-app: samples/hello_world + :goals: build + +This builds the program and the binary is present in the :file:`build/zephyr` directory as +:file:`zephyr.elf`. + +We now copy this binary onto the SD card in the :file:`/lib/firmware` directory and name it as +:file:`am62-mcu-m4f0_0-fw`. + +.. code-block:: console + + # Mount the SD card at sdcard for example + sudo mount /dev/sdX sdcard + # copy the elf to the /lib/firmware directory + sudo cp --remove-destination zephyr.elf sdcard/lib/firmware/am62-mcu-m4f0_0-fw + +The SD card can now be used for booting. The binary will now be loaded onto the M4F core on boot. + +The binary will run and print Hello world to the MCU_UART0 port. + +Debugging +********* + +The board supports debugging M4 core from the A53 cores running Linux. Since the target needs +superuser privilege, openocd needs to be launched seperately for now: + +.. code-block:: console + + sudo openocd -f board/ti_am625_swd_native.cfg + + +Start debugging + +.. zephyr-app-commands:: + :goals: debug + +References +********** + +* `PocketBeagle 2 Product Page`_ +* `Documentation `_ + +.. _PocketBeagle 2 Product Page: + https://www.beagleboard.org/boards/pocketbeagle-2 + +.. _BeagleBoard Imaging Utility: + https://github.com/beagleboard/bb-imager-rs/releases diff --git a/boards/beagle/pocketbeagle_2/pocketbeagle_2_am6232_m4-pinctrl.dtsi b/boards/beagle/pocketbeagle_2/pocketbeagle_2_am6232_m4-pinctrl.dtsi new file mode 100644 index 00000000000..7f54984345a --- /dev/null +++ b/boards/beagle/pocketbeagle_2/pocketbeagle_2_am6232_m4-pinctrl.dtsi @@ -0,0 +1,17 @@ +/* + * Copyright (c) 2025 Ayush Singh, BeagleBoard.org Foundation + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include + +&pinctrl { + mcu_uart0_rx_default: mcu_uart0_rx_default { + pinmux = ; + }; + + mcu_uart0_tx_default: mcu_uart0_tx_default { + pinmux = ; + }; +}; diff --git a/boards/beagle/pocketbeagle_2/pocketbeagle_2_am6232_m4.dts b/boards/beagle/pocketbeagle_2/pocketbeagle_2_am6232_m4.dts new file mode 100644 index 00000000000..6b1c256976b --- /dev/null +++ b/boards/beagle/pocketbeagle_2/pocketbeagle_2_am6232_m4.dts @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2025 Ayush Singh, BeagleBoard.org Foundation + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/dts-v1/; + +#include +#include "pocketbeagle_2_am6232_m4-pinctrl.dtsi" + +/ { + model = "BeagleBoard.org PocketBeagle 2"; + compatible = "beagle,pocketbeagle_2_m4"; + + chosen { + zephyr,sram = &sram0; + zephyr,console = &uart0; + zephyr,shell-uart = &uart0; + zephyr,ipc = &ipc0; + zephyr,ipc_shm = &ddr0; + zephyr,sram1 = &ddr1; + }; + + cpus { + cpu@0 { + status = "okay"; + clock-frequency = <400000000>; + }; + }; + + ddr0: memory@9cb00000 { + compatible = "mmio-sram"; + reg = <0x9cb00000 DT_SIZE_M(1)>; + }; + + rsc_table: memory@9cc00000 { + compatible = "zephyr,memory-region", "mmio-sram"; + reg = <0x9cc00000 DT_SIZE_K(4)>; + zephyr,memory-region = "RSC_TABLE"; + }; + + ddr1: memory@9cc01000 { + compatible = "zephyr,memory-region", "mmio-sram"; + reg = <0x9cc01000 (DT_SIZE_M(15) - DT_SIZE_K(4))>; + zephyr,memory-region = "DDR"; + }; + + ipc0: ipc { + compatible = "zephyr,mbox-ipm"; + mboxes = <&mbox0 0>, <&mbox0 1>; + mbox-names = "tx", "rx"; + }; +}; + +&uart0 { + current-speed = <115200>; + pinctrl-0 = <&mcu_uart0_rx_default &mcu_uart0_tx_default>; + pinctrl-names = "default"; + status = "okay"; +}; diff --git a/boards/beagle/pocketbeagle_2/pocketbeagle_2_am6232_m4.yaml b/boards/beagle/pocketbeagle_2/pocketbeagle_2_am6232_m4.yaml new file mode 100644 index 00000000000..fc258c2e383 --- /dev/null +++ b/boards/beagle/pocketbeagle_2/pocketbeagle_2_am6232_m4.yaml @@ -0,0 +1,10 @@ +identifier: pocketbeagle_2/am6232/m4 +name: BeagleBoard.org PocketBeagle 2 +type: mcu +arch: arm +toolchain: + - zephyr +ram: 192 +vendor: beagle +supported: + - uart diff --git a/boards/beagle/pocketbeagle_2/pocketbeagle_2_am6232_m4_defconfig b/boards/beagle/pocketbeagle_2/pocketbeagle_2_am6232_m4_defconfig new file mode 100644 index 00000000000..02a9f623a27 --- /dev/null +++ b/boards/beagle/pocketbeagle_2/pocketbeagle_2_am6232_m4_defconfig @@ -0,0 +1,18 @@ +# BeagleBoard.org PocketBeagle 2 +# +# Copyright (c) 2025 Ayush Singh, BeagleBoard.org Foundation +# +# SPDX-License-Identifier: Apache-2.0 + +# Platform Configuration +CONFIG_CORTEX_M_SYSTICK=y + +# Zephyr Kernel Configuration +CONFIG_XIP=n + +# Serial Driver +CONFIG_SERIAL=y + +# Enable Console +CONFIG_CONSOLE=y +CONFIG_UART_CONSOLE=y diff --git a/boards/beagle/pocketbeagle_2/revision.cmake b/boards/beagle/pocketbeagle_2/revision.cmake new file mode 100644 index 00000000000..f7698f24bf3 --- /dev/null +++ b/boards/beagle/pocketbeagle_2/revision.cmake @@ -0,0 +1,10 @@ +set(BOARD_REVISIONS "A0") + +# If BOARD_REVISION not set, use the default revision +if(NOT DEFINED BOARD_REVISION) + set(BOARD_REVISION ${LIST_BOARD_REVISION_DEFAULT}) +endif() + +if(NOT BOARD_REVISION IN_LIST BOARD_REVISIONS) + message(FATAL_ERROR "${BOARD_REVISION} is not a valid revision for PocketBeagle 2. Accepted revisions: ${BOARD_REVISIONS}") +endif() diff --git a/boards/beagle/pocketbeagle_2/support/openocd.cfg b/boards/beagle/pocketbeagle_2/support/openocd.cfg new file mode 100644 index 00000000000..f0cff3f9e2d --- /dev/null +++ b/boards/beagle/pocketbeagle_2/support/openocd.cfg @@ -0,0 +1,7 @@ +# BeagleBoard.org PocketBeagle 2 +# +# Copyright (c) 2025 Ayush Singh, BeagleBoard.org Foundation +# +# SPDX-License-Identifier: Apache-2.0 + +source [find board/ti_am625_swd_native.cfg]