From ba6ce5ea32ce3ceacf82bd0e4de3a4a7134d58e7 Mon Sep 17 00:00:00 2001 From: Lwazi Dube Date: Mon, 17 Aug 2026 22:18:34 -0400 Subject: [PATCH] boards/arm: Add support for the original BeagleBone Add initial NuttX port for the original (white) BeagleBone board, which is powered by the TI AM335x Sitara Cortex-A8 processor. This commit includes: - Board documentation - Board support package files derived from BeagleBone black - Architecture-specific page allocator for memory management in kernel build. - Default configurations for both flat (`nsh`) and kernel (`knsh`) builds running via U-Boot from a microSD card. Signed-off-by: Lwazi Dube --- .../am335x/boards/beaglebone/beaglebone.jpg | Bin 0 -> 103168 bytes .../arm/am335x/boards/beaglebone/index.rst | 184 +++++++++++++ Documentation/platforms/arm/am335x/index.rst | 21 -- arch/arm/src/am335x/CMakeLists.txt | 4 + arch/arm/src/am335x/Make.defs | 4 + arch/arm/src/am335x/am335x_pgalloc.c | 70 +++++ boards/Kconfig | 13 + boards/arm/am335x/beaglebone/CMakeLists.txt | 23 ++ boards/arm/am335x/beaglebone/Kconfig | 7 + .../am335x/beaglebone/configs/knsh/defconfig | 88 +++++++ .../am335x/beaglebone/configs/nsh/defconfig | 47 ++++ .../am335x/beaglebone/include/bin_romfsimg.h | 37 +++ boards/arm/am335x/beaglebone/include/board.h | 143 +++++++++++ .../beaglebone/include/board_memorymap.h | 61 +++++ .../arm/am335x/beaglebone/scripts/Make.defs | 39 +++ boards/arm/am335x/beaglebone/scripts/sdram.ld | 126 +++++++++ .../arm/am335x/beaglebone/src/CMakeLists.txt | 27 ++ boards/arm/am335x/beaglebone/src/Makefile | 27 ++ .../arm/am335x/beaglebone/src/am335x_boot.c | 111 ++++++++ .../am335x/beaglebone/src/am335x_bringup.c | 196 ++++++++++++++ .../arm/am335x/beaglebone/src/am335x_leds.c | 241 ++++++++++++++++++ boards/arm/am335x/beaglebone/src/beaglebone.h | 127 +++++++++ 22 files changed, 1575 insertions(+), 21 deletions(-) create mode 100644 Documentation/platforms/arm/am335x/boards/beaglebone/beaglebone.jpg create mode 100644 Documentation/platforms/arm/am335x/boards/beaglebone/index.rst create mode 100644 arch/arm/src/am335x/am335x_pgalloc.c create mode 100644 boards/arm/am335x/beaglebone/CMakeLists.txt create mode 100644 boards/arm/am335x/beaglebone/Kconfig create mode 100644 boards/arm/am335x/beaglebone/configs/knsh/defconfig create mode 100644 boards/arm/am335x/beaglebone/configs/nsh/defconfig create mode 100644 boards/arm/am335x/beaglebone/include/bin_romfsimg.h create mode 100644 boards/arm/am335x/beaglebone/include/board.h create mode 100644 boards/arm/am335x/beaglebone/include/board_memorymap.h create mode 100644 boards/arm/am335x/beaglebone/scripts/Make.defs create mode 100644 boards/arm/am335x/beaglebone/scripts/sdram.ld create mode 100644 boards/arm/am335x/beaglebone/src/CMakeLists.txt create mode 100644 boards/arm/am335x/beaglebone/src/Makefile create mode 100644 boards/arm/am335x/beaglebone/src/am335x_boot.c create mode 100644 boards/arm/am335x/beaglebone/src/am335x_bringup.c create mode 100644 boards/arm/am335x/beaglebone/src/am335x_leds.c create mode 100644 boards/arm/am335x/beaglebone/src/beaglebone.h diff --git a/Documentation/platforms/arm/am335x/boards/beaglebone/beaglebone.jpg b/Documentation/platforms/arm/am335x/boards/beaglebone/beaglebone.jpg new file mode 100644 index 0000000000000000000000000000000000000000..371d69fe74eaa658cce3d4548ae5ebfe5f9631c1 GIT binary patch literal 103168 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�T{meXnb0^PzUFUfmg4OO$`3lX_2J$LmIwK1= zwvF5aV&AtJs{{+t$A=k^h#%cud8NXx!EK7|9E9CABxwj@ECrVukIC;l`bYpNefSga z9_li(RoziS)i$i^V-3u>!SnX zAD81bJCz{=@5_`M8`DF8yYPN`EAY=B>o#8T5Y5 zZDn=ATy$wvNBwgZ@ zp4eEO>S}5LBT@BgK2^yEG@!O5Rs|u6I%gVN+vbe{u88q5NyQDj3$d_&+GD{VVp+;G zuF)>hl3hQo_^hwxF*3HAGCTLk`rhTP(Zlka@aftTtjFtEC#RaaguLOq1T#mv0NFzO zC+HdRuye9a+e?$e1ffNdUv~J|DA@v8}9pIg@^%7J8JU@!HiU{4e~;VZySFlO+0m zc^NRw>KkSQ^RhMJ6WvL*149ih0{Vw8B{d~&K)2Un9k$ewVY5npKp{|sA39)cQxyZsb9v#aad9VgQQj>bFDS@lc z%zW9@RMH2NaI7*6w!}Jv5Uf$+_cpXo1qW>`?5$Z=2;7e1`!R+z>5r7z(fagzHceqz zG_TL`&h`^jsiGoaBYp=#4{G`Q|B%AVdNAv%9ZoRT9*3cMzl;*tqjDgIG4j5l42-x# zSD4J0TkT6zUN|j`LNz{$GlOM@3lS%)^V%za@BURRh;kk_IxAB+d%sB+7)Y_TF@%;8 zG1yqvwbT8qiLVjYg<`fbnx$j!+Y}0TxR`AknS_}3YPg?}yj<^7z>yA)){Mk^XvW3a z5c1aODFJY2`nWmaNv6{=iXYPbhyZ{&GfX6G@c(ut^RB(7_@wjHx`pa?`69n9>~+y> zH}x;fro87}6VHG=8@m<>K#8$zNoFNnDTu0!=`49_Z7#CvqX$Joyh=9&U`){Zt2N-J zE`}uT1Y4vWBb~b8zg{&KVhN3MaYE>>0e9Aq6iCGE!4EiS0~vwRdYgMsHCr+`!F^^1 z8YZ$x{yItRNLpKj(_`>PIhZP{^@vC z+P&-{@k9=}SnZNUYJ4v+T`)Ih4D%u6+~+mm>F|=kBz4EU)`q$=h^mzGDU*~{d;sH0W+ zhk^o@MX_FVfvkz6}`Cjfu)8{=M%JLi+ba)=8 zq}v7!{8mcoa+-I^*eM&kHJ6g2fw&!evf2hj$$YHcE9Ubkh6;~gBFP-A^>}sRH0?{8 z904nBd(X)0dGs{Pm{d(NC3uz1v*=_C5GaK;Q(phiNeMwsjw$Cb2SG-Y9MuJ?PdhfO zAXLutMAa0x1Z@E=V&Hw(NlUH1@wx%GS&J&44jQh$<|pWXNGtRqkm6eTuv#6ro4}B< zqma=5kbZl)*qdzE5P>{PlmD=GVZ2csBD@{J=u$5e65~9m_)@XoE4+IcBvEs;__N?d zr){@EUe>1`D?Rg_M>mbBc5!GN`>)2XA}I>|Pe_ zUn>2pn;nwD=@;jsa#OU@o=`~2wnAPg5Id}J0E(`(1K=TL^&8)Ql=s3(S`~YDa&*te zr%rsoQE}(u(i&WF4>&e0c(=j1zD{!c9K3BLRi=_A6b9|wVL8^!!X3qzd#^zr#&@wJ z?C?}VQ*OtG)8RF%>~?QbkKhEjUGM&}nbFv>_+|$9*A*q++xL8;6Q$|-$eg&O6$UL= zlu`J<{y_i#Gx4tytEdx*S}#GV`{-Tt0toc03V2lbYH_B_gM=z<12Omy=`h5^5zk(! z%YGipM3Pr%otSRBX77m5MZ!tAym>Qu-QO#EB(H~XImJ8H<=Y8{uj%tU6<4?}Wi1U( zpZuNpTHt^NtyC_Hpcwdhy3CrIBr!_w^X%AAQTjOExiJ2_8SDtoS@WFQC|8=4(kmQ< zi@iZo4AGd9R5xlNVy&65Iy6u^ZMibK$LrfPioq&^f~=!7wq<-L-cvVN)Ng|bZG@=@ z@t<0pap!#m?1rLtH`eSU%LF4@>=hN&NUl+Fy1rUz0rF5WHKz=JG&E3B2<;XK<=PAF zdd)BBJ9kE^$q`Gl5Yiix={k#H-~((eMeoGh@gFEhVDcHm)WVouL5cPAyV|&6;0E8~ zFxKo!4)HJzG&vdf)J$s5= zbO3T{qTorDUvyYbfR|UJl6E;AUTK1zJSG76(*8ta#0BVi^Jm-}JnRyw)j9DPIf;ACj;kTZuJ*1ntY{W9Me4GrK;Py98M((Sy?0PcSD1=31g zYjl|$wwrF9Dp(K2Em8;)wc65r^Ly-N6?G^f{$6M#z@b(wTAQoP7 zxAWaw%O^zo^xvokLwte89ds*HAAv8pc>DduOgeF^f8I}sv#b@@yZTw>d?7aja?J$- zbIHq+y)RDb?)}D%$;VzmD=nsp&MI?>=5zgqg(r`^;@^VtE;-$yLwF+rR=3cU(&@j6 z-kZe&9bksleeWqV^)a9uiHd5xe3U-+!se(iubLx{$0@1 z?_Rh{b5rq1eOOQhctaB?wl!-Sl{C{2GIW`qDPz}5I9z&L)$~Tnb3J}3YKWJe@xyS+ zI}j1YVr+ZUpKf2rs=JQIgo#7nUHuU0S|rQ~$gxeW+yK@^Ot$$Wn>s)v4-f>#+^)w* zuTYVRbSb3dKzY<9#@_FXHjt|ID*@Z3o*E4Pc;l*KnnC3ni?kHCqh%{t@UE%nqE@nbmy9ferNrRqD-Kv>ig8)}jtE^>y8^k8k4AH9Ya;_ywv8OGI_2Ml!SVH$=!8+qP$@kP+*sr;A z)1NQvc6ugv^ON*vOtS3dNK$H))VbaEp9Pj%a z%!m!JIQTS9O778^sHsQnuZ9|kc6SFHBUgP&aHqDB=o~Q?2X2QP4x=@nHEk8G?~lX zO%GD%LIRGT+&x&P0-d76Ji>y4zsYq*p9J&_kvB#Z@;P58l|K#wX^~1H3 zZ+~kwq5S8Zcb?@W^Zb(57h>Xf=`4b9BLM+~ifhZ@IC zv-T)wA5sR5PaiVz=adGpcf^G7FNol}a@y7zwytgI`CF z>b?OoaJaH#Z@gTZ1@tnWUl`1`IdDeIk#pnrqk_U|nOgYo)}yA2H>g_JGyJa>1FU8ufDh$=<^?bn8(IWk4z9VOg2;Y&$pe4+Ry zAoQsJkUVnkeKQW;W0@os)31lIP>ckdX(=CSZq{l_W;9<^P+wiu?fa_=y$_D`A;08u3kNRHP-SHPHt z$5fH`^jMAnA;R>G0$YH)Qg{CE(?XYWOWmckg>j_Vrpq zf#C(Qq0*|0$YlZfpbwy618~D1HMX?pqWQ$j8jb{MN)6OJ@&SGY0uZ78KP32jg-)r3 zKNg*RF@#AA_QeRh5%OM>nou}3j}UjkgSOky9paGu+4?EJW^|(m^}-GTjTXR-lbDyG0x9*%SK!Lhh+DnleQi6 zCR+(_l=g$V0>1W_6`BB$+PsH`r!~ZbRP|ED`v3(? ztLU0^o2wJk?p~^>8sp%c28|1PU0oCDNR(KdZ z6q2N+ooEC=7QAch3O=#2oX(d?d>Tn0!Arv&(pP}Llq!in9fxam-A|@O?ZTYjxA8Yg z+gE3kn#qknXdLT?j>77A!k-=MRzc$9Y7P>nUOoFfajwRv-b=B@!{}`NxFxAE|io#$N4Uq0_~~^R*Lw#w1zH= zy!8|;u#*FxP^2VE%z~!1p^5|*>e{~3W!BGc@qBp;&06v|0>(W*lVv!FeOR3$KOAQZ z8B*AW9(8X)$<tNHbnlWFwuM##b{XCw6evu1vg>+bn^(fX zJ4Pg2_BaFIIl9ar-K+{WA9v&lb&U$I3jbY6ox9Cg@!Cv(Hg?c_vq4%go9S4#SWs(( zk1iH-hCE}gpl;86WH{|oF@L?kt$eqb)YcVjQl+74#SRtY&ujRn zdpF%PQo6Q9{bS=dZ0jtDU^8Q*)>Mm{t8Fi|8(oCIhcJB)do--qQhNFa{IrfOxCsbX z@Z3uc+_gI83b7%EX%{J0&ZK)b?L+-HSAV3QC!S+Wo^TCu&K;gkIIW(iwUEATbC_ZB zUB)^DcF8GLWfe?NH8(&Wrqsm+4i|fhsE!u{dtNgqUlP+U&cj^-K?>a}fx$;kg}ebz zR%aKvkNA~d)z&wOo?xclUzPvvbp?>xM+k5{waWq(MwH#t0)G35?AFg$u9zyU`Z=3z z^pyEyMs{SHx3;Ha7BblkABgTdb>A_mU6QsO`Y>z#g~fT9a!9J#+p{^cj*^qIiAk_V z&s$ubk++{|wAOkpRIWnD{f5lw=4-hyOgFTeq4E_6@L{ezKbQUW(I@*$bEmD&fvrX# zOtpLGnc5zC4*3-0Zen>n|B<{Et!PRyv5m$yp*?)$SaEIAYjR5IT_DIx$k12Ztn*p4 zdamXmK;cjN7ae;woeUG>02@-3OTCsvHKt?6)3vk~F8`ci=Y~1boQ_>R>S77*;@!+j zt7Dn){+}EI$vaQEUzd71-8yJl4l+Vwf(zix>?#O-s%<% zlGK3tsQc)T_L|UVl!v`Jr3+23EX-!)7>-L69>x9aQSjSQ>DI{J(k;!r$+)+u-tYqO z6jajN++OAe`V5-Os1?2kOk8?3POJDB=s;`rbXup{{!zNN)KoI>EwJGTNoK~m<6_f( z&77w(OVlmX-@0TIn&R0?WvfTJeWP9^ThS$~52-HSKX#Z|Y@RQyrEdlj^sTDf7(SFGktr`&Nia(|d|d!jOS zezBc24*s!rZ!YIEvI093c?vMao9c)gEa#i*x1!EtrgvA@O_2hi*0IuVi6MKt?X)F&`KnGaB{JFtSv6yW_Avb2V-lU#&C)h-r))(e>G-bG zmufp)EPMKjLOkU7JB(s#o(Z%seY|$m_jbjnwWok8UH_^8J8<{ve@Ke3rT9!ouqgho zW~NM+861DtQ$WIGX@;N1L5AU{%nW_;RYmr{D+s2xdR>kS`(AqoG=z({a|3*3&a_4g zcj}}rdM!$Z2gX@CEgwWNRp#_G`%Vw5CIcMu5*zm+8ZWXs>JlZ?pPd5d)_j!eJ2P6R ztc%{trF6?G4F70I=`puTP4Fl9q@c}q%wlBP?%6HP4th{7jS}uE+GXy+4^rTJKK>xB zF}ITHJ}>QCk&<6j(LSpkTARtf|7kCX1ULApOM`AY*)B)*aW`5IVh8tI{uWEY>=*2g`z3hqR0Q?_wyVJAEIq>Ax0OTPI3G zRRFw!CmdDXlSSD(<&qq1fTGMH#-EH55$-pAqhR$EoPb&qZ-m~XC;ex#EHK8jTN&7A zbx-ebnAz{SG9(`yS`*4E&sHZzpG^E&UDiTypBWP=HGxv;Me$cp8k^#eQ(9(9n~(bt z{qpS*Xpiv(SIj%bcS>Dj)5*KId9oI0`;}ij_aU#21w!B?X^)s9Gsck?J$brvQL$)} z#NeMHrU**p`=y@av%59_X=_^QM%~f$Pz6@zv0xCnfHhzn#H6k{7T|^^&6IN52E#Eg zFOO=T9dc>rPsANT0Yom!oM?<;csVgM(f`=h8T$I|*E@=*ij_Aik>|r^<3vF`KZvU zfkhHanH46^Q~upAiB7uksJbEzTP;OWjglo}@~@ZHdlUO{DH;XJOi5S1<=4*RMwWI_ zgAzAD^O}tGkl^-BI2sZ5MJjALIO|qqz$CY%2K){maxP1Q%8&OXjO8t7f5S@ z8`&4kL9Z8LZJ;Sd|7I|(EWmTT%w^V`=#^MC{hn%Ew;+K}^;Ub3o_*%WB_$OKD!1jh zl$e}Dg&-Wyy6;>Pw*}@|ULNi{h^r|#_IvgMJ%_g8mwIP-t1yarzT5=AyEkf}1k zU706LrcXcwiYddUTraZG^s4lCfK}4JjvB12b*+}De&=<|;&dp2eUl@fIsR+>4Z+*s z-(OGe7i=%a8U0=WI&Q~ib6q%DS!O`i35DvfROo+^r*oM!f;S*t&h>&MIeRzYg7nl{ z2|@M%&g-7L05ANB?h`QKYV`vCd_}BsL?xf}V0M-pmL}+Ei$1{4TyXx&z)quA2{Vja z(*8APW8>G60m)O4GEe2P^uNa)5nY?Spvybp6R69ZPECZc4NSwfD*DveaqjzwLq#(u zPaY@krTT`5mjC3dY8(Xz!cds^WAQ3NF9KY9E3R?vfmoW+5#HqXKzBq0#cjK3xFIlB z-kZwdGuX>C>|`0wfki;2ii)43yZi0*I>VmO9coq!_r0|x=O@`K7Rwo&VKU)bewg&O$ODb1wiqgUm z5y3AvPd>)=D&XKZsF6!ax&bhH&l9D-O2Oypfwb*?5N_Ex<^YMt- zYY^0UE1mYZVV!^c5>DS~{cyU;9Ez)1`L8L2x}ff@zH_&B^*a+PMjNaxOUAX%XCJRB6wKN$FGs(v zZDIFt>w!(1x;_@bSMr_8S7GmR5M)h1^YZ!@Y4x2t2dYIvaXEX4>KJ(@foLKRJy2w) z#pmMUJ$v45N4?rHjGTsaNz;HISSBo~oG%EpcWDd^nZn({FLkDik!biU zx0=th@lm|K`GmP+Y2)mskW;l9EjEcBZo(%PtU26y5L-nQM0Jt=8ZxTDr6vSFM_^4K z>4YU>?6>hFJ>JDt>ed=4#{(y{M|@lkn^uC1?WrcJO+WO8>>aQDhvc$)LUmxS=h|p? zSQ2Y8uNC)qf&UuoA&P@K{7n*XD(uG+jgi37>aR4iYZdLgLHNz9Wc|(4zYpnDb7n@7 z!ZLm<0t!5CcUxR%kjfJd8XKR1v)|v#%af0D9XbG7P&>QF;BiuE;px`yp7O2<4Woc( zx-8$|tAzTvBEw1kDp(KCCEvHFkd{^(n4eS5zxcmrHJrDxmkQRRQ7cM!3(Hhr>tOFeX=PJL1AseO z;O?-^d#@3dg~dpUff1&toD2hXUNLS?-#hl$sad7yv#*zc$P+5}Ggfm}P0z}|h4<69 zi1jGD%?XhYlX!5)lClY{yFcvnjACw&;+Foz2)3)bQ6V!j!rB7f$ysZ=bEg{n8MS64 zVNU77|0{I#keBD_IO9y+*Eas~7Irt8GvSkS0;bIHU9r|r6SA>|_uZY>8#qyn)z(ER zui{LI>k{IK?4WY(b9P_xiVNh8F?+Vo$l9$huIZrzjg;f^1X4>GIo0pAe%q>T_Ns2 zK{PfRh*Y- z%-*AAG13S9a$CCzt~9|0ny%Far*~Y1g00DfM!w8!zsoISc6Wqrt`K0-|B#f9Qh0St zj-X{Vl^JXACsaa5Bjn}m^H5ai>cOAl8%w?nYc3V1C6`QGT}L;TU2VRz8vovK{_k*l zu7}@JtWfTbowy(NH>wAeQx&_|ykm$P1+x0IFkeUCo(|I zhq4dhf@%0$oC9*W{n@Vgpi!3-gn0+7JP0>wN(&Zdws{EII7L^52x~!4hkycFxG18q zqE~#3x&jQ1bavNeDR=e2)lC2`6k5e*L!j;V=ViS8Y=}f{86sTQXN7A_!SzvL@`Yo$b6cyApbG`fJu#k7$q)1;rhQ?^p`mBRu}=#9sl= z6bxYvaD7UiE|x5jQ0oVIJbJVqUJ&Z|5H;Z+QrlG3ZEO1Mlii{!Il{RPD8u`C1r{P zZLfTp|BgB&;y#U3UFrQ!P%dzPiCXz!QDpVXE~EFgHN~IlPHR8*_ga=_A2!d z?X4wKBERUUlMfwh8OPuzr>d6K3Ep|oj$rh5uFx&TXh-F|RL#g<>&zLOr+!>IU$p&3 zsbTuXaN_B$(1Jr59NWn`F@j=odLg0xOI%D;0vpY{`MrVP^+$i0??f)2ij9axSuPA`qAX}zE6pJHO8(ylTM8A`d_5}7;$yytM0zH z(xC_LAR)D({tECvnA4wsWY%#3$nk_>neFPvY8e@z2iX6W?Mp;La+P>$Rra&rc6s_? zk4Q24&@>?6f)RG)n1ftg1`PH)CYP%2x6jARl)frrsJLp!;V`f)sD{`5GCqmq7o?wO zOFV{h?u~lEfZAmF7G^!RC{g?9l0xby95rMj)TFlCzv2QM4v@^g33}kRCdvqgM9!pk zte;X-UZJ~fGt2+<0WedJ`BIN6&;%nhgz>k6gc;xrJDf`QRC&B4b70QCj!sG5;QRX832v@P(jWqR1}%H1%HCD8jfh0?$(wm(fZi{9jhbsAzd z1P!dwlT^PCLidoT6oXWCW)-w0!aZk$7Ra``G!&Z`9rW9-zos;j?cv&w5l$RtqY(ve zNAGSKs&kC8gs!&RvQnTbp_gga94B~RpO1lU4g$|lj&%ryk z!n5p;fw3S`F*(+;IRzZnOM?lkSU-cUamhadGwQ`EpIMsqWv0%etA_Ke{nW+Xo_(n1 zezJv~s4)tXTi_(;{obYQ|5vCc!&a6lVidiN9Qb;ngtXf>h6ol()`@%7=>YjB@_2{0 zV)IbC7XpZekhiwx?GeT(6XLdDP;$ywcS#=S?cm3L#+!w-WG^!7cMhA5FMH51L>bF! zkb3-QRhLdUYKjJdEdIaO=y_p4oB{{mA+tJ{aWKqYTSZNP{~w;7yBl4gM@rA$~MK^MlCZCRn*(*0Y1&eHdL@@gdi&?r^kMI^iPADh`OGZcgQjx|Xt5 z`dL@Zjlpxg_m~zb%v_-y2aIwkjE`H~ZF~9XEWe?j1T@6zRK5= z1LwYb%^Gqv2ko)`Yg&8V2K7&jOQ*Fv(q}8?G>wgHVG4i@j7!UdJZyswNf#4tOsaX( z`Lz@!DtTopyI2o4&~z%Tdfy{R{D(~MX`-4!Uro@yp`n(F037#3s_wmdAHj6 z=R$F|{m~{DvX~ed8cY9_SWjsNGa|YEF_*}g!cJ%o`Ai2MD&>ieJwZ!7?fiiHGTOrv zehMO0!96O79rUT`{X6kfkeH*23kUe#_*9pdTn2GWA_przO8p9*`G)Ri^#d_8VC<;$ zkCeA-Wz^G}ZBrhCQ4~QF%6F%9?Ewh}X?7_c#r1;1>g?{MR+Ow0EgCwsVY}`v^QR9x zkTrHFZi?Q8VFn=jD)hm8=$y9%oxb{mSYI8UG8+rkS=>&(L)GsvvwU5x`FS4xX#u53 zLm3YP&R_MJ$i19FJU6HX0!)=1U)D20Aq1;}lmyCg9Jr%jRcWQUd$cjjb>`n{sCmnB zdEksr)b*NuakN?Y!C|vfc03#g1Kc58B#Am=$&iid^pOx%8c(<-K>Du(XZCzfLX$VN zLzCAaJJ~9P7a??UbMAZIqdOG%#QQ<_9Dek9h5xOJ1K&n*9o|oC*hF#)MZo=kNF4GC ziu;1(12k%4xvAD&{5|NNDf2m-%ZOT0tauOx&zhN{Zb+vni)&DJ#Y<&StoOX;KO8A-*kj8tir+z$ZnIi5CfMW1XdMI6CLyXoeZye zIkZC?*3Z$2T}ih8t%;p3bI`EA_LOfbz)9&tIWgOAlEf!JnOusVmdNsXnNH)RGTur6 zT3nTvvLHc6x7ChyY=O6*nW4^8@cUI_RaO2X+!xV|s) z>wL4cpR3%htr=3$A{uL;M$xeFROe``XlEt0ZRrQE-`FK4rgy%&9X-7Y;0=o89$4~E zzqFZep=aOiXY^dEwH>qA+qP>BGKmWqR|u9TOnp*J36%I`7U-M#yQ`BmvNVrbQa}Qa z)M#;1v!a=fEodSSjEnR~o&n;{Q>YR0^yDy?XVG$impzhJB*-#q8<653jNX*Aj8>0$ z_Amby-z{vZu-)`Xg_TQEvG9+)ZA3l2BJnbT!dsWig*0vdCODXsugmp6q#g|!UCq)1 znpg2#R@QhkrKp8qi-|#F}3VC$`k9_$p#s<^!=+!8r2 zyU6YVWmeg>tkCy>Xulj}LuDz2F47gGgzxEz5hAW5ZrgmKX7ODg!@BglP5q~XN~KwY z%Qp(4D19MZ*FFo|7iq~G;u1%jlZAHD9$jl+bC%ezWZ7HXS?4ZrgsZJxHOVu?A#a1} zk5deJw$r<%kAh$!r*O4*GpdaPr?Q$&*aRM^1757lHUMfwX~om$^y{Q{@`Ab|wSFK_ zXGNr__4N4+Zs@v}E=VQf!O=y`q^qiUA=7|v(h>T-;PIB~&md%MRRa)bH#n+ndK$Ie zazD^-APdfLW8&Q%c8nVpMzYRY<-(!wDc6*ujc9sbE~|4fJ=0QJRuc~PdQU>4|J45C z|K+FipB<}ek3VSa$LN7XIXeMEC+W+Dd7ud->o8ox`-5^@6I2`P%}BXk4k~^4HJU`eW@A*1k#?Z2tR? z1$*~?HTgW8x?4Cw*p5SK>34NST8!Nb1n;~7F;+G4a{YP`85w2nzbajF{`q2yx*OfX z51^HI?&XH9uS^56#$9u2xG+N${a&Awdm?8g}J3M7U9DG=3F_E-DYFjw{d(onBw zHLitWW<`w8K?!$sl4Q|YOT!b@WPfK}eVHs$Q8Tdafq(AOH!WAjFl1!~<_Law+ZvA9 zNzY=TCoG^@V%x&hQc0QpnD3(GNXhE#nbxT0Qx}6b>u^wZQQcOKDK;#sEd7FL4dX)l zcf)HQS-!lD?Ic|Szi@7X*Yb?bdJhiU-`NO$L&AY4RciU77%&8pd=6Y@2NMKtyB07o zNu5bAHn8|brT9Y;;u3`1ae!sid455_GwrH{g9@5sDP_`%go@dIzo_}aM$ch>tyar?U%`R$!=pKg;C?Dvq{J@0 z1M3~*Rj$gmuZE=V$Bk2aTwO0NEovEs=`7g~%DYG5^^8>^crdvZ3#2>j=h{`U$q;s%5Ew&+(7HiIk*mN4eiu}zojnAX+f7BlW`bp_vf zNObo#fCj_4j0%TM!TfoO10y^SFY%8#dBNMGzE`g+QY-zIp%UfP0-m8Xw||e4MO^|5 z;3tDfr_%FYY~iW85U)SNrAzQ#jqB+#IP7kw{HSnH?VGQWw{DQ|rl`pNHJLJ6ouHp( zfq&{d?U=9othx#Tl|q!1FF7Y2wQO$`5$c5s>&=j>z;n6wOtVXQ6{9%=5=VI`XjEo4 z!^;ZHDaxA?Htn=-jw`NtqBr|7=)AL%6YiH{AvcdA_$6cgdwj7%!$>J%COvWT5S9^x z)gL>)jMD(YwZA?ly#o&;qk}iQxyqbWLJo$Y_SRPaT$dHs&aAi6t>DFz&Zi)cBMl`% z@3EQ^BmdgTc1}{g_fbdkeU#~pxeP-!v3i>Rysb#ci~jsH-JaXzQH^T>R#r!W<_ln_ z+Vev%#||H!)RZ!H0%hI(jN-L{k#vOfE!b)izh}AXAAR{|^Ygf|mxlUz+Q&H4u2H@+ zFUjc3jTnYNp_O)Y>fDY2e9W|ysc*VrZ3$||4!a@WBa`r z?g#nI&a6Udf09MGbg%Bcx*aZByMh1+2rJ3S1pV&PJz8zqO+w=46>gr z@6YgJxQjSwb*7&hSE}ISv3n0nNDh+Sncw6GIF37L*P7~tZx1-*4fkfa<~%+-eX6;c zbN&~1KB1OzEqA@uk?jR}=ai|D{Nj(Q&6E))+=wGKQ(dRHCEm5V*pY9fTw{|~C7wEB z&>C!eTcT2OTWx4iJ{#F(oRM#4@?#N3OPkq4X??V=`L`S1eaEn7TwU=?*D3Z9GT)|g zeYbL)#^B%K(8T9%5l>Pz8iq==f{saYqP#j@QbEbl6m`|EQdqRMWG7K3GyD9r!nH)7 zZ8F|djd_TPhRyjT_&+4~Cfl`=<5L4AfAa1RwTagF1%ts=uwl_*(oLxG;HUh#IPQ2$ zsj9&?IBm`>p+Tm3M0@U48cF-eqY0!;^2v6t((4&5f3$EP_*oFEts<>J-<)zZkTSo? z&bWhbo?~H7Ej_pm)KV8f)p*%7AjLy#%Vu(u}{Uyg6p6QNj-@FF5W^pdA z#_Xn0elUpThe|bu9>gDh%Cmatdpl7hBEBy?lg@rtu*DyAe=1nCHIU8;^O4q0Ymw1{ zP#GD|U9`d=TQ1o@3s>LiFnU$H8471jj=-hWehPX@<^#DhJu>K+Q(GjWQDE60>A$YwVD+Mtq^1cLGbZ z=fA4Xyhkl9NujoDO!3$~?lII%FUE2Ax8+T#Bm0c#oS+Sn##1&^u(h$I{k+baUBa>a zmjYQ0%}t=0%Vek@z=be*iD4Ig&~4BWsH?rVz)t$^I5z6l6n~LluTU(O>tcfXOOJ!_ zZ*S!FNQ3K2>WlA$W0mxIt1-pNF(w~BS1wOALd#13vB_)cQO_u@>dTP0 zUt=(INd-I|MaO5~h;w%SBh`AltNXISiH1>;beB>(t*%i>p@6e|%j8G<^bIXa`S8wb zb1meX^SgZhYR~WO3+#}T$e7P5dG#(N)-mO86TiFg7CeoEaI<-x0>*Xun=^BC%ah}p zO+LKTQ)N;fyv$yE9IYx)+Rfwn@whxjml6CtC7EihmP-7fJ8@|1`g&O) z#PH*t-T=gq%+Lvf}t1Fh}>HqW%ww#%g8 zNC-}bNStR8l=Qvb{ty68sk9J#kKU9=eLvm6s1wTRQ(Un<7yNR$?@e zHC8F4%~5J|+xukU_mz?E7s6buP>y3M%@lfOkVqXIybD9j?;+Jd)QS!|QjXaJn3Lyo zY@3Q2%J^r3ULil$hD-BI%Flp$k{wr3>fbaT@H0bDNfjanwUFUhMyVpOU(%}y3pW<0 zs@BD3#iR@;*<~?Dx&XA&b=4T6ktG7GyPe0`W z8aw00AoT@ov9UM&Z6~T@^~{_7s7)!XfUGbjR-Ms*CUKx6Z+%cL*nhQFZyt{zEtA?T zl-Jg^yyWW{;rc>slE&Pg+L(_OI#_GuVx1P&s1_vFe=Hf6*E^K9jX_W#)Sr;@`={&p zo=zyp0}5aqG-?On)@C=f%8D{KZQ&z~HTz??e=UMQn*U>51h8s8?3XmZX!fwx?!DTJ z_s-mLqGf2U-fQ#dE?-R#Oe3(`AzYMF^*NDNvjOPGNO>_87=aK%pR|$@MB3=9!MTE_ z@Jn_b&x%B2Sox3qX0)91Ja>5h!d6tSIbY#RA>Z%{y*piudw0o?DSTcr$2K|Un}&c? zGAJ*z4DpDzJ|e;M485I~8Q3rY`)tv~uKCXXOL$|%zf1n$z5ZdT`f$_7Y~s-F+1POg z%u(&I`Z3!9PoN;|jhEPLI&ZU^0-<3vwYwDB9je6YVV<2)+L7X1E3t(8b){Z!JJid- z57aJcyEegH+k0^`=ZHUEyOQulCDwq+qOxsC7B_uXK(@2<;VaUfm<;mhk0-~J3bi6O z8!#4NcEq*wYTEyKq}%NHiblp`u0;KP?%W}WDgLrS)c%Ig8O*lOdQY=+?N!+d?mcUa zi%(W+Lf~kbfjm?hsjSs`k)xH&J*|oeH_|Q5o$vs@JPnv|Y-jsBB)e0(630=gwb#7<*$5*r|U+MnF~8?>YV)c*9g2 z0`fN-?5d)2G=)p;!bW&?Ta}64P+L&jbEe89H1AS$_4?$u3LGOyf9e&ByKhXnD{$O( zh8W8^&Cc^0_uKzbbOd#DxWJw~%(Z;V)EaO#jq3S5N)1>oVhx(Ra0*nC#tmXl*Mu02 zA*n9z^99q`PVP6o)VC7(^LFz_Xs#@;F@t}goag`h!$yEiVu-GjR{u0euZ;~pdgcMq;jSrTpHJ) z!8P#Ru5+qx)vbGO-G9}7*l&A3tiAS{bBytu&^HO_{k;Gsg%G$XZ$+z`ICq$v1)}6* zUg;{`FFCH^Z|+dks~%@K;owMO;Ij>0+c4eGP!>>9a%in+S>HZ-o16s-OPQZe{qlZY zaBXMj-)fijjE~P&7#1_0%K_(_5I11Gg_vodL3OKb$f6TLdnBS;VSDKBA*9h;TuXv& z?cOldUE1+Ctz{2Z3&lnD)>|Cl-r%GGjL>BrErFLc@^04D^i}V)Hjo{ktcv zTCyL{+QQZU%ockGE`=S}bA_t~D%s2Ow2dx$8E3FBuxks8Pg~x*+t{^b`3jl2HjWRe z4G0oyajVoMwjNeW?eFbvpR?EgZRDKQvobk%^7~I)rA!*pTMX6r7{w~D=Da+L-EV%0 zuxg`Qa;WB5hd!|WAe~_;*HtXm-Alekj6HtuJQE6#`Bl6NS(19%gg~;6{UV*pAf<=Y zO|kRZ2MBkl7jM|xMx&vPJAdDbF*Q!6YhsOMTY&La&rw*Mnul`a-R*Fbvx`<|LRIH7 z{ESXk29+EN&;jK%dTZe!S$dUud1acU8C>sg8fQd5$&jcsFwT*6wE1M}{jx***(a2T zz_LaINw;>sY;H7|yDTqo2UtEZ*O0&WNS>k|Z5fNdW=J)tATNaesE!94Q!gQn0NWXT zH?$ZkVWOTA%5Bx817<9*0sCTj)Qx|r0Go2Ce-f1xsVBauI;e9>-c{GLgh8{=qC2z& zV+TkLf4t-3lFYgPAul@czb3g`#zdeF-TgwFqoXZ&cR`!CU;iImZBH>=E^48C(#};Q z7sjEnZ#*30J1oYJsfW?=K`~DS^>;b>&EYX-zKSLBxyZ4`-YV_oSa<=+IZ7s`e0slQ zb(a=U{RtpoiR7^nYXL`*q({QO`h(&+C84F9c$GL<`9A8lz(}b(oKtvYCU>m)4}PRuHY=34Vg-{8aO?+ znW@o9(n@O!$uA`n^dLw7me&S@HKxmC9j#`aB{tV@*bmLzvU@bz8*a?$2Xf+V{qSnc zFs+RrWHw5;-+GA^vK7|=Vcsv=aMciz`KT@WH8xuRJ9ia1CF8Sv87F;HravfPDT_d# zYm7Q<<6%XM$wUIJ%V|LwR9%#um!}c6#~Tnqju*-;f>R-RuNhDRF-T)V1ho6)(jCm% zM2=akUJN~mw=acAx#yvEgs{^LY1X2Kz~p@K-ryQYzq%6Mh-~(k-3*Nly(GBAk0Wxy zH3dW;Ia~!|c75u<_YGawdYaNp`~K=(ktlfhjqiDndc7d4@{Ln_gbwW=@PkN7ymb^H z-{op4k%=Vs>j+4?MvP~Y?ySOmT!2D99m=NBPwMWGHI_x3T+MZ-6*{m;g7BZ~a&>{+C2 zS$_`|$f{8ri$)WDxA>Q40Pnu`3pnV*-kD8i9hi4O-Rzo`#2&Vz8-^de)CLxzN-`oK5h#47IbX&Q=0exr9PRR}ar5nmL zczzuGZ3}0m&N$iRK`U+z?FEDNGP&xeMd=11 zpCv+Z2Vx;?8a8CmX5=!6x_ia2#v|=sj|tFBuWDpR|RNJVEWfBP3j2M*1!Y=QZPRc_}qgQ({8E4>>ynMubA7zhcd1Fn%{Pm3;Ao*;RZc ze>~ipp^a-IDR;%zv$=ZTwqq!Yx}~hT^*_?}B%-WPMdY3YZoG*#mZm;SPqj+<$6iKmJZE>2sX2Iem^9A60HWdM9830FWR$k83;j;@uvs~(k ziy0O2^*PR}({1}3*NdeTBDzv0d-HRyUl^muEXb7^0pDVOu;;)HS;FN8I2m;g2UN_P zrUz;@6;+E)UD{D4kP)=HcyR9`LE?#V8$sIBf(fEl*{0vL5Xiv*&<P!frgd$Wgu3kCep)kS53w*YrdlHBK*7alC*@We|qRCxdx&i z2L9Cziy8G^gjCui>d~Xs!6lS|`wxT*4?aBy#pImweAlM7aNqEr;Yz3}*PtF7Mxh-& z#V*SZL0E-56~TbNfAd)Us6~yQgF6%k+p{#w3Vf)MKx*6{5e&u;D2nG~j&0U!te9ry z)eykr31cGr3ooYyTN=L&Dja`BQMs-xsBw5)7-&M0|(1~-!g?rRziNNhDlS5kZXUljjFb9=EjoMBMhyOr`(Y67+ z*FHnVEhN(nj!`a2YD{xMXVK7`FHcUjb(J2(2a)~=MGEz3J1HRc;; zbu3=K=+Kcoz^z_yb=s8iwxIZ}b@dpT)kK6kNGjlf5of!-U)B0^Wc_amY=Q;dO@<0^ zqAERRM{>@tD<@R~InK!_;@gPl67dU2vwP;MPMbPi#8c*mIeJq5lg}(N3OAe-MHrUE z?nxE>3|c$US+h%gh^X{=Bz`A(qdENc-?RJ`qu~>M9?u4LA0M#ML{BKPqsRk5YhsEDDIrvbsOn#6;IM}PtL-yaeSrk?f@ z(U|0!7bdjCY1o8X(Uq}ojP(AovH6-O5Qo(sl0?JH*Rsq71?p%wIlx{Tf~arWjF^}p z2g(_E+2jjg)m}h)UQ1Jq+&OjrX`-fKC{Iw0wpfdD z%{7KW^<`4%GT7uxWAJ?xb?05M>Gb2b!Rru$xfp zB%MsFVZ7G$;D2y+;f)BFPdgychme!XUPGE|llxh{mf zYk(gZ7kqvIN!iq4(sK9Do)5AqZ*O<-D>V~)5wvKXd#BRo)~d5LJE|Mv_=4O=-4pz| zd_njLd~YCqHW?@GpLgd70H5B9k3>Aptmm5c-1*vGw!HGLb!*P-t+35=CIW^hc?+eG zuuxpNiKsH+@2}E3?53_xW##ncKL!_?oN5+F4;$`c(YvGz#no|^GyZ<;7ZmH}E6<5G zPxfQ&f$wivdcTHQdBt?~i0uGM@rtT*(^rK*cRa)Q5hF*q-aK*xKcmJmhMyqcjA`40 zZpxXXavn=c*j?Zd3yzSO6;2qkam1vTcmZq*FK=pVU&|gyatIQ~!7U6dtg)A+o*nK;0i#fn2g81$?HZ3;u&i^h+U)Qx|E(X`q3Ly~eM-fD2WFQ`#6U4f6 zw2Z4{py&91zr2{lI&R2^iI(YQYXoc`Wkr@morRQ6Qbc75={X3vCKEjW7HxkWciz-l zQR+lWPTqB|2LhX#a7Nkid}+(}kK}iXogVzCf5e;ecWZRAxb{jnEtMSbBVw;MLsdWoQJ z(Z{NmdNL$&O2kX>t=X`nu1>Q%wsm*8aY_1iYv2*Jb?Xf=D7IZ4Q;!@raf2cfQW@tuC?_Ygx2!1Tb~|*E z6n<+PvH{Auuq6A0O>UFk*E$Bjrlrg#<8ShSlt zG|;1q(jLM*yu0M|WRMdIEVIw9RB_7}m>%1QEmj-ShMiO`9Y_7Y*2Q@MmQlblvG9ak zJ*R0&0LNq({~>!r)X63b1N^-GpjsR6Er)NoGaE_L&(v5<-{y7^zG5B6;LxwT#x3uE zAW)uCSshKIh82Zb#T`y{q>MzCwZ93K-Ve(l9|eZeeiMiHnavY+;i=X$rOHqHZ}yh4 z-zCMR;rn0mSAdI7#2H*~xq;GF;*>jeSeqf>9N6oHsY(r{Nj!Laav_e*D z^;A-a6f@ZkT5bazRL|J!H6F=MFMffY@@}E1Ea?@jr{t5jNb~Ts8ChYmNyAdamwY8E z@r{3a-1PKdsE^ z`t>uqj3r#r?Lb@KC9?Y%y6S0pNjGEZ!AA2h!oAn|P}q1Ud8I7^m6TcDs$1nun4wl}P>*3TBCle=)=MGRyv&*LBXju;?h(?poDm!hxTbw7G9+9nIN%HBjH;E5KyRiTFK& zWW<##k3DT==|VzF)R#?^L|A)Ba!LuMOg!5Xk#4O#Yysir6rB=K8uA^P9uNqlt?MJP zEpkrv4o7i{)fXkvH#AJjSh88FF}8xF-s-F2L(KS*vJcxT9x+vxrunET@iD6I)~Kc| zEMaD?AH1bWoVxH6LOfG5T)o#}W zitjH3u}H7UF7GoWOgVC62QeFWet3#y8T-&ck{WJ?8DLtR*=6dybmG@D27uI$^3Cn# zHEAoTItH`ugky0hx69~WqP$v>cQSKF$!xw5?YNk!!FJ&;bZ5egP(|u`Sbf_&p;-rc`^>I z4P0V>Q2+eTHb#45rq4XG>dufn-*8QN^sZ#Q?-2Zh`~?kD#)0YGFOHj@T5~3uv$D$C ztOL4g?CCbQFgV=h@xzJh zi!;mWS$Z@@euZ(`H=$+my7Tv#RlCof$aNxJ zuJjlVbU*iI6mhw01Y>O&R~AkbZ)7a&4b|f~vYjbr9ZDN7*!yNlfg*zxyr21%T;<{d z0us^r6~)@UmUbG(b3}^iBuK>Ai@`bS=9?O%ZWC&{f8tSSx#bfcB!0i~5m+!gje8eA zZT;B|6{soPxI%N=8w7Z095mFa`zqX1?LI8)Fjb|iTMmC7dK}1!)AV-AYC~THD)Qb| zXDQfaJ|z>eem?p(E@6y!?&0;UY^6oO+nR0zl%Sx1i^E`p7V(fGM6{Aac3?e{DnW|T zn)Y)0ZA%x4BQ*)i|KP9|_fs}&!9!`}7eA4H*7gRko_!u{lCFB2Dz*wRyc4Oozt#78 z->XmxFXzKxWv0aU>F)a`Xu18H{BbFu=-sO{G*ES=h)fHy8+x92^<%FBS7W}%A_Xuq zM5Tw;^>ob!LEuEdtWloKgjzDRq%!I;$eN#tFZB||98oe;dqmrCwIccw(|%A7;HlH_ zNlMr7Ps)K=0IJ#JY#apTL1x;3I!(O=9cLClgRlP9+DZ&*dwMd-sB9KbJ^!?O{cros(9-p=7yjjr=d~(QI*)p8*&k@vytaiReq7cHo;!JUt|Q-KkDh zE{3;W+1+-4MoZ_lKZl(1>5T{S%E$mlU#wb8d#>S0+KnZ&i z$luTIkbAU#ITM1Zf@4IN?1v~{p#Ujy4H*Gd(TratbNBXCfh!nFY_!zac`ffnMy<7t z!Ix((>@X6T$1`c$SsQPeRGQG$n3n!d>g@+9;*qY}m!PdQbrEz%_pVtgLvM!9h8KGVMadH~sjM?qAER)XXFk%)NwC@^QfB)C ze8J(HK6SE)e4&ZN_8B?Yw=6o>c^f~ScgW#$_U{)VtnHL`EHL*D%W-xxsStg3;ty~% zbC@tL86t;}CCi}Ts7p(p5?Uc`agCSW^JmgwL)^Xg65CCqBY2H1X-N!8u|B{fX+AUI zEqdT!wUJkpL(wmne(fULbCo^g0>daxnmEuz*!c$0-i3FD44<{ zX962Pk3rY5m&NlIiJBecXeNNQ(lyw2#^SUcG0o>>2@I%K3Bs*J{l=}6k!@-`@MIex z!E~kA2Y^hN&k<}|LIs$DJ5tl2Z5!-qO>@(FZr^=Gi^Yk4sM88fah#U42ze#6sN0WG zaJ7_2v84|NGTQ$Kpq*7)(dLRInkklP*V_doP z+(Z>)&YW#eAEp&+7$*>u2;2QVL?S1cg*qv4s`xk8iEv?K9OMvGXu9QGGLG3XP-nDm zo9;?fM}ph7OyX}JN$D! zO$5teaX1`9!?L(UIoEwkGArCs;{G?j&(_J=Nz?zqQHiwpr*EwB%Nu&&=`Jr;M1XsI zMsZ(!?EOiI{az_t$EUlpN0F1Cthcxw#mnXwmGSR?8y6%mpQ&>Xv-k{s7R(8Ypy(IR zQMQ4aEJuwy>$Yf3h|pC8@-*KYmA@uj8Qt@5`}q&Gb}lT;%r~pbhZb7;eklec{*dag z+fMxfa42f#_dTr~uL$CNKw7c68!Z!v^nPRiJ!(-}_>Uz!Q&!kb5s?11-#=ayKlux8 z`v_01c(puHM1nMBiAwQ?x1U5r&o4tS9TSs*L!a&^Z`*@k-D1*HqKN3HNdojj6gm3< zIJr({X)OaGRz^aPn#(4$Guv91d85UZ&W=T>MJ+@R7pR47XOcvrXuHpLs3u7+d3cgi zRNkRdv^ch)sjsBaaR>>7-9coK|l4A3mk77&1%K0P5?)IYia7KFVLi}I>JIC zLge{dcW!P@UQEXjsI^cnX4g^i9G>pwOK78JgYoC=llhddwy11wp;kWCvfWZOJEvG) zidOFD*cM0IAhiSbmi2nCXuKT&dj5SDAnvzjY&~3$QKB;om{N}ZQ{C>#Lk4WFw!G)2 zAFjUK&8cVoWs1Qc9C47;*IGrrKAtEI9iwy=Fk()Pzj=O3Pd7ud&6KXux!vbGD(m9X z(7f%1F~iWX!!!0z@=i5Ze^~nh7LoroSg*Ex)Daz{`eigw%%kae*NyF&TchPPWm0)k z+_J@rR8-5y`zN+4$H2hiG83ap#FBEY3&M5SkRG#pG$`v5-%mJ{Oh!SV!xvbVY|omK z?e}LY|BOLi`tQ%Igzz2agAd0ol~o-v3gE&&CiL{v0>10q3(khCx_QSSUV>ArpYSR{ zINGFM(QMqX6W`;4rXcgL-F&+yV2j;D*l4RG=!=d+`4tD6U8(d<*Syjf-e`(J0&y*> z)*2-1Ue~>R`b7_R!fu!Ru*^#V+Y`ILw?Rbu+kE7jSNr7F3NgggsgLIV=4X5r7mW3) z^hmHlSX(XgMotf#wK~d*Et2oa z9HbGZXmE3zZ=k^j7jdQT{M*Xap)s0m?{+@9!+)qG;eg{LYU1M zRh~wl*k_0&u=7c(*S%(>&Kg15qv7yrcx2BR|At3<9#3s!TunaX2xalz?0Q+~p2943 z+#AUe2*uq8)`_NRjAPV|&n6I!5s&?i7hi8GSr|{*sr=I&$i9c)4wM<$;Yb{!*hm8! z=tQENDpK4ZnT>aFzfiPv6v{d` z3;w^U_5U{%`G4Q6n0?A%x}d<@_C^U;qOH@#Li7?XvZmVe%!%oHY7FWYUurXPEZj}fwVN*n z{BgCFdJcmFcFe^IBjl-*x?oN@ZjeNvS$#@8Nm0j~f18{$2oFrCANG+^KWqbjMShEtK^nI-QSYP_EA%|AGD z4C>Y8Um988yKZ#x9LS2rQ@V4jF=jd*_(E-sLU;2?go6uGspM&DKnL11Tdh8ZpCLRDb%5q zH0uQ++R#t(rcVZXwuH_(LdkT|zVYcK`xw>OR@m81&?@eV(x^v6!cZcC`l~3nB5)kj z&W+0(XC*~V7q5Z#(zJGzuK+a*J+Q1^JWguD;FtkQA@282wCOzsa_niXEaxr%wAUeu zZRkHf753^3V>F;9Q9VT)*W!#z2RGh~z<;4*s!YPjmo?Yc*70~Y>A<*FR-z>91{SL4 z@$BYVqCu3BKj5=dYyUtTDJrdVsxInuc5rH#wEQaBAdioCxt@mJPow=$!wd~=q|KRL z&L2yK&*D!_RnzY!Gl+AwQ-cCVoWd;Tg9pzpgLD$h1h|1kfD(HsblyCK1TbdJwB9m- z?#V~G?zH?O#G(B?dFwdgFbv;z6e$Dwi&{fy(m@1T@#It_i|%mixvqWLHTc{knU8S- zsLF5zMnaAIO@o0T7riRWRZo{CIL@fm#z?~Tx;5Uiqz$#DD=Tj)rQZ_qJi`zmG zF}W}gBmQt+Buf@R2M9ifElrS|0!`gX1M!m?;?w>-79jmVN+z$ttQFCiKiq7;aA&`@Ke$W0%1TA_WXTc~0}D#DUqeAT`mwm-?TGPoS*;dr->m1)q@m{mf0%78 zq7_+>t_D`vl_jp~N>fEp$KWd9bF4uCXOlV`DV;^MYXiL z=WvKNiV95@Ud|gnP#5Tg%)gQdZflS`7xmGXd@$VmOLOm#rT%mNH5tZ5J9D<6b?SnK zf`JatfhkgFVDR-yKx~0sr^!s-uIA0dFzBB$F3gK`x&%_TeDC(0evWUxO5;NUSA%pG z*&^bFEO8Taz5`%Qoy@zXx0XBtj{k>-tL;-owL6M&Lh^KrE=K z<|AwQq0u)(6AdQbzV8wyuK%m5@xIQ&H#pdQYyQ)NlLh-%z*GD`@ihNO-SdA1R4aN| ztbN3(S{K1xy|>C?4`C%&Wc^F6k-qQr(ff@@m)vBnAujHrFz18FJLTF zKnXzDB=^Y1<$t3;LrFlD z@8bC@`bOQV2Y*J^KKm~>jwo9NgnVOCe3Tge_8%O~3NG)H2l?#T5~E^~mB$~COLChO z^2Z}}D_xr`lR(sy$S;c}+i|M04_7Q;O5%WTGDQ|Yx@BEYDeahdL;Hft2`}K&P2Px6 zo!rjJ(oKr{MdeWH(p{AygU;PSsnJWQ=bDnAAa@RddgP`6c2rNbN%;MJYm%7BKyJml z?s2MSDBR!J56I#>fqZM|k=5}&^9s#Q&TW6=5^Nmkb9WU;Z7b7dk&IQq1^n)LzU)VD z;$fsSN8I{&#pjOpGrcYxO=~sj)qlmIT+nLmYTj=QkvvU~;EB1kAmxagV=VoMG2z2B z1w2x=Bh?Fwn!+u;4l+*_f~J8M1+5MeQ~e_#sL1>xLbOlsQp}_$j2!RSvW0h1b1``B zO%m$vx1?*lr>C^Q$4X!s?vj=@B3}MvQ~z=b)XixyeWkGMxX{7>rRJYvm`hh%GyYBn zzl&-~o=;4%MvV2|leye7tE)LJ7LAp*1u0y6G_1~0v@K~{S{_xz*E3AQS7wp@d7um$ z1K<|3!85{rZCalDXl*sMbsHRUFYBj_)boh{%d5_qxgb}^5);6P2FJ>M#Kw7~NFp}s zq-Dp~t}~vheTiUV)4IYi+$wsly~*)uVR63XGxo$7Z44apr>1BNa)kp3Dj@CeFdc+J z(`Dl>!zqnpx6SD2SuVavk%l*64=5eqhl2-qJOpoG`E@*Izt_F0F~YbH_G4DY9ANM4 z^7AxiP7`%VF}j#EQT_sNF##&c$~9g<0sg#I^0`G*Ychg~5UL$sr^W~EidL=76driB zv$84?r81tlvMdwvDy5P-?1!*HFEnfM1(c^Qomj`R1I2dz`l)ydw4sJdzCgt_z=2LI z@JS6Z%8;K#vR}PAnpSQV%^?{h#0S-W5cupxmHbFU~|WrjDDDP}jU_!{;E@ zo}We2Id`G;V(}48WNV|S3Jk5EV%jsLkLO2MC7)PQ{+g5wn=) zFCN`u+lmZr?RHeU>enVf<8>d}9%3@<7$BaQnq-z#@E*mP)Qm4xyjJ9=X05d|CaC?AqK>+Xbwsp&F-}*^ zvyc!2A0>?zI{X-x5*6{{iFJ|`y=hEIJ>1mj154z6~$lp_4zRQ)kr z26c-N+-j^Av?AdgxaV_{G$;E=|*e$bqu9D7t+k_Cv?yQa68yH?+=z-EAFkI{10a=^45-sCUg9>Wf|zK2EREKL@l zxc^m?q|syYuE1izu_ao*y^(TQh*rn2Vd13P^|7?`8~t8!H`%Yf5}i6LHu2e{QTsNZ zc1!g0X#=&;t) z0GvMl-4lG+1QVrb4-;c**<%CrJqNv?!mfqC(@`4lx4J{re0*qRWvx@xPP-KGl=%Xc z&G+F0g9iCKESEkp{X)ty-3xgq8Ux@LLNkKJ2QpsZ`QX6KG(G1so)8(|De)Ex1jUB=FZj z2~CsM?9I&Q4cWZWly%mN8uZw8WYPdii+$svr*ilW$yh=m34xYcij(uETtnXc-Sm;` zmTg8f6^37wTU5-r)TzRgTCar^aK%sE$1@TR@A_vNQ?DCY_S>DB^?*>zmI=QkbsZ^} z2IJ%G?4mLs(;9}%s|qaaC>+TT*sR3;EMdRTK9ZKq)qDMDW_hsg$X0rG#tDztXUTT? zln6M=Ogw0XtBjz=g_{UVBjIZY4R>_VTW!@fBcE*;MYMbjkI}=|DN1s{`3;xigZ5+5 z&5T)4RGxah!w03hb}q29@q*u9HT}?|oDelTJJf|jCUIn%Mu=QV=!1cvwP;}^@%U89 zHeA(zaB^NSiIk;M>o(|H^(0W9eMT;_m(LC0mMp_Yq7f0xOwP?INe{TL$0$g#avpO5 zEk*y$DgBWMHO~o;hD)q+*tb8!U8@z*_8_`tj{i9z1r986uoJxtJ!aeat3g2P+>6*cer6G~~hEUmeK^QIm ztGY5Kg(x!y7wssy0vsxY6U+sL!*GDaF%>Z~Ji~VJ2U7p#zqy9{^oYk z$wkivc@dp)=4-fjYC3X_|KN6^_siWOUmI7?m!Y-$x)V&Y+FV|qAjQLt9K1_+aLXm; zW23OY{YHv`__txvNlo$!rnok?m>oBI{e}eTt(Or?U5r-HT}*Hx<_I+Vds-&2_`wv1XxEpbJY=# z5zm6fH}As>XmFUdH-R6wy=nuLA;>$ct7k9c%SbcKs=`?r*heR>h$)?b7AZ!Fl7hp_ojx< zVz0LBa(3#~q1}$OI5z?=jA8S)HtlrN=*p8bkWuCY?cVx<=ZvwRO6{_KT1T%-;KTC( zV>XpB_LKO_bM`w+j-YsUZN%4VB3p4JKZiYhvRT&$A<yg5q&JQZKboW~cO^NrV% z_m)yMI(E1>RD$UIu$~^MYI@2G?oZ6RG4lnMI>@U{RSO%~{4K4a>r2h2((}AUcI`_a zOXNHegkGQQ64WPxweK}cW|4!k%xfUDm9L|uzoX0jKaA9IgACf66+Xts8+TR4zC4UA z>l8-la!+!xU}uDGN~xq*;8Z^-T7VYZEA5^0s)V^Wfq~(+RVHdd5>i(S%Zs%`&P1|4g z+C^5rMr+ebc1oni;Z(T^V0*eol@tnNJylBwcqmF?&h4MaKji_m;1b`=&(060au*3* zhI85mJj?z+_dECO6eUh5p58EP68?j0x8DNFHPG$P?s*XIE~3`oJBY!H^}J(wx-hVP z3Qkau>Z*t3^KgjC-E9lS{)1CTkym2+WR{Q+HLsNW`k{_8bW&Pkf?Y>D8qsL~cF&p! zB}f_-L8xIa_>rAg2KVRa@z5Nb)%N0f4oG^PsX_i^*WN=GQLc4wdoRIbEy(UMwgCpw z{xw|Qsx|QC!>Eu9;{M6W{gTz5{-5`_f6|v&1s>VaY6ZIEZrvHba*gei+^Ii(uaX6c z_E}Q)oiPIPhQF;F5tp5p*R)5AlooZ{)8uW+qgR0Sr+H&ORA`yi-HqS+pRvp>8phe+ zkv9hLZ(hy_SW}46JErmRjPrimxsu&uAOZSVeSoLyC7fiY`1wn7W2;$JVKY!3TBm*9 z)G}@9*N-CbtY2;wAdfh8ASgr(_cfAEaH8%e@5$9S`Iv!9>tW2ueQw+_BH>!3Fr=gs z5@(r{QJZ*^lo87&&ny!^p=lMl8!1H}DKM-$61t$q&;gA08T_2J7?vNj)zdMb0Z@4! zy#A~y#c`So_VJ;L+6)mT5g~<1h%f?Z(FA|_Rkpm7)1*oAfy0FZ%QzEPE3=d-iuiWn z3SqwH+_Unu2^+d~MS+24Q3VZE4~hKi=51K~`dk&sQ0s-iNv|`HtbIH%qJAI4WYCR- z;`R)Bw?Z*{b>R8?9S~H$(G#2K=WVwq_2Cn@*elk{wO{ba^yeTtA@%7OOh1#g+0{%w z>i=Og9o24(w|vCLEx>)IV zN0|4}d!(}nRz0U5O1pRqgTVw9KouF>JSC}fqIbF%KL* zz{M^NLL!aA{l~l^%YS_GE~XM_pED=FS?aD=jcQ{qA3OW5%g7q)n{pd10H}H^W`bUx zor`zZTX|LhfkdijRAKtum7?xO6*>V8L_sp2Q2Rv#6BZrD^TTqU<*PsA+xw2|KN8RF zX?~%K#24_QCbv)MyFNzFzt{Coarpbu$xTz2G%t!fwttX1@i4~kxW_Zi1$q373XZ)g zqhTwfmZ!g+R)hASI_8M&BC=rz=x(&t@;kSGq6pQB@Pi-9Pl(59b^=x9edabBw^IT{ zmqp~lWYh(EzC7q&SR586eKlV#qXk6Svy45+vpYp`_0J8QpGYUUsjd)NVqnR%H9?mA`;tOh03!|vNuE5aAsAH{`N|Cr=ox|F|j7EiQ~ z_#b=-zFyKEb3iKh6-xizAS@cN=f(7vrB3yw8XqKetG>TiVODu(Tcb>$Cz@Ylow4#S zxMD^1qt%2lc@IEzoJ453tC8&!t=jR5__}!xrBA~LD|4y-QK%v98a)i0mu4!HtVk;M zTjg3~GfbhRU69&u-(aVnK0(wv2U~63ywco?6V8epyKt@`D{0+(cxK7kUz8Q206ETx z+^5p&lYIO5{jyrN^^J$Xpp|y8mlL1#zQL#X($zuysro|zvBW<{y6xYVK#xUJMRiAt z@m5p*qSggMn)W?_uE(uq@7GmtMqtXhwEk!Jfh8UMv~P0OU+F%myTvoU+h`M?GAPOQ zoFUN^uKzWBocN{XbNJ8aoBn2|^goSyx~0&R!P)oYU!>>Jt4BG8d~tjaMR|wqG(-!bE33Me z9pZB-!3=3|WNh$%SL3&LYm8swVKlkaWNp5PhZQDKS88P1@)$r!2%@?7(t!;g*-7cJ zvx7I0Fav=p>ZkTuf^ibo7k`KNjww=MaF;5TR|oFKiJ-}ea7{9)!#;mbK6P~KeXJ>&E_a-hgr3xi7gFORzhUEu^mBOe=U%%Qp&VuaVz z+Z|lT8}>cF@KQe1)VinnvC%q7Ie3JH-e~(3MHl+49;8FryN8O_cGp=}Rq-bRsFbr`j<%~}^S(svuhha5UERd=Y@})q zsxksbIZ+zcR=JyG3CA?6HjjcUI!M`aDy4ygZFV?d+6{s-!ttwNZGyj0;@LM#-8jV} z6aE+-n<=A%grP5-EIwn#vDhy#R;0sG`;F#jP_c_M8Kj{^I~{-v(Z4=--w0ZdZE(Y5 zE!t!|V&c-|AeK2S7B@haf;(QIljk>JN;Q${;B9HM8)5x#bKA?fhGd({amUHTXDNS<@C=5eNM z-?17u5?%EGyehX)U^DSgjRWhJ-QdsR&k_%wC5qyf0iYR)1q>DBFY5(j?>Pq-)nJmz zuwPbMLIT_cZ&?F-{(iiFgX zTir3{-g{!#U=TfirLtDyC~uMy-3~pVCLnx=Y9(o;5?ufBVuh(Fb5d!H?pMD>pS3ZV zI>^Pujwn?p&*7qZQ5MNWq<KSr6HT|LV)PPSIrLTqB{gFl)fqJCG|3FOMP zQ)vW$HIXv3hu~L4Z)<9DvsBBZUX6;zsQ7;PpnzeMk;+N^tn4M8eV%~AXJ9W^*Rl5a zrjoH(u$B}7?qHc~9hW}YMLl91@9VsE$5Zj;M24u*OEGF$I19#!#@oGHFr?E((Z$~2 zaB6H|eSC2A%h!3aw*yUEbu&HhUORnZ|Mu6TWODrWQ4xq2&%}_nf&ETl$33SXHG_|b z1_3jJRmv1IBl|TzBGgm# zhH10J5AyT-%KsA~4hD()e_ebSq!Rn;M?VL3Z=dIVJV_A&r+&LD)Ms? z+`r9_9e23iYIQTr-ySfjjXZ}w>+y6gP>v9G{*on5QsNW&5-3T#_odei6tK<2mZR_D8qOrWytxK;TXvGsgb<#+RP1 z==F#4q-EP%{29`!OcqV%_-8t=FLTH2J!;9S&Vck?u%x^d2vl@Q9iMuR>~nr^U%vau z=BlZo_mO*U=;JPj?El^6KP-t-t#VPLYQard8cXurmCs?pTaZj+~ZbgD?@Zjz) z#d@>P+5c6T2ul@Iur;X5T^Gsj^4uPia;S;xz~+R?skHJ9oNac0?SA) zC7#@Tv$5&w^mYQmxT)%t(5}J%=7Tx(*)8!j`|gR0vaSasn{Pu0CuSV;sAL*_^=9JJ zX!VD&a~WzcJQX6!TSg#g^BBr8u-uLsZKpM{603`qFuVZ^b3~-<#!O!i%&K_GPiQV( zOq%&Q(As;+TQ#NQC2OdTQl`Ka9wn(aX{jyy{ZNzz$+XmN>CLaS-x^&k{)TI4j$VAS zMcOGy9g}7PR5g(l(v5|IIp%$yVd=HL#$|l2kC2k^{9+kj>vd|~;qPkB*dir#bnv}` zB9eaD(fC-~P{%rFzHej=IWf4WW5!Oa8d9m&540hEkAL`}Ymt|F9=n;T^rr)!uzZT3 z0Ar(6%jPd11F~p^5=VVQM6tOoxsGBt_;4?nRwuR+qXp{y;~PqP*l`j3nj;p z0SN5EMM&=2RIqTD=I(7ir6s5?9WsnUML#k&q=Jbf-%FEgiBp>~yW+opBU14Dv^4dI zH+DEocy`$V8g5aiVvI9DOL4y?MB_^PZXjEhCVI>4$b(pJc5u#c!L}mbB4k-TpQst8 z#H@R|fsQreth&Z*CH!Ek)mxG^%(GwFFzS?Bl2__O(Vy)@RInx+Js9fvboU*JkDYsw zD!^oD@kcf;oSjlU=gU)1hiH$yTx1sNlHGC=lqNsJ^sTin@LlPR9fq=KhKH8 z>`PI}&5}TepQw*cD}QRIH?$M7_2GhQlyg{3*Vb5F3;2gJFUI{3dFlx`^cp#4r#{}s z89XC`cFX#is7qc$O+`#D$ZBJK^|Zo%fK|{#o$JI zlSW?ichM~YUYzdladVl4TM1N9h<4ELG1_>AjkQD-5d_7|YPx}Pm^fY?Uy-%fSLoWi ztNluaeQ}6wZ9ZzP6s)lL`uu_U=b$~d?s(&qm4QIJtV|M3k?-W|1qM7|D)eL2rzRo! zC+@&@wX|NY-F(NYxqz(&;vh<7yXCd zBaMcZn!|G;0t$I#C@kSq!8JIy`4kE8JAeD+p#|TB;DSCWrVJG`DHQac*TrOS-9Lp_ z$tZcEeb7p&8yICA`3?MnryES}xZ2PljVrFAq2UP0F8&$r?`>}w{946P@@95^zRX)_ zTHSxEMjXp=g)}$?R%Y(|4<$U8f!uC0LpLWg;Y<@#eqc)&J8;LjOj zuH9N!zp6@%i0!i$xadoMs8+chX8e45UJrul9In!C)YI_khn+l$U8y^?2-dftlFF-4 zyQcDkq-QlTec13&%FzhX%@9nemB3j!=k6MN&FRr^d8yDahv^LOR6SbCNWdCDCCnZ* zF?b*3XIn-})bZ7?G$sCB?sl+gmzikLqeqt9+AQ5DMa)7*ZMg?sFYIjq<8G(ZNYHLM z!_Mc5pRY64T3r(vY#6gKhvLy}jO2)=49w5JdYvwbPOs|OSg3dFzFTGpwAn2GI7nbo zWG3W91(8u^J*5Z)H0T5%_Di#DxD8|vV_j93y&9{+AaIpS zH}}Q#GoR5wJQBAh<8mf^L-GN6Px1w_dOa##TIGVYj&5{W2^2_lv^E(4oZ_ESi)=7k!^CaGM8&lXFJcghdv| zlp?c~&ZZsX46|hVd>FOhHQ}+G&oiRDrr0j!My`5FS&j7!M9c~iLQNFnpubT!v(;;r z&wXRXangU~F|&v1g*y&BGJebqavNdU?gM}h%-0&S_-dJTU_NQhd$8X-UwAHDSstc7 z-^XwdnbsScb}C%;Ot!NSBbVUjV$JOgq1A)fD zg^QcL>jz!in%JFHChb(OzH{0MUC1z&QEf327V}0^}dTCn|5De*HSmPGPSXM(r zxpOb)M4DOvkrN>*=#U;S`tV`wpWWBp>*kUl2~=@L_bVf3T%)OEU6+hCsZ0oc;u`|E zDL4(jeI!X*f$9N@v$R8h^s0BJ2Y%lZ&zwIz@vO`|89wez8&lUG4{-q()x5>>`@Xtf zUYv1FJrQ1Pz4G%&skIf#6u#3u{3aqkG>T6)IVn!+;jp{CElVi7p2U2RXGlK|cHnGS z#Hp2`Yc4lLZp3kR$sqD5PA7VH*s{_FolyE|uvA*x(Sf|vxR;d9)yiq)JS?oS@8>NK=SG5xB@!Ne4$)L}3LTM{CQyib+CIqfQP!dt?~e&q_9lphsGZ^?cx5E#RoJ!2&4DFSlU|3X&scBN6@ z^vY)PQ_N+Kx<*PwI|%Iro+ExJ7!bYHWAyY=gYKk^h{$r2$>-vB?lAnygaXZZ@$yBVEJ42@sg<5jDgIryjpSJQiQA(L zC73gNceQg)g&TEf3eyWH<)3mSHYR8b-vxt<7tlgVsI+)lN1u_?ix-EbnT;I46*)ra zdMPQDqavcrH!wo9qpWmVDxO{A_jb1q>JAOj;PF2c&x{yG2XG&0HVN+6zF&!$DxO4x zq7L}K6^kb|Ww~FuyTUXa_0l*B3cN!JFfkZKE5XoE<=Q**GQ@tp1ODvNE6tC8?JWLA zC;o@c0@3@H_i~h=EeaI}^)JR~8Q`t^H;pWlFuQ0@UfQ$)kVaJZ2{uj##*uJ4k%(BG#0@~|)-gSE5aoxZh=-RXO zcX)__SaCy{9Y@3Q8Q&#MetC=Nq!$`AjCzHthv+Lw!hDNXAMOKaj4F!xW8$jKe_Y8~ z3N3+dzHv8^*rXH5$mXRZl76rUY9T5a6yUTr<2cx+uB2ej`12W7x(CRYL><}LcnBG3 z;a}k&_A#$~41WjRL?ZK{!=c)>+07&&@{FrEcUcLU|5LM{>Tite5=VHNWBB3-$v*D* z{@-@8u_U4TbWc=At*PU-)rw>TGO@fby~7eo@7b>3#3Sso3k`z%xL47xs@g4=o@h6!xEQzF5b*5O*RDH#ghbZoz+PvplySDL*$T7Y}Mrlj9{Y#sCDW)-geR2 zAXjxGa-|@Nww6>4C=x9+S>*A98+qDyTl^>?u{?I`6egSY z7?)Ke`_MajaV4D;g^A4%=G>v75m?Z86mstx%QEIECd#_H2R8qd(q432_^%`%5>1L*XrG{wJy6rP9Ha4Lj`AWt?D|CvV zrJAmp!FoSq(xM1W7fRD8N!*)j{(|`S0fi$lo%rbYFK5KiJs&cH1=Vs-!Q>rMo>eF2B(6Y68Z}baqJ6SbFG7t4ggAaU2Bdiay`(1L_Yayu)|7 zJ%9aSfx}B{nJ)@W%7f#a!)X@?(00@@yN3pHOpY2hX+H672qV*e8+YbpHH$rL16 z!5W}0D@2oIj`{HUw5dJ-3x1t4lTuepn4Ag2_cu-@G{1<&rh`8QtCeS_U zAyY;)SIzKbOk(iLGm!u~Jm$&a$mr{gt1~wRlRAh-Q&Sp+fF%SPfN|osx;hx^%gwmX zSp&3{cD7sYJUc#{@hokYNUa!r(>OJ%K?8&X>?orm86zV30UxelmGxz>iuNsa?KY(U z1`-DnGTGOs9q2K^!ffTtG5`?LtR?ouUQp`mx8^Ug#fc;P9+E2jKCV7yi;&PPIW_IE z=tmXmhPw3W(rYrKY5$bQ!rz=nO)AX*uV=`*?poim?<*rEr29_Q2GVU~btf0g1h$!F zuM;;_Fyd$c-{nLkv%Z=MS$$StlomO;Grsd*N^`Ss>T51zY@=Zd$82)$V&EeJxg5P2 zB!>}?&y^)P)TKU@{PB|VESP?`+HiW6Uu0GqqToAUf<>6PE=oTg6Y_}?o6queNuYJ^ z#0>q=oRtDYnDDp$W{0tTT86&iAA*bwJ-ZO0^AOe0bWBQhM8uY7zp{r`Nt}X)!{AnZ z;~y*Ot=g;^f*&qC%erl7iFWzeBlBu}Vwqq4e`2`}!dzAbrc`}DeEGq#Z#1z)Vl;cB zoVifR4Nuna?~??=F~<2ZA!ms|$eI{(HZnN(^<(7Lkc%r=I=r!ho5Uz?)jTeLUuR?7 zG37vdO2TlfI5xctfFeIg8o(LrZ0I3MyLMf1Z}p2b9a)F@F0u5FYQLTmtO$^*AY?^7K z(Toc(AwMXz3N7rg@lS-_E%s%bBMH!x$_jcGG;3>zM@=XbJ)+1)Ge!ajf$WOgr?dOr zzlEjRMI*T&L6Nq$grMIJk&r?ZY5J<~-Z^<3KDCMam4^12_ff!3^q}{6`nI;45%v{W zCh5DMFcf6tjg&S_0xnBEb{gd1Lk+TjWP7E_ELzI-J+E%&7a6`LYBHRE;NJ@6$HJ+U zk*O)ubN!)1Wq%RycG2_FZYgyU2Pa1MYi1Y4h#1TMEuCgCsv z6~mk!!qsTkaf$Cm7G7N;EG2i1C!sL#iMi&kH~9r;%4>sEz|9QYgC(}+w@Y%~eo9{@Q36h7yc^mkBKx zmx;5}5GiJWnnd3wJ+&Be6w-6yc2PrL_QJZqiEEb`?u_PhS;{3Jv$GB8f~m!w+onpw z-=m0yZr$9Ta4*|Mx32B9CZ!%tl8mJ&L2E>M*#?XqdxH=jya_sN^;^HE^;qR*AHp&^ zhgxIQPy;(;y4@ zG1`gt{=ANag_$tc+>-w1)+bSQze9LvJD+Ttx=!{s3-)NN5#K?mYqpdeW&+7{<72(; zl2|)4Z?ev5nUc6?$H$mIp)ysly%&;IjM>+TbNcK>srn9@IlKhGx*6<=3}srtNta;Q zQILekasVI~WbFpNwkwPShs1t#mt1285n2hYjs{;J7uEC9Gf=sG(QOlO5vRCkEG^08 zD%180HvD0d7L^`rX3be00ly z=m_pn!W0L*5a0Q1%ErMShx+O%D8N4@D{RE>@YnoJ+3K`Qui6j&d*e%2L%YdiXAB5! zg|}7(qJ{C2sW)z*Zzv%E9$y@o4J-uPWJ{JqJ1~bFlb20uv{FhNzu8jDQz~po1#epy z020F<^QCX7zLQ;+^>fnUGDIjiUVr36CfZae=bXx#mBuNL<=r`igsKCsY#6T+^oa{X zFBHHs^ZRiN;AuPjSo=mM4Q;|jxf8q&BYq^nCD{9tRt)26Iaa3CAo=YRk5`?)=JP8~oTf9tsv&=|ofd6pzin>cq(MKguHE2w zw?Wdxvbj$v(R$Lx%kqdA7pCV!isHH?xoB0t0SF>MxCQ7SXxI@wgOX91OxU4y%BiHB zsrEZK8JkZGr*j(Uoos~pN5G;vZlM9nI<1EZ)fXMdoGq}`b#h}-iQ2#b<+BwLT=qp? ziB_W3I4bk;&iCI`_AWp8d8-YoCe~pk|0S5Ki_<0h?md+2E}X`Uq7^9l>P4)l8rZoP zR8p5D{rNE7*1)2n9#(R5RgtkQV`(qfrk2NC$UqhXPJD7h8gq7gIVhA3&M4d$(T36= zbMq>!kZ3rpvZO+Zt3OCOBv<{Mo|enu46|Zgv4)4CV9ceW2k8B{NX3AtYx)RuTI%l> zR!>aNVE){a!!_3}!ruM^x}bdiwkLmr^n?DDqGi4Y9^xPZglDs=%i)UgTiN^iC6zx8 zIp0OwWNGemA1_rdVb7`BXz4A^ssrn}_*KPWWw<#@1{a-qm|$IVnOh{*t$y61 z4yX=SKFZuHgMFZU#lyGTe35h?Yxg$#gI>}XCg0@dwXlH7Wy^UNhgg_neq}+0Jbi~z zls_Q>mhw}Zy2QF_*y$l`nvTppkGPDTKa)7oZt3b{#Zq1 zF45FhiaM`$E&)q%l{B#mQuypSUlKI^SdBt?UKl@y#Bn(~5G17vM0r%M{91&9i+zG{ ziW1k0i!~Am%$YL%J{+hl8RNjI1g;HC$BU{<2xXa@B&Y6j#TXCpIJzw96MV1*LsY5) z^x`8JXLVh9tAa3{6r?W(>lpVS2Q=YM8HFZN(K5v7FiZ43VV9d(-arb7)hBIjlH{Tw z;_OUU`**?Gx^9c5On()Hv8rBpie{peH$Qxz7cK5cE1XTyw@B*m=(QXn*?5`ZQq6Le zFcTSLh%_o&z@(vjjC{I2U1A|2R~lBbw-%gHfXj0W?Tr9=F!;BTZP=DLwUnw};8E6G zL&f>1cuV=&Ou20bPIQ-xXh##hvZ{_?nN8B5T{M)b_>|z|UMin;kGE~pS_~pq{mqb% z#V%J~s8J;W?{9ygICG$hY^USu4t9IA%T>12ECjz!^VZ_KK}m_#2H(%_6Tj@cnIc;H zwW+v~US8%ZvJGf{@#4(Od~WiWU%uQ1$UY&NKr!mjFvEC>LXYWg$CBo5ijnDQU8AT2 zi4b!mgl6(NDp|WIOslD4$CTD)dP;K|rl#SI+gtRN2`jKo?1ikq-CTp7O`!|o(Mr<6 z`Vl)_NnT)pG3Zm|%R4QnH8>m10b7qjn#^p!S}SX-R>pO}r?>7YYJ;?{!W@Vh!xds_ z4n=(Xur^sxxvh^cSnSo7+hk&eb-MD#f#K`uL(lr>w?Y^54oS;a`1AIC_-dUmb;3?) zU&z~EjL8=JZQKa$7iagi9K*AcYFXzn?8RA5b4zF* zI0hZ8=qDCcR*q0 zRYl-8>$qNVWqnb=}|o}*g~3)fs&5y6{H6>sb`N{SGrKaXRA|N zw<5)Ma%Q4ipb=n^!L~jVe31~KJqilo&W;!qF}+h@3ZJf?Rk+B|DJVDT{J<;HqSSlYm zw#?^uq5FVAIrQnp`STg9s%lkxiW`6T+i|7Z*Bf63MiYsIQ5FuN=#H*Ti`KPUI=Zh- zX9_kKI;Q(9mH6S=#g%$@kbDK5z;CMc%yLc201)_7BjRtz;%L7*%g^+WtBZ9vI62mb z#gNoZRmRU?10<0GvcLZqXoX^R44IP2zoU}tqLRJ4naTe>G}!PvmKR=D;dz4SF;|-* zR$v5v(Pyk4_C$|&GWe(#-_fC8flwT|u(=38SI)z9uOImRxvLspLdXIXqu5F3=cIs$ z8X84JFd1m5yCPOE0+ zs`w&me`xBZ{Q0wm5T-|PI)x^ictPe9?S_~r^47(q`<9sCQK0RI~MB<%wY4MX&?7T|63pdFu z1PMz(9iQ^nlk)x0ejDv&U+3Xlc*CQ9b)0N@Rp`-_4y5)4)46j*_(Q3#l(0-5w}}YLrBWx;kD}yTm1p)T{Uwtu39&-*AI9~ju&=*& zO#L%+iW@3e8kxkur7FBRfY@$epLStBkdMXb`2ztd2a#QG@BlidOVYjFf|4}3 zBdumj^6cOy#epWQ*)wBeBz#@L-})|_Y1e3FHNY}A!+sHWT8OZA@E=N!P1$j7vYw?H zlMDdMRqiO@dSfnBXnG<>$t2yaqN;-!r#A>x4M%fVa3NUFo?v3=uyX|_e*Xn!;@w$4KkmG%@icPNM_TRxdQJ0s_3AnZ zG&iepl7afZ*!pv$l3ldSx3&HYw8W$sG$3jeAD;nO(5{80kCao1Q~D%!w_}!|Y{@TU z#>RTx`jF{Ml=9S|RIpreJX6Ts>)-re%)*YBq;>Owu8z+sj#JmyYMKaIeWi{`sY6+6 zsp4o^tJf&1xmEbD0$x0ECsico;oXeu9W>UjC?ZXV#;pP8dL?dP)bDCO>@U(edeWM% zW^y-$Qj)O}Pq;@(+FGM8byo0Wux?rn+?XdXoii8mooTzeVeiE?g69uLP5K!cOzMAv3W})99glz-f zqll^)x-PHCtmL2@#x`!yHpgEjm8U87wU#=Bk79i@2VLkz5yb(NR~&mylByV2OBGuG zl4td$2pGn~S_D#>E0#hS@p5RCxbV2_P$fAVGeiA5;S=D8y(s;;hAlSA6d_nCccQ+$m{4OV z#Wjq6{&G5_KYm0a1ScH5QYG&+OVe>k#T2pB7}%|?joUaSkLgGwN&5Yk>ll~)hGl7N zl0l>(iHD870y)0}Eb;tA$>pP%HrN&4F(9~nkG^^ZFW&;K7f3j9Js)_W%)(*M6)s!- zlJo07MV*?=H}B1i+5Is7TmyxN+&ma;z78KxF!%GSV^$9^`cZUrtjxd^GL7jXv|=>u zUN7#`w)}9?nlW6~!Z3BCa>iDuY6!T{Cf+=7DPeR}N9@&mP;nQ+1m2Kd{|fB5nEbif zG?OY#d4tK}_i$?}s_Joh<2tGFe(kU+$7?WW+0J-}x@KwD_!nfr6ZJDj^^RNo66!%< z#*O)tZ06Q>vs#i2B$lBxhu`!-6!CZK`)hId40GM%ee-%5Tv=3yA9~^a~jNIcE?Zf9r~RW5V5k zFWgH$ZdT0uTQN}ad3B!WkXyA1S^?fvFLdFkBw#;5D;5?m&Ya}_axLCRL)C0hdYr62 zXHbl*A(pw7aQkQLCHuqkQ~i-fNXff+c12(#KaQ)%)UC?QRh<)N_0trdk_JwMf?~*! zKc)EftL)8rlLH2=$>dSSDG+Gh;iheAqhnfcUo6u*ku8B0cwh^Mh=!S02spsXWq5gr!H%`B+?JU|vc*<@EvFt74q1rxE)$2D-$k z_;xpW%Hr5l6Dp5o=Exq^ZhrnL?J!PHqop(z5RZv()BQ~-rOy3>UP#aDXruQHYLTzv z_mrD$d3HgD`ar?Uw|$M@rMDO}e1UL#T&~M|lJZ$GeWGl*$zS+v%$~jrP zu>P7ATJQ8JI^9cY1!JFDHhhI%B|MXQJkpj;t-yXe#)Mv7rBvWl*JZE=3%;BQo6*VZ zki2u4vqg9rs2dyORY zn$!oS6#*>r)OE3;OkaE+D;K6Bz$_KuAEF) zdwg42Mw|3!9RHXMcRPOWLgx7oR~`Gt*vWbbBVeWRl(4Yw0$9YQ%GJb*D!@^LS3>Un zn*^1@&`8}7MBT{BFzrL#A@BRcZ6!BhoNJJoM^#?*_6cauwAsJ2(DQb>`)7!95sgflS6Zp)pkW>F!#9CQy z$+Blduv1h6*0xqJVmb_8hmG3E+qYG{3WrMV+MQAIj9)fVwv2 z>n=WfKPwHiOvSb3UyO`$^r!U1dp!^Rp@YsFy*WrSmFRGv&z8$6$UM+N)76S=fpNyR z0SI@rj1vs~f_)e+^MUSxK~IVZRE7;`>ub$Saakoql?H(F(6VO`vZwr~%Xa8m>FTfV;!MTXnSZ(fap;Ew~6U=mIiFZA1JfaAf zWRV7j_#X6ZXexo+f{I1Ho8bJOlLBTRjmgu68b##JmO}npFPWEVX}FmoIBqvHL%1Sq zxQTlr_b){{{coP?&?^Z=LJwYG@n56g62BxT50DKCkQ06p46?=m#XCs866fnCE)}jS z4of6^^Pfv&s6D0qF3=%HJ1i?Srsf79Z`9PO9n{ZZg(|cRWcBlSJHeOj_`&YYLD3np zj10GAdl`#HMJ*(?$2NU6lzXpayF}#22nT*Pj5u-`*iY!hJk;?O{-<_goJ>mTaY!6? zHQPMX$`hm8!;*4UilsIqJt!oN1!mR!{%toMCdMAd=KiRVA<^Vknh3BYzO58!>}2XLG>7T88UA6NSIm9YuC+CG=sdfVk1)OKE*P(i_LN zv0u{+s;7pHUmiSR_bFfx3P|}D%Mdw?Y#(T46tQV5Yk}I6!u=`KPr2lpIOVO1t}+In z)?Xma^wo@o4+AqW{Jom+u}I!EcEc7#!!Nfqlt)T5LZ z?Jubm($Ys0lsHyage#8Q?JNOP!;{d5B3q^oiiS}S@*~CAfEG1JD0Ql=3lb%r>`Dl$ zs+2vh{AF$D_j5K$*5Ekfct-edaR@Y9(OnY{CUhyAUNp|R^llqd0gPjhjw+%x=f1zU zCd~kI{oy>%t0_I~YCv7~IrSQ8Mp_qcM4c`6A&JKohw|n3rfX+cjD8XG>X5jMn0Z(u zYhUM#k&~up3!_d&{gpf1Mt0*apr<6VFBo+IH*(yIgY@2xh+jUjaO5U+eJQnh|E8X$ z!Pa+6DtN_LS%d*Jh*vv+_Qons`qe)a4&M1}P;z3LWGlUN!MSZe2qvtr7L12y{!_se zsP;Ib`|`n-!vd7%&3ZMcLD0@{AS7RK{+rTX>Wye->7T9e=ZLR~A#o*MOWU6?ne;Q3 z!bmw=re&}#y}$271`JqA^IfrWt1B>8jJvHX;p4ksz=3n^?D2i(>?t9--}zM~zu|jz zoz8D|e3!JSby5&;=&zZTV#Q~|Jv$(h2W^F#ora9z9C#4Ej(0j9?KCTX)O^2mjBjy3 z!=X)%0?Xl)g<+xx$%y(}0o{w}l7|85i9p1S$6#)GS-3zmu~k8+qTIs$fe(J>-|(vF?2E>h94c!1v^BV5Yrwgqy*u+26UFgf#hx zp)RRG#Uh;`@Zwd<9|HFuV&xc^Sh;xay`WX)(b=!Y82~2Gru(DDyh?I) zR~H`uug*(bYfS0I|DiaOy4eRV_cveH-LSk$LJT&{!V8xsTi*bnT1qRrI`IY% zIJsBEKQ%^bdbf|vnUG7r=Gj_u2md9uy!cO|2EAK6Qb1GJEkUJ|iKNU?T#9a&nxtc9 zOOodV73UHV&M2Cgi3bN?P1B&F?&o%O-CMJ@%7w zEg@i^%BL*FRL$k5l{-ZQc=YK#0NdpbLOkaC8m4s(uzU<9J zL(Y5kBzAsnrOCBF6HF{dONEp=-ls;OAhFTU(HSDSx5^TyC zWG-Bf=U)7KiBA7WDR*9&s?ah!sgxu;Tcv9Fg6QTMdCCY|Z7+eLgCD1BN*8t@g$KMN z(lpgC^Lwahu1y4yV`+8A(2wuchv6fsNf4Lg3W!oYeJP_IBmGWjg#jD0_?-e_LgDVk z&1t0*>`%-PmyOc5bWI99p3F1_N=ykM8s2-Qa{81oMb zpQx#SdUD#A$hee+6jq+6Btw?2b4>Fn+&Hq;RG;^3Q*u3xWn@kcLCTGEoOwtOoO7kR zgX8?EET(c_V?wyMB7Ij{PSgfA4dvyf)nR3dru+u2f4bxbD_7^ohM)5T?Hnz6IM>H(*;40jO4mCGFd}>@;Qf%VpRcS5x=B z?_oBX%!<%pT5KKEF|x6@Q}MtM^_hBw#PxMIn2)gIJEdG!T_Nel zA`@ERHXsbzZ=|fwrBE&ERC%Z`*)Y9h+U|B8Y8Cy;+6ZQ9$?;CTWb2`2Y}T``Ma0p( zXnm@eCIUgZ~#s4jJNTaw*-8b5Z$D z|6^wKl5p&Mu$Vg?UCujM|9~fMZNQBgRic3j=pYV%m7alP&}D%{Z_h{D;o!|L%I$r4 z_5!RCamcSb`D^T5fnite=oDEP``}_~ms`#gk?6^!?v(UD6nwe(f+g}dAovX?J!vH& zjDq59jN5u?;)e5bL>AJ@F)H~w-gfCYd85(Gkfs*K#EM5Kr49#n1f}$G3q2EUtoEIC zlPYq|)-$Rls~cojDMIrY5W|tuovjN&JRQp;)%V5?7R*MIUkTT6VZ!|_W)hj?pU{(b z#=PAEEA?;3pK&;@emQ;>124UKyT_NKWRss}uEjA#=_}tLwt2_RPGO8AU|p=-=IEmw zf9yU^B216erfJ7=snd;7>?JudkUAu61@#<46~c%dhyKRaNVStLz5W}Bu9#zRHXbym zQ^trFSow~?z)^vWYH0wKJ2jmUn+8(`t?>~@QAa$ZwiGDI2ijs6&L}a5k^oqAsmsOqNCA$2 z`5yf28n|*ha4XgCKv<7h{wg$h4^uA#T<(&yT5;~UgIMqs($;b|ys7#xBG-ccN{@-E ze1;UfNsbw1P~6c^TK}@ap+Dm|7vnBtcU(7tVD!;uBY!73l!!BUWK;ZHV33f!scWMv z+;U~wB3$n=QpEK<&osSOyWy-5`?UEZG}r1AXJQiQ*|<0;z)MslD1}@EH%IYIt@GKn z()e`QPCvFSl8WFfo!;-55Lnb}AJ^L}8nvy@o!*U%f4Tcqx@G(DpFjLV@n$fP0Ks@a z5gnhPSM8TuIDMsy9j$5zBzvYhs$=gTRKY)bJCHb1TjiuYg}u<?r9+=}i~<$IqLEd)g`pQ>CU#A5TXouy8Fh z3Is1vuSS;|F$lbyCdKwsNB)Fs1Ei4(i|M@~!0Ij|T*YobuDkZtBd_g}DZSu_m#NQ% zRvP3v%Gq0jQ5|1XC}ZDKL&J=^aKuCwSGe|J)u3OAoNqz66&i-oXTF3tGa=^gfd6S< zy)onk5m~#~LjX5Ka*jENa7U$Ujce914m)$m+Cs)l*f&n7>o?niDVT^sh_|W0; z?j`LDxXF9=_{OW5U}^=4&A;NJXFpCM>QflR_@@5R?Z2DUmNa&L``B6VQ5M>=Uz5dE z5LaRGe zE4x+vKJEOnkKmwxCW1C#nx!?c|c7-DxWO7wBH`s$q zUpb@w_uIK>--9W=1PILCF|2iv|6Z=-feNHwc9lE>p0{U(;&;1w3+Mgr7pDL7e)Cbd z{@oE~g=*9PDC&N1)~6VN=E3C2kp>9XYOi6>Q8B(JE&xyLg7H(`Yv)G%lKCFIW*Y1m zQrvnyI0vAwHskF#wUYJdSh$L-!FY1Sob#Y3jPXin(sZ*tH*aK3Pn~C-zHSw_3Ub7A z+9>aslJZ(2&GRk3U9aa$KI#yv?;O-vt|KFMSxj2khr>S+3Vb>sQ?S94@iLP5+#SeG z2mg{rbUS`E^BZ0r8^>TfuX&=>#P7S{mzFQ;Tq}Ya>hE%Nc z9!c&H#NnHp@e9}MDk>^=$m{p$twoHOCwwOjIKMwwh;P={jHt+WPS?(vwtWHvArr)C8K(QtJh09Je#`AuATEY$B3XF zriOngT%v`e(N>IpRZa%G`sKGmUVzk+?icEX>>JJ|PB3d{HZ zFeAdjc4p7hl43(8elNx2&H@&Ab-@M5C3|eX8pD}8tx&+lEWF_VhtgzA`1ucp|Hp^j zXT7r5%20#ib}c3Od+1s5fqrMAGhXK zauNG>jx!S{n4^vSrJaNy6@t;j0AV?i2~s6QLVlj)9ftL`jUSVllne8-3$IR@i_ZeH ze5QT5bD}EuW$^R3m9aC*>X|nL>RCBv^~QKvZ?Ycz3if4nj{V%qXZ*m?-F7VIrR6^R zNcf*B_)ThUrkWf^ips|^F{4MMFK2~s=ekFkz;S6CT}M%i{_TlRBNbKgg+;E@7_*W!ed!Ntr%{Mgy@P(A`OR{-#Fe};wfEQZL{}y% zRYLPk(vJInVTJNaC~tDXr`jcK_XczqB zC3Ye1Mv1cp>uJ;bLm|oE7zTMY8_pI}U9*h_zoZ3JG(MMlkd!@;6t~vsHjb9r8t&~r z23DE&uL`Q@ldj+mc!#IhJjTt7DGTC)(TWc$e1HX&N;0aTT5^q`J%?`-ElyIM9reYK zu{z7Pra3#sIF4C;MePP>d-8Zm%~_-5m7CJTip4{xk``~zvg?c*1;rz-sP0ro2sz-} z7s~Z`9F9c9dzbymSj8AwLWEUNl-uB?2sK0{?^?&WjIg`uJ`YeN-R8KKWJdwGVegD^ z%swGLDRI0nYt$1+a{FQG_^DxPQtO1_a|tw3qU7ltk(^r^-Eh2km0@Hi&we zI%)5fuW+Vs>=TLaXb}T#jWQ=%naGAr((o?rog!p5eH1)0VPWLImg_ zZNED1aOv6X9Qe7ccHrTpajUtL-&ecWAgg3+3pvq-4(#xv6>ud02MPGp#Z1(6mm{@| z-(o88*vOV@0-;*vzw@^`m0zo1yC0B=%%%u{Q~IWKqStw@O6XSk7g*UY=M(FE|IU*DESf-rRfyWn96|$d+(FskptkcyYc2`en%|@Hc^uLP2RbPJnk>>3OO2JZnoPK> zlo8{*w`)90smw?&6D{-(GVm19FIv|3_A4|rW}??j%OSSW)XUV+2t34bbUQI8!%#Y{ z_e#Cl=Q&%c|5cpPl}s?}dwn!%SugwLoG0~uVU&r^Zd!jujO?hT{`mmYWpC9meK3{_e7a2ywc#m zNR%#C3a%%}0hZ)HC&;yA$6cPdUah%u{^y$EOKC~7RjuejEk&FgcvHexZA=)2lIjP| zW~@D3@;X5Adoywgms_MG#9EA$4>^Vl(zd*a8({)+;pp_ZxPQLq2`3T-{?A+M=;`=% z_66`*1#feR%`)+q(oUS#gNODLzr$i-v#JFGuSNROlZhB}?sH(|1hakcf_MP^+_FNPbW`+I*RNiL3+_mhci*G{>;|PN(E+LCvA~e(e{C2CZ z&HdCj%kKo@L<~O!Wb(#w6%|34>t;oK5cx%S(%Hq6ZFXK(>UO8CFdyBm8u*GuUNo_< zH#Q~)gqlj5lxBP9L^TnXII}&Ke{A@9DY-f)Tl6e0Il48OH@X$(Ek!3y?CXxZ zhMI@LP*o@xE?NuXPjT`vnQ#@m>Y>2nPVj|u)8MUMxj{qtLR?9K%LPJKP?kpzxCnoo z7LVO-Ni+7_QSpDhuGZpS;#P&Wa~LonvK@SjYses{EoAVlZ3UyUE2zP3`qr}mY1!;& z&voV_R~J(BUkfZtmEmQG+*tQnK%KA=%)~n#(M#<{e<|{YUGF%;p>uIBmOso2X`53c zxRHx5I9vj9@Vfd_Qh}0Cbq$4qV`!6qL7GohJFKTVN-VP_>uO%@rqzLMJ=tU9=)UEt z)+~J_>W@f94&k^H7qSc3-Rczo4F)7;hnepuGwA!p7Ba@7&b*7%XNY$g(wVfXCX?HO z$?QlQ^|;S>hGzr2I$@f%n>RJyG>EcuZ;S{{M9rCKTwv27Do4SSx@r)bv2JtMEzGpA zZ0Y4pA>|J2tldYU5zx8*t#U5>xQrIYT2|@@c#=2ED~6Qz2;c~hi9gU3L0awjh(}t` zOr7U4oX)SLt@tf%X5er>6VEWEF4xH2Y+x|c(pM+Fzv=3 zo{RNAj251#oaS&On31e+*!njqtZz8~0gGWa&{Ch=1$W{!8@ftJi9?2?Ud5a>Oz7pO zjb#~JnyU%hg|}TSTVUdx5NU=bMLa3OYM@b6aI7_Atp|IweownUkcjQv9qfUT8M?9ERs@l;Z8g*vu#037&&m1K6P?Apa`yX5 zmkLvgj#WDxlW0*?G1G-$(VR~TGS6_ccC_g}EYke)Y%kY;$_rUT4+g2^NHlj#pN-0> zp=!?I0TTZ`fTeiLUqkzyzxi}$cT54^M=r+)$}nRR(?5%;$J|ZQ+;u@}x62>q;eY$CL6U zGILYX=02uKF@CI`7TnM~3$~0L>BZMJr-pC|Ds5%>j;60?uU54NlS`3`(OLak@-8Sl zh?UqX9r5rC0zwBo5WG=(d?Yl;JD(52y)0zE`sBSmklRU%fO72mqsAQ5JdF-?^!KVg z{rFpAQfAi*s{{09qS8x}0N*}0?U_|qLg(MwGdN0DK$+nvdBs^{&T=DNv8V8&hnkT@z#gym%`ct>^OsQBj4J zk-_;f)XYt>gHDNd;hsPmxg~ttt*B^^>2M`qI8V3^pf9n3Wvvn`7m!XpIYR)OKqIe;2>y@^pLl6Vt>IttN9K}|w6yglBbg{^Yij`q@w-1kfzl_en9O_|3_8)0I5{eY z3Lb0YCG$FVS$#378h>Ita9Kk>*&eaIn7_M-Lte`;I0x*(SR^uWS9!$`;aNiN##qb+ c8NSkW{mMEQ;eS7Lzbn4}U(D?H%D+wh1CyUQ+W-In literal 0 HcmV?d00001 diff --git a/Documentation/platforms/arm/am335x/boards/beaglebone/index.rst b/Documentation/platforms/arm/am335x/boards/beaglebone/index.rst new file mode 100644 index 00000000000..efe414b980c --- /dev/null +++ b/Documentation/platforms/arm/am335x/boards/beaglebone/index.rst @@ -0,0 +1,184 @@ +========== +BeagleBone +========== + +.. tags:: arch:arm, chip:am335x + +.. figure:: beaglebone.jpg + :figwidth: 100% + :align: center + :alt: The BeagleBone + + The BeagleBone + +This directory contains the port of NuttX to the original (white) BeagleBone. +See https://www.beagleboard.org/boards/beaglebone-original for more information. +This board is based around the TI AM335x Sitara Cortex-A8 CPU. + +=================== ============================================================= +ITEMS DETAILS +=================== ============================================================= +CPU 720MHz ARM Cortex-A8 +FPU NEON SIMD Coprocessor +I-Cache 32KB +D-Cache 32KB +L2 Cache 256KB L2 Cache with ECC +DRAM 256MB DDR2 +On-Chip SRAM 64KB +Dedicated SRAM 64KB +On-Chip Boot ROM 176KB +Onboard Storage microSD card (TF) slot +Extension Interface 2.54mm Headers, 92 pins +Network interface 10/100Mbps RJ45 +Power 5V, 1000mA +=================== ============================================================= + + +Peripheral Support +================== + +The following list indicates the state of peripherals' support in NuttX: + +=========== ======= ==================== +Peripheral Support NOTES +=========== ======= ==================== +ADC No +Ethernet No +CAN No +DMA No +GPIO Yes +I2C Yes +I2S No +LED Yes +SD No +SPI No +Timers Yes +UART Yes +USB Client No +USB Host No +Watchdog Yes +=========== ======= ==================== + +Serial Console +============== + +By default, the serial console will be provided on UART0 in all of these +configurations. + +UART0 is available on the USB client port. + +Booting NuttX from a microSD card +================================= + +It is assumed that the microSD already boots to the U-Boot prompt. + +These are the steps to run nuttx.bin from the microSD Card: + +#. Configure and build the NuttX BeagleBone configuration. You + should have a file called nuttx.bin when the build completes. + +#. Insert a microSD into the host PC. + +#. Copy nuttx.bin into the microSD. + +#. Remove the microSD from the host PC and insert into the BeagleBone + microSD slot. + +#. Connect a Mini-USB cable to the BeagleBone and open a serial + terminal on the host PC to communicate with the target. + +#. Reset and stop the BeagleBone boot. You should see output from + U-boot in the serial console. + +#. Load NuttX into memory from the U-Boot prompt and run NuttX as shown + below. + +.. code-block:: console + + => load mmc 0 0x80300000 nuttx.bin + 414356 bytes read in 37 ms (10.7 MiB/s) + => go 0x80300000 + ## Starting application at 0x80300000 ... + + NuttShell (NSH) NuttX-13.0.1-RC0 + nsh> + +Configurations +============== + +Information Common to All Configurations +---------------------------------------- + +Each BeagleBone configuration is maintained in a sub-directory and +can be selected as follow: + + *tools/configure.sh [OPTIONS] beaglebone:* + +Where [OPTIONS] include -l to configure for a Linux host platform. +-h will give you the list of all options. + +Before building, make sure the PATH environment variable includes the +correct path to the directory that holds your toolchain binaries. + +Build NuttX by typing the following: + + *make* + +At the conclusion of the make, the nuttx binary will reside in an ELF file +called nuttx. + +The ```` that is provided above as an argument to the tools/configure.sh +must be one of the following. + +Configuration Sub-directories +----------------------------- + +nsh +--- + +This configuration directory provides the NuttShell (NSH). + +knsh +---- + +This is the kernel build configuration. User applications are included in the +final nuttx.bin image. + +Steps to build the kernel image with userspace apps in ROMFS: + +.. code-block:: console + + ./tools/configure.sh -l beaglebone/knsh + make && make export + pushd ../apps + tools/mkimport.sh -z -x ../nuttx/nuttx-export-*.tar.gz + make import + cp -a bin /tmp + tools/mkromfsimg.sh + mv boot_romfsimg.h ../nuttx/boards/arm/am335x/beaglebone/include/bin_romfsimg.h + popd + make clean clean_context + make + +Run the nuttx.bin as previously described. + +.. code-block:: console + + => load mmc 0 0x80300000 knsh.bin + 414356 bytes read in 41 ms (9.6 MiB/s) + => go 0x80300000 + ## Starting application at 0x80300000 ... + + NuttShell (NSH) NuttX-13.0.1-RC0 + knsh> uname -a + NuttX 13.0.1-RC0 3b7e453012-dirty Aug 17 2026 20:07:55 arm beaglebone + knsh> ls /bin + /bin: + dd + getprime + hello + init + sh + knsh> /bin/hello + Hello, World!! + knsh> diff --git a/Documentation/platforms/arm/am335x/index.rst b/Documentation/platforms/arm/am335x/index.rst index 1430fed1cc6..a4208c702b6 100644 --- a/Documentation/platforms/arm/am335x/index.rst +++ b/Documentation/platforms/arm/am335x/index.rst @@ -2,27 +2,6 @@ TI/Sitara AM335x ================ -These following boards are based on the TI/Sitara -AM335x are supported by NuttX: - -- **Beaglebone Black**. A port of NuttX to the Beaglebone Black board - was first released in NuttX-7.28. This port was contributed by Petro - Karashchenko. This board is based on the TI/Sitara AM3358 Cortex-A8 - CPU running 1GHz. - - - **NuttX-7.28**. This initial port in NuttX-7.28 is very sparse. - While not ready for production use, the Beaglebone Black port is - functional and will be the basis for a more extensive development. - Additional work in progress to extend this port and more capable - is anticipated in NuttX-7.29. - - **NuttX-9.0** CAN support was added. Clock Configuration was - added. - - **NuttX-7.31**. An LCD driver was added in NuttX-7.31. - - Refer to the Beaglebone Black board - `README `__ - file for further, up-to-date information. - Supported Boards ================ diff --git a/arch/arm/src/am335x/CMakeLists.txt b/arch/arm/src/am335x/CMakeLists.txt index 45e786b93c4..51c65b757f3 100644 --- a/arch/arm/src/am335x/CMakeLists.txt +++ b/arch/arm/src/am335x/CMakeLists.txt @@ -47,4 +47,8 @@ if(CONFIG_AM335X_LCDC) list(APPEND SRCS am335x_lcdc.c am335x_edid.c) endif() +if(CONFIG_MM_PGALLOC) + list(APPEND SRCS am335x_pgalloc.c) +endif() + target_sources(arch PRIVATE ${SRCS}) diff --git a/arch/arm/src/am335x/Make.defs b/arch/arm/src/am335x/Make.defs index e2d9a0d16f0..560222c7574 100644 --- a/arch/arm/src/am335x/Make.defs +++ b/arch/arm/src/am335x/Make.defs @@ -39,3 +39,7 @@ endif ifeq ($(CONFIG_AM335X_LCDC),y) CHIP_CSRCS += am335x_lcdc.c am335x_edid.c endif + +ifeq ($(CONFIG_MM_PGALLOC),y) +CHIP_CSRCS += am335x_pgalloc.c +endif diff --git a/arch/arm/src/am335x/am335x_pgalloc.c b/arch/arm/src/am335x/am335x_pgalloc.c new file mode 100644 index 00000000000..e8b488478d8 --- /dev/null +++ b/arch/arm/src/am335x/am335x_pgalloc.c @@ -0,0 +1,70 @@ +/**************************************************************************** + * arch/arm/src/am335x/am335x_pgalloc.c + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include + +#include "arm_internal.h" + +#ifdef CONFIG_MM_PGALLOC + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: up_allocate_pgheap + * + * Description: + * If there is a page allocator in the configuration, then this function + * must be provided by the platform-specific code. The OS initialization + * logic will call this function early in the initialization sequence to + * get the page heap information needed to configure the page allocator. + * + ****************************************************************************/ + +void up_allocate_pgheap(void **pool_start, size_t *pool_size) +{ + DEBUGASSERT(pool_start && pool_size); + + *pool_start = (void *)CONFIG_ARCH_PGPOOL_PBASE; + *pool_size = (size_t)CONFIG_ARCH_PGPOOL_SIZE; +} + +#endif /* CONFIG_MM_PGALLOC */ diff --git a/boards/Kconfig b/boards/Kconfig index 31653133202..add123751e1 100644 --- a/boards/Kconfig +++ b/boards/Kconfig @@ -1702,6 +1702,15 @@ config ARCH_BOARD_PCDUINO_A10 the differences are cosmetic. This port was developed on the v1 board, but the others may be compatible. +config ARCH_BOARD_BEAGLEBONE + bool "beaglebone" + depends on ARCH_CHIP_AM335X + select ARCH_HAVE_LEDS + select ARCH_HAVE_BUTTONS + select ARCH_HAVE_IRQBUTTONS + ---help--- + This is the port of NuttX to the original TI Beaglebone board. + config ARCH_BOARD_BEAGLEBONE_BLACK bool "beaglebone black" depends on ARCH_CHIP_AM335X @@ -4009,6 +4018,7 @@ config ARCH_BOARD default "or1k" if ARCH_BOARD_OR1K default "p112" if ARCH_BOARD_P112 default "pcduino-a10" if ARCH_BOARD_PCDUINO_A10 + default "beaglebone" if ARCH_BOARD_BEAGLEBONE default "beaglebone-black" if ARCH_BOARD_BEAGLEBONE_BLACK default "pic32mx-starterkit" if ARCH_BOARD_PIC32MX_STARTERKIT default "pic32mx7mmb" if ARCH_BOARD_PIC32MX7MMB @@ -4236,6 +4246,9 @@ comment "Board-Specific Options" if ARCH_BOARD_PCDUINO_A10 source "boards/arm/a1x/pcduino-a10/Kconfig" endif +if ARCH_BOARD_BEAGLEBONE +source "boards/arm/am335x/beaglebone/Kconfig" +endif if ARCH_BOARD_BEAGLEBONE_BLACK source "boards/arm/am335x/beaglebone-black/Kconfig" endif diff --git a/boards/arm/am335x/beaglebone/CMakeLists.txt b/boards/arm/am335x/beaglebone/CMakeLists.txt new file mode 100644 index 00000000000..41258b1e714 --- /dev/null +++ b/boards/arm/am335x/beaglebone/CMakeLists.txt @@ -0,0 +1,23 @@ +# ############################################################################## +# boards/arm/am335x/beaglebone/CMakeLists.txt +# +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed to the Apache Software Foundation (ASF) under one or more contributor +# license agreements. See the NOTICE file distributed with this work for +# additional information regarding copyright ownership. The ASF licenses this +# file to you under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. +# +# ############################################################################## + +add_subdirectory(src) diff --git a/boards/arm/am335x/beaglebone/Kconfig b/boards/arm/am335x/beaglebone/Kconfig new file mode 100644 index 00000000000..df70d8c73f1 --- /dev/null +++ b/boards/arm/am335x/beaglebone/Kconfig @@ -0,0 +1,7 @@ +# +# For a description of the syntax of this configuration file, +# see the file kconfig-language.txt in the NuttX tools repository. +# + +if ARCH_BOARD_BEAGLEBONE +endif # ARCH_BOARD_BEAGLEBONE diff --git a/boards/arm/am335x/beaglebone/configs/knsh/defconfig b/boards/arm/am335x/beaglebone/configs/knsh/defconfig new file mode 100644 index 00000000000..5f1ecdd37e4 --- /dev/null +++ b/boards/arm/am335x/beaglebone/configs/knsh/defconfig @@ -0,0 +1,88 @@ +# +# This file is autogenerated: PLEASE DO NOT EDIT IT. +# +# You can use "make menuconfig" to make any modifications to the installed .config file. +# You can then do "make savedefconfig" to generate a new defconfig file that includes your +# modifications. +# +# CONFIG_NSH_CMDOPT_HEXDUMP is not set +CONFIG_AM335X_UART0=y +CONFIG_ARCH="arm" +CONFIG_ARCH_ADDRENV=y +CONFIG_ARCH_BOARD="beaglebone" +CONFIG_ARCH_BOARD_BEAGLEBONE=y +CONFIG_ARCH_CHIP="am335x" +CONFIG_ARCH_CHIP_AM3358=y +CONFIG_ARCH_CHIP_AM335X=y +CONFIG_ARCH_DATA_NPAGES=256 +CONFIG_ARCH_DATA_VBASE=0x80100000 +CONFIG_ARCH_HEAP_NPAGES=256 +CONFIG_ARCH_HEAP_VBASE=0x80200000 +CONFIG_ARCH_INTERRUPTSTACK=2048 +CONFIG_ARCH_LOWVECTORS=y +CONFIG_ARCH_PGPOOL_MAPPING=y +CONFIG_ARCH_PGPOOL_PBASE=0x88000000 +CONFIG_ARCH_PGPOOL_SIZE=134217728 +CONFIG_ARCH_PGPOOL_VBASE=0x88000000 +CONFIG_ARCH_STACKDUMP=y +CONFIG_ARCH_TEXT_NPAGES=256 +CONFIG_ARCH_TEXT_VBASE=0x0000000 +CONFIG_ARM_THUMB=y +CONFIG_BOARD_LOOPSPERMSEC=70000 +CONFIG_BOOT_RUNFROMSDRAM=y +CONFIG_BUILD_KERNEL=y +CONFIG_DEBUG_ASSERTIONS=y +CONFIG_DEBUG_FEATURES=y +CONFIG_DEBUG_FULLOPT=y +CONFIG_DEBUG_SYMBOLS=y +CONFIG_ELF=y +CONFIG_ELF_STACKSIZE=4096 +CONFIG_EXAMPLES_HELLO=y +CONFIG_FAT_LCNAMES=y +CONFIG_FAT_LFN=y +CONFIG_FS_FAT=y +CONFIG_FS_PROCFS=y +CONFIG_FS_ROMFS=y +CONFIG_HAVE_CXX=y +CONFIG_HAVE_CXXINITIALIZE=y +CONFIG_IDLETHREAD_STACKSIZE=8192 +CONFIG_INIT_MOUNT=y +CONFIG_INIT_STACKSIZE=3072 +CONFIG_INTELHEX_BINARY=y +CONFIG_LIBC_ENVPATH=y +CONFIG_LIBC_EXECFUNCS=y +CONFIG_LIBC_MAX_EXITFUNS=16 +CONFIG_LIBC_STRERROR=y +CONFIG_LIBC_USRWORK=y +CONFIG_LIBC_USRWORKSTACKSIZE=4096 +CONFIG_MM_PGALLOC=y +CONFIG_NSH_DISABLE_DMESG=y +CONFIG_NSH_DISABLE_EXIT=y +CONFIG_NSH_FILEIOSIZE=512 +CONFIG_NSH_FILE_APPS=y +CONFIG_NSH_PROMPT_STRING="knsh> " +CONFIG_NSH_READLINE=y +CONFIG_NSH_STRERROR=y +CONFIG_NSH_VARS=y +CONFIG_PREALLOC_TIMERS=4 +CONFIG_RAM_SIZE=131072000 +CONFIG_RAM_START=0x80300000 +CONFIG_RAM_VSTART=0x80300000 +CONFIG_RAW_BINARY=y +CONFIG_READLINE_CMD_HISTORY=y +CONFIG_RR_INTERVAL=200 +CONFIG_SCHED_HAVE_PARENT=y +CONFIG_SCHED_HPWORK=y +CONFIG_SCHED_HPWORKPRIORITY=192 +CONFIG_SCHED_LPWORK=y +CONFIG_SCHED_WAITPID=y +CONFIG_SERIAL_TERMIOS=y +CONFIG_STACK_COLORATION=y +CONFIG_START_MONTH=8 +CONFIG_START_YEAR=2026 +CONFIG_SYMTAB_ORDEREDBYNAME=y +CONFIG_SYSLOG_TIMESTAMP=y +CONFIG_SYSTEM_NSH=y +CONFIG_SYSTEM_NSH_PROGNAME="init" +CONFIG_TESTING_GETPRIME=y +CONFIG_UART0_SERIAL_CONSOLE=y diff --git a/boards/arm/am335x/beaglebone/configs/nsh/defconfig b/boards/arm/am335x/beaglebone/configs/nsh/defconfig new file mode 100644 index 00000000000..eb363aae742 --- /dev/null +++ b/boards/arm/am335x/beaglebone/configs/nsh/defconfig @@ -0,0 +1,47 @@ +# +# This file is autogenerated: PLEASE DO NOT EDIT IT. +# +# You can use "make menuconfig" to make any modifications to the installed .config file. +# You can then do "make savedefconfig" to generate a new defconfig file that includes your +# modifications. +# +# CONFIG_NSH_CMDOPT_HEXDUMP is not set +# CONFIG_NSH_DISABLE_IFCONFIG is not set +# CONFIG_NSH_DISABLE_PS is not set +CONFIG_AM335X_UART0=y +CONFIG_ARCH="arm" +CONFIG_ARCH_BOARD="beaglebone" +CONFIG_ARCH_BOARD_BEAGLEBONE=y +CONFIG_ARCH_CHIP="am335x" +CONFIG_ARCH_CHIP_AM3358=y +CONFIG_ARCH_CHIP_AM335X=y +CONFIG_ARCH_INTERRUPTSTACK=2048 +CONFIG_ARCH_LOWVECTORS=y +CONFIG_ARCH_STACKDUMP=y +CONFIG_BOARD_LOOPSPERMSEC=70000 +CONFIG_BOOT_RUNFROMSDRAM=y +CONFIG_BUILTIN=y +CONFIG_DISABLE_ENVIRON=y +CONFIG_FAT_LCNAMES=y +CONFIG_FAT_LFN=y +CONFIG_FS_FAT=y +CONFIG_HAVE_CXX=y +CONFIG_HAVE_CXXINITIALIZE=y +CONFIG_HOST_WINDOWS=y +CONFIG_INIT_ENTRYPOINT="nsh_main" +CONFIG_INTELHEX_BINARY=y +CONFIG_NSH_BUILTIN_APPS=y +CONFIG_NSH_FILEIOSIZE=512 +CONFIG_NSH_READLINE=y +CONFIG_PREALLOC_TIMERS=4 +CONFIG_RAM_SIZE=131072000 +CONFIG_RAM_START=0x80300000 +CONFIG_RAM_VSTART=0x80300000 +CONFIG_RAW_BINARY=y +CONFIG_RR_INTERVAL=200 +CONFIG_SCHED_WAITPID=y +CONFIG_START_MONTH=8 +CONFIG_START_YEAR=2026 +CONFIG_SYMTAB_ORDEREDBYNAME=y +CONFIG_SYSTEM_NSH=y +CONFIG_UART0_SERIAL_CONSOLE=y diff --git a/boards/arm/am335x/beaglebone/include/bin_romfsimg.h b/boards/arm/am335x/beaglebone/include/bin_romfsimg.h new file mode 100644 index 00000000000..57b949ead8c --- /dev/null +++ b/boards/arm/am335x/beaglebone/include/bin_romfsimg.h @@ -0,0 +1,37 @@ +/**************************************************************************** + * boards/arm/am335x/beaglebone/include/bin_romfsimg.h + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#ifndef __BOARDS_ARM_SAMA5_SAMA5D3_XPLAINED_BOOT_ROMFSIMG_H +#define __BOARDS_ARM_SAMA5_SAMA5D3_XPLAINED_BOOT_ROMFSIMG_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +const unsigned char aligned_data(4) romfs_img[] = +{ + 0x00 +}; +unsigned int romfs_img_len = 1; + +#endif /* __BOARDS_ARM_SAMA5_SAMA5D3_XPLAINED_BOOT_ROMFSIMG_H */ diff --git a/boards/arm/am335x/beaglebone/include/board.h b/boards/arm/am335x/beaglebone/include/board.h new file mode 100644 index 00000000000..b348862e3c9 --- /dev/null +++ b/boards/arm/am335x/beaglebone/include/board.h @@ -0,0 +1,143 @@ +/**************************************************************************** + * boards/arm/am335x/beaglebone/include/board.h + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#ifndef __BOARDS_ARM_AM335X_BEAGLEBONE_INCLUDE_BOARD_H +#define __BOARDS_ARM_AM335X_BEAGLEBONE_INCLUDE_BOARD_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* Clocking *****************************************************************/ + +/* Since NuttX is booted from a loader on the AM335X, clocking should already + * be setup when NuttX starts. + */ + +/* LED definitions **********************************************************/ + +/* The beaglebone black has four user LEDs; all four can be controlled from + * software. + * All are tied to ground and, hence, illuminated by driving the output pins + * to a high value: + * + * 1. LED0 GPMC_A5 GPMC_A5/GMII2_TXD0/RGMII2_TD0/RMII2_TXD0/GPMC_A21/ + * PR1_MII1_RXD3/eQEP1B_IN/GPIO1_21 + * 2. LED1 GPMC_A6 GPMC_A6/GMII2_TXCLK/RGMII2_TCLK/MMC2_DAT4/GPMC_A22/ + * PR1_MII1_RXD2/eQEP1_INDEX/GPIO1_22 + * 3. LED2 GPMC_A7 GPMC_A7/GMII2_RXCLK/RGMII2_RCLK/MMC2_DAT5/GPMC_A23/ + * PR1_MII1_RXD1/eQEP1_STROBE/GPIO1_23 + * 4. LED3 GPMC_A8 GPMC_A8/GMII2_RXD3/RGMII2_RD3/MMC2_DAT6/GPMC_A24/ + * PR1_MII1_RXD0/MCASP0_ACLKX/GPIO1_24 + */ + +/* LED index values for use with board_userled() */ + +#define USER_LED0 0 +#define USER_LED1 1 +#define USER_LED2 2 +#define USER_LED3 3 +#define BOARD_NLEDS 4 + +/* LED bits for use with board_userled_all() */ + +#define BOARD_LED0_BIT (1 << USER_LED0) +#define BOARD_LED1_BIT (1 << USER_LED1) +#define BOARD_LED2_BIT (1 << USER_LED2) +#define BOARD_LED3_BIT (1 << USER_LED3) + +/* These LEDs are not used by the board port unless CONFIG_ARCH_LEDS is + * defined. In that case, the usage by the board port is defined in + * include/board.h and src/am335x_leds.c. + * The LEDs are used to encode OS-related events as follows: + * + * SYMBOL Value Meaning LED state + * LED0 LED1 LED2 + * ----------------- ----- ----------------------- ---- ---- --------- + */ + +#define LED_STARTED 0 /* NuttX has been started ON OFF OFF */ +#define LED_HEAPALLOCATE 1 /* Heap has been allocated OFF ON OFF */ +#define LED_IRQSENABLED 2 /* Interrupts enabled ON ON OFF */ +#define LED_STACKCREATED 2 /* Idle stack created ON ON OFF */ +#define LED_INIRQ 3 /* In an interrupt N/C N/C Soft glow */ +#define LED_SIGNAL 3 /* In a signal handler N/C N/C Soft glow */ +#define LED_ASSERTION 3 /* An assertion failed N/C N/C Soft glow */ +#define LED_PANIC 3 /* The system has crashed N/C N/C 2Hz Flashing */ + +/* LED_IDLE --- MCU is in sleep mode Not used + * + * After booting, LED0 and 1 are not longer used by the system and can be + * used for other purposes by the application (Of course, all LEDs are + * available to the application if CONFIG_ARCH_LEDS is not defined. + */ + +/* NAND *********************************************************************/ + +/* GPIO pin disambiguation **************************************************/ + +/* UARTs ********************************************************************/ + +/* One UART connections is available: + * + * 1. UART0 is available on FT2232H USB to Serial Adapter. + * + * FT2232H BDBUS1 Pin UART0-RXD UART0_RXD/SPI1_CS0/DCAN0_TX/I2C2_SDA/ + * eCAP2_IN_PWM2_OUT/PR1_PRU1_PRU_R30_14/ + * PR1_PRU1_PRU_R31_14/GPIO1_10 + * FT2232H BDBUS0 Pin UART0-TXD UART0_TXD/SPI1_CS1/DCAN0_RX/I2C2_SCL/ + * eCAP1_IN_PWM1_OUT/PR1_PRU1_PRU_R30_15/ + * PR1_PRU1_PRU_R31_15/GPIO1_11 + */ + +/* I2Cs *********************************************************************/ + +#define GPIO_I2C1_SCL GPIO_I2C1_SCL_2 +#define GPIO_I2C1_SCL GPIO_I2C1_SDA_2 + +#define GPIO_I2C2_SCL GPIO_I2C2_SCL_1 +#define GPIO_I2C2_SCL GPIO_I2C2_SDA_1 + +/* CANs *********************************************************************/ + +#define GPIO_DCAN0_RX GPIO_DCAN0_RX_3 +#define GPIO_DCAN0_TX GPIO_DCAN0_TX_3 + +#define GPIO_DCAN1_RX GPIO_DCAN1_RX_3 +#define GPIO_DCAN1_TX GPIO_DCAN1_TX_3 + +/**************************************************************************** + * Assembly Language Macros + ****************************************************************************/ + +#ifdef __ASSEMBLY__ + .macro config_sdram + .endm +#endif /* __ASSEMBLY__ */ + +#endif /* __BOARDS_ARM_AM335X_BEAGLEBONE_INCLUDE_BOARD_H */ diff --git a/boards/arm/am335x/beaglebone/include/board_memorymap.h b/boards/arm/am335x/beaglebone/include/board_memorymap.h new file mode 100644 index 00000000000..62044647b0f --- /dev/null +++ b/boards/arm/am335x/beaglebone/include/board_memorymap.h @@ -0,0 +1,61 @@ +/**************************************************************************** + * boards/arm/am335x/beaglebone/include/board_memorymap.h + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#ifndef __BOARDS_ARM_AM335X_BEAGLEBONE_INCLUDE_BOARD_MEMORYMAP_H +#define __BOARDS_ARM_AM335X_BEAGLEBONE_INCLUDE_BOARD_MEMORYMAP_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/**************************************************************************** + * Public Data + ****************************************************************************/ + +#ifndef __ASSEMBLY__ + +#undef EXTERN +#if defined(__cplusplus) +#define EXTERN extern "C" +extern "C" +{ +#else +#define EXTERN extern +#endif + +/**************************************************************************** + * Public Function Prototypes + ****************************************************************************/ + +#undef EXTERN +#if defined(__cplusplus) +} +#endif + +#endif /* __ASSEMBLY__ */ +#endif /* __BOARDS_ARM_AM335X_BEAGLEBONE_INCLUDE_BOARD_MEMORYMAP_H */ diff --git a/boards/arm/am335x/beaglebone/scripts/Make.defs b/boards/arm/am335x/beaglebone/scripts/Make.defs new file mode 100644 index 00000000000..70b3a50e2c4 --- /dev/null +++ b/boards/arm/am335x/beaglebone/scripts/Make.defs @@ -0,0 +1,39 @@ +############################################################################ +# boards/arm/am335x/beaglebone/scripts/Make.defs +# +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. The +# ASF licenses this file to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance with the +# License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +# +############################################################################ + +include $(TOPDIR)/.config +include $(TOPDIR)/tools/Config.mk +include $(TOPDIR)/arch/arm/src/armv7-a/Toolchain.defs + +# Setup for the kind of memory that we are executing from + +LDSCRIPT = sdram.ld +ARCHSCRIPT += $(BOARD_DIR)$(DELIM)scripts$(DELIM)$(LDSCRIPT) + +CFLAGS := $(ARCHCFLAGS) $(ARCHOPTIMIZATION) $(ARCHCPUFLAGS) $(ARCHINCLUDES) $(ARCHDEFINES) $(EXTRAFLAGS) +CXXFLAGS := $(ARCHCXXFLAGS) $(ARCHOPTIMIZATION) $(ARCHCPUFLAGS) $(ARCHXXINCLUDES) $(ARCHDEFINES) $(EXTRAFLAGS) +CPPFLAGS := $(ARCHINCLUDES) $(ARCHDEFINES) $(EXTRAFLAGS) +AFLAGS := $(CFLAGS) -D__ASSEMBLY__ + +NXFLATLDFLAGS1 = -r -d -warn-common +NXFLATLDFLAGS2 = $(NXFLATLDFLAGS1) -T$(TOPDIR)/binfmt/libnxflat/gnu-nxflat-pcrel.ld -no-check-sections +LDNXFLATFLAGS = -e main -s 2048 diff --git a/boards/arm/am335x/beaglebone/scripts/sdram.ld b/boards/arm/am335x/beaglebone/scripts/sdram.ld new file mode 100644 index 00000000000..ffd996b6498 --- /dev/null +++ b/boards/arm/am335x/beaglebone/scripts/sdram.ld @@ -0,0 +1,126 @@ +/**************************************************************************** + * boards/arm/am335x/beaglebone/scripts/sdram.ld + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/* The Beaglebone Black and 512MB of SDRAM beginning at virtual address + * 0x8000:0000. Execution begins at address 0x8a00000, leaving 352MB for NuttX. + * + * Vectors in low memory are assumed and 16KB of OCMC0 is reserved at the + * high end of OCMC0 for the page table. + */ + +MEMORY +{ + isram (W!RX) : ORIGIN = 0x402F0400, LENGTH = 63K + ocmc0 (W!RX) : ORIGIN = 0x40300000, LENGTH = 64K -16K + ddr (W!RX) : ORIGIN = 0x80300000, LENGTH = 128M - 3M +} + +ENTRY(entry) +ENTRY(_stext) + +SECTIONS +{ + .text : + { + _stext = ABSOLUTE(.); + *(.vectors) + *(.text .text.*) + *(.fixup) + *(.gnu.warning) + *(.rodata .rodata.*) + *(.gnu.linkonce.t.*) + *(.glue_7) + *(.glue_7t) + *(.got) + *(.gcc_except_table) + *(.gnu.linkonce.r.*) + *(.ARM.extab*) + *(.gnu.linkonce.armextab.*) + _etext = ABSOLUTE(.); + } > ddr + + .init_section : + { + _sinit = ABSOLUTE(.); + KEEP(*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) + KEEP(*(.init_array EXCLUDE_FILE(*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o) .ctors)) + _einit = ABSOLUTE(.); + } > ddr + + .ARM.extab : + { + *(.ARM.extab*) + } > ddr + + /* .ARM.exidx is sorted, so has to go in its own output section. */ + + PROVIDE_HIDDEN (__exidx_start = .); + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + } > ddr + PROVIDE_HIDDEN (__exidx_end = .); + + .data : + { + _sdata = ABSOLUTE(.); + *(.data .data.*) + *(.gnu.linkonce.d.*) + CONSTRUCTORS + . = ALIGN(4); + _edata = ABSOLUTE(.); + } > ddr + + /* Uninitialized data */ + + .noinit : + { + _snoinit = ABSOLUTE(.); + *(.noinit*) + _enoinit = ABSOLUTE(.); + } > ddr + + .bss : + { + _sbss = ABSOLUTE(.); + *(.bss .bss.*) + *(.gnu.linkonce.b.*) + *(COMMON) + . = ALIGN(4); + _ebss = ABSOLUTE(.); + } > ddr + + /* Stabs debugging sections. */ + + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_info 0 : { *(.debug_info) } + .debug_line 0 : { *(.debug_line) } + .debug_pubnames 0 : { *(.debug_pubnames) } + .debug_aranges 0 : { *(.debug_aranges) } +} diff --git a/boards/arm/am335x/beaglebone/src/CMakeLists.txt b/boards/arm/am335x/beaglebone/src/CMakeLists.txt new file mode 100644 index 00000000000..6535abe117d --- /dev/null +++ b/boards/arm/am335x/beaglebone/src/CMakeLists.txt @@ -0,0 +1,27 @@ +# ############################################################################## +# boards/arm/am335x/beaglebone/src/CMakeLists.txt +# +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed to the Apache Software Foundation (ASF) under one or more contributor +# license agreements. See the NOTICE file distributed with this work for +# additional information regarding copyright ownership. The ASF licenses this +# file to you under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. +# +# ############################################################################## + +set(SRCS am335x_boot.c am335x_bringup.c am335x_leds.c) + +target_sources(board PRIVATE ${SRCS}) + +set_property(GLOBAL PROPERTY LD_SCRIPT "${NUTTX_BOARD_DIR}/scripts/sdram.ld") diff --git a/boards/arm/am335x/beaglebone/src/Makefile b/boards/arm/am335x/beaglebone/src/Makefile new file mode 100644 index 00000000000..036a23e6c2c --- /dev/null +++ b/boards/arm/am335x/beaglebone/src/Makefile @@ -0,0 +1,27 @@ +############################################################################ +# boards/arm/am335x/beaglebone/src/Makefile +# +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. The +# ASF licenses this file to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance with the +# License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +# +############################################################################ + +include $(TOPDIR)/Make.defs + +CSRCS = am335x_boot.c am335x_bringup.c am335x_leds.c + +include $(TOPDIR)/boards/Board.mk diff --git a/boards/arm/am335x/beaglebone/src/am335x_boot.c b/boards/arm/am335x/beaglebone/src/am335x_boot.c new file mode 100644 index 00000000000..48ff236d56f --- /dev/null +++ b/boards/arm/am335x/beaglebone/src/am335x_boot.c @@ -0,0 +1,111 @@ +/**************************************************************************** + * boards/arm/am335x/beaglebone/src/am335x_boot.c + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include + +#include + +#include "beaglebone.h" + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: am335x_memory_initialize + * + * Description: + * All AM335X architectures must provide the following entry point. This + * entry point is called early in the initialization before memory has + * been configured. This board-specific function is responsible for + * configuring any on-board memories. + * + * Logic in am335x_memory_initialize must be careful to avoid using any + * global variables because those will be uninitialized at the time this + * function is called. + * + * Input Parameters: + * None + * + * Returned Value: + * None + * + ****************************************************************************/ + +void am335x_memory_initialize(void) +{ + /* SDRAM was initialized by a bootloader in the supported configurations. */ +} + +/**************************************************************************** + * Name: am335x_board_initialize + * + * Description: + * All AM335x architectures must provide the following entry point. + * This entry point is called early in the initialization -- after all + * memory has been configured and mapped but before any devices have been + * initialized. + * + ****************************************************************************/ + +void am335x_board_initialize(void) +{ + /* Configure on-board LEDs. */ + + am335x_led_initialize(); +} + +/**************************************************************************** + * Name: board_late_initialize + * + * Description: + * If CONFIG_BOARD_LATE_INITIALIZE is selected, then an additional + * initialization call will be performed in the boot-up sequence to a + * function called board_late_initialize(). board_late_initialize() will be + * called immediately after up_initialize() is called and just before the + * initial application is started. This additional initialization phase + * may be used, for example, to initialize board-specific device drivers. + * + ****************************************************************************/ + +#ifdef CONFIG_BOARD_LATE_INITIALIZE +void board_late_initialize(void) +{ + /* Perform board-specific initialization */ + + am335x_bringup(); +} +#endif /* CONFIG_BOARD_LATE_INITIALIZE */ diff --git a/boards/arm/am335x/beaglebone/src/am335x_bringup.c b/boards/arm/am335x/beaglebone/src/am335x_bringup.c new file mode 100644 index 00000000000..94754fc877f --- /dev/null +++ b/boards/arm/am335x/beaglebone/src/am335x_bringup.c @@ -0,0 +1,196 @@ +/**************************************************************************** + * boards/arm/am335x/beaglebone/src/am335x_bringup.c + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include + +#include + +#ifdef CONFIG_USERLED +# include +#endif + +#include "beaglebone.h" + +#include "am335x_i2c.h" +#include "am335x_can.h" + +#ifdef CONFIG_FS_ROMFS +#include +#include + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +#define SECTORSIZE 512 +#define NSECTORS(b) (((b) + SECTORSIZE - 1) / SECTORSIZE) +#endif /* CONFIG_FS_ROMFS */ + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +#if defined(CONFIG_I2C_DRIVER) && (defined(CONFIG_AM335X_I2C0) || \ + defined(CONFIG_AM335X_I2C1) || defined(CONFIG_AM335X_I2C2)) +static void am335x_i2c_register(int bus) +{ + struct i2c_master_s *i2c; + int ret; + + i2c = am335x_i2cbus_initialize(bus); + if (i2c == NULL) + { + syslog(LOG_ERR, "Failed to get I2C%d interface\n", bus); + } + else + { + ret = i2c_register(i2c, bus); + if (ret < 0) + { + syslog(LOG_ERR, "Failed to register I2C%d driver: %d\n", bus, ret); + am335x_i2cbus_uninitialize(i2c); + } + } +} +#endif + +#if defined(CONFIG_CAN) && (defined(CONFIG_AM335X_CAN0) || defined(CONFIG_AM335X_CAN1)) +static void am335x_can_register(void) +{ + struct can_dev_s *can; + int ret; + +#ifdef CONFIG_AM335X_CAN0 + can = am335x_can_initialize(0); + if (can == NULL) + { + syslog(LOG_ERR, "Failed to get DCAN0 interface\n"); + } + else + { + ret = can_register("/dev/can0", can); + if (ret < 0) + { + syslog(LOG_ERR, "can_register failed: %d\n", ret); + am335x_can_uninitialize(can); + } + } +#endif + +#ifdef CONFIG_AM335X_CAN1 + can = am335x_can_initialize(1); + if (can == NULL) + { + syslog(LOG_ERR, "Failed to get DCAN1 interface\n"); + } + else + { +#ifdef CONFIG_AM335X_CAN0 + ret = can_register("/dev/can1", can); +#else + ret = can_register("/dev/can0", can); +#endif + if (ret < 0) + { + syslog(LOG_ERR, "can_register failed: %d\n", ret); + am335x_can_uninitialize(can); + } + } +#endif +} +#endif + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: am335x_bringup + * + * Description: + * Perform architecture-specific initialization + * + * CONFIG_BOARD_LATE_INITIALIZE=y : + * Called from board_late_initialize(). + * + ****************************************************************************/ + +int am335x_bringup(void) +{ + int ret = OK; + +#ifdef CONFIG_USERLED + /* Register the LED driver */ + + ret = userled_lower_initialize("/dev/userleds"); + if (ret < 0) + { + syslog(LOG_ERR, "ERROR: userled_lower_initialize() failed: %d\n", ret); + } +#endif + +#ifdef CONFIG_FS_PROCFS + /* Mount the procfs file system */ + + ret = nx_mount(NULL, "/proc", "procfs", 0, NULL); + if (ret < 0) + { + syslog(LOG_ERR, "ERROR: Failed to mount procfs at /proc: %d\n", ret); + } +#endif + +#ifdef CONFIG_FS_ROMFS + /* Create a ROM disk for the ?/bin filesystem */ + + ret = romdisk_register(0, romfs_img, NSECTORS(romfs_img_len), SECTORSIZE); + + if (ret < 0) + { + syslog(LOG_ERR, "Failed to register ROMFS at /dev/ram0: %d\n", ret); + } +#endif + +#if defined(CONFIG_I2C_DRIVER) && defined(CONFIG_AM335X_I2C0) + am335x_i2c_register(0); +#endif + +#if defined(CONFIG_I2C_DRIVER) && defined(CONFIG_AM335X_I2C1) + am335x_i2c_register(1); +#endif + +#if defined(CONFIG_I2C_DRIVER) && defined(CONFIG_AM335X_I2C2) + am335x_i2c_register(2); +#endif + +#if defined(CONFIG_CAN) && (defined(CONFIG_AM335X_CAN0) || defined(CONFIG_AM335X_CAN1)) + am335x_can_register(); +#endif + + UNUSED(ret); + return ret; +} diff --git a/boards/arm/am335x/beaglebone/src/am335x_leds.c b/boards/arm/am335x/beaglebone/src/am335x_leds.c new file mode 100644 index 00000000000..5ebc94e69fe --- /dev/null +++ b/boards/arm/am335x/beaglebone/src/am335x_leds.c @@ -0,0 +1,241 @@ +/**************************************************************************** + * boards/arm/am335x/beaglebone/src/am335x_leds.c + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include +#include + +#include +#include + +#include "chip.h" +#include "arm_internal.h" +#include "beaglebone.h" + +/* The beaglebone black has four user LEDs; all four can be controlled from + * software. All are tied to ground and, hence, illuminated by driving the + * output pins to a high value: + * + * 1. LED0 GPMC_A5 GPMC_A5/GMII2_TXD0/RGMII2_TD0/RMII2_TXD0/GPMC_A21/ + * PR1_MII1_RXD3/eQEP1B_IN/GPIO1_21 + * 2. LED1 GPMC_A6 GPMC_A6/GMII2_TXCLK/RGMII2_TCLK/MMC2_DAT4/GPMC_A22/ + * PR1_MII1_RXD2/eQEP1_INDEX/GPIO1_22 + * 3. LED2 GPMC_A7 GPMC_A7/GMII2_RXCLK/RGMII2_RCLK/MMC2_DAT5/GPMC_A23/ + * PR1_MII1_RXD1/eQEP1_STROBE/GPIO1_23 + * 4. LED3 GPMC_A8 GPMC_A8/GMII2_RXD3/RGMII2_RD3/MMC2_DAT6/GPMC_A24/ + * PR1_MII1_RXD0/MCASP0_ACLKX/GPIO1_24 + + * These LEDs are not used by the board port unless CONFIG_ARCH_LEDS is + * defined. In that case, the usage by the board port is defined in + * include/board.h and src/am335x_leds.c. The LEDs are used to encode OS- + * related events as follows: + * + * SYMBOL Meaning LED state + * LED1 LED3 LED4 + * ----------------- ----------------------- ---- ---- ---- ------------ + * LED_STARTED NuttX has been started ON OFF OFF + * LED_HEAPALLOCATE Heap has been allocated OFF ON OFF + * LED_IRQSENABLED Interrupts enabled ON ON OFF + * LED_STACKCREATED Idle stack created ON ON OFF + * LED_INIRQ In an interrupt N/C N/C Soft glow + * LED_SIGNAL In a signal handler N/C N/C Soft glow + * LED_ASSERTION An assertion failed N/C N/C Soft glow + * LED_PANIC The system has crashed N/C N/C 2Hz Flashing + * LED_IDLE MCU is in sleep mode Not used + * + * After booting, LED0 and 1 are not longer used by the system and can be + * used for other purposes by the application (Of course, all LEDs are + * available to the application if CONFIG_ARCH_LEDS is not defined. + */ + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: am335x_led_initialize + * + * Description: + * Configure LEDs. LEDs are left in the OFF state. + * + ****************************************************************************/ + +void am335x_led_initialize(void) +{ + am335x_gpio_config(GPIO_LED0); + am335x_gpio_config(GPIO_LED1); + am335x_gpio_config(GPIO_LED2); + am335x_gpio_config(GPIO_LED3); +} + +/**************************************************************************** + * Name: board_autoled_on + * + * Description: + * Select the "logical" ON state: + * + * SYMBOL Value Meaning LED state + * LED1 LED3 LED4 + * ----------------- ----- ----------------------- ---- ---- ------------ + * LED_STARTED 0 NuttX has been started ON OFF OFF + * LED_HEAPALLOCATE 1 Heap has been allocated OFF ON OFF + * LED_IRQSENABLED 2 Interrupts enabled ON ON OFF + * LED_STACKCREATED 2 Idle stack created ON ON OFF + * LED_INIRQ 3 In an interrupt N/C N/C Soft glow + * LED_SIGNAL 3 In a signal handler N/C N/C Soft glow + * LED_ASSERTION 3 An assertion failed N/C N/C Soft glow + * LED_PANIC 3 The system has crashed N/C N/C 2Hz Flashing + * LED_IDLE --- MCU is in sleep mode Not used + * + * LED1 is illuminated by driving the output pins to a high value + * LED3 and LED 4 are illuminated by taking the output to ground. + * + ****************************************************************************/ + +#ifdef CONFIG_ARCH_LEDS +void board_autoled_on(int led) +{ + switch (led) + { + case 0: + am335x_gpio_write(GPIO_LED0, true); + am335x_gpio_write(GPIO_LED1, true); + am335x_gpio_write(GPIO_LED3, true); + break; + + case 1: + am335x_gpio_write(GPIO_LED0, false); + am335x_gpio_write(GPIO_LED1, false); + am335x_gpio_write(GPIO_LED3, true); + break; + + case 2: + am335x_gpio_write(GPIO_LED0, false); + am335x_gpio_write(GPIO_LED1, true); + am335x_gpio_write(GPIO_LED3, true); + break; + + case 3: + am335x_gpio_write(GPIO_LED3, false); + break; + } +} +#endif + +/**************************************************************************** + * Name: board_autoled_off + * + * Description: + * Select the "logical" OFF state: + * + * SYMBOL Value Meaning LED state + * LED1 LED3 LED4 + * ----------------- ----- ----------------------- ---- ---- ------------ + * LED_STARTED 0 NuttX has been started ON OFF OFF + * LED_HEAPALLOCATE 1 Heap has been allocated OFF ON OFF + * LED_IRQSENABLED 2 Interrupts enabled ON ON OFF + * LED_STACKCREATED 2 Idle stack created ON ON OFF + * LED_INIRQ 3 In an interrupt N/C N/C Soft glow + * LED_SIGNAL 3 In a signal handler N/C N/C Soft glow + * LED_ASSERTION 3 An assertion failed N/C N/C Soft glow + * LED_PANIC 3 The system has crashed N/C N/C 2Hz Flashing + * LED_IDLE --- MCU is in sleep mode Not used + * + * LED1 is illuminated by driving the output pins to a high value + * LED3 and LED 4 are illuminated by taking the output to ground. + * + ****************************************************************************/ + +#ifdef CONFIG_ARCH_LEDS +void board_autoled_off(int led) +{ + switch (led) + { + case 0: + case 1: + case 2: + break; + + case 3: + am335x_gpio_write(GPIO_LED3, true); + break; + } +} +#endif + +/**************************************************************************** + * Name: board_userled_initialize, board_userled, and board_userled_all + * + * Description: + * These interfaces allow user control of the board LEDs. + * + * If CONFIG_ARCH_LEDS is defined, then NuttX will control both on-board + * LEDs up until the completion of boot. + * Then it will continue to control LED1; LED0 is available for + * application use. + * + * If CONFIG_ARCH_LEDS is not defined, then both LEDs are available for + * application use. + * + ****************************************************************************/ + +uint32_t board_userled_initialize(void) +{ + /* Initialization already performed in am335x_led_initialize */ + + return BOARD_NLEDS; +} + +void board_userled(int led, bool ledon) +{ + switch (led) + { + case USER_LED0: + am335x_gpio_write(GPIO_LED0, ledon); + break; + + case USER_LED1: + am335x_gpio_write(GPIO_LED1, ledon); + break; + +#ifndef CONFIG_ARCH_LEDS + case USER_LED3: + am335x_gpio_write(GPIO_LED3, ledon); + break; +#endif + } +} + +void board_userled_all(uint32_t ledset) +{ + board_userled(USER_LED0, (ledset & USER_LED0) != 0); + board_userled(USER_LED1, (ledset & USER_LED1) != 0); +#ifndef CONFIG_ARCH_LEDS + board_userled(USER_LED3, (ledset & USER_LED3) != 0); +#endif +} diff --git a/boards/arm/am335x/beaglebone/src/beaglebone.h b/boards/arm/am335x/beaglebone/src/beaglebone.h new file mode 100644 index 00000000000..6564ca4f6f5 --- /dev/null +++ b/boards/arm/am335x/beaglebone/src/beaglebone.h @@ -0,0 +1,127 @@ +/**************************************************************************** + * boards/arm/am335x/beaglebone/src/beaglebone.h + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#ifndef __BOARDS_ARM_BEAGLEBONE_SRC_BEAGLEBONE_H +#define __BOARDS_ARM_BEAGLEBONE_SRC_BEAGLEBONE_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include + +#include + +#include +#include + +#include "am335x_gpio.h" + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* LEDs *********************************************************************/ + +/* The beaglebone has four user LEDs; all four can be controlled from + * software. + * All are tied to ground and, hence, illuminated by driving the output pins + * to a high value: + * + * 1. LED0 GPMC_A5 GPMC_A5/GMII2_TXD0/RGMII2_TD0/RMII2_TXD0/GPMC_A21/ + * PR1_MII1_RXD3/eQEP1B_IN/GPIO1_21 + * 2. LED1 GPMC_A6 GPMC_A6/GMII2_TXCLK/RGMII2_TCLK/MMC2_DAT4/GPMC_A22/ + * PR1_MII1_RXD2/eQEP1_INDEX/GPIO1_22 + * 3. LED2 GPMC_A7 GPMC_A7/GMII2_RXCLK/RGMII2_RCLK/MMC2_DAT5/GPMC_A23/ + * PR1_MII1_RXD1/eQEP1_STROBE/GPIO1_23 + * 4. LED3 GPMC_A8 GPMC_A8/GMII2_RXD3/RGMII2_RD3/MMC2_DAT6/GPMC_A24/ + * PR1_MII1_RXD0/MCASP0_ACLKX/GPIO1_24 + */ + +#define GPIO_LED0 (GPIO_OUTPUT | GPIO_OUTPUT_ZERO | GPIO_PORT1 | GPIO_PIN21) +#define GPIO_LED1 (GPIO_OUTPUT | GPIO_OUTPUT_ZERO | GPIO_PORT1 | GPIO_PIN22) +#define GPIO_LED2 (GPIO_OUTPUT | GPIO_OUTPUT_ZERO | GPIO_PORT1 | GPIO_PIN23) +#define GPIO_LED3 (GPIO_OUTPUT | GPIO_OUTPUT_ZERO | GPIO_PORT1 | GPIO_PIN24) + +/* These LEDs are not used by the board port unless CONFIG_ARCH_LEDS is + * defined. In that case, the usage by the board port is defined in + * include/board.h and src/am335x_leds.c. + * The LEDs are used to encode OS-related events as follows: + * + * SYMBOL Meaning LED state + * LED1 LED3 LED4 + * ----------------- ----------------------- ---- ---- ---- ------------ + * LED_STARTED NuttX has been started ON OFF OFF + * LED_HEAPALLOCATE Heap has been allocated OFF ON OFF + * LED_IRQSENABLED Interrupts enabled ON ON OFF + * LED_STACKCREATED Idle stack created ON ON OFF + * LED_INIRQ In an interrupt N/C N/C Soft glow + * LED_SIGNAL In a signal handler N/C N/C Soft glow + * LED_ASSERTION An assertion failed N/C N/C Soft glow + * LED_PANIC The system has crashed N/C N/C 2Hz Flashing + * LED_IDLE MCU is in sleep mode Not used + * + * After booting, LED1 and 3 are not longer used by the system and can be + * used for other purposes by the application (Of course, all LEDs are + * available to the application if CONFIG_ARCH_LEDS is not defined. + */ + +/**************************************************************************** + * Public Types + ****************************************************************************/ + +/**************************************************************************** + * Public Data + ****************************************************************************/ + +#ifndef __ASSEMBLY__ + +/**************************************************************************** + * Public Functions Definitions + ****************************************************************************/ + +/**************************************************************************** + * Name: am335x_bringup + * + * Description: + * Perform architecture-specific initialization + * + * CONFIG_BOARD_LATE_INITIALIZE=y : + * Called from board_late_initialize(). + * + ****************************************************************************/ + +int am335x_bringup(void); + +/**************************************************************************** + * Name: am335x_led_initialize + * + * Description: + * Configure LEDs. LEDs are left in the OFF state. + * + ****************************************************************************/ + +void am335x_led_initialize(void); + +#endif /* __ASSEMBLY__ */ +#endif /* __BOARDS_ARM_BEAGLEBONE_SRC_BEAGLEBONE_H */