From 878d9347258fbdd8ca168d6e60c9eb8ae4106c1f Mon Sep 17 00:00:00 2001 From: Philippe Bonnaz Date: Fri, 16 Feb 2024 10:47:30 +0100 Subject: [PATCH 1/3] API_LEVEL_15 support for STAX Signed-off-by: Philippe Bonnaz --- speculos/cxlib/stax-api-level-cx-15.elf | Bin 0 -> 65456 bytes speculos/fonts/stax-fonts-15.bin | Bin 0 -> 36864 bytes src/bolos/fonts_info.c | 1 + src/launcher.c | 2 +- src/sdk.h | 1 + 5 files changed, 3 insertions(+), 1 deletion(-) create mode 100755 speculos/cxlib/stax-api-level-cx-15.elf create mode 100644 speculos/fonts/stax-fonts-15.bin diff --git a/speculos/cxlib/stax-api-level-cx-15.elf b/speculos/cxlib/stax-api-level-cx-15.elf new file mode 100755 index 0000000000000000000000000000000000000000..7a312c043a26c71d2a0d5b1c3e723ce58d95fa38 GIT binary patch literal 65456 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 I{^F4PH#&7P-T(jq literal 0 HcmV?d00001 diff --git a/speculos/fonts/stax-fonts-15.bin b/speculos/fonts/stax-fonts-15.bin new file mode 100644 index 0000000000000000000000000000000000000000..a3f8919179aa19abec2b2e6867285190d402a4ac GIT binary patch literal 36864 zcmce<349#InK#_m^z=BK&hcjgJZ8{c5_RH?e`>&p{EeN~s{(k%W zKKFG0tE#K2tE--R>Z#{>TF$&tPYtxyQ)}w#sc+m-Pi^{PJ#|i?p5iHrx=x}f2Q_~_ zMRUeOh?gV%!eBi@6jfqhDXL{QPm2i8n7xsi1boI|=*xi%=qPm?upReXi|GmAS+nCz z2Dp1RLyZwMcn5H$41DIMjnr=o zNWWc-e+GOKoBgw&M)_HgEyT zNf^9m(9R2iNjvWb{tCFyzR%F9V)_Tbc_^nlDQbEdL%D&ZpDzZI@mT_V+=w#Q z0B4`rNc|AFkJ-ZB1f08sqvJr*?k9n6#D57S{W=Dmhxp%syYXC2K>8An`UY?=?q3T$ z3wS+n5}tD#(2aUxz@5OyfQwQ7S3vTdQ6S3GRsks;gh%Q#fzy{TbOmrWa1D?=?_MA& zw;g!M$Iyp??Z7mUwDWi&o%*~Op9*^4jrYC~IGGVBZ!x|C_{>dl`dr3a_)WX|YU|k5 zSDR5QQvGgqou~Q%&kM|v3!~L@qF)oYA|b27^4vFm`$$ds%QeCF+M1SVZA)$K!|F9^ zO(fP*6FU^Fec4;rwdSK*%e_PY-1EA-B{(M%si=-rRRq_pXkGlWRcqC~RuV+xq~eWjw}vYk@vlS{McGrxACf5FDv)D%S$U}$2njNOCq}Pfqw3e-Y?Q#BhjI|>0jCBq3JAU_TE3IX?bE%ay{r;GHN7>7n2d{`{ zj+C{yqkdnDMI`&0YXm!LJi4;xpkzTh&~Qtz@guA11ypL^Mw1+Jx6U9fV6HO2Q&FVGKj z%e>3Ik(xQRHLe{su9jfoS6UZz*9I3ZT=?Ckw+D9y*r%U9#2&7B#{G;{Ww;Ji916y2 zVzo7~nwE+~747b{d+ftctWw?W{m=jDbyn$T9}XjLJIa6}YidzP5OtX=tp$I4FPN@v zzt8L1=ymP%x-dpJTU8jRf3|*T&5eC>5!YrgHT{>RE-Wi;py#wz`l2fuVy zRKzMOtCm*QTpx_w8;M!o*7sk|j5b=ctm{oHf}xoAhhraixc5}tS6g@JzS`Zv4)-6e z`PS9eRk#=Vtnunw$#9o1sw%CTFxC^sy+B9RJ6cMMZ7UTN`x8YFzl8dZK&WOIp?XFlkkxvUWnUUp)%7oi2vJsVARl`nis4_$!?# zS$n#45WTk))LUX*>#{thmTS)Y<*!ujth@QCWtlmDwa&xMH80o=JzZqNqYIBHTo+lZ zLD;J?9^|aD=6(Lr=bwH4nKdyF9#(EG{Mz#x`yrd(d7QbqwT2AO*L3=q`r;OA`oCnV z+G`KBO#JtFp&IL=%DWl&%GT20Xw7)-`!yd1hh4!TcW}@fwA}b1aXdD>v-P*kJJteo z&EVB7m)Ff%y4+oJo_AAlV{N=8cBpt1U*2`_zS`TXYRb!NFh(`5=mZ*zkU8oO)|Pwg zR;;>CPfAadL)(Y!#>zhcllaBxMv-^%(b4+`5-IL#+ z`|7gBwJTqldmID1$eRAa+`}sy8<)L0`F)TJ@=UT~n7XU1mG*U&^~0Xu?6Rgi?>Q3>A)Od#vTDsw-`(sN7N05^Skx_Y4&d zZ+k_{jd$%W5NK=Fp_Uz|i`BN*wKlGNuKV*q+_TGjUwKtoWu^brBTqfs@2{*XE5B>& zYdY&6$MK2BCiW}&h!qK6>3EcX*cq={3N~Ba?ynp=^9#27t6IG`uPlGCVqaxP;Q7ZN zrR%JqRSh;5u^=>9vESM4bzRAv`tiXlofTIK)_c}_#yx+D43YN5$sC>hR}4(hs(sWh zQ6MJ!g`E12Z@h*s$NE-gd2sk~eDCj4&SkE|;j?@8OkOYYSA1dLdgND4H?Jg}<~@B> zw5(i-mkvB)eb<`#!OBcay8Xyd;b=cH-12_a?}Qt17+2a*SM^>?`bg?jhW3|RMpynn z)(q>a0BO~!mKEDE5?vjrK-#)iWkM7yC zdjxXNw7=p~dUWrmJ=v4yrSE#5T6oLy^S0zZ`7FQjyp^|jpStv2-=$W@+HGyJ9>H}t zuHXG=;ZI}tA6flwl~s1F&)Z&pXkp9ZT5oBMcTUg?Qmk@&*SNg*d3SoB^0s3hM+?7m zzI)+0*Po36Ib8~Gjp z&Om*S0-weGmw+UH4{$E({|nH5AMCA2d=ZeuR|Cm&>q#8-{Dj0&?iHXL@nPU4!2bZw z2A+d~Bk7j|N&eNq$-r9)euJX!1GZ2U^$2h}>faCCJB^}V1WpBQyb7Fw^y5I%PoEUy zCD>a%j&hd*$+&zUNXG51V!XMChk=BCo-HETqs>G;qd*tl|M$Qb5EpThdd@B46-B(R zh--n9aW>*4{q}R9Yd%H&8c5nTjFYtUW8ekAv(R=DKfj2+BHjcf?YsxL9Z2?Sq@ImH zLe~$t{~gD@)~h%yYm6YK_DR20QRcT+lvxj0kp-6D@5cFcNhbqkHCFH{YtB`cyJF6G z&^umH@n=WBW4Ho>N6>P)ms(SoT8oxiODoM%t8Am?s&QMcO7Ix3+p1V()y}b6tX8je zi`S}fS6F5Ks&RJ&Y$oHYwp!fQ9_wkVVx={2o;9`9^~rgj@umJx=2Ti|d#$O{Ebn3~ zW7sV>Z?cxOkH2b{Jp0aY*kutrO@O~W6 zT6f|&REULw)`!UWULazfJadGD0y zVGK&pO^D$?|Cua$XcU>-?P4u<6}5JC!P?2zYuG2p&<)Gn<5lkQ2$nT#1dm*6{e+BT ztuw9(-%bl@3HQ; zZnsvut>qQg(i(C_cr$wNmxP!mTg&EI^QKzo&-r9d1t!MnA0d%17*D0Orpj8l(tfy2 zNCk4TT&>pRl|_2G3_bdfgxK6gVk3D9CNYt15S;bN<_ z5_7TIJ6`zNEwEfI)?D)JJFH!&X!+EH!BoIer~}VF-3}5OZ-3ajgtpFQkb_L1_t3+` z*1Hg~P7aMf^+}^OdAYT8uC>nEg~|B7b+_FRdv@8CqT)ic3$=f49R(eZ;TQ!2*ab=9 z5$itd1-noo2T0@agtKsKl|7)RI`rgF;UF_td5|q}M@Zuj6y|0jd8N%o$F6DimUoEginY`T=G|#caP->47}Hq;OVvJXUa?6az<>NZ$Pa;~RhZT5tlegjz^W^)NW==- zg-_jHZ|yScW?LIw)~(oumSF|M6DOWQq>);lHX~(NYsl}njCC$;T>`QCq=^B=siLm(Zz8>|XI*`qHU( zFSDxVf(<=wPpoU~{Px5mZ~6tT7rJUfmDbsI=S@g?2YvaEf0xfrT?>lXK-h9{LRSTY zSUA^Nhkak$$2YQn#$jG*gH=*(RTug&N(SQ}(LI|CFJ6!E3Cm^ml4pCZh`l~lcwLY) zu*LG?#K2a#yw+87td*Foe#2vrls`tg6O+KIHm@LMtsx8jM5fIMBL84rZ+fkdu-^Zi zaA2J4L38(6hYSyh`KW!2U{>6VnesBo`a|R;@%wN*Weu60CkZVqTL}L52s-pNaFmq` zZ8~|cH{PoMa zrvI6Nj^f?$-Od-Bz6hrE!_3FiyDn=VC*)s)IK%}U?_uo0I1w60gWn6B4SA6z`<0?? zC;;2h)pylH!aTEIQE85b_)NKIhJgy5noTkE0)lj$x*9kS_wN8cj`S@+&KZt^|^L?gY*NJ`7xd`+I>T|MS4Z$kzoV@A<#%c%1roJI>IP$vy_@ULfi3e*}_p zYk;Jk>w(V!_Z08HSWM3WN&mbL+)me1CxMgje*Zz@7#|t?o81({Oa@MWVk31fi8C7+ zH*lZ9(cc1+e!kX@GxROM18C=lVthAnJL*3~(hZJE07<_L0tx+$62x=<7m&R7Uw~%; z|6kxmvpHHL`=HtAH{bz-p)Ur`gl%!D9fyq$I2re=fqQZP0pNCEBaoEa4%~)?xHCBxOEAUaOp89v-c6uX4f&RCnA2i^(pu=x@zU5hTi}l$pX2kONQ~vw> zKTj=)_}!5Sp_Je9=#@7gTD>FajZ|0ScempjM`dMoq_R5d4L%Y)TpfD<+FkyLzXG}_ zzrS|T!SZy*^RzeOM>Od7N0x7|3R|9G*VvkxTb5P2-7e2^kEhD-Sz75o&%fO5u3G*{ zXwfZZnN?OkvTD_VPxZt9v1?V;h{r0^ue~%<61)AfnrO*Amm2|`so|Y2t&ZY5S%V^!=RVDrk?*ygVkiWg6rFuu`q~*CAb(BZzBCVA#dxpzCgy`!r zhabWONhsuvs z?I=_^1U-@YUhBNoCGN`d3ePEp9s>UIimOW8b@Rr}bq8uZ73gX7x98N)8}tOd-dp`G z27AjbH9of1yY3JZDT$OpSLOFqda6s%i!DzYWe9)uFt0t-62*PIu*Z*^WhfU|`BBRz<4E*!kN+|V3DrxMc%qk{I{lt%kN5oNXk)8fm&|gGd>mG^EUsVES+Jr7X^`>NuYO3RFf(I*8r_`Yy zyZ_hJ{3I73<63jD^7P1(ETo9fQ;nDWnqOheJ=F&%950|igSUNQd{IrM8xJmaq)jaT zBf*w6RnVN0f=56oUph!hU!hrc#deV^Z=`LKA~~@Eu*yQ7-+NQAX4TaO56#Jaf<*7* zDEQ^7EDx!H91CH1m}{TqR_W+yb~O7%@s8yhw_Kl$lLMj_9{tF#;#D;*6JP&ydv7KK zR(UY8qj)@S=l`3huF6&OROG41;mE;~h^>2$9%+H*x%+e7TC%F<>V^Kw(#o47Un*C5 zbIoefFNF@hsW?o2Z{_OX&DEiaJwn=lI&OaZ?&9n^m4xoN=0{<#J?iJ-dLH`1{o$*x zW^?a_yw*I}GN%z8=xaZFB>O3}olr|y(TaJTVFMGXp{FC>`t+KE;ReogA4v!nO8X@{wOlo^Zdk%Zjo*}Rma1#8Wp5=8b zXwCcZv(G-V+y=}UeBlnR`u3K(HPNS@I`mTLw1z)avCwPY@DJYEkfQvaCD)Q42;bwW zSX8-Ge>LAy9g7xvu3`I=_uNRjyt1+emTvzJkA3(f!QkyXeWaVV-}B`5s69Hh(OC7* zbKx~*Yu&-wp2|y6bMfcD)DxWTMgdRRyJdf7uAw7f2UpUMqHx7M+x^u$JcVCPt*18V z*}Ej`+qbQ@s7GI7UHdyS8W-WXq!K$FDD3ZfDYBz>O{}85bQFZ?eH8Zz6{0z`j@KG` z_uao(lm2!p@Xi&d)84sa?cO!z6W^n%9L-v5Er3Zik|JDSM{@h`@A(~jHxW(mW*hGL z{q{m~dt{{iV{5L@V^{vp747#dtMrgJEWV}3?=SN&^GB|Q1nPPGEY|<7dBqij)})i~ zzB~M_?;4&D#zsFFex-3^;}O$4Hg09o7DmV7w@a|jgh19tNhDdMB)jr(riou|b zDy+3O*S{I2p#`~$jnSKrRGZ#tdBjsv?Q#1(UJO>5Cs^XC^TghrZ7sRfT5{QCE2a-y z_n5F}Ig?iH@#!lrLn?l{za~;01aGabt=1{(hIteu1mZ^|*t+cp>guVw`|2T?LGNr| ziHsPhECnLhfvQ$ zK=Q5~Dr6bpceFyj4}q5=zWprdkRc0CLnqAxw%Hh`oN%-v_Y(xs&KV`7{ZZ;x;9c3-VMM71fu!I64fs>Uch4gA)l=^PNqY0Sq+jCHD3Hiv{~I`o zVkoac-n*V^1-gL01YR~fO3j^({IlcKT?A47V<7ycs9Vd>ZpfY=1EPe77?@tk5ifeR6LqS2(C4+HU|{>6^RsoTyY^a!0ea5pVboj`OEH5rv$06I*l zQ@?TjH&arHoR-63IiZ>blub1yhka#olF^yW%vpWfw1m1grG)WIKlG*=v4i(?#BMmI zJ2IQ!=xW=4B85-`*QFQ@%Zs7#i>})f4P5>gyDkkIPu~7Ux288N3F|bQ*B!~`t}q46 zyu|(Kv5iYe2!)&b(#5j+_T`VAs^+ET`%mEJ^E)pMo7?xF=+Bulf<62YA;4RgR zY=|kc63hIj*`J7nf)8Py_v!cOtsm{qxH7DxMqpCdM z!!aNF>;!G>Lvs2Nfw4^I(PG^+d7A6~&GLqrU+M%q*>7168)KXGYVtERr*JatC=T+Qgmj)H!r=h6^isg~>X6j52zmmN=@tqc9_a z9&b)c`iS70W{e17iW}P&HTiDd;FO%gn0y!BR>(*prIQOwDZz;5biPA1q=d>FYJxWy zEuk45k}i-p=L`;@^%KE$AxI;AkD7>tsX z48BVW2uaCgd}_BeP09#iX-r~FMmjD{QxXZKNZ!BGDX2k0m8u4-Z@eWIhqF`!EziI^j+&X-u@>ZB4j*`(rju*PJUBm0J~*LUq?pFl52 zx|E2q9WmTR2Q^=xa!6U_Y_;2=OJ6;+Kjd`bhfFvikdyNpv|q@6O+HdCap1NWJ5)2) zlvYEmoZ?+RKKI-&7bU<~z)^Jm|9YyW0{VNhn$l>UP7$^POd}!jyJydP<4xI&Za6B3 z<4q%NyNu9|+fR%%#lz7%N4G}ov{#LA{J=<4YnYM8n&Lj;&1WORJDQs4*t)i&aYL`_ z2>YB`mopruqz*@bUB+U*Nv1>YlpUs=F<7lfHrTXmXniT=zE_NuUoFXBqQ)LY~X>?#tbZKa3!sw87Hjkia zbQ%r>0-XZs295P~IZTqt%sUOCn>D%*G(OSea3%UxajM)cJEw>l-p8sPD556Wu$p7T zni!_oEN{9Dp4FY0m%JgSHG@yHrZdCqESM&nHM5%Cqu_NqpJR0uy(wqG;SeT0EN10m zSk!qtYU>u`%E)$IPy&!Ui}x{+Cl zFA_?b_@-hq;xQ$_h+|5a5l0j~{vjGagvTc}9-#q*(srm1p{yP1K?n;G?&cBdQb`Dm zk?SU*4g`8t&Lr5ca5}+3g(L8mHbqPfC^NL~=lAT#+6=nrm(;bStI!Q>1=M_7LN9O)zsBB))=0gGY54vQ1=fC#j- zVrnQ(Bn5F6I-HOUPB~oPsvq1OHRLQG;t~ovs{^eQQeue9Z~Jvt;S5GNI;*2OKYvT_ zfWU@zUh0<5|GFt`El7e-W z%vWUS1cPJk7eJ7rke~_$h3XqM4#5S=7~EpXpx$pVcmnTx{IcnF1IWRX78Ky~A zIfp_0gP?wHz&N-cbl*n^-D$|^DDY-UGMlre1d@+sXB`JghViN2VqvA*jVIP}D9!VEd zSg6^#tl`Kw^b`aq47r@qcwI!Fs7YQ2DaaiTT|f{MWfF;U5k6UfFQ!-wrzhdCx@ zntwJ$kRfF`P=VMFnK#E9yw;6{T>)knQ2U!|!m*}N^_%KZ z@hxmmj%~Zv9BsNMG}PP@YPexQbc7x90Q#1q2e#c4ayWIi&&h^jZ3#4|R|&)(!d3wR z6I+i$py7e69SAi%NSfS-dRXTyogGA_5PU|qT^pjsG1TY~$3!;l7;CN#9N%`2@%Gk0 z!fN{UAOy;c=yPa2}PQh?=gWA`!rOhL^Kl{X{YfY|4Wx^q@pAVa~IM^1~ zeGS(i)h@elkkEB$&3CE5Ixd+Mi{q4MFJ7IG;K7j7{H#N#v~@-T zn%1|}nj-WXw1_n?C1Hc2K@g&qEUjZ5bP__rqLXpzG@+Fa1PQrdc|kCXRSs(jC`Brw zf_*+~Qw$cTJ`_4dF+5f;3@B?TU0_+tX^M%hJAd;{CflRZgkYS6V1_m?@ip9W?4m^S z!3Xb3Lvs^4bIELwvC?gr(Tfo~`rkZzzfuM1{N%+07nAX}iRSOFUmh)FyZ?T{CXcUV z$J#Y;ULyI>LmF5Bm>*XAFy27P0DLr*73Xd|QaDh!@(Di|;(H%9`_LRcAYiujmOr;pqjwDa`Y`TOm%eJUS_ zw)Kf9rSvsNe9?#c6$FQrKqP`$f4bp?nY@1e9TU>X-ONJ|f$u3p8a775_NHi2T_LM0wS1br53cgBq;6$AJ8Xn7m$I{rwkQsyh zA#FCSyP&{gF=HHs88g@%4>a6BIBZtrN@D*sB!*e7UkpP8?^R7^3Ttw`_C6Ms^DR524K~-UU~R$)}prhoR=m;?>NO^LetfE902QdIt3$8A9i#~f>)(tYXx7S39btVk55p#AwLZmHw zPu4AJDI{V)VJj}k(&V&vW}tekyUyaulr5}G3>1_Y^60u5(;d(RVw;F=>jtA?#NOte z*qRM%P)>aA>~5|ri9gi2*~mM?PHaLAXghRgO5uE%U(962Z2BMoX~n?&G?;)hj~$;F za%g$1=st&PZ_yz4LG_4^#Ll+=zec5>bl+E(@{Be;_XgCt3dH%ZQRlKmovV=D6gUjj zxr(jMRUlXt)wwJgSukbNVOg+gY>W!(2vmnHYa#4_#6iLk(h53V#n$PH1_%&B3j<{^ zx{RoTWRqo})RoUDb=gx&U9FR7bqTkJR#!===aZG}KRMY4AH3o#lN4-?UBCWv!hyfG zkUB+5d~pJNyZ$@fxI&i&g%PxWTBmmZ{hZ0Z3DHq{3vGN$GPJi089@@25PTEj%A1_= zrT~RT^UEd_72w5ECn+wHN_0-mV^+&h?a0R!oma*bGuAw;gksHu*lM!!U~??Y7p@Az zBz;>=h!utuJ~XQE=7`Mu24y}BriI)+xW<~hkptJ}nlP{QKn~_*FfCHVh&7Mw=M#xU zbK5alk8K#01F-{xa#(L{>)TozMoK?{#x??vEq-wTfE|NxXlreNWMG|nTw^zMHSG*P zcG*CehRwv{7klMUW7~l2W94Bv+<1Tp!;dX|ae(AmJV2oSxji<)flc9#c8YlVPWi!OZ~~ifAPv(k7?& zXbvBAYgnD~c06a-1w|h%=AAw~6|y$wVaI;v#Q_nma1N_n;>5Ney}h5Ve~ak4k1OCI z$H3WX;W)%xB=96bb@+tiNM+VK2BD2M2cbGJvHvpZTDBJo6@E;hO;#O+PMnrT@fQ4; z3N0Y?m9#`C;;n60B(!PjzI?j4~Ki9$(p9K)Atz0*}afc zQyZD|My8L4=10^sQN9;DWEuJsK}SeS6|7Nm4|c?9Y-(X-=z*3X9c9R_x|f0G8e3{1 ziG{saG$e4%5`*n01=)}?AhBuapXKB7G^yv;uWx=)8xrUcEB7fh^pZVFhz_t&NXOnt zZEG+D?9YTwR;RlJ-O;5P3ei61aRQY*9uEaCiG%w=Ptf4VL-*DR6G`{8`VHwfwmVKh z-trVX>nwir4hC+VUdual4Y{EohRAwW_g@I z6%Uqxk{yQy3=Jd7JZv4I!@~wX{(PzlD!dLR?86=o>Q=s6VnUqUr^4tYL){5hecOZ; zPPxa|FxxEaf7bXx`i-dLL_c}4oy>{e!b|lQ-?4|hGn6eryAOIGC6PXXF$0fAC-pIQ zx7`DKg+d3=j{_iB!!hh6{X3?}^JT5;K=+9Oku~My<{v`+A0XNe8HGb~l7$%NFgCsg zEr)FI*pDl)84;@{6q-DST!zt*bc1S#p&Ef^g^+>_r3UF1Cz4|{AFYLAUv4+x%9Gpf+9*aXqF#UD1ixo{}Yg~MHn z$*sS<3mP|Ugq+wE$=D>xkOib;jm+_#+(5s&7IF@^cJi6MUs|cFTa!p?$9K~&Cgrtj zp?NacBsz&Y9Y~+LmC+I>is89V8TUDo(FY}aAr#<}_U*d5IW#ni8nlh#TedLMB|%F^ zb!}3+1syN0z>H*c2~ds5KHJ;`;}i?25AsJ6h9#koH3Zow4LCw9*=Px)4#*v_dTCwi z+GPg2a>ATc*RH)eG1}A!L3_J7684d;WDZ7GsLUAW z`pcm`V}@b38+Pi-Fj&z@lpBHWXapi}#M6OZE#x&F_btvk4Rr{;Iw9+5+%cp~g?zep zE^Ikrs(7iZ6B+~ZN<(Eeh(Ummmy*`A}aW*n1@vg2rVAaX`|YS9?eG?B&j3`+Yd4OT;PJd zJQdsNsSaG$Le{~obQZ6m!kZz7gVD)Q%Z5Wj@hZD$bGCU8Eo5vK9dn!jHG$jFCosbt zU2S>*q*Y+)r&xTE-GS8?mVi_2E`NHJ$QRfh1Ou=;tUpkRy_wzj%s zq=h~){G9piL3uLl7??y^GD`{ zW&nl;Z99$SL4vlO#8vRa42;-hae#V4f+iT$h#PDs;lI=QhUd%-DXQ za~SXs7RqZ@XS;r8%+EABMrP*J=~}*N7luYABmw)!X~eRqW}F^9Qf5F6NCbFt#pXnY z?*@P0R8j3lZtz3-*sL#dq z)+^V|0d*pGh*oh8Flrx?Hg5fJ&-{V6uuMwFg@8jEQ@BvW55^=e6m23`PC6<%LdT)8 zKGqb4Mmidxhj3~5!9Y_KHzECoqRqpCuc2v7&>MbmeA9PwGv9fJzT-{N7jGLA!?6cO zw$z3j?ik&2Q_*r_9hd8F;*1l2#FLufHYR^Q?Yh+BR30i6&5(i zX+jbOVGj^cI)l=vn3g&;hmqYRbZ>#i8=8#7hkL&<@D|M5;&IW}aKo7D2%%4)0Ejh> zZN4_ZibuCzi}a(IxU?`TV(T@~)Doc4pq{2!$RQ`eG1N{3SrPkHF(*U2-vsgya;UBe z^9cdH;fDUrH{>>7ht*WcGm{A8>VjSp25%@Hvw{x_aDqBxN>FGbuqg>6vK@l5jTo{) zs-#=6iqR5GWF(vxU?ndEGYWJs21(3u0RkPok3c7SCM%UAgL#IuRf8+>IGY-nrv>z{Dshi-c;B7*F6mMD^vy?nCwvjF0K#pM z{sj>3fYjwQd;)}(F>p4%Lphhl_aXK0Jp}Id zMd|MW;l4@T1cciq)dYMJ<;dS9fUhb&g|nYaJpv@pr5%Oua8?3|FXxaQk5a4n!uK~n z1CsI!oQ3>92R>>dzz{?fA9;gzxJPf~fZda0beezmZ0KI7=n?$O7*HK1nh3 z2f(?A-z-z`Nu}s+Ao)JX3*S`xyC~pcly|5E8G0!Y?x1uWNb3C+@JYm{X@&etf#f@) zXMiOCN#IYB?+$dv2{}f2R4|2gb_Bnj_ zbTbg;=p8mjsXrFt)N(k2lKKt;cN!F(0`4>Fsq^78OWGd-f*z?R;7r`l0|`CO0kO?Q zefQc(QCT3NKLhkm+IbT}nx`Vg`18OgL5E58f^W^7mD<{bRn}mL$+{50yv>My?_@sF zW&}pHMCwNwF+hIW4+fN#B%rKH-A75hipgq*F#)#7B;yll1=CMVknFdpWC;~7uMsqBmXX6G5;~N zt}}i6VO$1NSGyHxQ~3am{V15O!8!~loPNMbbRL#p8eWeI%tT~g)WNg*a-CiT(knD~iR%G0L@->V9JnmJ5g*6_--KFfPh76l#MlOX!Mo z=lsM-WVabzur73Rc?F)A&cu-1*LK^BDUs?^O@Y_@)DYd#w&%r+3PuhI(xlZCH1Kc= z2+-KZ8IVn}7;O4j=dkW1cs;w3hAK?N+mkJ1N&~+nK~ZmgT}K7PmY&6yRp0)`V{qR< zO(+x+JLT!{UxhD*Fo{E1n<(T}i6q4CWc_#hx6Vl#(XCxutKlL9vkJF}gTHS|#U=`r z(NrDQqs{rIUoP78M)$0K_z?!8cXq0LIKadF1ZfF$!N4s0n-eql?J`V0sYlzopWDGF z8F^6T|F&sHV)OKo&1@njj~;S3hL!ood=&-`N*>t1x!%~bXJ8n~qjrXo&B#0>0sm7G z)`HV#hq3^Ka#JbM_Ql_V?(lSmZpEb}dL-x^vyzY1(g)U>*ab8_pGe75F%)0( zQ_udBCLe=}_$X%281R@XClXEjk0}NmB9%b&j-jU3Q1pSJZIMv?z|fZJLP~%i-PWq} z$InjWw(Xw#NL!CchwJ~Li-V=P173&D1x^m`J5ZcMP{H(saF0Czk!K-ADyQI7D#@mT zCUOpwb55Vim`F{H1z)OlUdN;rkl`M3IlV0-_+M3PlJ-w z;8Ym0^Ku9thh$nbEHQXYmM#!B)?5e*I@DqCmx3e!T}9VMI;$cGl0q^FMW3QWKo$|g zCKQq>?wYXYb2*47kc8mvW%OugcPi6AR-sIoDiJlLvlmvvgc5+;bHM2cK~ynzx597V zi8(=BnPoK90Z-$uM!2Lxz85id5!7r|2ic|(nTGhlXqeIPI@9Sq4J(z?aOSa%gNlIe z+3!o_TIqp4t>f%OZ{t-1Q7)t0HxI7W6M9879Ct*S1#rNICwG)Xc}7Y{(PCJAz~s0t zm@yMkF0XM$tKsXBd~h&;+g`s?>P+NizJwz#QED2LPkhMXX&I(q`h<6jW<33yBXF-I zVeH&t7O{h9FD4wBbR-$hmxZ8;WH2ctzxJDtC=o&rVbB!h891qj;VuYYh#9Zn>!#*uNM`f;CDACBeHKMtnxX=&|4f61GZYCj|FI z_{<1;7Ow1eP$>i*{z>5S3SP`fHh)f> z*Z{y#kgz=mQZYJ52X^ZERMeA`0*W&P-4M2W(98OyL20s6dr!Mi9d5cQ5WA~S2%CJ5 z7>ZtMV)$u&SMOt!B;pb;fYycd0et{UHHOTEjbwtTog10#CI)?`KxL_Az-vh&*bT8J zAuH%pZ`m9ICl=t1B8Ax`r?Wj0?Ssc7#s9^k`pdxK({;ihn~Gxk77rRL&HH?$e}NF$FH zC*<|mV>S75yq;uWzDw#-Hi`u-T>rgfl+W7J?&-d_;!G-zeHAPKQI6by1mD4c1we!I z2vdkCa1A3K+ey$7N@4AW5hZSC#`a51LIiM<8nJTYvjr^T62{yKe~JJI2#&Q-7^Qx_ zaoqr{tK{nq0j!znl8opBspi+VtS&j|3-Wu2-T1?QN#7S2Sa7sTcKJK` znMV&aP;V+d&(z!nYYLfKtWQcS0gVr-DR^Ay%oKP~V?+-=e^6(zi(?310)a}KCV6Rfb#q1trsZ%_839Pl3s6?W?UB|YWy0AA%NLmk@HsPNumKo>=ED@k_sG~SbA6Cu zXkkzjrnKJnVj{2gHn*A(aNycN9AMDlSTl|2{$%s3_E$4-_Js@!M=Ed-BE0f>ygf)B z5BSd@;`!2BZrC6X&a!)H8ZiafAx!Q6aR`6Et?R!RH=ajItfZF>T6rGS>#0Rvx{68l7ct{^8;@PwMsFrswq zf<*pxzfP(8?_MIQ&FEHVfCG}Jp8@&7i%1leO}u<1lU+orD{pM-fI?5mAv-!{{pA7{ z_7Sit=*(59vQ@bM=tGd4hM-&;+R3~)JQISp)+Z)6U)o3FSo}ya^QYRX|Vk4ibjv!I?1U>(N9XL?onjii{6#w8$H6>kwhl#@8AM z!pWwtd_sk!L0@@D56pmUk7x=#ewM3U(^*sjvm<;@tmnCg^D`W3$%VH z?-&$?UaQODD+v&SbI9rD9k8;&w-AF9LTENgfvms*zD#0}+~BMN8neHvI7MU( zKOgc*fykiNC+<4CCU4xD$UgVWH{c`egX1(4VnOK)%rNA$AtFuT`x609Ebv?gN79K~ zE1}}A!)m>90y&YM=~QPZ#WzZ;QjT~tNr^4^I?Pw*gKj&+7hVlp)eJTVa6lmM)*+e1 zMHOaHsszs>n`FiTxt&OUN{5K)R+vV3M+h@tdPxa0srZt%1ry&!72c9erQ_JnLUKwg z(9h$O1~^@-VF_O&nJMzZ1_O}<6C2JtFmJL7xVxB!o00@UP|4_wNF>9I{h7d*q0*>4 zGm1%@r=L;=JdrLc1MqDawzsf5OwFC z$ymFRFo>__Oo|Z?*)W8$Waq?ih{^x3*yu7i+_c?7(!O;bE8GdTpTLL2`}RSGH&CwPqjoTHR1(cOsd^ zmtRnDAIRX^@L*01G;HXC9{z@&y^a_ARZ`_KL66-zDg@%qgIM6AcMj~|rNaYbfP4YS z47csl&EaivU;qBN4*#KU!~+d?VvdI5+xi8w;Z7J9V%vtcEeSN-KC~?!LU?OUfaXWG z-eeAMt%0LYO_=M(C3f|NlHo|pWMWEZ!yq!L|@M#V8TW# zVAZva0FZ%9xUBG?OAr$_z#*Yq0Kvnu@8jX~#hJ(n<_bY4fgCV~)TuZ>_Aq>gPq|Cp9YHvfh!5vUMcgnZehLZ(PU=Yp?1kV@1+n2luB z=1sEICZPnF8i#d_grSj#XJR3omQAw5Cdv5v*C??=7&DU40lOGMj9yZn0!}|A>5}?4 zE`mJSkMC5ASN7g}qmCr(%Ein2_16z;XAf?T=+0g^a5=jU9M%J|4INt|f#~`Uq-?)_ zpbH*g8+v6ux?!;C`DATvg>ym$y7R#Y&s1+e>TI=t+b=rL!3TnmW#LqS8HR5z@OdOG znh>n99VPCk#HAY60LaYSu1n~`|K*pSl|B#{z<0<*XD6p8Lp=ZBfphwy+R*#3ruVV> zB;BR6@FIo~r6=1i9e`iDnv5yQZTO-Bd)r1a1>-HG=_Gb$y3z|b!^B>CAc2XGt$`x} z^;rK#C$@azz&WX>^~(|`nre*LT`;myVmH1el=4RGxkS?;m;qsAz#fb!4JCX(NG!1A zTfzKBKDUwY-Y8@?@i{4IxD6NP=P47W3TFNOmhYrCe`gSeA>zo`k5AWAIQ!uL2o}ho z<)Bg>{$tpC;RKTEm0l=x7`@M-AKCw>#~9s#bvs;taX)N!Z~}ha&-lbdQeC%>XkJe} zOkSzeb7_5YzRi3rvzI-Qj|;g?L>)rfNmL^?uSL6Ac*nrJ*v0BEZGEdAcGo<1({%p+ zX;6qkEK_mGL#)=hd#B);^08@ZYTb28CwQik3x^psJ4HXT+)pv*5e|94cr1gVjx$-j zeN;p{$WAM_kwfFKjTUopu8_uHmE*u&uys7L?d^I)#Gek}vI>?`dmAjG;^bzbvngK2 zL9$BZAA-jUj957-Z02b59>@U_JZPQ$8opAF!O}lT%_~>I3cYs1sznAUxp6^q?XrYo zB($&(Z^sZ!ZoMnHZUy$DNm%8f=)=S!n?MFgiJ8qmNUpmMn^riOB!<*JM;Elb6x)H0 zB(AQE0op<11k>5i>d|(vi9tueG2%2u*m2oDc`bT&VV5n^+85G_fo(zXrmVbnC9H)= zg{A<;WXPTCu9LJxdg~G>n6ODn!T%85Lraj3@i8L)P=wU8k?(EfH^^z&>{9ql2HGsT zj`Sh%$QFAV#2#gm)-7OPx;9DP3}v=v<-J4`;bs4)2?d>h}Z2_=ustxpV+&cfN#;ON<>zu4`x$?8n!<~23n zd_81-Nb*qB5cZ|Q@a!ZSGO$_@HJNPqR0tn`>7aWReU^$k!2dvFP!1ATKzKap(I{f5 z1!_13F6)jC=#G={bL*6*s;NhQl*rBM)QF=Mgbj2QL8vUV+C1HHD?GN9aEOKLPY9on zk`xiHM!GyQUHji*U!VOOJFw)j;|=1mM*0}GHTXPI>s`wkbRWDU`r!N0zYc$uA*J=U zIiBd&;Bnun1)>k;nxcVdQx5L#P*^z3F8J-`wnYMINGT4OrQuAR(adOb$MejC-AYb+ zQ;$6`hEKMJS>jBvwKhbLY^^oP3HRgx3vLx?xPH)#?H@54HjFsvKy3feft|XKc8oOb zG>6*`>n7Yw^$^`hhvC`mi)|QwV)FB2kW%ybgA?39ZX2O@XIgU_kY;HKxOgT{wALVC=c+vbV*x--1aW4*QM#G&0TA<;szNT0p z*4)<|4{*Z3)|-4h39@;pUx-IbZtG0}PEH=sP1s;KIUA?((y``_IGcH%Zt7MsZ3ncO zy;_MA0|Hl3xJVL&lmkJwR|^Qx`;c|TX>ib>lTZT6pQCmtNi{GDQw(pFuA8;{#k+#7C2zim)gO8eAl(15kz? zg=NqFFh5aOSC@uMfPFsn&_jv5SW3Po66~*f`ruu`GXVyQsc?N)7|wi#hm(?mA3mNt z7_xrz*{IMTcVumOBBf}U>1x_cE5vID4TbP7K|fIVl9T9)AYCJkh0+M$VrU>W*luA% zr6$8cEh85r2coz7pGP-2NLpJ1LI27-_`jzpsFlLKkeT?*a0>d=b5{`IGq1fW-FxIgpgU9kzdx{(In~Mx6SajSMxF*!+>ck|1pU z`-|~oK=OBs&VlX!BHaI1Ao9^G#6td8fNrGEkbwAGnsq?(H#+-@sK5t+*!;Hw$=@tZ z1MxRL>AwQ^p&w_%Ctx-y2PEb80WUy(Fo@f}1Xlq``PYEtZlr-;M##ML9PHhuF@44165#^K0M%BTALQHvmC80DRowsMmpH z9R2_#Hvj((BsTw<@D%{<(ANR+iqwyR&l(JU1W5h{=?NR_DKC5n$hgIA9|DdV2DTU! z{jWgs{HxGd(*8OidHz8lN&i3XU2BiqR(hs*6)BRSJx1beCI;Jh<2dmKY|!0JFEP}# zducj02HB#)rp{uTlX#37T}Kj0IKCyeX9Q!@P2kvL7){|Mg~uQ%krH*8 zk!B=&TqK3MDB5oS!G7uXIn*S!yWJL8pxed&+CbDx`I`ikRw|^<%scn}}#*84^ z@0cG98~%s;mxgDEy7-i~5gRdD+XV-aGV#W^}E}yguH@LzOCk9AF8Iq!5Im8wiomLa43^YiG6}cQFWf zeKSS(?4Q7-A{pzz$PA@HCkbQ4x#P+396Nw*y7Vu!$HGkd)pU?v5*j(jyQ z*9$!GL8+QiLoM};hR}gmf?)w~67ZXr{}_f^>2d`HCH)Uy`D>TFYv?Y#Yt{K|+nQ26 z&vjM`JCV4XIbXL1H3-Rzkao&Bz8XdOYe!b`HViEd8-u%E0F-3 znAT3cIjELDN$P@snYP>Kl9N?gT9pyt@x-u@a0+5L;>6g-CFn_!*)kj3!eFRvG-}w| zAiFn?#5pxlXlK;c7oVE=r1m6qE)4T}M)`7cE5Fxq=AUgfahg)~-X-%RVX2X21& zSNv_%j0M&w_is(KZ2Qt5k>WXnU}6 z6mfrt=Y`RATG2Hz{|+9E4LyeWm^1yNmlwLTa>tBy3rDN+)pNHW7bO2y-8AMnJ3#=`CR%5jsDk z)H5p9d8Llu#&@+|!noBMr&y<6PEL|CL*xpy?87w-Tm(XXUJ%y{@Dg5sB+Wds;g)Fp zn>qe5;Jru;Dc}|m55PM^5DVon1rhNS7_|iv$=vUSVxQO2;Gn@F>xBc(FYJHv6RgfD zO}t~Iq%;bIK_ZSCIRsKee1X?cV9@YNY>-y#XcXc>Rw0d2Jiy)K7>bmz1J3y9`BRiy zDI1fxEs_Akw3j|TVyNDEe&GDGQeC)s0R{ZTP6GG~XHnHNuV?^(fsO;Eg$)u9=Xk7O zX@@!4EAr&>Xy6BPa(zzpOl(0c3Q{a1SBoqHK@!Yy32^|ai73>4NZ16V$RqcoYhBzb z%8qMYLMPA?fOJ}FT@*h;8&Bv$jse=oonyK&iJ&0*Q3HKOCLkEUFv&;*okn721+gu; z#mAhsxzv>I1EOXyDvC-B#*s+4r1lY0G%mcH@X|a6FXBz$en3VLScfzpV>m}%b55?} zgS7(Liylr?wLrVpo-t;2dkA?X#+A5sAEawd;YW}H#wQb9Wvk@;Z0R4)T~$`W!Ny1k z6>Qc{9MSPonr}PS$QB)-R5}Kw}RqR0A3{@t_i|3&;d0?ttrkw zB0k}t|K3#~d3BV;NP)xx!`O0s!tV-}RWapO%;oqK>P>Mm{ z+LV?0pTq}xf0LV)*5=}_MXznDWToz$P_gLltXj=VD|3Qx(JOPug1Kp;;8?j69|wPo zCT>F85!Len)xzaV?FqPKv6L0_IRa}uc zt)&PC6WVDMw$>#k8P)cku26xB@@}LJQ*de-P{(0SqLd5;Y8O2{?J`sYam$lws%3+2 zVp#^VBQ3)fT`8xjRpsZ_@`{Y4lqj9A#YQvgC%;2CKaRbTyl_bL(qdSS4ZL@>$%@5< zMPykh)lHB_xIP3oX|TVpA&fE9J{&U)+<-!0V2=BR9bjSudP7D${K;V6Fq$c`fuDhP zG3hWbwo)plO$$cQaG4icT4>VE0s{`t5W$khq7G6-4W)btIXn+ViBf#PQHfPqyuWY* zS#sj<@)Dr{qX;ir>ebQWDGkh>fMn+NiAsjR<9Ly{Anz9WrcFb-v^27Sez|AKA05Lc za{GV`r)anImp(v976(Unj@a-9THkPHertvd5by_Sl@l=3ohAF>J!llJo>8kH0#V8WLZ zRmgL6H=@K6}W)>`s@7gZsh%G zet(!#I{(wBt{h0;ecP^SwZ!;6JwC_3`RoSVJVzh?lY3uE@v#<*jDo3WSXfkumDZ-8 zzI=k~*;+rV^zfmnweom!4JJ&Av5SI*mXghK^8MFpSzPnVFG27{h>R5phjs=Ef2;Ge-Gl3{x|})STC@28&uW zHS3VO47Y;=T~SjQ7T=0HP<~kjM+Pgl*l}77&(O!Woz;^F!>QGjTr2S~oN6!xN<3Mb z|82?dE3o_SyoAhSW@x3rBOcGlcs4&1Jzhp3k9TLu?@Nn!Jy;dqBfpuG!c^ow z!tOm@xkfJ^haIp$4`9#`2NGAS7CAVO#H7heLaU~ObYUn7tK;^a9l zkjIg#gg`Ax|0GC_)Yul7W!Js}(R0s7qz)e*_H==N^HogHJ9~@IVq&3A5_ymy3aiO) z?2Kce_2%`NUWx9fSRHZ{JcudmL7|tPDtASk&;zau(gdKK7r6x>oF`r# ztd-x_jnskO!fD;eg1+@Mu+*C}r>~I~sk+xuW8WeNW#>_9Zy=c&s#59WD%b)>5ohp*+Sha`mL^KGu3S$J! zwX9a0WTnQNM0TOnEX4Y(V4%J#QfzS083j%nUOx)X5G#$E@S702jGCyUg4+-^0rxQq z@y;-Tv2{*IBa9nZlF$H@8|1uWJ>Ib&bxMhjEqt-04n zEb{=xK6r+`3QOPH?3F}f@v&3|b`h*Z5<8NsHtQAOAtd}1>_gs5gL@Vx=iiAqrIth9 z7K}Nia_P_i#tE0s{KatvwX_o)s6+MpcD}DY(a3T^mTOR8cBMj-heKA6mSK#kGckBm zaG!#`m<7(_X+S^F2|h6@LKJ|nnh#ggyFiFTSPJFkv=HQ(w$0SjYReSrdAVhBShk}} zFGoMKd_~`}>jV9X6_uGl_T%*<-<*UOCmuRP05)7%9s8J>?_572b{Yj-O>D$)TQS(u zxK4ezwCQ?E4KvuwHWoEW1n-+AG@Mo>HCj`ecv+ zxTwNK@X=rBxD31zexnD6jhy16ld+4Y08*2K;kw<>|1?QGfKUOlDkczp8UBi^c5UP? zOHGq^?a0it`Bo~ng^C^C4x|au{LvD7beC`QUHB~Cp&#&405psb7H6Isy)^R&qnLL- zQjpXU&t!a{m8CdrY}`5KF~3|7P)FpyVEbukB{G`0I?HhDH30hoMgx{a~meReWl*HcXu(KZrj{b(?|BKJ^^Q$W4OAn#j(&*o z00@!`2`!szb5vU$0X5Kwc8GACkfZA=2*~u*u@J)2kWkYip!^3p4nal=iY&$liP=QM zt!iQDkzs+^foVcMH}oABu799|8(}ygt{?dh2JyctI~52-r0jK(mCMKszS~CclysE9K)8D_iv6)}LeR5n>unPe0^%5MLVr>e9^jou#@y zv(GPK*eAZ2tG{MaC_qY^KuVR3X_3IRNI;W4*eam_muu5hd*R_>=Mg-4de48DOI;D! z?VvjanO zhUT4(4La6RMFHF<)g_1)p`KPkEMrulY{v|lMR^OT5!Bjfkv*!kD4{PaNHN{(=^5{`Lz4a#(tyZ=cp)}+TmDyrzp86_zQoC=`@BUL01L@3f8r%^zCc<1)cx4q_kMAmuJZf zC$Q(ig9n{P;gKH5dd4pD>=+5XOvD@(g2BtgzAHj`eK#F*ZKjhG9TRC8$WU38Q2{ac zeOM&?`hq@K&n4E=>a84qt3q literal 0 HcmV?d00001 diff --git a/src/bolos/fonts_info.c b/src/bolos/fonts_info.c index 5000566b..b1b073d7 100644 --- a/src/bolos/fonts_info.c +++ b/src/bolos/fonts_info.c @@ -203,6 +203,7 @@ void parse_fonts(void *code, unsigned long text_load_addr, case SDK_API_LEVEL_12: case SDK_API_LEVEL_13: case SDK_API_LEVEL_14: + case SDK_API_LEVEL_15: break; default: // Unsupported API_LEVEL, will not parse fonts! diff --git a/src/launcher.c b/src/launcher.c index 4c831f8d..7d52b3b6 100644 --- a/src/launcher.c +++ b/src/launcher.c @@ -791,7 +791,7 @@ int main(int argc, char *argv[]) sdk_version != SDK_API_LEVEL_8 && sdk_version != SDK_API_LEVEL_9 && sdk_version != SDK_API_LEVEL_10 && sdk_version != SDK_API_LEVEL_11 && sdk_version != SDK_API_LEVEL_12 && sdk_version != SDK_API_LEVEL_13 && - sdk_version != SDK_API_LEVEL_14) { + sdk_version != SDK_API_LEVEL_14 && sdk_version != SDK_API_LEVEL_15) { errx(1, "invalid SDK version for the Ledger Stax"); } break; diff --git a/src/sdk.h b/src/sdk.h index dd409b91..161f74a6 100644 --- a/src/sdk.h +++ b/src/sdk.h @@ -29,6 +29,7 @@ typedef enum { SDK_API_LEVEL_12, SDK_API_LEVEL_13, SDK_API_LEVEL_14, + SDK_API_LEVEL_15, SDK_COUNT } sdk_version_t; From 0edec4b68c45bc6885359f0276391be6be13e621 Mon Sep 17 00:00:00 2001 From: Nicolas Roggeman Date: Mon, 19 Feb 2024 16:23:45 +0100 Subject: [PATCH 2/3] Adapt font structure for API LEVEL 15 (different from 14) Signed-off-by: Philippe Bonnaz --- src/bolos/fonts_info.c | 63 ++++++++++++++++++++++++++++++++++++------ src/fonts.h | 40 +++++++++++++++++++++++---- 2 files changed, 89 insertions(+), 14 deletions(-) diff --git a/src/bolos/fonts_info.c b/src/bolos/fonts_info.c index b1b073d7..c6328297 100644 --- a/src/bolos/fonts_info.c +++ b/src/bolos/fonts_info.c @@ -6,13 +6,14 @@ #include "sdk.h" #define MAX_BITMAP_CHAR (MAX_NB_FONTS * 128) +#define MAX_BITMAP_CHAR_12 (MAX_NB_FONTS_12 * 128) typedef struct { const uint8_t *bitmap; uint32_t character; } BITMAP_CHAR; -BITMAP_CHAR bitmap_char[MAX_BITMAP_CHAR]; +BITMAP_CHAR bitmap_char[MAX_BITMAP_CHAR_12]; uint32_t nb_bitmap_char; // Return the real addr depending on where the app was loaded @@ -31,9 +32,17 @@ static void *remap_addr(void *code, uint32_t addr, uint32_t text_load_addr) // Store bitmap/character pair static void add_bitmap_character(uint8_t *bitmap, uint32_t character) { - if (nb_bitmap_char >= MAX_BITMAP_CHAR) { - fprintf(stdout, "ERROR: we reached MAX_BITMAP_CHAR!\n"); - return; + if (sdk_version > SDK_API_LEVEL_14) { + if (nb_bitmap_char >= MAX_BITMAP_CHAR) { + fprintf(stdout, "ERROR: we reached MAX_BITMAP_CHAR!\n"); + return; + } + } + else { + if (nb_bitmap_char >= MAX_BITMAP_CHAR_12) { + fprintf(stdout, "ERROR: we reached MAX_BITMAP_CHAR_12!\n"); + return; + } } // Space character is empty and have no bitmap -> erase it with next character if (nb_bitmap_char && bitmap_char[nb_bitmap_char - 1].bitmap == bitmap) { @@ -81,6 +90,25 @@ static void parse_nbgl_font(nbgl_font_t *nbgl_font) uint8_t *bitmap = nbgl_font->bitmap; nbgl_font_character_t *characters = nbgl_font->characters; + for (uint32_t c = nbgl_font->first_char; c <= nbgl_font->last_char; + c++, characters++) { + // Be sure data is coherent + if (characters->bitmap_offset >= nbgl_font->bitmap_len) { + fprintf(stdout, "bitmap_offset (%u) is >= bitmap_len (%u)!\n", + characters->bitmap_offset, nbgl_font->bitmap_len); + return; + } + uint8_t *ptr = bitmap + characters->bitmap_offset; + add_bitmap_character(ptr, c); + } +} + +// Parse provided NBGL font and add bitmap/character pairs +static void parse_nbgl_font_14(nbgl_font_t_14 *nbgl_font) +{ + uint8_t *bitmap = nbgl_font->bitmap; + nbgl_font_character_t_14 *characters = nbgl_font->characters; + for (uint32_t c = nbgl_font->first_char; c <= nbgl_font->last_char; c++, characters++) { // Be sure data is coherent @@ -212,7 +240,12 @@ void parse_fonts(void *code, unsigned long text_load_addr, // On Stax, fonts are loaded at a known location if (hw_model == MODEL_STAX) { fonts = (void *)STAX_FONTS_ARRAY_ADDR; - nb_fonts = STAX_NB_FONTS; + if (sdk_version > SDK_API_LEVEL_14) { + nb_fonts = STAX_NB_FONTS; + } + else { + nb_fonts = STAX_NB_FONTS_12; + } } else { fonts = remap_addr(code, fonts_addr, text_load_addr); nb_fonts = fonts_size / 4; @@ -229,10 +262,19 @@ void parse_fonts(void *code, unsigned long text_load_addr, nb_fonts, fonts[nb_fonts]); return; } - if (nb_fonts > MAX_NB_FONTS) { - fprintf(stdout, "ERROR: nb_fonts (%u) is bigger than MAX_NB_FONTS (%d)!\n", - nb_fonts, MAX_NB_FONTS); - return; + if (sdk_version > SDK_API_LEVEL_14) { + if (nb_fonts > MAX_NB_FONTS) { + fprintf(stdout, "ERROR: nb_fonts (%u) is bigger than MAX_NB_FONTS (%d)!\n", + nb_fonts, MAX_NB_FONTS); + return; + } + } + else { + if (nb_fonts > MAX_NB_FONTS_12) { + fprintf(stdout, "ERROR: nb_fonts (%u) is bigger than MAX_NB_FONTS_12 (%d)!\n", + nb_fonts, MAX_NB_FONTS_12); + return; + } } // Parse all those fonts and add bitmap/character pairs @@ -243,6 +285,9 @@ void parse_fonts(void *code, unsigned long text_load_addr, case SDK_API_LEVEL_13: parse_nbgl_font_12((void *)fonts[i]); break; + case SDK_API_LEVEL_14: + parse_nbgl_font_14((void *)fonts[i]); + break; default: parse_nbgl_font((void *)fonts[i]); break; diff --git a/src/fonts.h b/src/fonts.h index b4e13f5b..85305d1a 100644 --- a/src/fonts.h +++ b/src/fonts.h @@ -5,9 +5,13 @@ // ============================================================================ #define STAX_FONTS_ARRAY_ADDR 0x00805000 -#define STAX_NB_FONTS 7 +// Latest (starting from SDK_API_LEVEL_15) +#define STAX_NB_FONTS 6 +// SDK_API_LEVEL_12 to SDK_API_LEVEL_14 +#define STAX_NB_FONTS_12 7 #define MAX_NB_FONTS STAX_NB_FONTS +#define MAX_NB_FONTS_12 STAX_NB_FONTS_12 // ============================================================================ // BAGL font related structures @@ -81,7 +85,33 @@ typedef struct { // (They are defined in the SDK, in lib_nbgl/include/nbgl_fonts.h // ============================================================================ -// Current API_LEVEL (14) +// Current API_LEVEL (15) +typedef struct { + uint32_t bitmap_offset; + uint32_t encoding : 1; + uint32_t width : 6; + uint32_t x_min_offset : 4; + uint32_t y_min_offset : 6; + uint32_t x_max_offset : 4; + uint32_t y_max_offset : 6; +} nbgl_font_character_t; + +typedef struct { + uint32_t bitmap_len; + uint8_t font_id; + uint8_t bpp; + uint8_t height; + uint8_t line_height; + uint8_t char_kerning; + uint8_t crop; + uint8_t y_min; + uint8_t first_char; + uint8_t last_char; + nbgl_font_character_t *characters; + uint8_t *bitmap; +} nbgl_font_t; + +// SDK_API_LEVEL_14 typedef struct { uint32_t encoding : 1; uint32_t bitmap_offset : 14; @@ -90,7 +120,7 @@ typedef struct { uint32_t y_min_offset : 3; uint32_t x_max_offset : 2; uint32_t y_max_offset : 3; -} nbgl_font_character_t; +} nbgl_font_character_t_14; typedef struct { uint32_t bitmap_len; @@ -103,9 +133,9 @@ typedef struct { uint8_t y_min; uint8_t first_char; uint8_t last_char; - nbgl_font_character_t *characters; + nbgl_font_character_t_14 *characters; uint8_t *bitmap; -} nbgl_font_t; +} nbgl_font_t_14; // SDK_API_LEVEL_12 and SDK_API_LEVEL_13 typedef struct { From 13597638cc83110992086961917cceec22dc2073 Mon Sep 17 00:00:00 2001 From: Philippe Bonnaz Date: Mon, 19 Feb 2024 17:31:44 +0100 Subject: [PATCH 3/3] Apply formatting Signed-off-by: Philippe Bonnaz --- src/bolos/fonts_info.c | 19 +++++++++---------- src/fonts.h | 6 +++--- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/src/bolos/fonts_info.c b/src/bolos/fonts_info.c index c6328297..4783fc80 100644 --- a/src/bolos/fonts_info.c +++ b/src/bolos/fonts_info.c @@ -5,7 +5,7 @@ #include "fonts.h" #include "sdk.h" -#define MAX_BITMAP_CHAR (MAX_NB_FONTS * 128) +#define MAX_BITMAP_CHAR (MAX_NB_FONTS * 128) #define MAX_BITMAP_CHAR_12 (MAX_NB_FONTS_12 * 128) typedef struct { @@ -37,9 +37,8 @@ static void add_bitmap_character(uint8_t *bitmap, uint32_t character) fprintf(stdout, "ERROR: we reached MAX_BITMAP_CHAR!\n"); return; } - } - else { - if (nb_bitmap_char >= MAX_BITMAP_CHAR_12) { + } else { + if (nb_bitmap_char >= MAX_BITMAP_CHAR_12) { fprintf(stdout, "ERROR: we reached MAX_BITMAP_CHAR_12!\n"); return; } @@ -242,8 +241,7 @@ void parse_fonts(void *code, unsigned long text_load_addr, fonts = (void *)STAX_FONTS_ARRAY_ADDR; if (sdk_version > SDK_API_LEVEL_14) { nb_fonts = STAX_NB_FONTS; - } - else { + } else { nb_fonts = STAX_NB_FONTS_12; } } else { @@ -264,14 +262,15 @@ void parse_fonts(void *code, unsigned long text_load_addr, } if (sdk_version > SDK_API_LEVEL_14) { if (nb_fonts > MAX_NB_FONTS) { - fprintf(stdout, "ERROR: nb_fonts (%u) is bigger than MAX_NB_FONTS (%d)!\n", + fprintf(stdout, + "ERROR: nb_fonts (%u) is bigger than MAX_NB_FONTS (%d)!\n", nb_fonts, MAX_NB_FONTS); return; } - } - else { + } else { if (nb_fonts > MAX_NB_FONTS_12) { - fprintf(stdout, "ERROR: nb_fonts (%u) is bigger than MAX_NB_FONTS_12 (%d)!\n", + fprintf(stdout, + "ERROR: nb_fonts (%u) is bigger than MAX_NB_FONTS_12 (%d)!\n", nb_fonts, MAX_NB_FONTS_12); return; } diff --git a/src/fonts.h b/src/fonts.h index 85305d1a..8ef3eeec 100644 --- a/src/fonts.h +++ b/src/fonts.h @@ -6,11 +6,11 @@ #define STAX_FONTS_ARRAY_ADDR 0x00805000 // Latest (starting from SDK_API_LEVEL_15) -#define STAX_NB_FONTS 6 +#define STAX_NB_FONTS 6 // SDK_API_LEVEL_12 to SDK_API_LEVEL_14 -#define STAX_NB_FONTS_12 7 +#define STAX_NB_FONTS_12 7 -#define MAX_NB_FONTS STAX_NB_FONTS +#define MAX_NB_FONTS STAX_NB_FONTS #define MAX_NB_FONTS_12 STAX_NB_FONTS_12 // ============================================================================