From a774e33ceff6c3eef02aad4f58a11c7e23ff62bb Mon Sep 17 00:00:00 2001 From: Clyne Sullivan Date: Wed, 7 Mar 2018 15:25:55 -0500 Subject: [PATCH] basic graphing --- include/display_draw.h | 1 + include/flash.h | 11 +++++ initrd/init | 38 ++++++++++++++++- initrd/init2 | 21 +++++++++ initrd/init3 | 1 + libinterp.a | Bin 62136 -> 59924 bytes src/display_draw.c | 15 ++++--- src/flash.c | 95 +++++++++++++++++++++++++++++++++++++++++ src/initrd.c | 2 +- src/keypad.c.bak | 52 ++++++++++++++++++++++ src/main.c | 25 ++++++++--- src/script.c | 39 ++++++++--------- src/stdlib.c | 3 +- 13 files changed, 267 insertions(+), 36 deletions(-) create mode 100644 include/flash.h create mode 100644 initrd/init2 create mode 100644 initrd/init3 create mode 100644 src/flash.c create mode 100644 src/keypad.c.bak diff --git a/include/display_draw.h b/include/display_draw.h index 5ed4224..823c697 100644 --- a/include/display_draw.h +++ b/include/display_draw.h @@ -5,6 +5,7 @@ void dsp_cursoron(void); +void dsp_pixel(int x, int y, uint16_t color); void dsp_line(int x, int y, int i, int j, uint16_t color); void dsp_rect(int x, int y, int w, int h, uint16_t color); diff --git a/include/flash.h b/include/flash.h new file mode 100644 index 0000000..26fffd3 --- /dev/null +++ b/include/flash.h @@ -0,0 +1,11 @@ +#ifndef FLASH_H_ +#define FLASH_H_ + +#include + +void flash_init(void); + +void flash_read(char *buf, uint32_t addr, unsigned int count); +void flash_write(const char *buf, uint32_t addr, unsigned int count); + +#endif // FLASH_H_ diff --git a/initrd/init b/initrd/init index 4351743..56e5212 100644 --- a/initrd/init +++ b/initrd/init @@ -1 +1,37 @@ -print "Hello, world!" +func Fx + ret (arg0 * arg0) +end + +# graph area +set plotx 0 +set ploty 0 +set plotw 479 +set ploth 319 + +# graph range +set xmin (0 - 10) +set xmax 10 +set ymin (0 - 10) +set ymax 10 + +set xinc (plotw / (xmax - xmin)) +set yinc (ploth / (ymax - ymin)) + +# print axis +line 240 0 240 319 32767 +line 0 160 479 160 32767 + +# do function +set x xmin +set cx (plotx + (plotw / 2)) +set cy (ploty + (ploth / 2)) +do + Fx x > y + set y (0 - y) + if ((y > ymin) & (y < ymax)) + pixel (cx + (x * xinc)) (cy + (y * yinc)) 511 + end + set x (x + (1 / xinc)) +while (x < xmax) + +print "Done." diff --git a/initrd/init2 b/initrd/init2 new file mode 100644 index 0000000..47dbae1 --- /dev/null +++ b/initrd/init2 @@ -0,0 +1,21 @@ +do + getkey > input + print input + delay 1000 +while (1) + +#do +# getkey > input +# if (input & 4) +# rand 479 > x +# rand 319 > y +# rand 479 > i +# rand 319 > j +# rand 32767 > purple +# +# line x y i j purple +# end +#while (1) +# +#print "done" + diff --git a/initrd/init3 b/initrd/init3 new file mode 100644 index 0000000..4351743 --- /dev/null +++ b/initrd/init3 @@ -0,0 +1 @@ +print "Hello, world!" diff --git a/libinterp.a b/libinterp.a index d52e2803bcf46de59182df5e14cd76914da2038a..a11013cf3c14896093240f36a613d8cb9782b74c 100644 GIT binary patch literal 59924 zcmeFa31Ah~y+3|t?oIBRkc41D5==tE8X#d210fK$2qY{5RyMu4Np5m4WHSp}tYF2Z zeO95`YLz~%TdmdBr_zUFt6glhVhe5EZC}({yIQQ;BGLN$e9nC5-bsiLZTnt-|7DUp zpYuKE`~9BpIdkUB%$ak(Q#dEw*$|!UFD)3jO+8~;*^KFD&X{^;K|z^La_$QX&YU$( z1nT@ssX0oyHhuKpln$l-8NZq|r9STOnsTK+?04W!rH1 zdfFO7u_g&Lwo9NTTpwvs!q?cotxe)1ZH*Gz7LBz;RIH^v+!$(T??h0m>WXwrsFNYR zYwze%vGxw8>p&>n2rca$p{|~KjjcT`;6+4ZY^%mFvjN@SsbRZdSJa}rqOc9gkqb14 zaI>YOr5m;&v01RqB3s*`GEr_TWR)z|7K5lRTGy5sDy6ME(%AviBb}kh6rSHCy4fp4R#Z3}t)+3$0qiTO!n=VvX%Bh$lw2cXTRTz;-RK^D56w-PpqXo*48zp-8#FR=hW1)GMrHH{mdCNNX?pAuFtAE|E|Tg z)rMi<)Uq~1jaLauspvQzpEN_mcy*c@p>`km)V=B(+v|oe%UrrW`oUlS_QCLF!zGmA z2xUlI`m#hQUEz)7Kx(-R?Rz$MxcUs>FS?Ke{oRT}|r`A^v-BUE+HFz7x^m z+rw{N>Kfj0D7qoqAKg%=in6QIw0$S%lF*&fM@h5LlI@Ldh*8$E=EF6(sy9aa#X^hM z+8?Zgy;H65gV7Ju(i?pdWiyVdqF|rJ)&EG}F3A#JJq$f2lFkyDK_hVA-3IhR>=6;h|H>);WiL>;N-)Q!a zl2+hB+{S25^+=)BBPdl&m5hP?FUAr_%YT&gMwB;6r`SiXH~K=%&guF4>|;mX+0oTF z0=-c+`h~FFzR)2L(N^9)sfML#4FGnQx`RNh)w3#vE?8N8t5WPeS1(?xRs@xDYe}~; z6@lQ6B&F^ZReh!vFs}!ixn1e z^J8Rldp0q_oAi59UQY|a?M_0+$FxkOnVrbnl{p3p=F<#jpUL3wVV0}xd<2u+ZvW%J z9xpY<;_97+owslseC?U z?oPRfk;>eJoZYEE0pTZ`v4GKOi=i|y8bKA<$JoGlu$h4uSY%~h21rU?1)iXr*?S6- zyiWps??ZEvj|s~60VIPyLIOVs9PxJkNN>guvXr}K; z#t*v^;cVaU8BU||BU5-7lhUa_4_O}t2HnqMkHa(q*`+cZbkq2t`%ijLUNfDlGd{uK zuc+;`H0)Cqc0u=P*blo1+Q%S}#vLNx0c&~y;R^gRs<1OvY6$>`ZWNRazaG2f6s9I2 zB+OBp*-)wL5FUOH)Fh`e+TwC~-BZAB-h-XT!%WT12zn=-%V07};O%5E^V<;dMT|=k zPI7ziI0|yaLF~MD-oaoYgI{H=N?(B8%Lr*JU1$;BTY2<-uc8@wZ)YCLS53`#-3Kll za6c2iMiKKx*ysJmr3jwpHaCOGe;V6v)*ld`?Vr4zdZshFltGme+M@hrRO$Bp7+S2b z*Y`Bot#HuyDA_enT1sfU@=v`8l9{N|F~Ia3?5@I38;gvFA?srQ86GI}y#l@dGcAL2 zsHNP>i4Dv@i(#*?3hl^0o8h2uKJ@r27*6xO1wH;b3}^ZtqiiL^*}gxMXD-8ezGTYI zW4J(N7eJ}k@Gm)wIp5A4mNKY(_$mJ~hIfx#K~1%^Ss5dn$h4A#+feD*z;nT*3zDz0 zmx11E_&0u@`gE0TVo>?MfxZ7c=IZu6NEM+Q5##mI0Dm0|eg!Irs?xuP9e<)T=>887 zIa%*Pwb$SEEC^qKQr!$HA9^z7@6no}VF9SD5lD#o@AsgjDWMMKe?W7lggTY~fM!ey zZBzblGU)Y%sOvwMA{_L!vHlJ+oSG7Y22)C#H!_--ZFf4nDmX#w6(|%0- zb9_nEfAk3Wt9);==6~9U@WPZ(3uK?B>>^(ed7dMGt#2&zeSR-2S>>ytoiB|+j%$67 z(YC%6q^|RgqCKzheAwjsDdS(IY@?j;U{9k=8Vi-i-Xx95sLe9OrZOq_8E6>q_LrM1 zY+fqunr&*Xyfzv$&pgwMW1BaN+AYGH_p3xoFz+tfFkj207Y(kbP6-)G8Fa|UGQvrZ%sJGOIP)s=SM6+ZvOlU7NRo#8&gKX!h$yu?_oonrydAj8RunsMkCf zRIM@Ub(*@%tbx9l%uzEbw#R%Aw)UB$a!Flko{O|Un5aB9Ki#9UERG7+q*U-PAro{* z!7%JbWW*NZ;AE72C_YCXO0gv+cp&{vMCk61?L?n6rbQpKX;iX{l{d=x1>p3bpb$ZS zp)nOlEKi@LMLMkVx>?v_gW0(AZllN;gU8j2Y*@;mn>tU=Kzgdb(&(fDs`Ss*VU;(T z^)pWs$$1eHRmLiC2UR-ZQxFgf^N;w?H7`Mh=iN`X_2#8WS9!BYY|w|rop&qE*{Hd^ zdFiN5|0a`1v^ei=*7bS%P%gmdMWQ*&LQ~#6r8RVEVUJ!BYCRgJ(OBTHufkpHQPlt+cL>#Ja6iZl{6eVsp2&#g`uy( z3wiQgX6|^a1hFyQf zFEGy{itNR&NsCOy#Zy;#kwavRh_L#{+Vwf%7M4Ii?o!;?KXDCB$hPFV5llD6qz(_b zQgc(&jf~{9ELeJ)a;44=R0Ng|#~ov_3IygN9bJnA(e{$Ej6i@a23V3)@PJ_Rdxkqw zyhssEfj~+i7$`?seThhtez)OD4InRDU0^(f@{kf7hOB8rN+JVFq>fdL9X7%kH*)E4 zT9B5cW6}-7qB9CXmx6WpjJN^wMw+OGOetFuHH=7Df?G)DhMSP#+8o=MY)vNFj|>Yx7P4}nNRD$#4v-t4s5UZA7?M$`iBKO-1jy>$4&>U5}<`>XvUB{i!K<*3&~nY>=frU7e*djC}PpMoKYW))K2P zZ4Ea>IYu^ATGx&)HN{FHYjZavO%wCP%{cvC^4Srcaq_Yjg}^HPDh!W27mJ zp~g`6j*dvzl&FFU7%*$Z(=7;CY!CE-!uit??(B+mB8)9Q8m6h1_J%E%L|hf5p$Qov z9@Wqp!2qkpg40Gs>nw_KoftQ=?3`k^HIT_09LJpBtlq=|-J~8oSyeTcBoLO2W2l0bt{f@Hio++p-5*Z>M7hER-tVT zo!#xN^{62vP-k;nxFuBI)1)wD*<7G^J#CDRG!}4#0QbC2R?Zz~bg32REMKsAHS(~t zXsw67Z4IKYG}_)8DQ#%k(H1FP)!E+M8E$RG5GsyceDIYfI4uZuw}!eR4UX)Ys~FG_ z#rP`j*kN9%KHLR^$sTRTy?Q9rg~;}{P-J_oJA~2FE`=fM_AN0obv3v2L@brmW{qOo z!{0PTh0rinsHr7PxmZ`IVLK{EHyh;Cvc)QK!`5z{b!&Z>E@hWpZ76k1q|K(9+I05L zf%Q;R8}#ZUF?|{ig=K*?1f(mSd85JcC?QvUfEL7>X>6z&l@``a2;qQ7!i_xKC=g4p z1|A*MX0)DlN(*79Z4;EX_t^PztRjTMz-F-oF9(J=)J+`y54FYG>$_A}w7s*tU|?ow zGN|k_#o=ynbjKREt5CSBp*z+Z(QOFEc5&E0M6=X36o&<5K{0a9*Ar6Z)5HvWtPEUT zHUp3FjtGuBPTVfl)Y;zJ0GnFFEl>k3iH5{uq|bp+ds7oN=@OyX9M#A1-QJA`LT#<> zZ7@^Yu0pLyjUTyCS7Qu41@3sL16K5OMH*S!YuW z-x%h3+@%{|sCsGbV%n`wS=MK$Ye1CMC+GsJvsRo_uyE?s0^Ma6Oe>puX4%YXWd)O4 z8#;O_@kR%gFu8RG=T^~sgnHfd zc;I0@r`P+R#fN)*Jp8d(%wsfqIqub0>>cH)YF7UJlMb(^)aZe`Y1DL4*&*20Ce3&u}9 zW43N1C0$$FrkydpZ2GLpQ%mZnP8ig3aFyiX&Ii~GWnP#XOi=}(?Tz=L^HaT-n^zh0 zQ`6?Bc$!kZ^Kpw;APn|xZk#6@JZ%Gc?7QayJevmc*th5dc+MZlW8eD^;Q7Qr9{VvO z&O@7*4dk((RpLCfIW&;Regum1P>;D(GudUgpQ_?K)U({uGrt@a6z0v1GNvGyw9q;= zm(Rc*xM#V~^e1PyGmQ~O7H%*`8aYO;k!PHqJR0{lCvDC+w|esfCxeT3LypbGTOh~g za@^f9+NF~8@lLQLsbL8MAw#FHi^mx{oyXbQtaJ_#+cf1_7dCB&h!`YxlA!qjoY-6n zPneF)HOM*_hR)eO)8agd5Tjg<6pJ2M8kfqzpS4j>I?B&G-&v?OJ`!f2ykmd|K%Xu& zkJn%ETOjmoAZ76=rR6EN3;cWzrTi-3&ph zeNxZwB>tFS(6r>LiDQ-e1aX{Fmk|q<;`vScA14iYJ)q4K1slujCZe1?Cs;p0BIwOT;BkSzg@Q{2*Ah{=e7VB(okUdf#X|GAGJc=ne!;H@9uoY4;O_+gBIv?p zh4QI_xq^H#!uV-|O9jsn3=3W@c%$G~1n(E*iyi8DQt(;9R|Wqh*e~cs10+A+LJf1uF#45?mt~65Jwqqu^Hr9}#>~ z@L9oE1^*=2FE|w^6!V`aSSz?*ut~5>aJS%R1#b}iir@o+-x2(=;ERI45qw9`#ATfM z4-?E2oG4f>SS`3#@J+$@1^wtSbUg|d3(gg+5nLx25xi3Hi-LCu-Y@v5;8TJx2)-`( zwxEIA59XgLm@7D5@C?BPf-40#3C0As3VuuQM}h`!XQ)3#Fe=zBxLfcuM4Vgq3;m$b zuL%7Ip)&)Pz9PZNM93`@dackMLhlm%w8TFu^pAvoOX&B7o`#N__LdW&ccIWY?8-zK zNjl!e{s-xqq;W%qE??8Sp9VcgXnoxTT_^NzBIrFr-zM~(LO(9_VWIyZ^f95+m@nir zCI1;h^Lc^xs3~1LTD!ybKs*m>jM|~jNXryF4tJ|5dSq-$eHVry8QIxxMKIhLsqbmV zV{KDA*mO8tU*8$oYH>;ohUA*@n5KoTC_Nug1dyMa($L=8%Ha^s;xZLWy>MDy=hjIV14uZo$Q=WWi{`x+b zG`di|W!eFunZ~UIKl0njAI3*}D8s|RjeKke_Ga5xh6tP@?=#)K^=e)T2;DeduQ5`f3rjWe`-i;69_)HrA1Lz9US&H*m93 zz<_MF4&HM(^9_!*&JX5`(>0#&1qjTH#^vh2&cY0=wrQ8AB$}tw@)HW z8P+4WZZNFj2`U@Y_`5>T=KCS8|E0o1u=zeOVLRzK_|`H}Hv72o8O3Q|G3?umINFzn zpKaeQ2;)$70Q6Ri206mtqd;@wx}= zcGew=UW0j#y?VCewl~J@?2mpAw0a~H^GMG-?(Xe4>%+O5KL&U6N6?KKmz#UFJwJHk z@>A;O{LJ^?cztKq8+#{O_6s$8c$Mdky|a%a?Np`tZ*(mD$91gvC)lyzgzK$;+!FI+ zXi2n(2i|Dj`Q{sGCpahhqSZ#<%45pZ^Nc@2>v#aQuVtV92V{To56C|E56Hgw_sB|J z9r>uTAKLbEKG*-|TSmX@t)Jz5_>t#HZTD~Ni`g%+pW=N_9)1P*730V2*d+YQ@Z
bBwP<40O7m0dS6SKhXOQ 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%0DuHH-yi|+qvr5LYhF(naD1w(NdGoW3yo;0M zU2Np>E!n=9Y|efquh+=)`TdVVV#z1S(MsQY;i^(%_r=AwCW&oL65DzYm_=;Vh%G7L z&9{kUJLD}_@&@DbHYLg1lq7GHE=i^4g+|_-3AldtItJxI9_}d=<8;hV(8ah;;EYU39$~9#FvBhJJEmrn$ldGIU zl*DMsUGuF znYU9AmkZ-)V3cUkn&Iimxpjr6A6dSB@sGiwY-N%l59Ot#F|^jjuHfHuHBK%RD?9_#+%YnX1o<1%j&?T z)m8p*KiriyHT|V3@WZK30Ucl8KH>FcE-c($S9uS8d&IA*bZ;9LAFhcOt^u~yEGk^n zFG&Bk%G&L1b)|*c`% zy>gE)_%p1@d}!iR6aPRSBY$D4Z{+H>x@&4G7gq+dl|q+kNvUgnRjYkpwF>I?Pn>=8 z9(opT-&k5Yx4*D|QB8ka{~9G{=LTUvJo%o|Kh&~7{ZgQC`rb_KuW8#;x2JMX?f$aG z{a>uy|3kI1G?x5hwox1QmoE0L?(1k`} zY}zTC;3Vu2BN25UM7ptvaRhf6r#MHpH(`gDjz%oD-2k&Zh;Hj_Xpc1Zw|XodlS~5f zaSf|TQ-SU?VRs@s-o%$lj&w9a;PxgF*vVDgPREK6ig@*i^mRmf(KAgLK+^8fyVNsQ z+w8OOl@OXn8XJ0PfQUHJE_@%1M0()~bIz6>vAzffm0*q8)YY{$MyB32E?|xECbN4_ z!faD5!;DrVVGRny#_bk1{Ar+wSZ}0h2Z~IsOO8a_x9W0e+SaGE=xFR!S?`S(CU?)- z8fkCn?Tg!fMp`?SLf%EK;b-hc)%worDll2JRWM0qf-ODB*3wuTOCi#Rb)y>;6I`eW zEe*}A2FMo6AYo3bm{G9NMqXzs2Ne^_HFx!MS#In#6hRjFGJd=PXrz_9M5#@YI=g!M zv5gc94uaL{q>;{8S7Yyq>`No4O(^^_vvze)OD~sq-)cn~dYk%U9WAPgL3MgVZ76AN zhgf7c{wRnr|FWX1T!cCCt(7=>2xhZHwz~K`Td*d$T1i~5#opA_z0-O_`QUM*C86rw5L zNN;lt>(`@uOqsllxHA&r+B{a4QIBxx*!CEzNn-ulNbPycY9i}aEW2Rc`K#W)BC_66 zTS`T?_r!3c>J`#GSyH=N$>vphmGJmot89IhVfJwTxMgxA8bJ-~?2=0fK2?<>JDVF& zf{|X>C;xf|2Iuf~{7AxJk@mCZHK^OUsf+anjkH!@D;MchjiZ)n z_C-*#V!h3%@%p+Xngpz#%*MP2kG7avFBw(M^FYyy_Hz+WidC%<%8MJd#oH37*+Dh` z8*R+Fe*6h+%=ylnWE<}2MdpjyiNs-EoyEqOQr_paF)mPCiI@4fEVatKUS!|MGM^4S z_R0+>l4U+wB*~I>?M-^-Gf5K9rexc9^MxjfXV_Z&=BrQ=PejWxdYi9hah@uag6}L_ zbLsDREC%yoHO{wzd|z^g^O+Cdo;CUR*<^jdR;%*=E8A`3Q={id9cHKPv+%vtbJ!|8 zN4=5I+g9PM2l~+AQ4h`dy#C(sOYoXxXomB87@GRf4&KlV=XEeN!w<$^B6a#-^Uw_M z!{-5g=x|;iLo+;zZ>WZ*{7XDE!+-0cg;BvjZ>P@G5{D1#Ycaj7xEDT1c@Celx=nZ- zZ^xb;w`;=40Jz_L7baeO$5iv1Nb_qJ5Bkxry;R(Wrri_1rp4{r7sG81>Q!wBAnEtv z*M%S38QO)vA7~DSb5J{7KF=|{0dys3ei$UZ3uq4V?=b|B^hfX;gZjcxlH|V`*a3RE z(4PnXZ_rgj9|W3%@gKwQ4TLWRGXA%K=3w}D@#8e3bAb&1G4Mm6`SqOiFF~7w{J${- zkn|si(L=-NcZbm~3s(-t&lpCZF^nERj4mEVPa8&`4f-#*KR5tH{TB}l=LCqIsQ(<8 zWBB`qg@0feec>>=br`*67=7_Ddgm~jtH_yy`A_t%kJ~MwGqJ}`y#JBt7VG^~(SK4M zY0sXq?AoY(5A?J8q#aC%if@b1gbm4tGoE7GRkLF$Up{oVBEE@f;zcgrLFfLeNKkfM z)q9|F-&M2Us=N>=7Q7(v2cz_7LbBW;FNCe-P#Q&Sbg_iXLBEIjxPDHwYA|juc;(lU$ zj*OE}&2t0a1Ef(%j}g&Way&Jy3UY{$|6?NJ^BLwW!N=cJ(91ArOoVgM~gRw-G=RD$aq(_7v4-i-2x)G}_ z>mA}bu+vWimZ5xzvvFGz=VH$cBKZGAoQ@fZXgi2u!S#ZC#&VsC8%RUX)DRGQ6$maM zLXS@qq4&K+l;4v?*)Te5i5?QIraiw8HZRHwd-}ZV}urc&XrC!D|F>5WG$B3xW>` zJ}vl?;I9SW7EHl?Nj<}Ye7=w_73A}S^a??)ElHZs4I-Zx#ES&C3+@s8xF9FJk?(&A za!(=BhXubS$l09qcTtu^wKoRvT%kEdjrF`w=-our_q{?N68wSSPX*O_8IUu=r{(4d zP7s_fc&6Yg!S#ZCUQ(aS1@{Yb0w?`HC-{KiV}d^v{HfsY1;?XeG2S%6GX<9jt`V#g zY!T$_amM3{mBgzAuM@mY@QZ?n1fLZAh2S3q-xUm^u2WvF;1a<#f^~wNHb%Zr34T`a zQNgDKzc2WT;O_+A7Mz9~igL~rTq9T~*dlnb;0Fb-56-=b7W}&4 zcLfIpexJ$Tn)`B4&dq`k6USQCvqJw?@NFW}IfKtP@Xrxk zE!Zk}so)(%@ZT%+VWFQ9d`a+E5}txNHyl$zITMq!GoW4 z2@(37DfDuo*9q2(f4|_T#Q$cY9})ViLjPFsm|!MmsZjoCBGM}m8qJ!;ae1ht{Q3UJ z@Ep<;Fuy|l%Y{Z)ONDP1x?bqZg}zegJB7Ym=p#aZPw2OVJ|=V?(?xpYBz;cyAzdYO zz0l1y!e2TAX{^gpo^6N<<})-7H~9_XrC-pLVo9IFGjuv$l^ zN|V-9T+l4^9eAA?pL}=}9JeM?G42=oo5RRMQ<@~N9PdP|LzD-xae1Y1Gd}%z%z!-a z!L)f$Z@PKuc#towo$74Ttpa7@FrXTIrKrp1Fk!5xc!XG060j2bT?s{~A0C}?{c7Ph zamd*@TWnbcbjV?3Yy|C1_sFtDx!@5MPqzbZ6Ne(Mfjr)8<}hKG z!Na&2_IdEpGQ%7uYyckKbO(_x%boc}QyowDqi{1$8Gbz8Hx=K{SRisRjKAvy4d2zc zkob=uhVM4vGXal*>3a;6!(6wUL3{Ok4f;I>KkA1jDz4wXa3g!&0CikD`}EdMIs(2U zNR01K6Y*oZS@FkAB8U9lU&ZF4y{*h=#8>+R~2E^Z2Gsr`)gU>@&|Q zP{*m)PRilUj0ris7x={_2P;dN)r_?Dv9H=#EFY`iDXZHIVGSJbZcAKGrvf(A+EVpc z{Q~TAbWE+R@lLb?Hp;YV_QZ*=N0e6LU}Ya#_1Z-i*711hzPxJhIz%5*(2zCw z4%W`mR^kOEsYepjh>}cMEhOO=u09mas=nbIu8;Gol0AU6m%{aC<()OS*>&Cb+wVuk z3h~A2YIR}pkwt0~cHa0QynMW|;=79c2Ca|dq`+_;;HnKp{3(1a`gY^wEMZH8T{Di6 z2&6nkD&R%{iLFF<1NvON8Oc^6xk%erralb>{GWn+-wQbT-Co4<(OxP=?=vz7d?`I_ z5>xnIoZ4dVf;-ipa>uWM?s{_Gd6>>ukV4Am=xYV=70Y@DzY#q7sM|g;rUg=Nn+UF8 zCWU^MNm;=ibl>$YIQ_^qa+vaYo4Q_4abNs2{6qe9e-$Vc4Xt@I==RY%(>;S3&*b;N zJa^_@fZ#>+E~V4T!n_N&jEVSz??A402ZH+%sNJF9n`Bo!Sy`~cbZ4{AkYlC$`OP6v zi_>HHsaznT@4#K`o;e>`2|fn7?%6sEoR935>y&;^|M_$Wf?H7B?gF|)!MhR3t)M$A z_(8fC(w!6hFUGB;J1@vhi`_+Zj|wAtm=9-5FW5!gL?{ z8GN#W+u-9qO#ZxJi2Pq+#>WNu0myy)T9jx(a2w-3@t<%P2MbtYPreHG)L;$E`za3l z&B&q^ru#Hymcb3po}p&ta6`3kQ~tu>Pnp)U4*FPC!6L?ej#jYCvS@|rexGrd2P>HF z^W?7$@=~}jd=Bol!TF5)@&}Om`d|a~8JvmG4MBc*c3IQJRei%3#nL4o*}3Zn?wE<}L%}E^riA?mR?r7dtU%>Cb&FK?HJdNf4o2 zF4pQUQE{?ziy_`!>eR54l=~G*TdqRNatFz_!a0a!=H)(0UC&V=<+(>0vdU>ioQ1iy z45@W^KUU>F!F1Lrw&l6BGIP&WAuDsgL$>prcEqX8JxaE9ifwJ~auVk|%86 znFh8Ed91_kE{FAYrJYCf2zS6?&8)Ta#!&cW&IiHxvXhrX8J9b=kn=$&k6$I-z0Oq# z`>lh*WA#%7%)EFCSdmh|=RiWbpWowi9zb-~7!N1C%%%7mc^Hc|DZzu-ufapLi>xQ= zrhyG8?}LekMte7vg*V>L1dOo}A>-V zVD5LxR_Czww{n|FY*d%UpSzgqY*Ji-+=bBE-R!X0EY4+X>RzZW<;vU|DteLAj`(YH z*O4vabRne;xlb{q-eJX$=6--74T|W_y${T8qat?XW-_G7c>>z(&YjCdo1O22xH9)M zRHsFyb4zXu6Kz#-ZqL1p0@@UDckX(IL>2Ks?qY_-6!A#zxg@qI;%m9=>$_W(w5P2= z6(TW7RUl(D%~TcbYWnAf&b7iv-ELihiU0lH<=iD)_C4-s=DFg(?8wMdu}}M08=&h zDDNJe1FRmOf)Q0fC+;**=KElq$PdT%Sy_r|o(OxE@{b`Jtz2?G1P9rSGL)3=XK>N48LODim+`v< zKl?x@Sea0tW#v8?MP5N3}rg-d0LvWi0VPiI>-11@&i z?E?kq^f4#tCMU4ROV>I^i$4lhJChL@f64-uL@G%hl!5q&n<{ZNf57mc&;}@B_H)ur zl)P3nsa`7@H(?WlN@Dgw8e#T9N)rQ@pq-5edV;qc-H?#Bxk)F`IwwP$3uVSlWK^Uq zM56r)SQu$!+}cKkVqDJHqm-k5VIM4-z)l!&jT{AJ+oTkVt z#+b*zwuOR>g^*a@X!{^lY{!}KOjcrsg^BUZl#?WZYQ-l5ZX6t_adI4#YDY508fiTZ z*L$+BlroYzErXc&t8^39IHgGpr%L|~vlg_nCopTttJz;uxTX#^B86*ciQ%Nu+``9` zpJpPd1w5q|Dl-iywe^I767wX1d&(;J*X&=6n2v8J1=HZ+@MPGvRB8j0zSM2=zgbj? z<~`ZkLCu`Nd~{3&O)_`z*f)4A8%}7;Fnr3pn%#baDeiHDhGf%){}!u-f7oC_>8<8v zpQbf}nKyi#RYKAOFXJ;^p=Yr(<;q?e-x6(65e$9#IwVO_AToz~3uT4(Rba($2kLha1d8qf!WI3ka zALrqG{H>bjUuS-~A8)PR!_$p{Hx_#H27>16Q{wO?jbxD@{dLdbgY-<$95>Jh2BSTP z&l*m1WF>KM{xpZ8s1@r0=fiT`%^Z|F(GWn=(}vMypl9O8I>h)3hJ`N$-GCqK55ud0 zSK-H39@49U_j_o*?EVNpzG^Z2{Xnj7Q7<&ip=3a#$tv!%Fljd4(7?e7o{6cXO?oD& zOgcqyCw=(3#1|{Rf|;8>(G0MJ(~!{|A_iIVi72FnLa!tu@DoG~-aH~$1szG_<<)|n zsJiYBgmIjPsOHH5@zS8ie+!9tNn^P%oMlL4`4N{0GCk7g39c7x5R3|T34T!U!-D@V zc%$IWf_Di%DEOG*_XK|;_!q%6d8CCSIduZU{i9PmGcen#*G!8Zi|BFIl;j5k`a zP;jPTlc1Ux2R<%DL;jBn-XQo{!TSUc3qCFQf}olohxlrK9FR>E<)sU9$r{pA1m_8= z`Eu|-SLn@x9A+T@4#9sDEW(XKe=fF0=sn>-w^&0p|2O@B7cncEkQ02 zN&4r4T)>d@yMiIyo217GP8Q^%l=QC>TqC$quuZT}@I!)E3*IDnr{M1e|13B+pye+X zyixED!TSW&d}h?KSA@<*8$rDaiSS=9^iH8~7JNeR6$$^1(4!Dn#TP6gLe5g5Q7o2& z6WezBzaYr=kNenhjGz9PexYc#gQPbLT`%hMr)8TrwBdhZmJ2>lB422-)bjwKo{!$I7$`z@ z@Og_%WmPH4vfe_0)6M4wu2c?dRf$VtBU zp-z~?gq6X=tKU34!0v@o)DO3ET)!%~O&mC_O4J<=$(h51t%HYgGi)2WCmaYg<6)c)2=mH&3-Tz3@|bNS?_#(ahxz8gd3Sxx zs2mLA?-D`7w;d1oQsE&OzN^G-g6;%g76avAx;*yc=hg4e(61YQ)DKyT>vtX8xV8*Z z$3cu;&Nl?mh$ec9-+Bvtx4@JAJ@y%yF0!W5G<5}}buH>&JsolwdDO$p*N%?S9fk>L z_>?j5toT-41*e*CGOzsXIcmB|!Kvq)yhg=Q?O1o&b5iq7WIo9J`hn<;*y-S<=!S7S zqfgdzZS6uT;B@& z-q^j&u3+k8F?Yiw??F9xgxr*O<5K&1t0;AFepJspIaZIIy*#r$PQ;z&;np)`eAWKB zOlSCf8k2_e{CP($-^t>+ukTyHJt%bS3vqdMZS>pAP`)8P0!;I3j*Hj#=aVMaBrEq$+UvaW}EX`&H!T zJBzIG{sTJo8t;#iU$61Lo6fQr!cs#15hFpRPDPrYHQo_~IRm%iY}=_;DyG(X*LZ)D zWcop#-LLShRuSgfvAL9t5e|SJPRx89;m)^lN=fCIwO%Eh>$S67+%s`X8NmR{<%2aP zjoyCuI{F76#5v&3gKB2Ib{Yz&q#uHRmdg&bS+D)ObZ1@<33)EZQ)RvO5qiCL%1^A< z&IzyqKfBQZKSP|KG2u}hhY9$0#tU&4sRK=MK@*Y$P4EaRGJ?`3GEOcp(VcM3 zQW7{6sa45Ml920>FxE&&AJ5E;BFS+{E#alOgi%^TpU%uEEuq`Wn8aA=8xTWja3F-b zp2=nM(oKXPQx{bUu(qd_&esS#K*QJ>2;k2?KuSdlNF;0)J8~5zBfu~z2A?owq7;3M zMwurZ5&Lgl6)$-}EA1phE*#Z?^@|zZ;^gX3@_11CiDJq?PKGxuX?-+|h@0^=HDOy1 z!i_v3KZ=jl4~34yJQ6L-v^w-XjGtqDoagsubu@f9Xut?f6NR60FvqOtfdL&{&iMLf zj4KP0jjp>VR&yv;*A}b8xvsRXbPdmKI9Jx~fhnDB>m_iu(XbY#r+O_AqXbu(*cp;ule_pV1rb>gg-s5QAA#>YQ^gC|EXoc7a-}tzb^s?6b?xnp0LVv!kiIzp@G3 zEjwm*%mdvQ?eAy=D%0GVSl+EN+R)QX4=}cNZ<{x>w|i#u?6V4HwzV~b5erDQVZ)D^ z{7eg~vuma-+=elO_`)l)%#L36L}`xIOw6JqdXW~76|tqwf=!+n($>;5Z2hSCAd0YA zvF@&Jte~V4IIq zp7dR~SXEbjVw2|io_n76d#>R#P2Z{bOuOpgTYVyVrp5N~t@ZL1h<@hT5dXHz@4xGk zzyF#iP!iAklX=YJE{SL3zuq@u_WKhD9w?sUz4%7VdceNEKKM3~I8NsqF}vN=iuHlt zWce+V-zyCrhPw_wK3f@H0Ob6BKAlNV1%A#$b7I*K@na8y;pYI&K|RmKFC7W8tHN-8 zYcPk(hiNqR2jGOozce24rX;yFHFqxWEH*?jEGvLk!FbCJjdcgGm_i@Z`x<`y_WP#b zJ49rDI&`D|9AfU@|IK$Y3tlS7cSwd`BY1=0 zZGvAAd`R$V!IuPoE%>%z3i3yJVZjN4%s>6jH(z%8NpBKt6XaxI`d=o<8AYTydz$#9 zp!w$eQ_|=Iyea=b*N*<_?7;zZiSRp1=!HVFtMC1Wc7Qba_yXnqhPF`XDhY2EIx6(Xgx)9g1417Z z`gx&W7W&UZ;}%ir{eR&bnzu`cB38%nZ)p2MdR&FyEKoG@Zzq$4#${87cP$orkeA2s zZ)hjun+IMKhw;eA@Bij7VP)`O8($>>2caM9HuX!v&yQaKzbgDp95}6?ARyo4VVvuR z@o~MI0!EO-@Ub0DN;gA42beC?GwHU#ZQ{UbjYoxkoDMlmSOaLUyeA=#awreCM_k^; za5E0`&0`SqI1kqx4CC(-LBlrz!b=U4gpuzmahssE;G=gqdKi?2QBbw+@+qx5cyWxqZ|8IUnn~LkpGBt;hM?E~%!>YoA^$x=X zG<>GFYd)i$>KoeZvbkmR)JL>ae?vP~tP+fWLmQ1&O79=OLv|PU+HC3lk1HA`4_06g zS#4{yxg_h^3ha_@=*|*9tc~75Xc{cF7*f#?z>dQ7SrFS9Oi4c8Wg)pUk)q z_e~$duBaRFWzCv+WBs9>{*sdC?OU;f<5BDI2oyHIC9J@2CVrLpl`E?=?B5wRyUS+} z4n_Ug-7{RTzqbXkkLXZzW4(+0JIUok_yQpIn2djgQ*Wwb2gm)?kJnu1VF~o3%aI+? znG$zr*C{3B-HR`W&KGy!yWvf+c1wZH+l^7~`AAzby#p}zgNF_S(f`2rPyIcRdrkVP zL)Fjx%9@w5x}b2X+I`bHOpCXBA2n6ZSiX5B2Tv&Z29ZozY7bZ?X}9bj$@?!ME3s>? zgI#k+92p54IJ1xa4pqW|<9xWoabC5y$J_Vd9%W?*D>vDH7q)wllzn81if5a>=%eGt zQ*&c8S0wc}XBZbt)j#Js?791w*MGSy_w{|#!@{XkW{}cy=hNswX8|a*4t=abW`THzm0Yx)PQ#V zdbwD;rQv{`*&w`pl{m#s@c8K#CU}=AfPoCczX?gs;t!C^pTf^yzH4!Emc*2gI}tpv z#(R!bz-0#{VU71Ya&zZFvBtXqVtv}+?&FZ^E4v8n{M0%GOr42Pe;T_kHr5(ReHeoM zK~3UQYY`=f6zO*?_f?4Yr{79X_mAYvpbUO$wW*z*`eh_Af^KCF=+C?d!FoH*vl(e5 zja_6rP4+77;B(AK@CoV_+)7m-i|-Cj!2c?OeC(s8xa=YO^59HWpNxHXfK(TrZUz_SO1-n6&UbK1{TzL*OsYVuku08+;owtXObMjk_B=e?D=74{ zOv-Y(Y*y-BAA&aw2mcon{`{92=>eQlzqlUfk$xYhj9Y;-ctu7%0iV3UOs?|dzKFPi zQaY_{%-IZ-QKaAPp|^4e+&jRo-65AF?b@A{4Ku;OY??iCv&JDXWgf+e{bHpv5~6Wc zap24!F`=g*H*mIA_z_Ak*C`#N|9rXw?$0TG0o@_@&xjPLpgYTDA3Cs*?i}~ij9W=} zo_iJY8dya4IQMSGT}*cYxR7wb4y+sx2KNdQtLW5Io&u}s-aY!SlvGQdVbQ=%Q3B_Y zfSF+C>p<2um5~Wn4maT1X9qU%qU$2tOeYMoDC0t=>UTd*5s{1GA8?fd^~^XoYow@5 zE_BGB$PDk50W=W1wG2h6L7zQTHJr8o2*QNHZH|f`JDV zXEw|P0}m?3Y?uiKzC>pLMolB5YT3V*)$UjJai>QWx1D;^I`JmxuePd6=r;# z`!d~+m!l_D;C_x}|3o9)#V+S}1fKjixTm^bXL&z$3*0lZX(kwWnlj7ahGx%DvvRnh z+P5ixq5E5=^(oY%U1XAitQ zgw)r&*HE89zP)X5x#?lxRo)Mq-Otefr;OWdck^TqNnh1nB93(_2%r));OH`b!@EnR?>iixZ z)tqo8bGclFl!a+%7FgkIMl$ol>D2oi6;d9KGGvw7Wo}`ZD{Td89o~;s;R{KuQEbb@ zgOqlz3RxNELc4+U92ywahB>?vSf|+5hA*OS=R3^p`mh?8+2%Y0bvBG;9S-brSZ`O_ zV|m{O2Ar9oYVEO?Q}|^L=Y72FjAd6PaJlmwbRBfYI;8eGGZ6+e!GNFDPZcop;wfN7 zN&yEL$G->+xm)05jqz~O%Up^mc^Hc|DZzu-+?7?ef~+U%roontybr!^XfzYIFjM30 z`vK#)T2?4fXuG&#Vb!h`DYq5o0860QW-|Wpjf^tM=5^(>fVm9#DRbOdgl7aQ?UfYp zAzqe6%58+~AoV^IQ!oQ+`jq0-a z!!*?jY*Ji-@R!N9*hIE5nad(Tkkzh`%=c4A~-1Hd5LUUP5X04l8~% ztab@*P(*k55SRmvir5j}#W+n)4BG4tZ)QldvlGOX;qeSnpIpnqwOVogNVt@@vgNy*vTBdvT&p2j$_gV;lOeJtPqq4(h=d*|A?C+Xf!~mf>wb*>N)ff_{*a9PV>Q#)E&a&h| znf8HVniA3r+qF%BDPg8|w@=w(*;%~PkrS$83;fz}NteIOUdMUQ5JuuO(teA|2F2V~Ln$ zED=ZQfzDCM)`i*0gRwbrGeKotI65Jcc7bPT>%!cGbzz>iF4P8t+$T&M3`#VyE;QSQ ziFM()xCV+D+lM8r3-i6!g`Ta$aK9Pr!ouO!g|rgP&<2v)-0*MO2_}#JCiW4-R$obb zaZOGhdN#X=iGATz?{Kll6cH2A%`Rdm962_xOQ>0T3bOSgT<^)q@#z~3#=qk}r zq7M_lWzDxR0|H#Mp`+ zMoBgmG{e}(?~Iff@crj^LHd8gXwbXi2Ug5J?LCc*h175>!d2(4UvbWgb Ga7C` zD8pUafG{S@cmLnn(dfOfD*QXPD{77HkO>spy3j04u6K=^gS}JKhCRySN|_hxi5bTm z84lly=mbWGC*67Ic-zAyD^E4XpV(yRcymNq`#e4;pwm0SL2VtRS5ZHmeS-df8%1sU zDtqO~K0)5?f#QaV)fb$*%rh0kYo~}hrFYRuGFXfZw^TH(J~pB9Z2j|3+9@ilL?d|? z_E9>?em@Db#Q1QwxfPN&{rR6TQ&culC$m#z4>CSaL+!1zLQT{tfIkn@YmM`8PKdK1 ziN|z`lX&X&e2-!+#xmXOB^gEyjJ>%I~2+JF62)fnpWQgm8X`^>!S}Xe<9vS3{CmGHikAXqR+y6qvtr@#uD#k zp2MftF^l_f2O#Q~757QjmV4NEkK^apj8x-?RG)R4^IOJwB2X@0!puQ>I)0zT?=k$y zUj{S>!_UO;Z3wIdGMr-r=3sa=e*BKN8pv>dHsGr*Uo%Nx05k{r8w>#?y=55P2YLm{ z*T~~r+{Z!l1)1{p4&(m_XnyMAYc|69_Mhi%IGx)|=DKP+rpGK0=>zgZG;&%?)OU`L?;s+-HV4PYO@@5>Hs?DxR|3SLK8I zrRG)UMDrf=0W-{Xl0N-1gzGTrgGcT%cba?5{pLaQd-G>AtNK9ru-;W1W4Yd(Vcupo znv4U5e3)C!us?+2`PTALvrn#|f4+H%Im!(CLns{mti&7EyNYWpcbHqvE_0{J2qEG2 zn|y5)nK3vx%&al_R2=Rz&ADca*=nvaH<&M*^mG#bEt8KrB7bTgFd1LN{e;Plhdj_6 zYO-$*?t9J8&2P-3=C9^pb+@8lZH_VP&H3gs^D*;j^Cfeex!wH0{KWjyJZv5}|1c}m zkxM>?n8VF+W>^m^|JjybFt?arnupA3dOZ{0EOV~eY%VreLe=3-mOCx)u)N#yLCax3 z2kA4BiTKN)ht+s#d8m-#MKyhltGS1O~IAn!rkzcZDEROTXG zH_MYOPqBQr(j^QV43Z?5EIy4x=+)N#_qJ*K-v_83Oi)F3r97A72`b&>p%@$FK4Tz}$I zzkV^kM`R}q*AcT?3deN5(cs6g-Hdwo=|-!GO7=r!Rpr%&%h6wTL(uXt^U(s|A)!uAH zsT3dWx1?Uf<*C%0z3AyXVEPzdoOzhn`rWaUuNgajV%=ofYiny0#|d?H`TV#Eb(8YJ zH1&V{hS@i!8B4Tb=6^|2o2gKd`_u*hkvf+PQkC6p-Rr`9ugOj2$A@Nr(>%6X%_Cf` zFQYRfka=N)HA8FOFS*s3?X5G~itBP&*&0`{me$$Q&g0tXn5Ioxc|?bJf#={Zlc7{H zBPsjrd>!=Xdj^=N0~Y;V$z{e0nHKKvvY&KFSFP8PAbF%tBz=%PUG=;y8rbT4CC*h_ zgVdVpm&?)g?4Rq@v0u9Elu*$TTwV)D>}AzDq_a3+h&uv1C%l?!|a&ceZ(+6?-l}7IR#{svB!hl<)?w{0v(nu0Z1A868iDkvftkEwMMh$x( z!8xUbJ)?K05nw+g-S5+SHq?AHM6ROt~huNqKo` zy&0=U8XFfZeW*o!e~n?2_~JiI?Y_xgbicf`s+U2&2;Tz-x&IN z{SxcOW+vB-oxQ%X46GeSSwTK}d;or+;(4Q;GaKXA!!wEU87rNeq-ZIK&g#=Dyz>Gf>mKC8&P zlQggJAQn3CXdA?`cdbS>9)I`kS=##Ot)F~7)I9Aor-TQ7Mtitb0Hbui;9nY z6Cds|z9q5~hU> 8); + dsp_write_data(color & 0xFF); + UNLOCK; +} + void dsp_line(int x, int y, int i, int j, uint16_t color) { int dx = i - x; @@ -115,11 +124,7 @@ void dsp_line(int x, int y, int i, int j, uint16_t color) int e2; while (1) { - LOCK; - dsp_set_addr(x, y, x, y); - dsp_write_data(color >> 8); - dsp_write_data(color & 0xFF); - UNLOCK; + dsp_pixel(x, y, color); if (x == i && y == j) break; e2 = err; diff --git a/src/flash.c b/src/flash.c new file mode 100644 index 0000000..3027ec0 --- /dev/null +++ b/src/flash.c @@ -0,0 +1,95 @@ +#include +#include +#include + +#define READ 0x03 +#define WRITE 0x02 +#define WREN 0x06 +#define WRDS 0x04 + +#define NSS GPIO_PORT(B, 12) +#define SCK GPIO_PORT(B, 13) +#define MISO GPIO_PORT(B, 14) +#define MOSI GPIO_PORT(B, 15) + +void flash_xchg(char *byte, int count); + +void flash_init(void) +{ + gpio_mode(NSS, ALTERNATE); + gpio_mode(SCK, ALTERNATE); + gpio_mode(MISO, ALTERNATE); + gpio_mode(MOSI, ALTERNATE); + GPIOB->AFR[1] |= 0x55550000; // alt mode SPI2 + + // clock enable + RCC->APB1ENR1 |= RCC_APB1ENR1_SPI2EN; + + SPI2->CR1 &= ~(SPI_CR1_BR_Msk); + SPI2->CR1 |= (3 << SPI_CR1_BR_Pos); + SPI2->CR1 |= SPI_CR1_SSM | SPI_CR1_SSI; + SPI2->CR1 |= SPI_CR1_MSTR; + SPI2->CR2 &= ~(SPI_CR2_DS_Msk); + SPI2->CR2 |= (7 << SPI_CR2_DS_Pos); + SPI2->CR2 |= SPI_CR2_SSOE; + SPI2->CR2 |= SPI_CR2_FRXTH; + SPI2->CR1 |= SPI_CR1_SPE; + + char buf[3]; + buf[0] = READ; + buf[1] = 0; + buf[2] = 0; + buf[3] = 0; + flash_xchg(buf, 4); +} + +void flash_xchg(char *byte, int count) +{ + uint32_t status = 0, dummy; + SPI2->CR1 &= ~(SPI_CR1_SSI); + while (SPI2->SR & SPI_SR_BSY); + for (int i = 0; i < count; i++) { + SPI2->DR = byte[i]; + do status = SPI2->SR; + while (status & SPI_SR_BSY); + // discard rx + while (status & SPI_SR_RXNE) { + dummy = SPI2->DR; + status = SPI2->SR; + } + } + do status = SPI2->SR; + while (status & SPI_SR_BSY); + + while (1) { + SPI2->DR = 0; + do status = SPI2->SR; + while (status & SPI_SR_BSY); + // discard rx + while (status & SPI_SR_RXNE) { + dummy = SPI2->DR; + status = SPI2->SR; + } + } + + SPI2->CR1 |= SPI_CR1_SSI; + (void)dummy; +} + +void flash_read(char *buf, uint32_t addr, unsigned int count) +{ + (void)buf; + (void)addr; + (void)count; + if (buf == 0) + return; +} + +void flash_write(const char *buf, uint32_t addr, unsigned int count) +{ + (void)buf; + (void)addr; + (void)count; + if (buf == 0) + return; +} diff --git a/src/initrd.c b/src/initrd.c index e90f9f0..948811f 100644 --- a/src/initrd.c +++ b/src/initrd.c @@ -61,7 +61,7 @@ initrd_file *initrd_getfileptr(const char *name) return file; uint32_t size = initrd_getsize(file) + sizeof(initrd_file); offset += size; - file += size; + file = (initrd_file *)((uint8_t *)file + size + 1); } return 0; diff --git a/src/keypad.c.bak b/src/keypad.c.bak new file mode 100644 index 0000000..f25d46f --- /dev/null +++ b/src/keypad.c.bak @@ -0,0 +1,52 @@ +#include +#include + +#define ADDR 0x20 + +#define CONTROL 0x41 +#define ADDRESS 0x12 + +void keypad_init(void) +{ + // clock init + RCC->CCIPR &= ~(RCC_CCIPR_I2C1SEL_Msk); + RCC->CCIPR |= 2 << RCC_CCIPR_I2C1SEL_Pos; + RCC->APB1ENR1 |= RCC_APB1ENR1_I2C1EN; + + // set times + // PRESC, SCLDEL, SDADEL, SCLH, SCLL + I2C1->TIMINGR = (0 << 28) | (2 << 20) | (0 << 16) | (2 << 8) | 4; + + // gpio init + gpio_mode(GPIOB, 8, ALTERNATE); + gpio_mode(GPIOB, 9, ALTERNATE); + GPIOB->AFR[1] &= ~(0xFF); + GPIOB->AFR[1] |= 0x44; + + // go go go + I2C1->CR1 |= I2C_CR1_PE; + + I2C1->CR2 |= ADDR << 1; + //I2C1->CR2 |= I2C_CR2_RD_WRN; + I2C1->CR2 &= ~(I2C_CR2_NBYTES); + I2C1->CR2 |= 1 << I2C_CR2_NBYTES_Pos; + I2C1->CR2 |= I2C_CR2_RELOAD; + I2C1->CR2 |= I2C_CR2_START; + + while (!(I2C1->ISR & I2C_ISR_TXE)); + + I2C1->TXDR = ADDRESS; + + while (I2C1->ISR & I2C_ISR_BUSY); + + I2C1->ICR |= 0x30; + I2C1->CR2 |= I2C_CR2_RD_WRN; + I2C1->CR2 |= I2C_CR2_RELOAD; + I2C1->CR2 |= I2C_CR2_START; + + while (1) { + while (!(I2C1->ISR & I2C_ISR_RXNE)); + uint32_t v = I2C1->RXDR; + (void)v; + } +} diff --git a/src/main.c b/src/main.c index 74ae6b7..71ce68f 100644 --- a/src/main.c +++ b/src/main.c @@ -13,6 +13,7 @@ #include #include #include +#include extern uint8_t _ebss; extern char *itoa(int, char *, int); @@ -24,7 +25,7 @@ int main(void) { asm("cpsid i"); // disable cached writes for precise debug info - //*((uint32_t *)0xE000E008) |= 2; + *((uint32_t *)0xE000E008) |= 2; // prepare flash latency for 80MHz operation FLASH->ACR &= ~(FLASH_ACR_LATENCY); @@ -58,14 +59,24 @@ void kmain(void) dsp_cursoron(); task_start(task_interpreter, 4096); + /*char buf[2]; + flash_init(); + buf[0] = 'A'; + flash_write(buf, 0, 1); + buf[0] = 0; + flash_read(buf, 0x00000000, 1); + buf[0] += ' '; + buf[1] = '\0'; + dsp_puts(buf);*/ + while (1) { - gpio_dout(GPIOA, 5, - (keypad_isdown(K0))); - delay(10); - /*gpio_dout(GPIOA, 5, 1); + //gpio_dout(GPIOA, 5, + // (keypad_isdown(K0))); + //delay(10); + gpio_dout(GPIOA, 5, 1); delay(250); gpio_dout(GPIOA, 5, 0); - delay(250);*/ + delay(250); } } @@ -77,7 +88,7 @@ void task_interpreter(void) char *s = initrd_getfile("init"); if (s == 0) { - dsp_puts("init not found"); + dsp_puts("can't find init"); goto end; } diff --git a/src/script.c b/src/script.c index 78165b0..c7b3614 100644 --- a/src/script.c +++ b/src/script.c @@ -19,6 +19,7 @@ int script_line(interpreter *it); int script_color(interpreter *it); int script_rand(interpreter *it); int script_getkey(interpreter *it); +int script_pixel(interpreter *it); void script_loadlib(interpreter *it) { @@ -31,11 +32,12 @@ void script_loadlib(interpreter *it) inew_cfunc(it, "color", script_color); inew_cfunc(it, "rand", script_rand); inew_cfunc(it, "getkey", script_getkey); + inew_cfunc(it, "pixel", script_pixel); } int script_puts(interpreter *it) { - char *s = igetarg_string(it, 0); + const char *s = igetarg_string(it, 0); dsp_puts(s); //dsp_puts("\n"); //asm("mov r0, %0; svc 2" :: "r" (s)); @@ -44,7 +46,8 @@ int script_puts(interpreter *it) int script_gets(interpreter *it) { - char *s = malloc(64), c[2] = {0, 0}; + char *s = malloc(64); + char c[2] = {0, 0}; uint16_t index = 0; do { @@ -57,7 +60,7 @@ int script_gets(interpreter *it) variable *v = igetarg(it, 0); v->valtype = STRING; - v->svalue = s; + v->value.p = (uint32_t)s; return 0; } @@ -98,39 +101,33 @@ int script_color(interpreter *it) { uint16_t c = dsp_color(igetarg_integer(it, 0), igetarg_integer(it, 1), igetarg_integer(it, 2)); - variable v; - v.valtype = INTEGER; - INT(&v) = c; - v.svalue = 0; - isetstr(&v); - iret(it, &v); + variable *v = make_varn(0, (float)c); + iret(it, v); + free(v); return 0; } int script_rand(interpreter *it) { - variable *v = (variable *)malloc(sizeof(variable)); unsigned int mod = igetarg_integer(it, 0); unsigned int val = random_get(); - v->valtype = INTEGER; - INT(v) = val % mod; - v->svalue = 0; - isetstr(v); + variable *v = make_varn(0, (float)(mod % val)); iret(it, v); - free(v->svalue); free(v); return 0; } int script_getkey(interpreter *it) { - variable *v = (variable *)malloc(sizeof(variable)); - v->valtype = INTEGER; - INT(v) = keypad_get(); - v->svalue = 0; - isetstr(v); + variable *v = make_varn(0, (float)keypad_get()); iret(it, v); - free(v->svalue); free(v); return 0; } + +int script_pixel(interpreter *it) +{ + dsp_pixel(igetarg_integer(it, 0), igetarg_integer(it, 1), + igetarg_integer(it, 2)); + return 0; +} diff --git a/src/stdlib.c b/src/stdlib.c index 303db4d..ec67ff3 100644 --- a/src/stdlib.c +++ b/src/stdlib.c @@ -40,6 +40,7 @@ char *snprintf(char *buf, unsigned int max, const char *format, ...) break; case 'f': itoa((int)va_arg(args, double), nbuf, 10); + continue; break; default: buf[off++] = format[i]; @@ -47,7 +48,7 @@ char *snprintf(char *buf, unsigned int max, const char *format, ...) break; } if (nbuf[0] != '\0') { - for (unsigned int j = 0; off < max && + for (unsigned int j = 0; off < max && j < 32 && nbuf[j] != '\0'; off++, j++) buf[off] = nbuf[j]; }