From 58820dd4780d6d89df32adfa01316276fab878ee Mon Sep 17 00:00:00 2001 From: Jeroen Domburg Date: Fri, 15 May 2015 16:10:15 +0800 Subject: [PATCH] Add flash mode. Doesn't work yet somehow. --- ld/eagle.app.v6.ld | 2 +- lib/libfreertos.a | Bin 66856 -> 66856 bytes lib/libjson.a | Bin 31274 -> 31274 bytes lib/liblwip.a | Bin 270322 -> 270514 bytes lib/libmain.a | Bin 125952 -> 126216 bytes lib/libnet80211.a | Bin 183888 -> 183888 bytes lib/libphy.a | Bin 191888 -> 191888 bytes lib/libpp.a | Bin 196628 -> 196544 bytes lib/libssl.a | Bin 137680 -> 137680 bytes lib/libudhcp.a | Bin 43226 -> 43226 bytes lib/libwpa.a | Bin 160412 -> 160412 bytes mp3/mad/decoder.c | 2 +- mp3/make.sh | 2 +- mp3/user/user_main.c | 239 +++++++++++++++++++++++++------------------ 14 files changed, 144 insertions(+), 101 deletions(-) diff --git a/ld/eagle.app.v6.ld b/ld/eagle.app.v6.ld index 6a67879..b976739 100644 --- a/ld/eagle.app.v6.ld +++ b/ld/eagle.app.v6.ld @@ -5,7 +5,7 @@ MEMORY dport0_0_seg : org = 0x3FF00000, len = 0x10 dram0_0_seg : org = 0x3FFE8000, len = 0x14000 iram1_0_seg : org = 0x40100000, len = 0x8000 - irom0_0_seg : org = 0x402A0000, len = 0x72000 + irom0_0_seg : org = 0x402A0000, len = 0x1e2000 } PHDRS diff --git a/lib/libfreertos.a b/lib/libfreertos.a index 755ead8f09467f7901ea1c4c922ec260aa88858f..bfdaa1fa9d539f075c6f8482e9597040e0222fd3 100644 GIT binary patch delta 135 zcmZ3{#j>J{Wr7TwnYp>Kk?}?)Ck`lc@;rI*&5a!5;!ytPdGh;2VRCUD;+rc?Un8j% u+uUIHM*=24PhM>EjPL^nFuiddO3_Giljl6nWn4I!>xneu!p&+=m=pnk4=LOL delta 135 zcmZ3{#j>J{Wr7Twsim2@naM^aCk`lc@;rI*&5a!5;!ytPdGh;2VRCUD;+rc?Un8j% u+uUIHM*=24PhM>EjPL^nFuiddO3_Giljl6nWn46w>xneuqRnbgm=pn&+$tsj diff --git a/lib/libjson.a b/lib/libjson.a index 439fb35c40ca1b4f02ae25728c550d83e476689a..e8e364be78a9c68d61fcb3dd722707357d585208 100644 GIT binary patch delta 31 icmZ4Wg>lsv#tAZPX6EKb7A6~&GMJ&v%@desl>q>(^$HIF delta 31 icmZ4Wg>lsv#tAZPrj};rMy4B;GMJ&v%@desl>q>({R$5N diff --git a/lib/liblwip.a b/lib/liblwip.a index d9c188d9a6cadbcc55aba9b2d2461d2b9eb01352..ccaa71009a8cf7fbbdc7162a9dccae0fbdd3fb72 100644 GIT binary patch delta 30065 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 z%0Ard-L0d+;a)!r8@~$%*amF?KK}4Bn2nL&gd=Q(28VaSdD!?}Fvd1$aCjHY!NxDJ zLu`Wvha=4qW@n0c!!M$M-)5&c0}T#uv$@##u%BTYG&r0N>Y`G->hrMo9{<`p8XR`` zvgUsNw$dw-p6(BQE5*I?7Xd>wFI&>=LqVEt+9e`>Dt|LjkR zBzYlX-1rpcR(acu3;#Vc9{G>Vxb6RL#^uj6LAq196Q5g0gA3MEm1$p80}S)FCSmSk zW{zMf75RIu$~qbxF0N(R3@A6Yi*3;0g7y8a^HqJenUQ0$&WWXpe`97Y;0p82iszfL znV>BlRBr5lSx18l)+b>zxNLK)ZP4I?^(ok7b9}OEun{60_G~IfJC`eZ);4Hx!TP(_ znS=O;nK_8>%uQSBmX0{5G)I~bkRHr2kYI9Rjf}#8p_h%&;4om=)jAU!Yq9qjfi(4? z!C~yMpLHfYCYp~?ypFP*R<)l@aRwqB_Wl~{OmZwSKcjf2ws1}S-Z~l_%06tJiIC-H zCOjT9Gs$t5xELyW-WiB+sOUB8On%H32m8NRM}vd?dD!eyK4o9n1`RG)pM%Y=nN2Zi zs){*uh;X5tk^K=mfhL$VsZhJJiV10mfrh7)1nVA`5W;W&*W@cBIg-Lhg_$!?2 z3`DrFTUoEg$hY4D+n~W=kKeG)Ov`&_{2PBaGaK`Hq~9S$>PE;z*Q9*-4C;D1vDrYJ7el_o89Sshz=Dn;JneSOffnMbvjdcbZ9KHc3S!WvP zVeI{askM#i9h;&kuw&U|AX4KD1RJ^wTz zA;VCht(i%!US?*~b~8^C%ROdhX6*?x({d}#I7Oc|Gt0I>96Is3bu>71 zg7O?8X5Y5e1~cO}JYyYyX3$1D17_AORC<7QG&odxlyzp=PKbEAnOU}Wu57yD(g7s^#@q_3|+n~XrqwBCapj^*qwn2jn(sv@O zsYbN)jw!nJ6mX?2t)sz(4y874*B6+Ew0oUp2X{0-g8 zOC3u$oso7ft=KnrT*JpV49ag2&uzG2(T+|xtX^{Llr34E8V>y7uhm=9=QiF`l?L0! zw|b;IZ&^p#sd2zz>4hzA-1_abQ{(Dm(-+&8g+{f0yBn#0yj{n}ag$Z>*@RFdYn}*p*A`--uK7cTTOpTcWnIq zQ@JWHK5tz8R_^kxT>G)_=eEu5I;{T68~Wsyb*mq^?+&Ha@8>#hzs4{B@;NX6yH=Mo z;hLr_C(Ui#ij}0L-9N}xHu>}Bx8EpD_#oFl{Zr|r4{`^jD@#j1$nBgyT-x|St}0zx zYWlZa@AQtw{(sAzlBVNJ3qH&pp6*`S^kHsH+P5_1qulrDhowQAa{bb`OH()H7F6%` z=#ROsoyN3j(q+P-Q#&2sziOM_f3F!gvZA6%Mbj0{l1m=k%=*@0jR$<3Ym)0XRt^|m z;Bko4fj3pq^K?^V{U^ElmbqJ(m1@4t4OiTF(zm&mx!!YC0gl08iq%TCRAQ3u+xbf0 ztop|(9$i`5WB2^7rI$|5SCn4=J~ygJDLgd9yb0>Gt=d7jv1Yr^$ZeaDU86`p5AxXt0OBO5pzl@|0^fimzeim~4# z(&2D)$BAh-TTsLmOrUVMn$sHY+bxIp4KZd^`c`BQhfaJN>2S5}EBzdxe)w+d`YQ%L zcFGNh+lPjEa2zJRPFr8yPSi`ocpeE<1cwWqTaJJpZa?bTD4h$LdfJkyKm?ahliKg2 zguXzs28KjNFpeb}J~+~0&NupLkq%Q2jh!q0xotj(Y~VYr&)3*K+kf&&;0B@azplZ= zt3hM`q<{kUFm6}$N)2xb=x`6k=(|KZ+)og={wk_BhLhdY{$i+EJO34!=Y@AIFy|j*}yDa z$QrJVGGH8^bm$y0XCAH-herYL7XqDt$0<&0%I`H?26fu{=zu{a!+E5(DXuMmeL!C*!Im7hV3 zXhH*Rc~L0P035ERZNzwCXkffJ?AeUS9u7NmrFe|(UlX5h-j@qif%?URvzIWHUKVA* zdUa%bKTmwV7@HP)+U;5Y_%j{x(`305dHyL-9ULAGv&8sZDD~UO1`fMaAL%fw5U{^3 z(qY;{zkiEf%n~8v(JdJXyr&C%7wK@YZ^l_upwn>ZXmzB+p`(2w9cG?3>rwwG1LhFY z(-Dylhl=)!^wDBoXlac+OX7jzI&HJX;X!e=I46xd7l;XTdI6PI3&?mV%7DYAw<6Nv z(21uTmp02EljfeTEH5AU9nKFxaWCD(h)@*2aD-B@GTY>2wGCRduNWrt0h^wPt+bjVd{yVAY)q)SSZ zTjpz<&Q+J!H7;+Ne>`907=)qH65YmOewkZ3=-C7YSG59@8)42cn;@}UFPmMlO*S*b zt)-C7~q0*yyath)JuoRjEzue81vUSe@boPk}l33cPSbN1xM+ zJLs&H3--L+gUxK6grC}iRVQI4>@U_CupdR!;6nD4(VU?R(23g8>#g%w7Oxeu(2%fD z8_Y#@znP0=t+}P@|K3cq1C_>}>c*L|ImFB-(rhzNrEH- zer)DC%_eMRGeH-{f!eT#e`fBhc&3?aT+@-64cGp=X1*7{HPB0gCj*PEJ3 zG5XBhS$b`wsIUU9pdvna0lMTUf64h#L688Qih$m8P+O zD(-7$&-O9Xxx*sPmTb!Yx6*Em^xMp{74scMoje_u2VJ}(o32m>&y#h|pn-SHbdGN- z3iJH=%FJ`=do$0g_S(B}gtj-c1AIrJ^L*Rc%yVy;xwt@y2~N;3A5|3Kp?S2KLw7@D z^NpE@>|T1#V1Jz6j+qZ#%!7EN^%td2)58>-JEU)|F9~=nX>x69xsnn?^%Teb2;VIu zmR@EBRQM7zpCHegm&#^eu7LTH}k0VRf?ZC_c(0Gw^VX5Qhm{+?R9$4Gt5wqp;z@uCSYJ zMw!DT?OxXLzGREmRS(bnyR=c~v)WjJDlTS;$D@pu=2sNIXuef3X$t?lHyH24yViL> z{AkA2(#p?&xH9675sy~;NvcAGuFe>3E=Xr6-N!n9ow3RbM`(a`G&mfgk=Aj?Og5ja z_$c$)inEoas_%G~tJXRLqo0{^_+ZFh;>$VDjL(KNI)0sTbVy7fjgAJh12`cjC>=We zzifjB7elY9I2_Vj%o`L>qOjf9Z&*izgHL=))WAEoL4!m6o2}zSs?HI2h)@ehx&Nipurq!+$Gbj(}|y(@m`%}#=|v(dOGPJg}TgxrNW4H$_y)c zW-1*P@BGGv(crLnhl<%_Tw>YsQ!yVdEZ9Yd&!QeTc8_&5n6|Y4`bNWu0kgt`HbR3# zV^3Jeo%W0wH{0uG_Lzm5G+eEV?j193w)0e1IJ)m!M-vx+I=pi*@=~O1ovbQCgTqp! z?_3xk-9^~rA600rG!3J{1?!!x)448YI@iy6BAcrzZ&Tg~|KSW!x2 z_~_2l7VeI<*3sZ_cg(>CPk_SPwn2jnMQ2bMmD0dP+QPEpudSoOVO4RW2NU*u3(mzJ zzlH+KAJNg^uwwX1>%5HSVc*U6C1)VQVP)`qjH=2;EJLJHG`L{>ZtHk47hvDLY~NrV z4KA+?)*f5ODY>!C#mp1=4`&Qh#y1hK5{JXvLwR%p4GxDFPbNBLv%eh@)4&?a`sj|a z4H_Jt0bgZ*c%%ZjG{3hIp37`GqIA5HowU&a+$G}SW;~kvMa&m5_Iyp9X~v_uQ1yrB z#|73G7A2D40m8Yt${DyiOJ+QpH<o^?mi)OeKX>XX56Y@o2kEv?82$Jo3?sp&p)}PoPh`zdX}%`r5Nd` z5Zc=Y4Gu@E$~p}!!`?eE**Y2=cHlVc9O=`FPT<^~Wo8A~FU&Z4=S2K44fHB^Xufqc zIIJwX(K_G$k7Dl~xW_sg%nlUk#UsvO4^~7Ctg?;DJNUu!jCD>x&fs+KgX)zL^f)Yi9WNfEhRWTI%0%w&y4T=ax>RKv-0?`nEY0dt=v+j_;9!Pz!B$rPxD0S z*3+>kK~kFr$w(Q|BQO*PHRlUl;L`RyzM2Ivnx$Is@h}6VV@2yxfdm_*L^t z#mlreVR-cy>u7KoUj4)RkBYxDGoI|Mjrwbff^1Qi5@XfCF3uRPc$gWTGzD-%A8%$h z;3V_KiZ3-YWAHGY>r*~W3#_BT;SW6?Rl11tn6S!5h;aB@hj*#vRWr z13IUmo0*vemO!E7b{}ZQE555)KImdH!U^2sW6VrXuu+)xQiq!Hkk^_|R?K=TZ15la z+|10wS>|&U|1#3gH#4>INX9z0covo}o6tcp5;g8>~44xMOky}#n#5wD5L?qnSe4rSM3;~m(utW|;EK@Tu-5fd>&z3KZ{|XrW9DMSMMM4gh}Ki5PATDO>+4yrN+R5^ z8={7Pun`&@8s3P_4&{m{M+0bZ_`8^Gtanx1*~~S>1&lox><83S>|d^EkTVeBg7uTE zGmmpd#B(C9Gc!eVv6;D^xn{~6cS}tV%Xe@4m#lcJii&yjR-LwEMfzrG z=wbP);-Z%}U){CS?VT^I?%!e9qX$(SIQ96ht!H&@lfHz#>{eyvlA7%*Iy`%Ivxf&i zvYr0MxbKehW(^zsY<<#uJ+-;}4Jxf+QAK6-K@~E%H7oz< z=F-T?`A+G@rOA`?yQNQ;=1Nk`=O z-~cW-BHuT6YeVVrBk~t2t<_f5rDG~`6^*lw%r9($Ma8lC-71f-Ne6wp`S9cWRd?+) ztAEwd$|j}B$L5DOUVW_EY{uHNX@$n6wfVkH5Bpxu5RG@UpW5Rac$C~Wx_L4YH^L@m zlHXtZptpE3TQT|T6!Rt-r%!<)&(2hU_Q0$w0$hros-#r6WNE|!9K~U3ET4r_yoEDhw0M& z#oA-)DJJ8T&~9aw9wH`C0M@;n>9vs#>r*S!r$_n>F~^cl;12C2uG98lWCIU%*-he~ z)>eI`1m3a5+Hh%x^$Yy*Jb@1NH`4&DhgH@9o=5^V;Y4CHK{_MjI&G&!HgMR1S$HNX zNW zP#D%Fo$0qmI=rv-4Fs4hN1Lc;+&6ThJ-t+*ez<&X>CMz5%7Ep)$O`n0 z^l&56z!2%|0S)j+*x_0^U93@XR+bxRrIJh z96EjoCLEPl!~`0E^+3q%c|s7-!_$I>*(+{8I=wA>sDMq8L{7jVVrny-j=qr*96C2# z+}ZY%#Ow`ar$zQKou;uf#WaM?uf*NV*Ol$dKh{Trj#JGew}DF?gnEn2LC)637S-*t90eCImUhbnZskV21szf^cy? z7?p*?>3d2X>SxGJpnjNdk2=o(7fOWQ@mIXRkVXTzwFpF+i%T*3r4k038^vMopA?7F zv{oECw^2+Wg2P(9j=EZDKg%FNk7!^YF`b1E;F4CLFdWYP3F6+;u(?dEGnMg`kv$w5 z`_~17bgqu}@h*kE=Z6}3tWxR6QAIE>A$0x_l0b*xVBap%VUpNyCkXEm-j@W*mfxM) z|FlN;v@&@9t4GNJ;&9H!i+7SnMdyoop2G{oIWtq@;ex$Z9PXgo!~`14UeJnZ>u%|N z#kBRO(tb1ZtxxSGq*~lI;S5%AS`{b`6Jx`~Ie|1Bn#Kzkn(i6d!1RQ&J2gHwGrzED zdS2e$<4sM?lY&akTOSkAj<&R?W$8--@r2pbsg%bx_)|w0oDdqO|n| z`4Kz*Q)S!BnES3q4a36}A8I~D@zkJ~reB~FGq7~!1^EF*KK|A^=Xr5|HACr%iVu!> zTEvUZbm;-}_A2v)d8Xn&o6k~wqVlNoDQ($=sbY5RK7Rg&4EFhRZNcd4hH&6=wyXigKR0uMWV1K6xgVXcw)M*R(nefS6?$T3g%$H2 zf;URvJ?OF>9a!=Hfu&z==C$*Hd9|K-Pn)^fUp7xrT+G)0r~!UjZILo*Y?3nGHuD;3 zuRQc!rHzSro|y)+r9iUb>HMMfPZV!9H`86zMjQ2XR6M-Qdt^_~SDmpz@q1<-bS?D6 zp+IlNZO!}#{i6JZX@_CDJi^@KA~9u#mGYP5ckVEPtgiY;;VErojVK*>Nxn~q zQA&n+yMJ@msM4h>RUA#0{l2Yycc8(+%Q_aDZu&=|gKf~@Fmuw~I>V+N&D@uR%!eu7 z(|oMraVnoyC3`4R!WoEgp$b($Kxdut*94`*?j2`+Lg|;6=KCByiLCAv(4rh?p}}E> zZ;H~P_-}2428X|to{EhpXs@-+)Y5mC=DT#Ljk4}>R&8mAx%n=|l_a|>U*SY;p_P|y zh6aaL-m(6%;!n)eWYf;ik#UN*G4H83``I>~OGbm)k1>j|=jYmVj*AIK3@6i`QWb`j zGcpYhQ%2ZvQ7}r}$IP&DKXa{O(%8T!nQ81MGo!)V;qF;e$?P0o1HS6+w$W_GaMyIfuPg^)w|7INx4(Dp4^-YTBXiIyS8+*?>8l1Tm)qeR$-_&b{q!(!m1^yvsZ_wc2 zhr|w@Ve4FRxB<3O8XXM|H^4k>ypyeMg9aDFUUqN>?}we?UgcgNYn|aH<5(JCNXimX zn4#+V=9?5>Xl6KjS)`N3p5f_LTez4k*pf)Djd)?ii_DCdX^@I$X`>^sUQo$h5sww8 zRplL6ZXFE{cjsG~uH(;Mjnfuh_}NMuYuQR0F{3#CM+7v6eXk~EW-Q#t%nNRynHM1I z8?c8*n#U*}ZKmx0**X;&F~F|SmhMpQ^`SOGgM$O~Nb8J?Pc-w^oMvVm-9}qD-)CA! zgTv`=k4=?F1DDtc5e|naTkxXJF`9qPHjL&sm>KbJHZ$;M`3QT=V7sH4@%4db#?BLA zK7SOB$bME$1sF&V)E1udr(z@>4Gya_7FlQf`v)^)GdOxrUC5^yx6) z6^wb$aRy`I3(Sm>FN*kzh_8;ApV4A(7;IA>W)QxK9bnj~KpW_2aKU=8i18Nj!--c@mjG8Yp@>R;19Rk?va zHbR5L#rQoocwrO<+Xf8|*T-Jg@enLFGuphz%s~B*W(MRdvUMuz9SJsi%?SP#GlTGr zX1=gCnHj)O(H4I5=S%BoaQMw1KI5o!TgA;It_;l2YISph&o&lBQy?3)M?B0tPVwl7 zNn?MU;v*s^jn07lWVl=T$W6D-z@A^hDq@6tfemIa=bL}0xIWUaH{*i%qZt>(%Vt~< zQ&m1?u%hs1>u7MndM!4)WG1@*{NafRhu_|5X&pDkiCYRJ{MZy7MT3L=PS$Z{Ov8TH ztbt@_>u7NJ*`Dk-it}n8zs3v-_&f4w7eIr^IaDI2pb)} zQ8tUre1Y@3QRsYuKgkay2cv8SjxsPhi^hDlKW`f}I9%=6Q5Lrpzvl$w`^bK1N{kQX z6YKa#W>crHgU_uO5lMtE;q2F_R2WCgc@*%TwN#o0(BSYQ+15IaoN;D+B2&!xN{%t( zPZ_8!?AY{{`a5YVMO5OaJ*yL=<8-+k#)YqNm3168RE*8|QlUQIVqnf5m>&JiEwe-m`8m+gkOt&iSbVGW6!*`!{t7yFB z*8I)sPrpOZsmU&bb{ou(4Wu&~Prp6iqk_M^U(k@>KFw{jrnGcfe(xTYZO-_3^OU`s zcdxs7O+|~bmHVd^xvNLFs~g?AdUR#==(g3P+mzZrm>-`0xisOyd`V`I|=~ot6l?p?_+X7FJ3xNu!0M@V_Zw0|yt^X<|LIv-)R=^%V*ivy}zn zq`4|$mB9!x6)hEqX_{xm1S*9?MJz5LpoiV3LmQ;ekw!hW+C!b~tYLopgn<1FaaX)b z6qu_-aG5U_|4IhxU9uhCFa-+0M=3_1Ev9YwQvaUo-&Boa>asuLtABagvc~tG$xlcR;XL#A1GvMy&^f6?)jmwy*@6o(C$G5*$5F1znVSYI``S{%-nwq&D@s{!G0RQV4ZvDbu;(bL~V2w zo@VBro6}nDlkrC-E_Md|8(3E<;dj=#x9%`=|5f_XbNP2Pb3d(BUN}O1t)s!=2(810 zdy4%()JBMKI7I6)Qkrn2ZP4Iwgs!vBeR-3a`|kns9~J-2Oh>Z?I@)1uzLK8(eiS$F zY$d`7d!VloG&qc~&%=g!4~2bfg9e8^n}ZE|rtmY{puu6sF2Y8eLhFPDHJk#(S#3)b eW~SARJH3&g9sjn^lkeo$b@cKN{ie>uUjG}kDCPJ7 delta 29666 zcmcJY3%u4-zW<-!^Xy&e+1+(hYPY*>U38HyL`76&3Q0_+5JE;wMoi0s}mz1|sfL!ufumACu zFFu$1pKYb6;K2QI`TuMicVI66zrB@0g@3pxmuGwU!vFp4^#^kKzaN@yg@F&`;;j@X z{;z!WySc*uzpeDYSNZKNbA|uz_SdU(g={+@fa9H)<_iD)ZS}m01Dlnv<<$?h>N%i{ z>CML^?J5Qi?msB~;Jl<~GIDjlLwe@BwcN1d@fN!!jaojHKec&f$Z;hsPW8vF1Ne3 zt@*kZJ=&~(d+eG*q@^vsD(tuVweef>`K`OjV2{;LOz4>88&!xqt!{ASCrP@sPqKSm z%cCbIZ`YlC^vezIYq{_8+jp%#c+yXk7LT5^t2U|4R~Q zDYAYcKHRJ>dp`<2j0_HY~VLTwiX-8@3^a&3Qz^ss9Z zmE9_Rg7Oz?>#AK;Qtz??1CJs6jf&omY{GuWrjf=QI@*b` zD^L%7f#T)4T-}J8HYMSWlC ztp42vI;t7(DW?6bUnHuXaRAl|^cU`+SpCgS5w|p-5!rrM5Kl4JP_aUZn8Z-UG<>`>h~T!?&k=`_ zT_mOf>~FwOfd~#K7xxkZQMj+rxm6NE=bma*KL0W!C9>m6uRj&%71O}y;-2PCsy#H& z6Hrig4i0-|aHPX6lutclB0b#Tl3E@ADasfrgN53zi;Unf;@iaG()xX512Rt0R}a5)VWhpS_pxV!Qx`@_f{4tu2(>3(wNvS;8m%HVh`)V4Y@g8RAB zzeYM7j$gvbp+M*0(78P#9cE|Hx$cq9Q#9B5m*}!g! zbhsV&A1b|HiEx}Ai;UpVq1VM^VgHZF1`e+@Dp|dI6lAE+huUelUna*CHoRKbhr0_t}q;A@2T^oGTJC~c@ zDINL!q$U}aUioODXa3R_b<=zHs2r?4y`^rKY$hG1M|_fQlTBpU7J$Bt06e@2bahMLK_KQqy3z`f+g~t$sLpEdA{nN%M5)ZRvpvpOl8PMkMp=#^~Rvb(hWRoUE(6 zUH@KFw{g~lWKdn(vqp5`gg;J$Y^i&RJjT zp4Ww}7WP*B6Z0a)_o^%Cd;+X9&r`h7JYVrv^CHC^)DHG{DZW19PtCl8_tl0C@AdnY zxs>Cjop)?9=R`QKL?_RmT?-2A+Fo%vzK+amrV;(fHcDBDzV=SI2| zNKDY_*i9SETV+4DpkV;%pK1q-8$m(8~+ ze#guM;)96ux-Mw|y-~z%%x_8W80n{(2P>Wx@gi>AR5V)ga`PI++zzt_R!{ix$%Rs9 zUzvCaYRtT7kj9Lwx3`%up#kO-6c3AdRK%krJ}Tn#%y=5+mbsL@)gaIqw}%C08Y7K< zpW@3Su8a7W5#Jv1dU3*|QQ_~_(cq%>NAfyK32z$;J8blbVz_Ai8|(NuioP$w?IP}O z#`UpD_K9{fp^tSmI6R35SszsrY>o=-?+i3J6u^(do;XbL=!nOd&s01);w{w4BU9lN z>u7M%`eJb@;WbC$4jUoDMe9q%2`_>QYixrC7p*VF21k{`L$*PKi`K8fhIc=O&9;$N z$`VCqT!)dI|AZH9ga#L_xAkow&rc5+cZx!9>#5>FW;{!Hk;35^WgQJJHrMedj0pu4 zzfS>=exh|WIP8@j*m(5E+Xf8|d*u^sJo*{7L4(6y`GVsgcFSxVeIX4Fd*v%^Jo*c5 zg9eAa!dq{`JH5hXwn2l7)+?~VS)g#0ZAyqFiq818Gw_`K-Ha#fT{8}>f0*|auNNmc zhZL~mBt?UZ*7LGM$8*-e%%RbPxRhn^2!Di%I+rV|wh!^F%yb?9an7L9iDq6KwotgHT=)d*XmHW`eCxR87MbxU;=&7;-xb!; z;BfgZ!zOc@s*Q~{LWGOD%@dxnj{EKd^Vf<$iuhAA?zV&v=fYa5}#;X1C;Na^%Q z#n)i((X_OV28U6$vyS7lvw4|px{0&5G(4r(QPE!I-u18%8eFvAAKmwf8?kpshuR(u z4jo-#9k1zBZQ-tZmvw2S9EosSt#<~V(&-fFRqoI_>u7M%`bO(`N@s|Z-evpetfRq2 z>%362=kU45ox5dL9M*G@IrO zG&nrX=40dCe!6YY;BYvoi%M~5FT&m<{;_p5I1G3J4r>bFN?%L?kAATWpuu7EOR(|i zueJ>u97ewsn?B|9fb)X-(cq%>KUjZ?ue680P2_TaiWm<%g}GGzY{q;3ni+5Sn`S)b zZ=3P9u7M%`ajW2YJg9>2HI#0Ze`}vZl#RE$<@v}8XQipyRqq4Zmh3u z(BPu=QPz2@{-K%A#nOdNtW>5u(@3Ijh97Z+?qkYO1J!Bg+xM=-V>-hiQG2{OK*!;EP&m!Jw<^`k!69(*d z<^?t>BYZIIsWdto96lKKw$7ZwX6*fqKpJ~AID9)CXq~x+!_AWwZ=o!&;c7oO(HV$v z82wV~OfcMN{-ffV+QK=p+&UT@%C54`9K>ofa}5uenO~TttrRNS;0#1KRP?lUCLU&s zgZ&HE(coY|2b+D%hwOdZput7!bFmqm*_3i$+XxXZmNT-M4t6QWX&wcJlq+qoj-aE# zMe9ASGt)B2%&f==GZP_anVHyN0wfv6{#Q8H8HjLkSXrNfkw2G~*ai&_BYw_0lN_&^ z@oBtmW+LRhNM9yS_Al4JqvQ<49omY{_{=&pBrC+B6OEN-^k{JCL>KGKqO8Q;kLDiM z(ctiC9%jA7RLk8I=w9y8NN1qI;T>?ib*5leVebdb6zgbkc)+Z|rdPSnQ*46h zgwcUzqql5?1{bX_#>VHwN47zO!{I2XQyeDdiW)_{gt8;b^|wIh{*Oqa=!~TpjVv2= zbYV2OXnnkOoL-Y7{(%_>Ss!hoqi0x0gF{D4OhVC9CZPIj3vaQhbu>7<#V)r_xi`)4 zDSkU*($vYs)GBduP;;*fSAtH8X?ushOFwFC+fOjGwZgJnDhhM;+}b zJ$wI0BoTUgpbOy49A{?MY@(Ujv0826CY>UOA6Hi)4gF`1M&*<@_HMQ@P$*z7GYyUHQHNY7#j?+-- zf!5LBQ0WBgOmH0=@ia3NTqi|Lnocm;b*`EB$^|7ScrUxb%&Zo(U&+|=3H4j+XmHW` z5^Q`UdcZblaOmh}Yz`~e^R{i!;G*>G4*gGOFgvzI94h_BI@&kQSFgJApk#I9tJYW5 z{q?5Zy%ezDq4^6}pZDtlh40es(~;*UC$8?kyl)U$FSz>b+r~`!&Zyn$=f8fl=DT#c zQ2oALl2EGdp;mj;FX)!E_o~Bs)pA4Qa*6s8(~~z_M5XK14rYdtS1pi4ADJ z{=tirdm6d)*-MfyTLoU09Ni%{eEq?sYte#6*S@}bV_bE+^vNfZQ}W|0(hnymUF(l| zGI_Sb*6LKd`h&M56GG22;hr~=(}KX>s=xN*GGVqan zwHIb9-LC%ZZTTNH{5HQ`#jt_<4$KyG=2vyD>wie^^w{nBwsqA#nm68}GnH^nB?~R{ z+ZwXQGJR}&zGeHDcfIkKT}O2u_iDbwF-J`sSJSd`T+^PbCT@5k{cwB!u;kHn_&fQ1 zlHaAX-^o`e_oi39lkbt-QNQ+`{Ao!tF|B?te{8aUI`_T&n50*_{=NKH$$RM^-p}_+ z{+e!oKYvYizGJ(Cw(M9ksKdmgrnWn&Pj#EY|5iKxfU2sBs><~Za*y4gKHDeROMPrn z|H41=75QGH&>eibtl^U*|7wk0~A)V(#<{wQbT?Odt9xY1_WHaJjZ`wDCC% zx6z%TS$gHbq;08(rNbo=8fk+kYs2)Gyq@EV;itp|Y+&8kGW`{CsQMFeU+Z1;=1jmI zCSIs*ukZ8*S)!Oe)u5tnDXdGJp!`tx55#(GWbMrQu3Qcd`h}7G&&2r0mTUV}WDg%C zjrLy=>m@I<`TKV^r5uSGXY5w--J&?${Gq@AF@eFrI!IYXgT)+p8a_xIb_gDM0`_oc z#dP8VF|V-LUzypADI1Xp2krM+Mp=jX+M~eJkq%Qi`U~Pt>6X*;ZA)P%RMJ5OOyGSL zW6CTw0Ug$3G1JG0Lo?rxY{J=?)N&nuw=-W5V@92S`OdzSB|<0O|1Kj3*SG+lU;>?h z?^aAjzmN2A`qMBsf@74wP+NCh4x!;*VgmKRnO~QRxMm1sgzJZjwn^tSrJ^QeDiFcp zsB{&Fz0yCjf$;%R|6!31b9B*9FGU%+sHlj>a6kRfMsGzn@Jj1T^c_wh8^&Wn**``) zj01wkK8$o24{3>vrj7NF0u{ks6{8P`bhwu^8u)&s!`x-Czdh1nzL3#hjdVEZt@y4Y z(6ACYJ-@R8UB%&;)pA8CU;~F;dQhapx}#>DM;omd>{FfSy_Y5%4u1EwGa zZi{r7Qv{ta&fex1BO923V)I6%!=dbUac|qS;x@qev(YON3hzmVbvP96CJu!sL^g0Z z0jEYfjH8kcohRn-!xxE}@q$Y{B?xpPJTa2m^3#cL{Ds=Os&-Bm3XG&B1?=JZiqY4L z!+FE^76BU=mo4?|6o>m=OYX{yA0ras_;nMXAdO1-j0t;%Pm}@H*NMZP_`6vDW%hh! zga(@MXi%VjIGj&>D&aMu{==JT|A&#yj0(VEG?$CVxWIGbv(2M8TNP*k9<7*4FNt(m z4~uN{ycYk|HkG>Ljet4+qq+SlP!X(iBr7l>(&5h1Y2b%q+$QkPBO5r3^2$huSxA8W z@<@mA>tq@K5@o&=v{R(R?r163HOhd)2x=o8X0I}W zp^**;`vW3tZ z=){JW->%g=J-ymF6zxNhRinq>F%9x3@@owGH2N&j@0l9jB8{WLwX zqM}v(fsG3lN#!E-`NjG%#lk~{5<4NRdt0WfJYi4@T;)OMb1vaTS77oX%=={%7M>XN{#Rn-zMMro+BXOo7!Yj_@Sd9pynB zI{Jv7=t0*T^|$ss^@GhE9fi=L*|2YIvtYls&V-v}w?9qAk>JEtnC=2}VrqJF^TL&- zYlZw_7vVZ>FlW`jm^oRtm>a16FU&OCM``S-Zmb!bBh0)y%`tPwdP26?^N!3WE@jsa z3na}_lH_uT#&)iLVYR3Mpi1*frD9gL(v1V*8sL-v63|&IG zC6Unzb06vTk^ZEar3W8IdbX%S^|a6q9-@spc?r%|Jc{=br`CCSyu&=bBzVb*Hx++l z=BO2Q*r^CTTP7gp(6+M9;csW=@Lz1^6seEOK5ynUYOK?ZIyt?1ic2KM3HmyNbMPHA z=VoJ_0N9LIJSO5(&D|BxGIL&EV&;5*!_3R$XXdHWf2M~tb?VKflzY$#jF>7SqqWZ0 zqHaSldN$KzX8B~$uQqd`-DGB(d4;*J&eFAJW`SQe->>?ablE+xK)VLVeK1{E-Gaw~(#bl!GhH<}1YX?hPAp z&-vKQz32-w_o(I?UDy+Qm>B@CQ|R2&`kA@c4KgnkXEO-0DbZ`*tth~a@;EcQ?s_ve zpPIR`9-w;~_9y6(IMK|_cbj>m^clK=VzWYeW4%zo1!P zUZ^_?I&UHmo9~v*DCME^mNDK;rI(p`?O9^35Z`R3qj#Dqd;hnrPABWJQMx3h4n7?Sx1Az zdY84bYCef2ho?G$s|Q0G#*H)AjJt+3Ixd~DbVy7fjgAI006Y@ol@6W0 z$~I_l=rr|a_kVWj%{IaxG?Bu5Ix4(i9Ssh?>`6+8241rb8XOw<(mL*=rrPKzZl5WX z#j~LHbFG|#2!}b#_SW$?bv9GDTf{t8sg&pXRFx0wW`se{pN@Si9e=_R z&X{fvBbcFd*wsI<4I0d@-ljX|4C{2_3^RT!R*lj*oLe)gr=9*$xX3!%MI|M|3Y=LI z!lIi?ZG;AgMK@GTr8vN@HS@A^L&USG$Bo@#9Ssg`&2d}V`0uq5A{-j~gLOPkv&2+AZnb)#D=KU%){*g}L>^sbiGxHWRPCZs_(ir}_x!S_jvBf$X z9IlRe*mx1wtF}Rd!^ucp+5Mje=4%Vffj=RGktv45YT&P|^DekZ99H`NL}~2N;IPv7 za_c;d7GvL;{iZ*yu#Q$D5mxjr!Khjm3d?MS1{bR{Ik(a}?#-pxcPZ=lSVx1)D|$6z z>v$-)nej^gqs*n;ASFI^2E0iec5k*oQX@ly!|tU5MvVOsGYxE}tatmt*3saw+dsCB zck_#eI{s9I8?%`(p4dfBe)s8qED;bVM)HnbG6U2#01RZFMW3u$7svod#B6?*SZT z9SsfxIKeu5`gAjX-XE5nU{%&RW*ogNsG`^K8XD+c?$8qJXmD5&^egMU`>(~`1GvLF z8XN|2zxC|>e_hnTCTF0*p#fHM(ILKS)<+GzZXFE{4ZLTaJ@i?`k3?;K)7bC-h)R6h z*lucs#`p^2TM(YAk+n19I^RS^UVgf#bu>6UJ9=5~ueh(74h{X5b^JF|QIGQOJJKHq+8#$CRJ`f)`oJZ&8fE|#3}7iZvi&(^A`QoiNh zwT>TsYgAFT^h`Er+0rxD(^htL2p@cnnNPWF>6vss^oS*eIBr>)mF-5w)#eG(dzksI8)D|; zbH7L*ZKl#ABEHg$Z~m7NFEitgzq5(&|0GzOL??c)xZaF2_-QlF|5X}I_`G`AIvN~4 zud;%c}&nRUq4G>P%SGuwd9q3K{| zLZO=(_d0(AjSa5wfo8nfL(TGpmvRR?akyeO3LL5UduH6?Q_UwSo@T~@z}hG5nSq#X z{;}d8MfwG1W;n8COtODYydl$d{5J|7$r3t4Rq19kMlYI~Mc|J*X^d%*VP^Do?9#o; zyL7B|G&uaR#*x-fSA1f`>-mj}Q20z|td|Cd!jE9%8`M18puyn=^$Y7Gb;7+L@u%i5 z6@L-wtP5Z;B_?S$MV)Bq3^X`&qPg{2#WfLcj>`73js}OaTd?r}_O}h1xb*D^wqn$) zyc-X-5gHuUsGee-$)O9(oQU(xoQ$|=7#V(^m#9;Rl(4}%8eG0yb^Kq68vdt^(BRPU zHf(yAD{80;X#fo_T5oB+o#NJJ&LK`<>^WiIqMknGditW{|3M@X7TKQY0!-eV74f`? zFETSPv%t)p<5qFE=wGL>`?$zc%7F`VqS<<8H-wn(u3w&R>~7tbXsk3WL1JE7iiL zcJ-xw3d1UzEzec`CV6kydadzTan$l${l+1MXS|lF{A+Xr1`Zrr{x!Nm>FbjUV=DO= ztw@vFWJr3_F@^n-x6+%ADRgP^YF0;+s;VVRHlNkEDtS45=9oft>FSQ{uKx3mHp9NC z>C<}Xx+AI%pL$ZqX6JTno@~Zmc25%5>Q!gs)eTk-ykpM>h1_0!mz+Cv;KsU|wZnfm zaJS)Atp*-ZRXgj{gF05Nm~zB%!^h2f{D|ZsiXB>!8`igPVRGT?OF!MEx_+PaA%E## zcBzrt6WToX$!Y7)T|fE!j~5U8*$Ia}v#ZOUyAG&I?sLocW>sva;6320`N<1Esygoa zS%+>yyUW@^A66ZI$E-si-qqzsO5a{CUDe^fBdU@WBrbh$S1x^aa-m&vNc!&N!m#9$ zwA-Ot=-u1%kwS-Ab%)lDx)rmvWJJi)wDFVyy- zSXW3^#n+L27y|Yc8b&|c?;|GAJRIgij}U8=)Kkh$R6;|^Dm_L_pa86EHq&QBI;>Z! zOg}r)!~UZa*GTU!n}ynb7umr4UBq&2JH*A@v~uE0CBg!m7U~-Ba2WNYn+kNOznKPL z-ITHhMnyK^;9)aKdfW6vmXL-1{#X)KQT0V)UF8`s6?3f7SBmvt#&-#LT|j>hQGxQX zTFCUBkq)yj7i!z}ovvFeM_z$`!6Y%_BqLC1IN`AAD7{7+HV2BkDqgPbL~%G+r$%LA zlGxyR3j;n+yk|}eJIJ_N2|W}uz8Px;8isZ9W;&iR0y=z1-A~qcE$yxpU1_AYIrpip z9sN+i5)S8zrm3@l4$J9~+4qg~a4j*^q0(8CLH);w!=e9?SRb#HEoB#-IBP6ifE30j z6FRp{9BkllaPJfAl`ZSUdU4n{Pm05^|5Y5y!n&q2doFU?&l(O_JPlW9SX@r@x)VcG zV8n1!<)s z$FaXv%$bP&Z^UPrTQNih>Vi4$*t8XgJyav6{%qCQsHgxOcHQBT4%09dabG0RK)6RH zwR$c~=NQwus`&p$VLSv7SVI8J(3$?u<4x`5r#9fkx|Kn;vo+;=JFjk<` zaIkM1=_L}RDbPg_u63Sy1PW)*KgCI{u4(Dq&gszi#Nm(~E#6xi^(+wMpoFgz=gs(U z!U@YvwyvNynbDm}5NPafIDKw*q3h}0MAX47cDSmF976?6VPb6Xh!IG`p`AA3aHZnF zAYcR25@q|=|KOa$jg`rq^vfR?Cg{cO@be3|Cacm9&M$PWyzXEXNZZaWbWM&<_n%wn z*<{&hO+D$h!~SeqSDM+O^5$weHS2Dk*|kX@^?9N$IJ#R^_sq-=4d&I#H^ zW11@J!eqoSm))RT?!4+{*2Lzlt`~n&s7n^qpE<8^bVUyiXz+DR(fOOGIAK!66C0-U z@5#40>@8IlY`IMa+srwystMe;gI=Y&6863Vzo8pG{364}l3PR?fyRL{tFBJN?gz{+Td|UGq++=;F;_O#8s8qM4)3s#{C_dNB;l3f#?}wSp-KLD4&fxrL zuJa}1FuEd5F|50VGW&+G2?xVb`CYxe63s+04xG)Dpr@Tc3^ zEPp=5Q`KMD_P zBWq|{xUA5#^>8J_q#5fD$QquGxU8^GX(U-Za21;PiWq4QF3!HFVuhjB(cmz{gB@-0u{Xwi1fH0~oS31Q&qa*j)6Fz?tC_F5yWlQaTe*4S zFyd9VL4(7Hvqdke^H0*|YYThvMRAG75J`mHxLu6CL-8VQNsn@4?^;KLgB$Q;>wH-* z))wqPwT=b{d+exRU!SFH*-p4-iW13SDGwa3nWajHQD&=Zl!pd~QMMOTmZ!)NxO=(N zCtK$`@=P<|n%N3YR^spxy1*H?D!$Cjhw3jPoiq*b;dyPu{5o0CZ;E(X#J8FG5T-rs z`9Qvln>PtP$8z^XJYJksmq+lBbu_qW{Y~qPYNEFAkbm1c8qA*L01NkMp;LL!;iw0zUK@+Cy$Ky1T!DU z)6ASir$qYMX1;ZQYUUgG5;Nb%`~(&qg|CYEmt`(x8Oxl(M>Z8ufRFDTjDXim1sXv| zgNxQ#tC9>T+dOL(%$Iv>bG733 zW=;A z!)!1g?*D4$<9oZA_plviKHR5jD}~?I+35^KIQ+H_Z+leQNpV%gZ6aot6&qgY`kMJz z9};o)L$|V-C~d5Dv3#OVoTB)Ih)Gi^AL3`goy)s7Tj(O4FZyh8ix{^88}^Ly8uPCd zr;(nmXORuAhYgvoJpkvX0h^pXdz*208;D#w-f($9xJytfRr<=W%%7reXXUv$6M^=ZV(Q;P4ckgN@&g z=Gdl$NFv-;7dQjQNcQ7SY5>;}zZ6Adyr|ckc~NIW$L4V}HgjnVU!%fP*3sZ_vdgag z@rFO@B^%-M$bQ60mEuVG*gAfZc~t82;B)I}aCmp#WgQ30eC$19)-%yjG`Kuq9sf?w zz=Jc@zBY8w4j|Goo; zl>e$fnNiof8;)LO`%hgo^*d6K7o2dUsO*i z#}bEBA{8Bt&rJa%IJmm_D+1lrvj$iMpf}Kr`H>SsBXtNKE~cK9;xN__lls?p=3S@}osSC@YT|BLKL@ROD4>-tIj%1wHr z3csIpP1>dX9@Agd&6dY>Ys0j^e(yg2euwgJ;J>B2((HWp8~Dkj`ez<1bjTmcQ68eB zjPI;QF-MUvZqfsk=3uOHdbrZ;)MK6I^Ok*cxzoo}zJCA53pXe2XKCDtkMJhh1RhlX z@e_qz`O>*+m)~IFCy+Lq`QLOjP#JW7>F7~2XGi$8o2SIo!MjV8Lr3H+85h0tLB9EotYbuNkF z;;>-*P>ko`@J>O_OXGBuVkCE@=UG0PPp!bL`)u-H1+&=qE`t!vC& zbH9Z-4Hf=moy#NqU=f#4w#G)CfTwF?kX%l4`7>b>ERy-DGvMq;({%e-7F6<}12=R>iCtohy;9to}&t9hArn&gd!i#PFgEIPUnxnh_I{@p$ AR{#J2 diff --git a/lib/libmain.a b/lib/libmain.a index 7a8062f1c94d1aae3d6e1a89bf950f1c523af054..101ee3f7c9373132a83bfb0ca5d0e399aa552bc9 100644 GIT binary patch delta 11768 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 SF=0RbS!-<1@ekF+VgCyjXiiB0 diff --git a/lib/libnet80211.a b/lib/libnet80211.a index 4087316acfce20f9b457a6ed119c1c43ba1743f0..23387176364f137f335abb31879904cad144907e 100644 GIT binary patch delta 361 zcmcaGhx@`D?g=t%X6EL`2Id=;qWGcA$$UX#n`iLf5klrqP}(4c;7e?dvpvRz;EQi| z^f=B5@x} diff --git a/lib/libphy.a b/lib/libphy.a index 99e0e9019151211739d143dea5c412c9dd4875a5..b9b0f5e4542db93586fe91ddaf950009558ccd0c 100644 GIT binary patch delta 161 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 diff --git a/lib/libssl.a b/lib/libssl.a index 85187cb7bbc878a81be38e74d4623c86017dda8b..26a0ddb6f4821bc6dc6bca5a5536ad583979cdd3 100644 GIT binary patch delta 327 zcmcbxnd8D{jtMesX6EL`#s(Xev^b&6>3nXC;+r!$Z_C02_K5%m64iHWAPGopwhGYl zh6+sX+a$KRVRncxOaY%Dqr~)moQ$cP!`B-!Lq#|DZQ90*tRvw-k1~QUzM1pMe;$}x zzK@e6pzP@&)3yUmn+7upECMn=ZTk&gMgy4ecA&yla1PMbi`Zet^L-TGUMs`6Sqdi5 yw@G}vuQ}sxKB&NUps%@Lp|M>qiE&W@+3nXC;+r!$Z_C02_K5%m64iHWAPGopwhGYl zh6+sX+a$KRVRncxOaY%Dqr~)moQ$cP!`B-!Lq#|DZQ90*tRvw-k1~QUzM1pMe;$}x zzK@e6pzP@&)3yUmn+7upECMn=ZTk&gMgy4ecA&yla1PMbi`Zet^L-TGUMs`6Sqdi5 yw@G}vuQ}sxKB&NUps%@Lp|M>qiE&W@+#zp@+mR@+#m# t;{FSJAd1BOmBYh}#8s;L0p)I%?|97(k=e{Y#zp@+mR@+#m# t;{FSJAd1BOmBYh}#8s;L0p)I%?|97(k=e{YF1^} zif=yIK3xK)0AzUWf_e@ZA7r@1$_p?9How~t#EUE!v(HBv%HO>1;V+oMo7cTr#S9aV z`@qzWq-T3gIirs(RA4*M1xd)ZZ}(lxs2qc=yoZzNi6)AGF_Q!vvcLgLrV5z%x7+zK RO_GGk0{y%FT{_b`E&!MVcDDck delta 392 zcmbR9lylBg&IvMXrj};rW=0#8!Z@MK&2^kkLQwYPI!^J;ccm{2!1(Vrh;Kftlg$TH zYiF&-1(UP07T?_HdLL#EP_NkL8h;%TnA&y8a)QWeUzU7lhw;}vl-T^QW*y9|>F1^} zif=yIK3xK)0AzUWf_e@ZA7r@1$_p?9How~t#EUE!v(HBv%HO>1;V+oMo7cTr#S9aV z`@qzWq-T3gIirs(RA4*M1xd)ZZ}(lxs2qc=yoZzNi6)AGF_Q!vvcLgLrV5z%x7+zK RO_GGk0{y%FT{_b`E&xt6ccB0P diff --git a/mp3/mad/decoder.c b/mp3/mad/decoder.c index 64b2b5c..79e0f13 100644 --- a/mp3/mad/decoder.c +++ b/mp3/mad/decoder.c @@ -324,7 +324,7 @@ int ICACHE_FLASH_ATTR run_sync(struct mad_decoder *decoder) int result = 0; int r; - printf("run_sync\n"); +// printf("run_sync\n"); if (decoder->input_func == 0) return 0; diff --git a/mp3/make.sh b/mp3/make.sh index 32f23ef..02397cb 100755 --- a/mp3/make.sh +++ b/mp3/make.sh @@ -1,5 +1,5 @@ #!/bin/bash -e -make COMPILE=gcc BOOT=none APP=0 SPI_SPEED=40 SPI_MODE=QIO SPI_SIZE=512 +make COMPILE=gcc BOOT=none APP=0 SPI_SPEED=40 SPI_MODE=QIO SPI_SIZE=1024 #xtensa-lx106-elf-size ${ESPTOOL} --port ${ESPPORT} --baud ${ESPBAUD} write_flash 0x00000 ../bin/eagle.flash.bin 0xA0000 ../bin/eagle.irom0text.bin diff --git a/mp3/user/user_main.c b/mp3/user/user_main.c index 9251260..a10ec8c 100644 --- a/mp3/user/user_main.c +++ b/mp3/user/user_main.c @@ -20,43 +20,88 @@ #include "mad.h" +/* +Mem usage: +layer3: 744 bytes rodata +*/ + + #define server_ip "192.168.40.115" //#define server_ip "192.168.1.5" //#define server_ip "192.168.4.100" #define server_port 1234 +#define READER_THREAD +//#define UART_AUDIO +//#define FROMFLASH + + + + +#ifdef FROMFLASH +char ICACHE_RODATA_ATTR mp3data[]={ +#include "mp3.dat" +}; +#endif + struct madPrivateData { int fd; xSemaphoreHandle muxBufferBusy; xSemaphoreHandle semNeedRead; +#ifdef READER_THREAD char buff[2016]; int buffPos; +#endif +#ifdef FROMFLASH + char *fpos; +#endif }; -//#define printf(a, ...) while(0) +#ifdef UART_AUDIO +#define printf(a, ...) while(0) +#endif struct madPrivateData madParms; void render_sample_block(short *short_sample_buff, int no_samples) { int i, s; -// char samp[]={0x00, 0x01, 0x11, 0x15, 0x55, 0x75, 0x77, 0xf7, 0xff}; + static int err=0; + char samp[]={0x00, 0x01, 0x11, 0x15, 0x55, 0x75, 0x77, 0xf7, 0xff}; +#ifdef UART_AUDIO for (i=0; i> 0) & 0xff); -// putchar((s >> 8) & 0xff); -// uart_tx_one_char(0, (s >> 8) & 0xff); -// uart_tx_one_char(0, (s >> 0) & 0xff); -// printf("%04X", s); + s+=err; + if (s>32867) s=32767; + if (s<-32768) s=-32768; + uart_tx_one_char(0, samp[(s >> 14)+4]); + err=s-((s>>14)<<14); } - printf("render_sample_block %04x %04x\n", short_sample_buff[0], short_sample_buff[1]); +#endif + printf("rsb %04x %04x\n", short_sample_buff[0], short_sample_buff[1]); } void set_dac_sample_rate(int rate) { - printf("set_dac_sample_rate %d\n", rate); + printf("sr %d\n", rate); } +//The mp3 read buffer. 2106 bytes should be enough for up to 48KHz mp3s according to the sox sources. Used by libmad. #define READBUFSZ 2016 -static char readBuf[READBUFSZ]; //The mp3 read buffer. 2106 bytes should be enough for up to 48KHz mp3s according to the sox sources. Used by libmad. +static char readBuf[READBUFSZ]; + +void ICACHE_FLASH_ATTR memcpyAligned(char *dst, char *src, int len) { + int x; + int w, b; + for (x=0; x>0); + if (b==1) *dst=(w>>8); + if (b==2) *dst=(w>>16); + if (b==3) *dst=(w>>24); + dst++; src++; + } +} + static enum mad_flow ICACHE_FLASH_ATTR input(void *data, struct mad_stream *stream) { int n, i; @@ -66,14 +111,15 @@ static enum mad_flow ICACHE_FLASH_ATTR input(void *data, struct mad_stream *str rem=stream->bufend-stream->next_frame; memmove(readBuf, stream->next_frame, rem); +#ifdef READER_THREAD //Wait until there is enough data in the buffer. This only happens when the data feed rate is too low, and shouldn't normally be needed! do { xSemaphoreTake(p->muxBufferBusy, portMAX_DELAY); canRead=(p->buffPos>=(sizeof(readBuf)-rem)); xSemaphoreGive(p->muxBufferBusy); if (!canRead) { - printf("Out of mp3 data! Waiting for more...\n"); - vTaskDelay(300/portTICK_RATE_MS); + printf("Buf uflow\n"); + vTaskDelay(500/portTICK_RATE_MS); } } while (!canRead); @@ -91,6 +137,20 @@ static enum mad_flow ICACHE_FLASH_ATTR input(void *data, struct mad_stream *str //Let reader thread read more data. xSemaphoreGive(p->semNeedRead); +#elif defined(FROMFLASH) + //Copy from flash + n=sizeof(readBuf)-i; + printf("Copy %p, %d bytes\n", p->fpos, n); + memcpyAligned(&readBuf[i], p->fpos, n); + printf("Flashbuf: %02x %02x %02x %02x %02x\n", readBuf[i], readBuf[i+1], readBuf[i+2], readBuf[i+3], readBuf[i+4]); + p->fpos+=(sizeof(readBuf)-i); +#else + i=rem; + while (ifd, &readBuf[i], sizeof(readBuf)-i); + i+=n; + } +#endif mad_stream_buffer(stream, readBuf, sizeof(readBuf)); return MAD_FLOW_CONTINUE; } @@ -102,115 +162,90 @@ static enum mad_flow ICACHE_FLASH_ATTR output(void *data, struct mad_header cons static enum mad_flow ICACHE_FLASH_ATTR error(void *data, struct mad_stream *stream, struct mad_frame *frame) { // struct madPrivateData *p = (struct madPrivateData*)data; - printf("decoding error 0x%04x (%s)\n", stream->error, mad_stream_errorstr(stream)); + printf("dec err 0x%04x (%s)\n", stream->error, mad_stream_errorstr(stream)); return MAD_FLOW_CONTINUE; } -//#define FAKE_MAD -#ifndef FAKE_MAD - -void ICACHE_FLASH_ATTR tskmad(void *pvParameters){ - struct mad_decoder decoder; - struct madPrivateData *p=&madParms; //pvParameters; - printf("MAD: Decoder init.\n"); - mad_decoder_init(&decoder, p, input, 0, 0 , output, error, 0); - mad_decoder_run(&decoder, MAD_DECODER_MODE_SYNC); - mad_decoder_finish(&decoder); - printf("MAD: Decode done.\n"); -} - -#else -void ICACHE_FLASH_ATTR tskmad(void *pvParameters){ - int n, i=0; - int rem, canRead; - struct madPrivateData *p = &madParms; - while(1) { - //Wait until there is enough data in the buffer. This only happens when the data feed rate is too low, and shouldn't normally be needed! - do { - xSemaphoreTake(p->muxBufferBusy, portMAX_DELAY); - canRead=(p->buffPos>=(sizeof(readBuf))); - xSemaphoreGive(p->muxBufferBusy); - if (!canRead) { - printf("Out of mp3 data! Waiting for more...\n"); - vTaskDelay(300/portTICK_RATE_MS); - } - } while (!canRead); - //Read in bytes from buffer - xSemaphoreTake(p->muxBufferBusy, portMAX_DELAY); - p->buffPos=0; - xSemaphoreGive(p->muxBufferBusy); - - //Let reader thread read more data. - xSemaphoreGive(p->semNeedRead); - - - vTaskDelay(100/portTICK_RATE_MS); - } -} -#endif - -/* -THIS IS TOO SLOW! Incoming packets arrive, but with big hickups. -Things that don't help: -- AP/STA -- More free memory -- Killing muxes -- Doing a write before the select -*/ - -void ICACHE_FLASH_ATTR tskreader(void *pvParameters) { - struct madPrivateData *p=&madParms;//pvParameters; +int openConn() { while(1) { int n, i; struct sockaddr_in remote_ip; - fd_set fdsRead; int sock=socket(PF_INET, SOCK_STREAM, 0); if (sock==-1) { - printf("Client socket create error\n"); +// printf("Client socket create error\n"); continue; } n=1; setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, &n, sizeof(n)); - n=1024; - setsockopt(sock, SOL_SOCKET, SO_RCVBUF, &n, sizeof(n)); +// n=1024; +// setsockopt(sock, SOL_SOCKET, SO_RCVBUF, &n, sizeof(n)); bzero(&remote_ip, sizeof(struct sockaddr_in)); remote_ip.sin_family = AF_INET; remote_ip.sin_addr.s_addr = inet_addr(server_ip); remote_ip.sin_port = htons(server_port); - printf("Connecting to client...\n"); +// printf("Connecting to client...\n"); if (connect(sock, (struct sockaddr *)(&remote_ip), sizeof(struct sockaddr))!=00) { close(sock); - printf("Client connect fail.\n"); + printf("Conn err.\n"); vTaskDelay(1000/portTICK_RATE_MS); continue; } - - while(1) { - while (p->buffPos!=sizeof(p->buff)) { - //Wait for more data - printf("Doing select...\n"); - FD_ZERO(&fdsRead); - FD_SET(p->fd, &fdsRead); - lwip_select(p->fd+1, &fdsRead, NULL, NULL, NULL); - //Take buffer mux and read data. - xSemaphoreTake(p->muxBufferBusy, portMAX_DELAY); - n=read(p->fd, &p->buff[p->buffPos], sizeof(p->buff)-p->buffPos); - p->buffPos+=n; - xSemaphoreGive(p->muxBufferBusy); - printf("%d bytes of data read from socket.\n", n); - if (n==0) break; //ToDo: handle eof better + return sock; + } +} + + +void ICACHE_FLASH_ATTR tskmad(void *pvParameters){ + struct mad_decoder decoder; + struct madPrivateData *p=&madParms; //pvParameters; +#if !defined(READER_THREAD) && !defined(FROMFLASH) + p->fd=openConn(); +#endif +// printf("MAD: Decoder init.\n"); + mad_decoder_init(&decoder, p, input, 0, 0 , output, error, 0); + mad_decoder_run(&decoder, MAD_DECODER_MODE_SYNC); + mad_decoder_finish(&decoder); +// printf("MAD: Decode done.\n"); +} + +#ifdef READER_THREAD +void ICACHE_FLASH_ATTR tskreader(void *pvParameters) { + struct madPrivateData *p=&madParms;//pvParameters; + fd_set fdsRead; + int n; + p->fd=-1; + while(1) { + if (p->fd==-1) p->fd=openConn(); + while (p->buffPos!=sizeof(p->buff)) { + //Wait for more data +// printf("Doing select...\n"); + FD_ZERO(&fdsRead); + FD_SET(p->fd, &fdsRead); + lwip_select(p->fd+1, &fdsRead, NULL, NULL, NULL); + //Take buffer mux and read data. + xSemaphoreTake(p->muxBufferBusy, portMAX_DELAY); + n=read(p->fd, &p->buff[p->buffPos], sizeof(p->buff)-p->buffPos); + if (n<=0) { + close(p->fd); + p->fd=-1; + break; } - printf("Buffer full. Waiting for mad to empty it.\n"); - //Try to take the semaphore. This will wait until the mad task signals it needs more data. - xSemaphoreTake(p->semNeedRead, portMAX_DELAY); + p->buffPos+=n; + xSemaphoreGive(p->muxBufferBusy); + printf("Sock: %d bytes.\n", n); + if (n==0) break; //ToDo: handle eof better } + printf("Read done.\n"); + //Try to take the semaphore. This will wait until the mad task signals it needs more data. + xSemaphoreTake(p->semNeedRead, portMAX_DELAY); } } +#endif void ICACHE_FLASH_ATTR tskconnect(void *pvParameters) { vTaskDelay(3000/portTICK_RATE_MS); - printf("Connecting to AP...\n"); +// printf("Connecting to AP...\n"); wifi_station_disconnect(); // wifi_set_opmode(STATIONAP_MODE); if (wifi_get_opmode() != STATION_MODE) { @@ -227,10 +262,13 @@ void ICACHE_FLASH_ATTR tskconnect(void *pvParameters) { wifi_station_set_config(config); wifi_station_connect(); free(config); - printf("Connection thread done.\n"); +// printf("Connection thread done.\n"); - xTaskCreate(tskreader, "tskreader", 250, NULL, 11, NULL); - xTaskCreate(tskmad, "tskmad", 2200, NULL, 3, NULL); + //tskMad seems to need at least 2450 bytes of RAM. + if (xTaskCreate(tskmad, "tskmad", 2450, NULL, 3, NULL)!=pdPASS) printf("ERROR! Couldn't create MAD task!\n"); +#ifdef READER_THREAD + if (xTaskCreate(tskreader, "tskreader", 230, NULL, 11, NULL)!=pdPASS) printf("ERROR! Couldn't create reader task!\n"); +#endif vTaskDelete(NULL); } @@ -239,13 +277,18 @@ void ICACHE_FLASH_ATTR tskconnect(void *pvParameters) { void ICACHE_FLASH_ATTR user_init(void) { +#ifdef UART_AUDIO + UART_SetBaudrate(0, 441000); +#else UART_SetBaudrate(0, 115200); -// UART_SetBaudrate(0, 441000); - printf("SDK version:%s\n", system_get_sdk_version()); +#endif +#ifdef FROMFLASH + madParms.fpos=mp3data; +#endif madParms.muxBufferBusy=xSemaphoreCreateMutex(); vSemaphoreCreateBinary(madParms.semNeedRead); - printf("Starting tasks...\n"); +// printf("Starting tasks...\n"); xTaskCreate(tskconnect, "tskconnect", 200, NULL, 3, NULL); }