From 60f9454bb24ee0c643ac0c8cb6b23e742b3547ad Mon Sep 17 00:00:00 2001 From: jjwbruijn Date: Sat, 9 Dec 2023 01:07:27 +0100 Subject: [PATCH] M2 tag firmware v0024 --- binaries/Tag/SOLUM_154_SSD1619-00-0024.bin | Bin 0 -> 55974 bytes binaries/Tag/SOLUM_29_BW_LOWTEMP-21-0024.bin | Bin 0 -> 56118 bytes binaries/Tag/SOLUM_29_SSD1619-01-0024.bin | Bin 0 -> 56175 bytes binaries/Tag/SOLUM_29_UC8151-11-0024.bin | Bin 0 -> 53647 bytes binaries/Tag/SOLUM_42_SSD1619-02-0024.bin | Bin 0 -> 56172 bytes oepl-definitions.h | 24 +- zbs243_Tag_FW/buildfw.sh | 20 +- zbs243_Tag_FW/drawing.c | 364 +----------------- zbs243_Tag_FW/main.c | 103 ++++- zbs243_Tag_FW/powermgt.c | 25 +- zbs243_Tag_FW/settings.c | 23 +- zbs243_Tag_FW/settings.h | 15 +- zbs243_Tag_FW/syncedproto.c | 20 +- zbs243_Tag_FW/userinterface.c | 45 ++- zbs243_Tag_FW/userinterface.h | 1 - zbs243_shared/bitmaps.h | 3 + zbs243_shared/board/uc8151.c | 75 +--- zbs243_shared/board/zbs29_BW_ssd1619/board.h | 21 +- zbs243_shared/board/zbs29_BW_ssd1619/screen.c | 22 -- zbs243_shared/board/zbs29_uc8151/board.h | 2 +- 20 files changed, 251 insertions(+), 512 deletions(-) create mode 100644 binaries/Tag/SOLUM_154_SSD1619-00-0024.bin create mode 100644 binaries/Tag/SOLUM_29_BW_LOWTEMP-21-0024.bin create mode 100644 binaries/Tag/SOLUM_29_SSD1619-01-0024.bin create mode 100644 binaries/Tag/SOLUM_29_UC8151-11-0024.bin create mode 100644 binaries/Tag/SOLUM_42_SSD1619-02-0024.bin diff --git a/binaries/Tag/SOLUM_154_SSD1619-00-0024.bin b/binaries/Tag/SOLUM_154_SSD1619-00-0024.bin new file mode 100644 index 0000000000000000000000000000000000000000..ee136a32dfcb2563cbd5a184b99b2c0cb29ec43d GIT binary patch literal 55974 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 %`s+80uzO z1k-ZLgDl)}sXh`3@vGMxlSjG!EH<~&kkqzr1 z6Wg-9HQFB=SR3DRJ8k87HmzQ;8L?i(4xuf%mRx3V@GzED3)5CIB%U&M*R*TT;>P6u)ST#kVA5-aD2~p#4}sx8H~M7xlzs zB)wh++vQz7wmb1-y0a^}^cuwCzt#EmBtt9^2uGM*3GtIGC{Zd1n$Dvei$EPfu0$~u zl86-B3Z__wSux}*Kk z?s$p={RYq@T=WWrx)WUpyrZWKkw_(g^7*lNURMy+w2M9rPS6(H@|^G++A% z?a-gokI|+29r}>|fWB9Mm9EuZ)!(HH^_BWdbhUO!o6s)MeyGLhJ`tx``jcXwzK+fn zH_==zDxzAm)=uMEv-qd>SMhi8hJKwG7Q@<=VuRSA9o6sB6Z$E7U4Kh|jjq$4r7N{# z`fK{T`m?&k2}L+Yp2EBpg7!TLV1pQ1lT^?li6vt5z5@D;_OOOHpuVETz=RmA=&LSg z%m$DEsnoEqFZ1o6=W<_&?+OowA;Zo833!WwM)E{ zl=LtI4g{)2;-4I>WrNpo!&?$m;bg+v~l6KQIdtumP+Tqaqqx&n$$20&9St0!P!G z80_m|D9u0&ke^{TBVetd0T;X@5lLQ4YoSp8J01PK15!x#0b1S~ zPYfpA`ido;%A}kNC@T!A-5ty3XsUY?8g-`pER8att;c)EE7h%XcI8**UVKS(5V#Ud zA+N}8NHRVQ=pi6tc*-Fk2c*fty+BfdtQ1;fpu*eKiyyLOAO*gCmVp$6pY}6lAO)62 zwhW{w11ZWt3iqRLkezz>V{YC9gdpBj22ywjsllH_%RmZf!4L=t0^H%LMt*rN11ZWt z3Ir0%KneyUmVzd#88R`AR|ZljSacakA*?cxq70;}m`xoKgzX584GI#(0 literal 0 HcmV?d00001 diff --git a/binaries/Tag/SOLUM_29_SSD1619-01-0024.bin b/binaries/Tag/SOLUM_29_SSD1619-01-0024.bin new file mode 100644 index 0000000000000000000000000000000000000000..9a197e18749ec9e2ac57911bf612311d192cadb4 GIT binary patch literal 56175 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
>oacEZtlPx zkOQ7ryy!8<{3Q&L3};;ff!$G#C5s-Tc7goC1+ImzB}CoepX^zTTNw3$G#80fkT`om z9H+6D-qVlFp1*){Ff=;m&3|;BWB%MJ!xp&Et1KI1fV*biiC+hoF?->hoCU~WAT5p? z?Z}vQd**F3vuDO}4=?zQLo3k1C}Oq<0z_LzJ8r%sluA$WXpYEu>EQ*7=KLm(1IH2< znH&R*FI~7`(d@aPc^&@Qj{{gDgfWh65Z7a~7cSShYY71>&V$S`Sa4b#w=id^S;i>V zS}L2k706(%%3Pd76@;qnMjnq)7l1Exa*5*%peRqSmR$pZQGyXNXVGK13v$F9G~FZ> zCJz>BiP3903+FnPJu)YZjSW%D6U;Nn8*^7xhHO!ciqYy+8xtQdIoFa*L z_g%N4m*(Wmf1LVPoCiuGYG-Jg4VuyKA-X}}i)Sxf@<`5N6f}Ry;+#ikFGiM(+h>Fo zFf03d$8C3$WHpM^oLwTXiY3jO$q$bjZo?-klTWiM7O0)pKUu$w{xSxi=s#IigmF`) zJS9)f^H1|nQ*kHdaZ@>qWc4H{gZ+8xU?ss5BUxEU4CXM?{CRKZd8XkGp-2_uN$?Ez zPea&X+)>K^=0C-f$lGn~lbSe2`7M{rC8LT#jv;%~{powt_g>Ep;Rf|wX*AadpZ39A za#~_;TCPLMLplrKw58jf$?5iVn)EG5JvC;=F!4`?rK6I~zQoKKbYOyEU z9G!VKhdnV==a*D2r(N~XiP-VAx-*YU=hAW2|JGf1{I=;c9=>7h^lz@$gJQVI4-4*_ z80+ZBi*@u3tAk7AP%r1eulZ-^Y#d}H4oxy0?|sU7qu!E1FdABv$ce~cZuLZ8TV zMqWEmy^Ql){8oPgzT8Br$6}s z^W<$4Cnj_AILV^r#?`3D3{YZ{ljGBD4nCbv=kQ0rHb;C~aGY69yFnfP!Js<*V{pHJFt)+#AA>VJW{H&A&q_o(U8YEYf$BxuSPe!^S{Oq0 zaMi>p(pw};I`1H%lc+Hpa#2eCLwS+vQYl73he=lMQlk$1+PP@S;skI;m=Y6euhF_t zJGj2!X!aLM7oRBDzh^w6rSl|0H1#pqKDm!wAe^pGloN9`{3W6~d{Co)M+GW_lXZ9# zanGtqqhz!UvYX>99M6#u zgk(%k9G-X+unu?xdq2D0n;fJhaXWoD?Jpe!5zjHYh(~t%Gg5@)HE5EkE{3}l#MH-Q zac~?e>i$8n_9ulg8!EWTwjLkZ=C>NS^5+?&Sz@%J^IO;mhjC6TNUS4~c3Y17fxbOScfUkuQwm2UhZ8A7dEc&Oe`dlPvB2f>)0@Djp7P;Un-(P)Vt zmTV=A+=Ne>jy+TiNYuf)-k^u7`j`h!FiNvYR-!(;A&)5~`Xw3NEmmSW{J zN>6_tqHTQW8OX**0?qg>b}L$D$JgrrKkZz7Y#hZEf3thZT^xch&=vxQ+c>UbS`v~_ z1!IbD{gF@dVeGRoREV7It8?JwjPD%F5PTab$Q30uqI{`|0!>9lqCycMK#1njiY8Pl z4JwpYA<9W<8w#p?6%9Uwo$c?xCCr3Wmw+~}5SSLac=fVc_7v{_6#ti0IoeOejZyg=O-XT4#e&1p4nJ=e5CUfo~+eua! zGmQ(?S)e2_-fDS<))een^4M!F(^H^*Lm^a=J7Q$@3q-+CPXerSF_t*%U z1v|yl0-WzPa+V$2z-h9Y?z0YVGJ}?TmZ9Qx)F!V6>@#lqHp;5Y@siG^^Kr1vr-L&E zxr-l5x0-II4*ajivr2NksZ~dUX9*tJh{@}2CItdZ>l$mt;UeCqz!OW1#=J0`;+)yo zFWiK6D-12@b93eg*#*U#c5|ZTN0%Qhy%T}8eECt^F5H>2?b17!Q^~g7C&HwttC;8c zL!IUiOnur~cnrMe65dX;v*0(eclucG;dQH#IyWm1)f9ZC(Q0uk+y|x$JVy?CwH=!$ z=tN$&NtvQvXDW^05(6tC9mHLZ#w5d-XUxd!#tdT?7KA~jH#R9ydb4czZBc#(p6zMK z@+z>;AXik2SE5*s_>AYhvj+QQvpVCYo*T`ba8cKp_b8pJMlu+$X**+gbOD`+w9-c5 zULse}UqMdQ$2v}X^||$aHcywx5gEZuCAJ)SvCg@+Y-6x3kixo*1kcT?^(Gu&8T+BT zyWs3$ADDN^vC-Co56ru!yvB-n%z>17F0bZ?|ABSb&P>`98*l<|fPp@p<0kDO z*B|#LsW4rtZFXgxCnqZwRjhze*I~cPiDsPP3N!`VjGHojBsOVJoMX(*&o@kz|D4}n zFhRIFXLin1Pfll$3AE)X%4K4)<8r5xxt8;e`wdqwWrsSj#AI_fPhB9KegaUg)Yt!C-LiHv3N7PQUbY zN9*-OmsLNKnBeyx{H=N)&Jr#1jRWB{=&2iD;N!4n!HX{*2Wfx&%<2wofum!QTgRFH z^wi$FQJ+|}_jxAmkAJzLZ5H{)v^gEenVvef`Dv`qHRpV~Kf(0r4C+T?)Rv$Rd zw0$bJ!!)V(yt`y|wmrU|``1+Q=%9RUPptiw4~%m9QfnZf?K-aJ>(*Nz!2J5w5A0L) zJMW|{(#-RA9-oqoXZBUhHOOeYe)zS6sNVd{^1Xq{!ZtM z*PA#B15Z6ak!Hrv*FFLJ(;jJj?-?ei4t%g$gKB0q>>rdC^!9V}VZT)I>znN~-j9#B ztnIOgo@{$+oZtWPx2J;qBdYe*>)ttT+Y=wY{il1etJHz@xspG_V)z5NoK>nUEi+-u z%x~Knyb8giLrUlQPIi{>LU{}R(@apMdKJn_Dx4u5Pic$NsQNVNs7y@C7VwoR3<{sX z+5Pk91lLxX)wwo&3+HM=R){+kvQQ0Cn8KFKL2VG4L~UtgI;zQ09#I%O zC-VNR-^SN0f3^~><`7iL$_&-$_!WmR&e&YY!Wp7x-3%3FLD8f?&sn~5QqP8+49?qW zP{moMLF7WGMdnic%ETo4hMud;&)tV=vND5Dy9C3KJn6;jwv9KHQng{*MwxW368f_( zC{y4eZ9y*-%J?z1bhZ?FHhPqi6!L*$6APe`|M`j-h1Toq85qDAhiU@7&=NN6W-k?PY8qzm! zXuNI(mhmFaji!!BWa9?N#I~+zjrPX|*2TBpM%y@^O=}izL97?C!>Gh>AZlrJ40Rw9 z9zmp>aS>Z$^$7g7#kM520Z@=Y;JquF0^lPaOM>6N89)q&GmJpy)>O1R#V^`o@vX_2 z_l~6#Xg}7^?f0Sm#XT_@Nw1f|c6nEi?N0od?&wM`yBe|hZ*_h>$q)+!!VzXyLi{8P zN|XwMrt|5BB2WjAD^U!EBw|IzO23=v>r+6E#@2d z*v^0%j`sqF5(5sxs9#u1z|Ej%2IiDS*2a4QZAmGpL~ZNR#Y+r~!srYWLG#TA=-d9?+lDkI^Oi?fQ^@zrI(0m9EiV)!(HH^i}#xbd`2Uo6yeJ zeyGLhUJ<8R`jcY5zMkfY8)=>v6;Z8OYo~FoS^QJ`tN6QkL%&uGi(%~wu~BT)j_P;n z3H=nkuD_+fM%QZ3(iPe<{Wbkv{aIb&gd!XxPhs8)LHnKrut5y1Nh;`gT2Uk-gn zdssspP+!?%U_uO5^p%$}W&=ooRBBk_DHd031d@VL8eIv*)svS)iT#6peTxSB5lm0U zlPQ3Sx}x2;^(Te^*^%{e{C-XIVxt*L6QH622x1xW)WsRqmF5wKR!fD7J{h$OG2b&y>LvSQ^6(wYdzQD1#>uJS>AJ7=Ty`l&EHy#57(RJfWb_W$=Ws%HWAIc!J8{3HCzE;0Xp( z6#L_4@C2fDW$*;xlcksEeV06_UzRme@hvg=?H#{xmx_1amc+;V3hKkx_+Hb~^FQ0d{8j5${fExOkk68S^Ov){D6{{+H6Xq;8(r>Sgn$1A Dm4S@~ literal 0 HcmV?d00001 diff --git a/binaries/Tag/SOLUM_29_UC8151-11-0024.bin b/binaries/Tag/SOLUM_29_UC8151-11-0024.bin new file mode 100644 index 0000000000000000000000000000000000000000..328ca9f6a504d5a89b51fd53d127c14f35354b4c GIT binary patch literal 53647 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

*CM^ zeOU#41*FBIP@I!F4HjAr8xk9eJ2rmndb`%)HNTfXSH6> zYF5t*lu4no9xCgh03;_YL7tuUtm(1H!!CSY- z;aF8{#<)ER=A-EPfuLK1w=7-?-Ojg0_fM~L#eupq4z*?+TygZ-Q(NWOv_laYFSVu} z{B6cdIg}0=Frj-%5n}j~3F;HZ@>{)vyDy{1m9L_u61}H9-m&Vm(l*emB{^1KM}e6L zlqeAQH{yOZyU(R%3s_d>B4ngvRTCX#vD)eO6aW?B*J%hjwH3>NEPf=5x3DW-P=^>Q z*Md?e>vhPuPt@=Kg8L-g(;)}I&HeYfwSHa#whePBVB->i>GoXXSoI6Xs@wyZ4mwt? zD1%FSlHywn7cwb^jG}sb2@Cpd7#0}T`DqF(U)7OfJQ8dr;V|f)i7Q{tu_Cq}k^QOK z(}v69%2ypZo1l^Aah0_FmYnkC!j%1|y&QJA(Z!JmT zd=Hcw0_Ii|IWR*~2ax0crNBQ$_J}Q!8Z{QU$NF{H)_g#{RVBcHFuX9Yw0dXFJlS~J zLBINB=u_VD7hs|4Wb_>;mw-v!o^e2S$d(nEj+MK#E?H}@AAg|(y|C9q0UAP+{hZZad zOBcA8XxD=<2u$|&&0e(GBdZt(T&;<5dteH3 z&Yh1pePL`Yz){5bQGD?IfYpfBaOs&ZO7l2~WM0Y+4$F?7V9BXN`FFEnbQY^+TMxD9 z8qh8cXY7Jcb`oZ0A>S3^s?)?lyERuY1QF5Qj3E8?7CrVQ%@vCvyaB?DX7>~iWJn6% zoh#r35)0ZRk#i@F&3L{=@ol4(SoW}q3L!P5FY6Ir;4O4-j=N?x!BC8G6#5DBg=h

O(C#OIQaw zWY!1t6oN9epQ`&0RJUKR?$3I4!QzbR2kVYE*l@G{x((M$_F>oI#H{OE02*6_q|u5D z4Xhi3Jrz1pLU*zWBTK5=>>X=28Iuw~qPoCaSDIC>b{cW=0JkT(hj1zC-s@V|Yj~xH zEQ_THSW#)?TOecU9i%IuYG7+uEhsp2_w~OfyCD2Q5){`$c~gA*8pjj*-ZgXxa}fI%Zz)lHMc7z_QH3YNN75WiN)CY?1h*m+o9=HzAUv5^;xy0v0eFLHN<%`7Q;*_1X3&Y^d*6Uk@qNG~pAW8HzK`(z7~fCu zeczGMnwm(znIqDHtpK&=JO*3(RnZipQS57K>&x{7tGH>k(w0E%oe>!YM@O8B?mLAI zO^UCKsioK>Ig9)s+c$!XR$5lzz~!1z?RY&j4Ey<{e9yL3&9>Iu;kvRmxeVTt7uv~{ zPi-x*JVR_}(ch%gG97+f8?ni*xBLbwAcYF=M1$Ik@*ntF<)>`2(Obab&e&FyT-IJa z{sOklVd^ zGMs7HrPbE1t%eKRsP@>J?!ZsC5U`b6Z*kLh#rIh#UI?7MKMS06R(x`N8_I7bfU3q{ zXx)HA+|`x>VI6gY0g!*Xg~BUwm~&64oGuVF=K)Rr)jF~Q`XUw{xiyayOC4koJ2@MK z)ak{@|M4+whsDpL4n8N`g*o9S-OCko!m_S&!V~7n>FhP-%7rp0XP8?Nef~pJE_{l` zu4vps0TZFgTmUuFQ%3=sQ>)AJ>5&Mp1M`8nvHre0phvQIHz5kefYRb{#cqfTpD_hK zfr<)n!^;J7!n|-wV@!bqX&F;MZ?=lcHpTZ(>WtHjNJTa`^L_5sRz}g$p>v5Do@UHY zHGn)YGQ6Tjx~!F{oy6IVa_9;V#no$Q%D3B8HQ3Wd`727T=o_!0 z@+MQ6d>#lW`^T$-d1H_axXSLsR=N%XLzh7}1^ML|4fbl?sNQRq=}N z9QSecRpX_>8XrUv$led4_$pbX5n8E-R?{&Th)YvR7V$Kt)w^nTrzYUBx^$OTvzwH@ zb1cO-JLnD_$Bdum(gj}GWFFt4_%0AwY~!M@hT$6SwIJgaPP_=grv+bR0uJ{Rpy!AC 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 literal 0 HcmV?d00001 diff --git a/oepl-definitions.h b/oepl-definitions.h index df6aedd5..e5bac5ef 100755 --- a/oepl-definitions.h +++ b/oepl-definitions.h @@ -1,26 +1,30 @@ +// TAG TYPES + +// The 'OG' tags in OEPL (mostly M2 tags) #define SOLUM_154_SSD1619 0 #define SOLUM_29_SSD1619 0x01 -#define SOLUM_29_BW_SSD1619 0x21 -#define SOLUM_29_UC8151 0x11 +#define SOLUM_M2_BWR_29_UC8151 0x11 #define SOLUM_42_SSD1619 0x02 #define SOLUM_SEG_UK 0xF0 #define SOLUM_SEG_EU 0xF1 #define SOLUM_NODISPLAY 0xFF #define ESP32_C6 0xC6 +// M2 Tags, overflow #define SOLUM_M2_BWR_16 0x20 -#define SOLUM_M2_BW_29L 0x21 +#define SOLUM_M2_BW_29_LOWTEMP 0x21 // low temperature version of the 2.9 M2 tag #define SOLUM_M2_BWR_29 0x23 #define SOLUM_M2_BWR_42 0x24 #define SOLUM_M2_BWR_75 0x26 +// M3 Tags #define SOLUM_M3_BWR_16 0x30 #define SOLUM_M3_BWY_16 0x38 #define SOLUM_M3_BWR_22 0x31 #define SOLUM_M3_BWY_22 0x39 #define SOLUM_M3_BWR_26 0x32 #define SOLUM_M3_BWY_26 0x3A -#define SOLUM_M3_BWR_29 0x33 +#define SOLUM_M3_BWR_29 0x33 // the 'standard' SSD1619 version #define SOLUM_M3_BWY_29 0x3B #define SOLUM_M3_BWR_42 0x34 #define SOLUM_M3_BWY_42 0x3C @@ -31,10 +35,15 @@ #define SOLUM_M3_BWR_116 0x37 #define SOLUM_M3_BWY_116 0x3F +// M3 Tags overflow +#define SOLUM_M3_BWR_29_UC8151 0x40 // the UC8151 version of this M3 tag + +// Hanshow Nebular types #define HS_NEBULAR_BWY_35 0x60 #define HS_NEBULAR_BWR_35 0x61 #define HS_NEBULAR_BW_35 0x62 + #define CAPABILITY_SUPPORTS_COMPRESSION 0x02 #define CAPABILITY_SUPPORTS_CUSTOM_LUTS 0x04 #define CAPABILITY_ALT_LUT_SIZE 0x08 @@ -44,12 +53,12 @@ #define CAPABILITY_NFC_WAKE 0x80 #define DATATYPE_NOUPDATE 0 -#define DATATYPE_IMG_BMP 2 +#define DATATYPE_IMG_BMP 2 // ** deprecated #define DATATYPE_FW_UPDATE 3 -#define DATATYPE_IMG_DIFF 0x10 // always 1BPP +#define DATATYPE_IMG_DIFF 0x10 // always 1BPP ** deprecated #define DATATYPE_IMG_RAW_1BPP 0x20 // 2888 bytes for 1.54" / 4736 2.9" / 15000 4.2" #define DATATYPE_IMG_RAW_2BPP 0x21 // 5776 bytes for 1.54" / 9472 2.9" / 30000 4.2" -#define DATATYPE_IMG_RAW_1BPP_DIRECT 0x3F // only for 1.54", don't write to EEPROM, but straightaway to the EPD +#define DATATYPE_IMG_RAW_1BPP_DIRECT 0x3F // only for 1.54", don't write to EEPROM, but straightaway to the EPD ** deprecated #define DATATYPE_UK_SEGMENTED 0x51 // Segmented data for the UK Segmented display type (contained in availableData Reply) #define DATATYPE_EU_SEGMENTED 0x52 // Segmented data for the EU/DE Segmented display type (contained in availableData Reply) #define DATATYPE_NFC_RAW_CONTENT 0xA0 // raw memory content for the NT3H1101 @@ -81,7 +90,6 @@ #define WAKEUP_REASON_NETWORK_SCAN 0xFD #define WAKEUP_REASON_WDT_RESET 0xFE - #define EPD_LUT_DEFAULT 0 #define EPD_LUT_NO_REPEATS 1 #define EPD_LUT_FAST_NO_REDS 2 diff --git a/zbs243_Tag_FW/buildfw.sh b/zbs243_Tag_FW/buildfw.sh index bca0ada5..b5a60459 100755 --- a/zbs243_Tag_FW/buildfw.sh +++ b/zbs243_Tag_FW/buildfw.sh @@ -1,24 +1,34 @@ #!/bin/bash make clean > /dev/null +VER=$(grep "#define FW_VERSION" settings.h | grep -v "suffix" | awk '{print $3}' | cut -c 3-) + +echo "Building ZBS version ${VER}" + +BINDIR="../binaries/Tag" + echo -e "\nBuilding 1.54 version..." make BUILD=zbs154_ssd1619 CPU=8051 SOC=zbs243 > /dev/null -mv main.bin ../binaries/Tag_FW_1.54.bin -v +mv main.bin ${BINDIR}/SOLUM_154_SSD1619-00-${VER}.bin -v make clean > /dev/null echo -e "\n\nBuilding 2.9 (SSD1619) version..." make BUILD=zbs29_ssd1619 CPU=8051 SOC=zbs243 > /dev/null -mv main.bin ../binaries/Tag_FW_2.9.bin -v +mv main.bin ${BINDIR}/SOLUM_29_SSD1619-01-${VER}.bin -v make clean > /dev/null echo -e "\n\nBuilding 4.2 version..." make BUILD=zbs42_ssd1619 CPU=8051 SOC=zbs243 > /dev/null -mv main.bin ../binaries/Tag_FW_4.2.bin -v +mv main.bin ${BINDIR}/SOLUM_42_SSD1619-02-${VER}.bin -v make clean > /dev/null echo -e "\n\nBuilding 2.9 (UC8151) version..." make BUILD=zbs29_uc8151 CPU=8051 SOC=zbs243 > /dev/null -mv main.bin ../binaries/Tag_FW_2.9-uc8151.bin -v +mv main.bin ${BINDIR}/SOLUM_29_UC8151-11-${VER}.bin -v +make clean > /dev/null + +echo -e "\n\nBuilding 2.9 BW (SSD1619 - freezer) version..." +make BUILD=zbs29_BW_ssd1619 CPU=8051 SOC=zbs243 > /dev/null +mv main.bin ${BINDIR}/SOLUM_29_BW_LOWTEMP-21-${VER}.bin -v make clean > /dev/null -php packagebinaries.php diff --git a/zbs243_Tag_FW/drawing.c b/zbs243_Tag_FW/drawing.c index 2480c21b..09cf0027 100755 --- a/zbs243_Tag_FW/drawing.c +++ b/zbs243_Tag_FW/drawing.c @@ -13,327 +13,8 @@ #include "timer.h" #include "userinterface.h" // for addIcons -#define COMPRESSION_BITPACKED_3x5_to_7 0x62700357 // 3 pixels of 5 possible colors in 7 bits -#define COMPRESSION_BITPACKED_5x3_to_8 0x62700538 // 5 pixels of 3 possible colors in 8 bits -#define COMPRESSION_BITPACKED_3x6_to_8 0x62700368 // 3 pixels of 6 possible colors in 8 bits +extern uint8_t blockbuffer[]; -struct BitmapFileHeader { - uint8_t sig[2]; - uint32_t fileSz; - uint8_t rfu[4]; - uint32_t dataOfst; - uint32_t headerSz; // 40 - int32_t width; - int32_t height; - uint16_t colorplanes; // must be one - uint16_t bpp; - uint32_t compression; - uint32_t dataLen; // may be 0 - uint32_t pixelsPerMeterX; - uint32_t pixelsPerMeterY; - uint32_t numColors; // if zero, assume 2^bpp - uint32_t numImportantColors; -}; - -struct BitmapClutEntry { - uint8_t b, g, r, x; -}; - -struct BitmapDrawInfo { - // dimensions - uint16_t w, h, effectiveW, effectiveH, stride /* 0 -> 1, 5 - >7, 255 -> 256 */; - uint8_t numColorsM1; - - // data start - uint32_t dataAddr; - - // compression state - uint8_t packetPixelDivVal; - uint8_t packetNumPixels; - uint8_t packetBitSz; - uint8_t packetBitMask; // derived from the above - - // flags - uint8_t bpp : 4; - uint8_t bottomUp : 1; -}; - -uint8_t __xdata mPassNo = 0; - -static const uint8_t __code mColorMap[][6] = { - // colors are: B, DG, G, LG, W, R - // phase 0 (LUTS: B:W:R:G, purpose: BWR, prepare greys) - {1, 1, 1, 1, 0, 0}, // lo plane (B) - - {0, 0, 0, 0, 0, 1} // hi plane (R) -}; - -static uint8_t __xdata mClutMap[256]; -static struct BitmapDrawInfo __xdata mDrawInfo; - -#pragma callee_saves drawPrvParseHeader -static uint32_t drawPrvParseHeader(uint32_t addr) // return clut addr or zero on error -{ - struct BitmapFileHeader __xdata bmph; - uint16_t __xdata packetsPerRow; - - addr += sizeof(struct EepromImageHeader); - eepromRead(addr, &bmph, sizeof(bmph)); - - if (bmph.sig[0] != 'B' || bmph.sig[1] != 'M') - goto fail; - - if (bmph.colorplanes != 1) - goto fail; - - if (u32minusU16(&bmph.headerSz, 40)) // < 40 - goto fail; - - if (bmph.bpp > 8) - goto fail; - - mDrawInfo.bpp = bmph.bpp; - - if (!u32minusU16(&bmph.headerSz, 257)) // >= 257 - goto fail; - - if (u32Nonzero(&bmph.numColors)) - mDrawInfo.numColorsM1 = (uint8_t)bmph.numColors - (uint8_t)1; - else - mDrawInfo.numColorsM1 = (uint8_t)((uint8_t)1 << (uint8_t)mDrawInfo.bpp) - (uint8_t)1; - - if (!u32Nonzero(&bmph.height)) - goto fail; - - if (u32minusU16(&bmph.width, 1) || !u32minusU16(&bmph.width, 0xffff)) - goto fail; - mDrawInfo.w = bmph.width; - - if (i32Negative(&bmph.height)) { - if (u32plusU16(&bmph.height, 0xffff)) // carries if val too negative - goto fail; - mDrawInfo.h = -bmph.height; - mDrawInfo.bottomUp = false; - } else { - if (!u32minusU16(&bmph.headerSz, 0xffff)) // no carry if val too big - goto fail; - mDrawInfo.h = bmph.height; - mDrawInfo.bottomUp = true; - } - - if (bmph.compression) { - pr("compression is not supported ;("); - goto fail; - } - - mDrawInfo.packetPixelDivVal = 0; - mDrawInfo.packetNumPixels = 1; - if (mDrawInfo.bpp > 1) { - mDrawInfo.packetBitSz = 2; - } else { - mDrawInfo.packetBitSz = 1; // mDrawInfo.bpp; - } - - // mDrawInfo.stride = mathPrvDiv32x8(mathPrvMul16x8((mDrawInfo.w + mDrawInfo.packetNumPixels - 1), mDrawInfo.packetBitSz) + 31, 32) * 4UL; - // mDrawInfo.packetBitMask = (uint8_t)(((uint8_t)1) << (uint8_t)mDrawInfo.packetBitSz) - (uint8_t)1; - - packetsPerRow = mathPrvDiv16x8(mDrawInfo.w + mDrawInfo.packetNumPixels - 1, mDrawInfo.packetNumPixels); - mDrawInfo.stride = mathPrvDiv32x8(mathPrvMul16x8(packetsPerRow, mDrawInfo.packetBitSz) + 31, 32) * 4UL; - mDrawInfo.packetBitMask = (uint8_t)(((uint8_t)1) << (uint8_t)mDrawInfo.packetBitSz) - (uint8_t)1; - - // calc effective size - mDrawInfo.effectiveH = (mDrawInfo.h > SCREEN_HEIGHT) ? SCREEN_HEIGHT : mDrawInfo.h; - mDrawInfo.effectiveW = (mDrawInfo.w > SCREEN_WIDTH) ? SCREEN_WIDTH : mDrawInfo.w; - - // calc addrs - mDrawInfo.dataAddr = addr + bmph.dataOfst; - return addr + bmph.dataOfst - sizeof(struct BitmapClutEntry) * (1 + mDrawInfo.numColorsM1); - -// seriously, fuck SDCC -fail: - pr("Tried to parse the bmp header, didn't work..."); - return 0; -} - -#pragma callee_saves drawPrvLoadAndMapClut -static void drawPrvLoadAndMapClut(uint32_t clutAddr) { - struct BitmapClutEntry __xdata clut; - uint8_t __xdata i; - - // convert clut to our understanding of color - i = 0; - do { - uint8_t __xdata entry; - - eepromRead(clutAddr, &clut, sizeof(clut)); - clutAddr += sizeof(struct BitmapClutEntry); - - if (SCREEN_EXTRA_COLOR_INDEX >= 0 && clut.r == 0xff && (clut.g == 0xff || clut.g == 0) && clut.b == 0) // yellow/red - entry = SCREEN_EXTRA_COLOR_INDEX; - else { - uint16_t intensity = 0; - - intensity += mathPrvMul8x8(0x37, clut.r); - intensity += mathPrvMul8x8(0xB7, clut.g); - intensity += mathPrvMul8x8(0x12, clut.b); - // adds up to 0xff00 -> fix it - intensity += (uint8_t)(intensity >> 8); - - entry = mathPrvMul16x8(intensity, SCREEN_NUM_GREYS) >> 16; - entry += SCREEN_FIRST_GREY_IDX; - } - // pr("mapped clut %u (%d %d %d) -> %d\n", i, clut.r, clut.g, clut.b, entry); - mClutMap[i] = entry; - } while (i++ != mDrawInfo.numColorsM1); - - // replicate clut down if not a full 256-entry clut - if (mDrawInfo.bpp != 8) { - uint8_t num = (uint8_t)((uint8_t)1 << (uint8_t)mDrawInfo.bpp); - - // we can use the fact that our memcpy always copies forward - xMemCopyShort(mClutMap + num, mClutMap, (uint8_t)256 - (uint8_t)num); - } -} - -#pragma callee_saves drawPrvDecodeImageOnce -static void drawPrvDecodeImageOnce(void) { - uint8_t __xdata rowBuf[SCREEN_WIDTH]; - uint16_t __xdata er, c; - if (mDrawInfo.bottomUp) - er = mDrawInfo.effectiveH - 1; - else - er = 0; - while (1) { // we account differently for loop gets compiled worse - uint8_t __xdata inIdx = 0, bitpoolInUsed = 0, bitpoolIn = 0; - uint16_t __xdata nBytesOut = 0; - -#if SCREEN_TX_BPP == 4 - uint8_t __xdata txPrev = 0; - __bit emit = false; -#else - uint8_t __xdata bitpoolOutUsedUsed = 0; - uint16_t __xdata bitpoolOut = 0; -#endif - // get a row - epdDeselect(); - eepromRead(mathPrvMul16x16(er, mDrawInfo.stride) + mDrawInfo.dataAddr, rowBuf, mDrawInfo.stride); - epdSelect(); - // convert to our format - c = mDrawInfo.effectiveW; - do { - // uartTx('.'); - uint8_t packet, packetIdx, packetMembers = mDrawInfo.packetNumPixels; - - if (bitpoolInUsed >= mDrawInfo.packetBitSz) { - bitpoolInUsed -= mDrawInfo.packetBitSz; - packet = bitpoolIn >> bitpoolInUsed; - } else { - uint8_t __xdata packetBitSz = mDrawInfo.packetBitSz; - uint8_t __xdata t = rowBuf[inIdx++]; - - packet = (bitpoolIn << (packetBitSz - bitpoolInUsed)) | (t >> (8 - (packetBitSz - bitpoolInUsed))); - bitpoolInUsed += 8 - packetBitSz; - - bitpoolIn = t; - } - packet &= mDrawInfo.packetBitMask; - - // val is now a packet - unpack it - if (packetMembers > c) - packetMembers = c; - - for (packetIdx = 0; packetIdx < packetMembers; packetIdx++) { - uint8_t __xdata val; - - // extract - if (mDrawInfo.packetPixelDivVal) { - val = packet % mDrawInfo.packetPixelDivVal; - packet /= mDrawInfo.packetPixelDivVal; - } else - val = packet; - - // map - val = mClutMap[val]; - -// get bits out -#if SCREEN_TX_BPP == 4 - - if (emit) { - emit = false; - ByteDecode(txPrev | val); - nBytesOut++; - txPrev = 0; - } else { - emit = true; - txPrev = val << 4; - } - -#else - bitpoolOut <<= SCREEN_TX_BPP; - bitpoolOut |= val; - bitpoolOutUsedUsed += SCREEN_TX_BPP; - if (bitpoolOutUsedUsed >= 8) { - ByteDecode(bitpoolOut >> (bitpoolOutUsedUsed -= 8)); - bitpoolOut &= (1 << bitpoolOutUsedUsed) - 1; - nBytesOut++; - } -#endif - } - c -= packetMembers; - } while (c); - -#if SCREEN_TX_BPP == 4 - - if (emit) { - ByteDecode(txPrev); - nBytesOut++; - } - -#else - - if (bitpoolOutUsedUsed) { - ByteDecode(bitpoolOut); - nBytesOut++; - } - -#endif - - // if we did not produce enough bytes, do so - nBytesOut = ((long)SCREEN_WIDTH * SCREEN_TX_BPP + 7) / 8 - nBytesOut; - while (nBytesOut--) - ByteDecode(SCREEN_BYTE_FILL); - - // update row - if (mDrawInfo.bottomUp) { - if (er) - er--; - else - break; - } else { - er++; - if (er == mDrawInfo.effectiveH) - break; - } - } - - // fill the rest of the screen - for (er = mDrawInfo.effectiveH - SCREEN_HEIGHT; er; er--) { - for (c = ((long)SCREEN_WIDTH * SCREEN_TX_BPP + 7) / 8; c; c--) { - ByteDecode(SCREEN_BYTE_FILL); - } - } -} - -static uint8_t __xdata prev, step = 0; - -void ByteDecode(uint8_t byte) { - prev <<= 2; - prev |= (mColorMap[mPassNo][byte >> 4] << 1) | mColorMap[mPassNo][byte & 0x0f]; - if (++step == 4) { - step = 0; - epdSend(prev); - } -} #if (SCREEN_WIDTH == 152) void drawImageFromBuffer(uint8_t* buffer, const uint8_t lut) { pr("Doing raw 1bpp\n"); @@ -353,8 +34,8 @@ void drawImageFromBuffer(uint8_t* buffer, const uint8_t lut) { } #endif void drawImageAtAddress(uint32_t addr, uint8_t lut) { - struct EepromImageHeader* __xdata eih = (struct EepromImageHeader*)mClutMap; - eepromRead(addr, mClutMap, sizeof(struct EepromImageHeader)); + struct EepromImageHeader* __xdata eih = (struct EepromImageHeader*)blockbuffer; + eepromRead(addr, blockbuffer, sizeof(struct EepromImageHeader)); switch (eih->dataType) { case DATATYPE_IMG_RAW_1BPP: pr("Doing raw 1bpp\n"); @@ -367,10 +48,10 @@ void drawImageAtAddress(uint32_t addr, uint8_t lut) { for (uint16_t c = 0; c < (SCREEN_HEIGHT * (SCREEN_WIDTH / 8)); c++) { if (c % 256 == 0) { epdDeselect(); - eepromRead(addr + sizeof(struct EepromImageHeader) + c, mClutMap, 256); + eepromRead(addr + sizeof(struct EepromImageHeader) + c, blockbuffer, 256); epdSelect(); } - epdSend(mClutMap[c % 256]); + epdSend(blockbuffer[c % 256]); } epdDeselect(); endWriteFramebuffer(); @@ -385,10 +66,10 @@ void drawImageAtAddress(uint32_t addr, uint8_t lut) { for (uint16_t c = 0; c < (SCREEN_HEIGHT * (SCREEN_WIDTH / 8)); c++) { if (c % 256 == 0) { epdDeselect(); - eepromRead(addr + sizeof(struct EepromImageHeader) + c, mClutMap, 256); + eepromRead(addr + sizeof(struct EepromImageHeader) + c, blockbuffer, 256); epdSelect(); } - epdSend(mClutMap[c % 256]); + epdSend(blockbuffer[c % 256]); } epdDeselect(); endWriteFramebuffer(); @@ -398,41 +79,14 @@ void drawImageAtAddress(uint32_t addr, uint8_t lut) { for (uint16_t c = 0; c < (SCREEN_HEIGHT * (SCREEN_WIDTH / 8)); c++) { if (c % 256 == 0) { epdDeselect(); - eepromRead(addr + sizeof(struct EepromImageHeader) + (SCREEN_HEIGHT * (SCREEN_WIDTH / 8)) + c, mClutMap, 256); + eepromRead(addr + sizeof(struct EepromImageHeader) + (SCREEN_HEIGHT * (SCREEN_WIDTH / 8)) + c, blockbuffer, 256); epdSelect(); } - epdSend(mClutMap[c % 256]); + epdSend(blockbuffer[c % 256]); } epdDeselect(); endWriteFramebuffer(); break; - case DATATYPE_IMG_BMP:; - uint32_t __xdata clutAddr; - pr("sending BMP to EPD - "); - clutAddr = drawPrvParseHeader(addr); - if (!clutAddr) - return; - drawPrvLoadAndMapClut(clutAddr); - - epdSetup(); - if (lut) selectLUT(lut); - mPassNo = 0; - beginFullscreenImage(); - beginWriteFramebuffer(EPD_COLOR_BLACK); - prev = 0; - step = 0; - drawPrvDecodeImageOnce(); - endWriteFramebuffer(); - mPassNo++; - beginFullscreenImage(); - beginWriteFramebuffer(EPD_COLOR_RED); - prev = 0; - step = 0; - drawPrvDecodeImageOnce(); - endWriteFramebuffer(); - - pr(" complete.\n"); - break; default: // prevent drawing from an unknown file image type pr("Image with type 0x%02X was requested, but we don't know what to do with that currently...\n", eih->dataType); return; diff --git a/zbs243_Tag_FW/main.c b/zbs243_Tag_FW/main.c index 53b33e1c..74bfb701 100755 --- a/zbs243_Tag_FW/main.c +++ b/zbs243_Tag_FW/main.c @@ -21,6 +21,8 @@ #include "userinterface.h" #include "wdt.h" +#include "flash.h" + #include "uart.h" #include "../oepl-definitions.h" @@ -28,7 +30,7 @@ // #define DEBUG_MODE -static const uint64_t __code __at(0x008b) mVersionRom = 0x1000011300000000ull; +// static const uint64_t __code __at(0x008b) mVersionRom = 0x1000011300000000ull; #define TAG_MODE_CHANSEARCH 0 #define TAG_MODE_ASSOCIATED 1 @@ -41,6 +43,7 @@ uint8_t __xdata slideShowRefreshCount = 1; extern uint8_t *__idata blockp; extern uint8_t blockbuffer[]; +uint8_t *rebootP; #ifdef ENABLE_EEPROM_LOADER extern bool __idata serialBypassActive; bool __xdata serialActive = false; @@ -158,6 +161,51 @@ void displayLoop() { wdtDeviceReset(); } +#ifdef WRITE_MAC_FROM_FLASH +void writeInfoPageWithMac() { + uint8_t *settemp = blockbuffer + 2048; + flashRead(FLASH_INFOPAGE_ADDR, (void *)blockbuffer, 1024); + flashRead(0xFC06, (void *)(settemp + 8), 4); + settemp[7] = 0x00; + settemp[6] = 0x00; + settemp[5] = settemp[8]; + settemp[4] = settemp[9]; + settemp[3] = settemp[10]; + settemp[2] = settemp[11]; +#if (HW_TYPE == SOLUM_29_SSD1619) + settemp[1] = 0x3B; + settemp[0] = 0x10; +#endif +#if (HW_TYPE == SOLUM_M2_BWR_29_UC8151) + settemp[1] = 0x3B; + settemp[0] = 0x30; +#endif +#if (HW_TYPE == SOLUM_154_SSD1619) + settemp[1] = 0x34; + settemp[0] = 0x10; +#endif +#if (HW_TYPE == SOLUM_42_SSD1619) + settemp[1] = 0x48; + settemp[0] = 0x10; +#endif +#if (HW_TYPE == SOLUM_M2_BW_29_LOWTEMP) + settemp[1] = 0x2D; + settemp[0] = 0x10; +#endif + uint8_t cksum = 0; + for (uint8_t c = 0; c < 8; c++) { + cksum ^= settemp[c]; + cksum ^= settemp[c] >> 4; + } + settemp[0] += cksum & 0x0F; + + memcpy((void *)(blockbuffer + 0x0010), (void *)settemp, 8); + + flashErase(FLASH_INFOPAGE_ADDR + 1); + flashWrite(FLASH_INFOPAGE_ADDR, (void *)blockbuffer, 1024, false); +} +#endif + uint8_t channelSelect(uint8_t rounds) { // returns 0 if no accesspoints were found powerUp(INIT_RADIO); uint8_t __xdata result[16]; @@ -430,6 +478,7 @@ void TagChanSearch() { } } +#ifndef LEAN_VERSION void TagSlideShow() { currentChannel = 11; // suppress the no-rf image thing displayCustomImage(CUSTOM_IMAGE_SPLASHSCREEN); @@ -515,6 +564,7 @@ void TagShowWaitRFWake() { powerDown(INIT_EEPROM); wdtDeviceReset(); } +#endif void executeCommand(uint8_t cmd) { switch (cmd) { @@ -543,6 +593,7 @@ void executeCommand(uint8_t cmd) { eraseImageBlocks(); powerDown(INIT_EEPROM); break; +#ifndef LEAN_VERSION case CMD_ENTER_SLIDESHOW_FAST: powerUp(INIT_EEPROM); if (findSlotDataTypeArg(CUSTOM_IMAGE_SLIDESHOW << 3) == 0xFF) { @@ -601,6 +652,7 @@ void executeCommand(uint8_t cmd) { powerDown(INIT_EEPROM); wdtDeviceReset(); break; +#endif } } @@ -613,16 +665,45 @@ void main() { // Find the reason why we're booting; is this a WDT? wakeUpReason = getFirstWakeUpReason(); - // get our own mac address. this is stored in Infopage at offset 0x10-onwards + // dump(blockbuffer, 1024); + // get our own mac address. this is stored in Infopage at offset 0x10-onwards boardGetOwnMac(mSelfMac); pr("MAC>%02X%02X", mSelfMac[0], mSelfMac[1]); pr("%02X%02X", mSelfMac[2], mSelfMac[3]); pr("%02X%02X", mSelfMac[4], mSelfMac[5]); pr("%02X%02X\n", mSelfMac[6], mSelfMac[7]); + // do a little sleep, this prevents a partial boot during battery insertion + doSleep(200UL); powerUp(INIT_EEPROM); // load settings from infopage loadSettings(); + // invalidate the settings, and write them back in a later state + invalidateSettingsEEPROM(); + +#ifdef WRITE_MAC_FROM_FLASH + if (mSelfMac[7] == 0xFF && mSelfMac[6] == 0xFF) { + wdt10s(); + timerDelay(TIMER_TICKS_PER_SECOND * 2); + writeInfoPageWithMac(); + for (uint16_t c = 0xE800; c != 0; c += 1024) { + flashErase(c); + } + boardGetOwnMac(mSelfMac); + powerUp(INIT_UART | INIT_EEPROM | INIT_RADIO); + wdt120s(); + powerDown(INIT_EEPROM | INIT_RADIO); + + wdt120s(); + powerUp(INIT_EPD); + afterFlashScreenSaver(); + powerDown(INIT_EPD | INIT_UART); + while (1) { + doSleep(-1); + } + } +#endif + // get the highest slot number, number of slots initializeProto(); powerDown(INIT_EEPROM); @@ -630,6 +711,7 @@ void main() { // detect button or jig detectButtonOrJig(); +#ifndef LEAN_VERSION switch (tagSettings.customMode) { case TAG_CUSTOM_MODE_WAIT_RFWAKE: TagShowWaitRFWake(); @@ -643,6 +725,7 @@ void main() { default: break; } +#endif if (tagSettings.enableFastBoot) { // Fastboot @@ -682,9 +765,6 @@ void main() { tagSettings.fastBootCapabilities = capabilities; // now that we've collected all possible capabilities, save it to settings - powerUp(INIT_EEPROM); - writeSettings(); - powerDown(INIT_EEPROM); // scan for channels wdt30s(); @@ -697,14 +777,25 @@ void main() { // end of the fastboot option split wdt10s(); - powerUp(INIT_EPD); if (currentChannel) { showAPFound(); + + // write the settings to the eeprom + powerUp(INIT_EEPROM); + writeSettings(); + powerDown(INIT_EEPROM); + initPowerSaving(INTERVAL_BASE); currentTagMode = TAG_MODE_ASSOCIATED; doSleep(5000UL); } else { showNoAP(); + + // write the settings to the eeprom + powerUp(INIT_EEPROM); + writeSettings(); + powerDown(INIT_EEPROM); + initPowerSaving(INTERVAL_AT_MAX_ATTEMPTS); currentTagMode = TAG_MODE_CHANSEARCH; doSleep(120000UL); diff --git a/zbs243_Tag_FW/powermgt.c b/zbs243_Tag_FW/powermgt.c index ec0e06af..90372b30 100755 --- a/zbs243_Tag_FW/powermgt.c +++ b/zbs243_Tag_FW/powermgt.c @@ -119,13 +119,13 @@ static void configSPI(const bool setup) { static void configUART(const bool setup) { if (uartActive == setup) return; if (setup) { - P0FUNC |= (1 << 6)|(1<<7); + P0FUNC |= (1 << 6) | (1 << 7); P0DIR &= ~(1 << 6); - P0DIR |= (1<<7); + P0DIR |= (1 << 7); uartInit(); } else { P0DIR |= (1 << 6); - P0FUNC &= ~((1 << 6)|(1<<7)); + P0FUNC &= ~((1 << 6) | (1 << 7)); CLKEN &= ~(0x20); } uartActive = setup; @@ -134,10 +134,15 @@ static void configUART(const bool setup) { static void configEEPROM(const bool setup) { if (setup == eepromActive) return; if (setup) { +#ifdef EXTRA_EEPROM_LINES P1FUNC &= ~(1 << 1) | (1 << 2) | (1 << 6); P1DIR &= ~(1 << 1) | (1 << 2) | (1 << 6); P1_6 = 1; - P1_2 = 1; + P1_2 = 1; +#else + P1FUNC &= ~(1 << 1); + P1DIR &= ~(1 << 1); +#endif if (!eepromInit()) { powerDown(INIT_RADIO); powerUp(INIT_EPD); @@ -289,7 +294,7 @@ void doSleep(const uint32_t __xdata t) { uartActive = false; eepromActive = false; - capabilities |= CAPABILITY_HAS_WAKE_BUTTON; + //capabilities |= CAPABILITY_HAS_WAKE_BUTTON; if (capabilities & CAPABILITY_HAS_WAKE_BUTTON) { // Button setup on TEST pin 1.0 (input pullup) @@ -339,19 +344,18 @@ void doSleep(const uint32_t __xdata t) { P0INTEN = 0; switch (RADIO_Wake_Reason) { - case RADIO_WAKE_REASON_TIMER: + case RADIO_WAKE_REASON_RF: + wakeUpReason = WAKEUP_REASON_RF; break; case RADIO_WAKE_REASON_EXT: if ((P1CHSTA & (1 << 0)) && (capabilities & CAPABILITY_HAS_WAKE_BUTTON)) { wakeUpReason = WAKEUP_REASON_BUTTON1; P1CHSTA &= ~(1 << 0); } - if ((P0CHSTA & (1 << 7)) && (capabilities & CAPABILITY_HAS_WAKE_BUTTON)) { wakeUpReason = WAKEUP_REASON_BUTTON2; P0CHSTA &= ~(1 << 7); } - if ((P1CHSTA & (1 << 3)) && (capabilities & CAPABILITY_NFC_WAKE)) { wakeUpReason = WAKEUP_REASON_NFC; P1CHSTA &= ~(1 << 3); @@ -363,8 +367,9 @@ void doSleep(const uint32_t __xdata t) { } #endif break; - case RADIO_WAKE_REASON_RF: - wakeUpReason = WAKEUP_REASON_RF; + case RADIO_WAKE_REASON_TIMER: + // this stops the compiler from whining about a conditional flow optimization + wakeUpReason = wakeUpReason; break; } } diff --git a/zbs243_Tag_FW/settings.c b/zbs243_Tag_FW/settings.c index b82b4c71..0939b733 100755 --- a/zbs243_Tag_FW/settings.c +++ b/zbs243_Tag_FW/settings.c @@ -1,14 +1,13 @@ #define __packed #include "settings.h" -//#include +// #include #include #include #include #include #include - #include "asmUtil.h" #include "powermgt.h" #include "printf.h" @@ -17,6 +16,8 @@ #include "../oepl-definitions.h" #include "../oepl-proto.h" +#define SETTINGS_MAGIC 0xABBA5AA5 + struct tagsettings __xdata tagSettings = {0}; extern uint8_t __xdata blockbuffer[]; uint8_t* __xdata settingsTempBuffer = 1024 + blockbuffer; @@ -44,7 +45,7 @@ void loadSettingsFromBuffer(uint8_t* p) { break; default: pr("SETTINGS: received something we couldn't really process, version %d\n"); - break; + break; } tagSettings.fastBootCapabilities = capabilities; writeSettings(); @@ -66,9 +67,12 @@ static void upgradeSettings() { } void loadSettings() { - eepromRead(EEPROM_SETTINGS_AREA_START, (void*)settingsTempBuffer, sizeof(struct tagsettings)); + eepromRead(EEPROM_SETTINGS_AREA_START + 4, (void*)settingsTempBuffer, sizeof(struct tagsettings)); + memcpy((void*)&tagSettings, (void*)settingsTempBuffer, sizeof(struct tagsettings)); + uint32_t __xdata valid = 0; + eepromRead(EEPROM_SETTINGS_AREA_START, (void*)&valid, 4); xMemCopy((void*)tagSettings, (void*)settingsTempBuffer, sizeof(struct tagsettings)); - if (tagSettings.settingsVer == 0xFF) { + if (tagSettings.settingsVer == 0xFF || valid != SETTINGS_MAGIC) { // settings not set. load the defaults loadDefaultSettings(); pr("SETTINGS: Loaded default settings\n"); @@ -90,6 +94,13 @@ void writeSettings() { return; } eepromErase(EEPROM_SETTINGS_AREA_START, 1); - eepromWrite(EEPROM_SETTINGS_AREA_START, (void*)tagSettings, sizeof(tagSettings)); + uint32_t __xdata valid = SETTINGS_MAGIC; + eepromWrite(EEPROM_SETTINGS_AREA_START, (void*)&valid, 4); + eepromWrite(EEPROM_SETTINGS_AREA_START + 4, (void*)&tagSettings, sizeof(tagSettings)); pr("SETTINGS: Updated settings in EEPROM\n"); +} + +void invalidateSettingsEEPROM() { + int32_t __xdata valid = 0x0000; + eepromWrite(EEPROM_SETTINGS_AREA_START, (void*)&valid, 4); } \ No newline at end of file diff --git a/zbs243_Tag_FW/settings.h b/zbs243_Tag_FW/settings.h index dd8b9413..a5114263 100755 --- a/zbs243_Tag_FW/settings.h +++ b/zbs243_Tag_FW/settings.h @@ -3,13 +3,15 @@ #include -#define FW_VERSION 23 // version number (max 2.5.5 :) ) -#define FW_VERSION_SUFFIX "-HWI" // suffix, like -RC1 or whatever. -// #define DEBUGBLOCKS // uncomment to enable extra debug information on the block transfers -// #define PRINT_LUT // uncomment if you want the tag to print the LUT for the current temperature bracket -// #define ENABLE_EEPROM_LOADER // uncomment if you want to load eeprom images via the serial interface +#define FW_VERSION 0x0024 // version number +#define FW_VERSION_SUFFIX "-SET" // suffix, like -RC1 or whatever. +// #define DEBUGBLOCKS // uncomment to enable extra debug information on the block transfers +// #define PRINT_LUT // uncomment if you want the tag to print the LUT for the current temperature bracket +// #define ENABLE_EEPROM_LOADER // uncomment if you want to load eeprom images via the serial interface #define ENABLE_GPIO_WAKE // uncomment to enable GPIO wake -// #define ENABLE_RETURN_DATA // enables the tag to send blocks of data back. Enabling this costs about 4 IRAM bytes +// #define ENABLE_RETURN_DATA // enables the tag to send blocks of data back. Enabling this costs about 4 IRAM bytes +// #define LEAN_VERSION // makes a smaller version, leaving extra flash space for other things +// #define WRITE_MAC_FROM_FLASH // takes mac address from flash if none is set in the infopage #define SETTINGS_STRUCT_VERSION 0x01 @@ -43,4 +45,5 @@ void loadDefaultSettings(); void writeSettings(); void loadSettings(); void loadSettingsFromBuffer(uint8_t* p); +void invalidateSettingsEEPROM(); #endif \ No newline at end of file diff --git a/zbs243_Tag_FW/syncedproto.c b/zbs243_Tag_FW/syncedproto.c index 66911d76..2867524b 100755 --- a/zbs243_Tag_FW/syncedproto.c +++ b/zbs243_Tag_FW/syncedproto.c @@ -27,7 +27,7 @@ #include "wdt.h" // download-stuff -uint8_t __xdata blockbuffer[BLOCK_XFER_BUFFER_SIZE] = {0}; +uint8_t __xdata blockbuffer[BLOCK_XFER_BUFFER_SIZE]; static struct blockRequest __xdata curBlock = {0}; // used by the block-requester, contains the next request that we'll send static uint8_t __xdata curDispDataVer[8] = {0}; static struct AvailDataInfo __xdata xferDataInfo = {0}; // holds the AvailDataInfo during the transfer @@ -578,7 +578,7 @@ static bool getDataBlock(const uint16_t blockSize) { memset(curBlock.requestedParts, 0xFF, BLOCK_REQ_PARTS_BYTES); } else { partsThisBlock = (sizeof(struct blockData) + blockSize) / BLOCK_PART_DATA_SIZE; - if (blockSize % BLOCK_PART_DATA_SIZE) partsThisBlock++; + if ((sizeof(struct blockData) + blockSize) % BLOCK_PART_DATA_SIZE) partsThisBlock++; memset(curBlock.requestedParts, 0x00, BLOCK_REQ_PARTS_BYTES); for (uint8_t c = 0; c < partsThisBlock; c++) { curBlock.requestedParts[c / 8] |= (1 << (c % 8)); @@ -896,6 +896,9 @@ inline bool processImageDataAvail(struct AvailDataInfo *__xdata avail) { drawImageFromEeprom(findImgSlot, arg.lut); powerDown(INIT_EPD | INIT_EEPROM); + //powerUp(INIT_EEPROM | INIT_EPD); + //powerDown(INIT_EEPROM | INIT_EPD); + } else { // not found in cache, prepare to download pr("downloading image...\n"); @@ -912,7 +915,8 @@ inline bool processImageDataAvail(struct AvailDataInfo *__xdata avail) { powerUp(INIT_EPD | INIT_EEPROM); drawImageFromEeprom(xferImgSlot, arg.lut); powerDown(INIT_EPD | INIT_EEPROM); - + //powerUp(INIT_EEPROM | INIT_EPD); + //powerDown(INIT_EEPROM | INIT_EPD); } else { return false; } @@ -967,8 +971,7 @@ bool processAvailDataInfo(struct AvailDataInfo *__xdata avail) { } pr("NFC URL received\n"); - /* - if (curDataInfo.dataSize == 0 && xMemEqual((const void *__xdata) & avail->dataVer, (const void *__xdata) & curDataInfo.dataVer, 8)) { + if (xferDataInfo.dataSize == 0 && xMemEqual((const void *__xdata) & avail->dataVer, (const void *__xdata) & xferDataInfo.dataVer, 8)) { // we've already downloaded this NFC data, disregard and send XFC pr("this was the same as the last transfer, disregard\n"); powerUp(INIT_RADIO); @@ -979,11 +982,11 @@ bool processAvailDataInfo(struct AvailDataInfo *__xdata avail) { curBlock.blockId = 0; xMemCopy8(&(curBlock.ver), &(avail->dataVer)); curBlock.type = avail->dataType; - xMemCopyShort(&curDataInfo, (void *)avail, sizeof(struct AvailDataInfo)); + xMemCopyShort(&xferDataInfo, (void *)avail, sizeof(struct AvailDataInfo)); uint16_t __xdata nfcsize = avail->dataSize; wdt10s(); if (getDataBlock(avail->dataSize)) { - curDataInfo.dataSize = 0; // mark as transfer not pending + xferDataInfo.dataSize = 0; // mark as transfer not pending powerUp(INIT_I2C); if (avail->dataType == DATATYPE_NFC_URL_DIRECT) { // only one URL (handle NDEF records on the tag) @@ -992,7 +995,7 @@ bool processAvailDataInfo(struct AvailDataInfo *__xdata avail) { // raw NFC data upload to the NFC IC loadRawNTag(nfcsize); } - timerDelay(13330); + timerDelay(39990); powerDown(INIT_I2C); powerUp(INIT_RADIO); sendXferComplete(); @@ -1001,7 +1004,6 @@ bool processAvailDataInfo(struct AvailDataInfo *__xdata avail) { } return false; break; - */ case DATATYPE_TAG_CONFIG_DATA: if (xferDataInfo.dataSize == 0 && xMemEqual((const void *__xdata) & avail->dataVer, (const void *__xdata) & xferDataInfo.dataVer, 8)) { pr("this was the same as the last transfer, disregard\n"); diff --git a/zbs243_Tag_FW/userinterface.c b/zbs243_Tag_FW/userinterface.c index 41f3ccb4..8c7bc43c 100755 --- a/zbs243_Tag_FW/userinterface.c +++ b/zbs243_Tag_FW/userinterface.c @@ -6,7 +6,7 @@ #include #include "asmUtil.h" -#include "bitmaps.h" + #include "board.h" #include "comms.h" #include "cpu.h" @@ -18,6 +18,7 @@ #include "../oepl-proto.h" #include "screen.h" #include "settings.h" +#include "bitmaps.h" #include "sleep.h" #include "spi.h" #include "syncedproto.h" // for APmac / Channel @@ -94,7 +95,7 @@ void afterFlashScreenSaver() { epdPrintEnd(); epdPrintBegin(100, 32, EPD_DIRECTION_X, EPD_SIZE_SINGLE, EPD_COLOR_RED); - epdpr("v%d.%d.%d", fwVersion / 100, (fwVersion % 100) / 10, (fwVersion % 10)); + epdpr("v%04X", fwVersion); epdPrintEnd(); epdPrintBegin(0, 16, EPD_DIRECTION_X, EPD_SIZE_SINGLE, EPD_COLOR_BLACK); @@ -136,7 +137,7 @@ void afterFlashScreenSaver() { epdPrintEnd(); epdPrintBegin(8, 40, EPD_DIRECTION_Y, EPD_SIZE_SINGLE, EPD_COLOR_BLACK); - epdpr("v%d.%d.%d", fwVersion / 100, (fwVersion % 100) / 10, (fwVersion % 10)); + epdpr("v%04X", fwVersion); epdPrintEnd(); epdPrintBegin(32, 290, EPD_DIRECTION_Y, EPD_SIZE_SINGLE, EPD_COLOR_BLACK); @@ -169,7 +170,7 @@ void afterFlashScreenSaver() { epdPrintEnd(); epdPrintBegin(360, 8, EPD_DIRECTION_X, EPD_SIZE_SINGLE, EPD_COLOR_BLACK); - epdpr("v%d.%d.%d", fwVersion / 100, (fwVersion % 100) / 10, (fwVersion % 10)); + epdpr("v%04X", fwVersion); epdPrintEnd(); epdPrintBegin(10, 48, EPD_DIRECTION_X, EPD_SIZE_SINGLE, EPD_COLOR_BLACK); @@ -212,8 +213,10 @@ void showSplashScreen() { epdpr("Starting"); epdPrintEnd(); +#ifndef LEAN_VERSION loadRawBitmap(oepli, 12, 12, EPD_COLOR_BLACK); loadRawBitmap(cloud, 12, 0, EPD_COLOR_RED); +#endif epdPrintBegin(5, 136, EPD_DIRECTION_X, EPD_SIZE_SINGLE, EPD_COLOR_RED); epdpr("%02X%02X", mSelfMac[7], mSelfMac[6]); @@ -227,7 +230,7 @@ void showSplashScreen() { epdPrintEnd(); epdPrintBegin(2, 120, EPD_DIRECTION_X, EPD_SIZE_SINGLE, EPD_COLOR_BLACK); - epdpr("zbs154v033 %d.%d.%d%s", fwVersion / 100, (fwVersion % 100) / 10, (fwVersion % 10), fwVersionSuffix); + epdpr("zbs154 %04X%s", fwVersion, fwVersionSuffix); epdPrintEnd(); #endif @@ -243,7 +246,7 @@ void showSplashScreen() { epdPrintEnd(); epdPrintBegin(80, 295, EPD_DIRECTION_Y, EPD_SIZE_SINGLE, EPD_COLOR_BLACK); - epdpr("zbs29v033 %d.%d.%d%s", fwVersion / 100, (fwVersion % 100) / 10, (fwVersion % 10), fwVersionSuffix); + epdpr("zbs29 %04X%s", fwVersion, fwVersionSuffix); epdPrintEnd(); epdPrintBegin(105, 270, EPD_DIRECTION_Y, EPD_SIZE_SINGLE, EPD_COLOR_RED); @@ -259,9 +262,10 @@ void showSplashScreen() { spr(buffer + 8, "%02X%02X", mSelfMac[3], mSelfMac[2]); spr(buffer + 12, "%02X%02X", mSelfMac[1], mSelfMac[0]); printBarcode(buffer, 120, 284); - +#ifndef LEAN_VERSION loadRawBitmap(oepli, 0, 12, EPD_COLOR_BLACK); loadRawBitmap(cloud, 0, 0, EPD_COLOR_RED); +#endif // lutTest(); // drawLineVertical(EPD_COLOR_RED, 64, 10, 286); // drawLineVertical(EPD_COLOR_BLACK, 65, 10, 286); @@ -278,7 +282,7 @@ void showSplashScreen() { epdPrintEnd(); epdPrintBegin(3, 268, EPD_DIRECTION_X, EPD_SIZE_SINGLE, EPD_COLOR_BLACK); - epdpr("zbs42v033 %d.%d.%d%s", fwVersion / 100, (fwVersion % 100) / 10, (fwVersion % 10), fwVersionSuffix); + epdpr("zbs42 %04X%s", fwVersion, fwVersionSuffix); epdPrintEnd(); epdPrintBegin(3, 284, EPD_DIRECTION_X, EPD_SIZE_SINGLE, EPD_COLOR_RED); epdpr("MAC: %02X:%02X", mSelfMac[7], mSelfMac[6]); @@ -286,10 +290,10 @@ void showSplashScreen() { epdpr(":%02X:%02X", mSelfMac[3], mSelfMac[2]); epdpr(":%02X:%02X", mSelfMac[1], mSelfMac[0]); epdPrintEnd(); - +#ifndef LEAN_VERSION loadRawBitmap(oepli, 136, 22, EPD_COLOR_BLACK); loadRawBitmap(cloud, 136, 10, EPD_COLOR_RED); - +#endif uint8_t __xdata buffer[17]; spr(buffer, "%02X%02X", mSelfMac[7], mSelfMac[6]); spr(buffer + 4, "%02X%02X", mSelfMac[5], mSelfMac[4]); @@ -362,8 +366,10 @@ void showAPFound() { spr(buffer + 8, "%02X%02X", mSelfMac[3], mSelfMac[2]); spr(buffer + 12, "%02X%02X", mSelfMac[1], mSelfMac[0]); printBarcode(buffer, 120, 253); +#ifndef LEAN_VERSION loadRawBitmap(receive, 36, 14, EPD_COLOR_BLACK); #endif +#endif #if (SCREEN_WIDTH == 152) // 1.54" epdPrintBegin(25, 0, EPD_DIRECTION_X, EPD_SIZE_DOUBLE, EPD_COLOR_BLACK); epdpr("Waiting"); @@ -428,7 +434,9 @@ void showAPFound() { spr(buffer + 12, "%02X%02X", mSelfMac[1], mSelfMac[0]); printBarcode(buffer, 392, 253); printBarcode(buffer, 384, 253); +#ifndef LEAN_VERSION loadRawBitmap(receive, 100, 170, EPD_COLOR_BLACK); +#endif #endif addOverlay(); drawWithSleep(); @@ -452,9 +460,11 @@ void showNoAP() { epdPrintBegin(64, 285, EPD_DIRECTION_Y, EPD_SIZE_SINGLE, EPD_COLOR_BLACK); epdpr("little while..."); epdPrintEnd(); +#ifndef LEAN_VERSION loadRawBitmap(receive, 36, 24, EPD_COLOR_BLACK); loadRawBitmap(failed, 42, 26, EPD_COLOR_RED); #endif +#endif #if (SCREEN_WIDTH == 152) // 1.54" epdPrintBegin(40, 0, EPD_DIRECTION_X, EPD_SIZE_DOUBLE, EPD_COLOR_BLACK); epdpr("No AP"); @@ -477,8 +487,10 @@ void showNoAP() { epdPrintBegin(10, 274, EPD_DIRECTION_X, EPD_SIZE_SINGLE, EPD_COLOR_BLACK); epdpr("We'll try again in a little while"); epdPrintEnd(); +#ifndef LEAN_VERSION loadRawBitmap(receive, 76, 120, EPD_COLOR_BLACK); loadRawBitmap(failed, 82, 122, EPD_COLOR_RED); +#endif #endif addOverlay(); drawWithSleep(); @@ -513,8 +525,10 @@ void showNoEEPROM() { epdPrintBegin(64, 285, EPD_DIRECTION_Y, EPD_SIZE_SINGLE, EPD_COLOR_BLACK); epdpr("Sleeping forever :'("); epdPrintEnd(); +#ifndef LEAN_VERSION loadRawBitmap(failed, 42, 26, EPD_COLOR_RED); #endif +#endif #if (SCREEN_WIDTH == 152) // 1.54" epdPrintBegin(26, 0, EPD_DIRECTION_X, EPD_SIZE_DOUBLE, EPD_COLOR_BLACK); epdpr("EEPROM "); @@ -522,8 +536,9 @@ void showNoEEPROM() { epdPrintBegin(8, 32, EPD_DIRECTION_X, EPD_SIZE_DOUBLE, EPD_COLOR_BLACK); epdpr("FAILED :("); epdPrintEnd(); +#ifndef LEAN_VERSION loadRawBitmap(failed, 60, 72, EPD_COLOR_RED); - +#endif epdPrintBegin(3, 136, EPD_DIRECTION_X, EPD_SIZE_SINGLE, EPD_COLOR_BLACK); epdpr("Sleeping forever :'("); epdPrintEnd(); @@ -532,7 +547,9 @@ void showNoEEPROM() { epdPrintBegin(50, 3, EPD_DIRECTION_X, EPD_SIZE_DOUBLE, EPD_COLOR_BLACK); epdpr("EEPROM FAILED :("); epdPrintEnd(); +#ifndef LEAN_VERSION loadRawBitmap(failed, 176, 126, EPD_COLOR_RED); +#endif epdPrintBegin(100, 284, EPD_DIRECTION_X, EPD_SIZE_SINGLE, EPD_COLOR_BLACK); epdpr("Sleeping forever :'("); epdPrintEnd(); @@ -551,8 +568,10 @@ void showNoMAC() { epdPrintBegin(64, 285, EPD_DIRECTION_Y, EPD_SIZE_SINGLE, EPD_COLOR_BLACK); epdpr("Sleeping forever :'("); epdPrintEnd(); +#ifndef LEAN_VERSION loadRawBitmap(failed, 42, 26, EPD_COLOR_RED); #endif +#endif #if (SCREEN_WIDTH == 152) // 1.54" epdPrintBegin(20, 0, EPD_DIRECTION_X, EPD_SIZE_DOUBLE, EPD_COLOR_BLACK); epdpr("NO MAC"); @@ -560,7 +579,9 @@ void showNoMAC() { epdPrintBegin(30, 32, EPD_DIRECTION_X, EPD_SIZE_DOUBLE, EPD_COLOR_BLACK); epdpr("SET :("); epdPrintEnd(); +#ifndef LEAN_VERSION loadRawBitmap(failed, 60, 72, EPD_COLOR_RED); +#endif epdPrintBegin(3, 136, EPD_DIRECTION_X, EPD_SIZE_SINGLE, EPD_COLOR_BLACK); epdpr("Sleeping forever :'("); epdPrintEnd(); @@ -569,7 +590,9 @@ void showNoMAC() { epdPrintBegin(100, 3, EPD_DIRECTION_X, EPD_SIZE_DOUBLE, EPD_COLOR_BLACK); epdpr("NO MAC SET :("); epdPrintEnd(); +#ifndef LEAN_VERSION loadRawBitmap(failed, 176, 126, EPD_COLOR_RED); +#endif epdPrintBegin(100, 284, EPD_DIRECTION_X, EPD_SIZE_SINGLE, EPD_COLOR_BLACK); epdpr("Sleeping forever :'("); epdPrintEnd(); diff --git a/zbs243_Tag_FW/userinterface.h b/zbs243_Tag_FW/userinterface.h index 85047ad5..a3fbce46 100755 --- a/zbs243_Tag_FW/userinterface.h +++ b/zbs243_Tag_FW/userinterface.h @@ -16,7 +16,6 @@ void showNoEEPROM(); void showNoMAC(); - // wakeups from external stimuli void externalWakeHandler(uint8_t type); diff --git a/zbs243_shared/bitmaps.h b/zbs243_shared/bitmaps.h index 049ecd9f..1a4e4b10 100644 --- a/zbs243_shared/bitmaps.h +++ b/zbs243_shared/bitmaps.h @@ -6,6 +6,8 @@ #include "screen.h" + +#ifndef LEAN_VERSION static const uint8_t __code oepli[] = { 128, 26, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, @@ -202,6 +204,7 @@ static const uint8_t __code failed[] = { 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x00, }; +#endif #if (SCREEN_WIDTH != 128) static const uint8_t __code ant[] = { diff --git a/zbs243_shared/board/uc8151.c b/zbs243_shared/board/uc8151.c index bfb82154..1916e37d 100755 --- a/zbs243_shared/board/uc8151.c +++ b/zbs243_shared/board/uc8151.c @@ -327,10 +327,13 @@ void epdConfigGPIO(bool setup) { epdGPIOActive = setup; } void epdEnterSleep() { + timerDelay(20 * TIMER_TICKS_PER_MS); + epdReset(); + timerDelay(20 * TIMER_TICKS_PER_MS); shortCommand1(CMD_VCOM_INTERVAL, 0x17); shortCommand1(CMD_VCOM_DC_SETTING, 0x00); // shortCommand(CMD_POWER_OFF); - // epdWaitRdy(); + // epdWaitRdy(); shortCommand1(CMD_DEEP_SLEEP, 0xA5); isInited = false; } @@ -395,69 +398,19 @@ static uint8_t epdGetStatus() { return sta; } uint16_t epdGetBattery(void) { - return 0; + uint8_t sta; + commandReadBegin(0x51); + sta = epdReadByte(); + commandReadEnd(); + if (sta) return 3000; + return 2100; } -static void readLut() { - commandReadBegin(0x33); - uint16_t checksum = 0; - uint16_t ident = 0; - uint16_t shortl = 0; - for (uint16_t c = 0; c < LUT_BUFFER_SIZE; c++) { - waveformbuffer[c] = epdReadByte(); - } - commandReadEnd(); -} -static uint8_t getLutSize() { - uint8_t ref = 0; - for (uint8_t c = (LUT_BUFFER_SIZE - 4); c > 16; c--) { - uint8_t check = waveformbuffer[c]; - for (uint8_t d = 1; d < 4; d++) { - if (waveformbuffer[c + d] != check) { - ref = c; - goto end; - } - } - } -end:; - return ref + 1; -} -static void lutGroupDisable(uint8_t group) { - if (dispLutSize == 7) { - memset(&(waveform7->group[group]), 0x00, 5); - } else { - memset(&(waveform10->group[group]), 0x00, 5); - } -} -static void lutGroupSpeedup(uint8_t group, uint8_t speed) { - if (dispLutSize == 7) { - for (uint8_t i = 0; i < 4; i++) { - waveform7->group[group].phaselength[i] = 1 + (waveform7->group[group].phaselength[i] / speed); - } - } else { - for (uint8_t i = 0; i < 4; i++) { - waveform10->group[group].phaselength[i] = 1 + (waveform10->group[group].phaselength[i] / speed); - } - } -} -static void lutGroupRepeat(uint8_t group, uint8_t repeat) { - if (dispLutSize == 7) { - waveform7->group[group].repeat = repeat; - } else { - waveform10->group[group].repeat = repeat; - } -} -static void lutGroupRepeatReduce(uint8_t group, uint8_t factor) { - if (dispLutSize == 7) { - waveform7->group[group].repeat = waveform7->group[group].repeat / factor; - } else { - waveform10->group[group].repeat = waveform10->group[group].repeat / factor; - } -} + void selectLUT(uint8_t lut) { // implement alternative LUTs here. Currently just reset the watchdog to two minutes, // to ensure it doesn't reset during the much longer bootup procedure - lut+=1; // make the compiler a happy camper + lut += 1; // make the compiler a happy camper wdtSetResetVal(0xFF8E797F); // 120 s wdtOn(); return; @@ -478,8 +431,8 @@ void setWindowXY(uint16_t xstart, uint16_t xend, uint16_t ystart, uint16_t yend) void setColorMode(uint8_t red, uint8_t bw) { // this does exactly nothing, just keeps the compiler from barking - red=1; - bw=0; + red = 1; + bw = 0; return; } void clearScreen() { diff --git a/zbs243_shared/board/zbs29_BW_ssd1619/board.h b/zbs243_shared/board/zbs29_BW_ssd1619/board.h index 4684a303..c56c617a 100644 --- a/zbs243_shared/board/zbs29_BW_ssd1619/board.h +++ b/zbs243_shared/board/zbs29_BW_ssd1619/board.h @@ -8,27 +8,26 @@ #include "../oepl-definitions.h" #include "spi.h" -#define eepromByte spiByte -#define eepromPrvSelect() do { __asm__("nop\nnop\nnop\n"); P1_1 = 0; __asm__("nop\nnop\nnop\n"); } while(0) -#define eepromPrvDeselect() do { __asm__("nop\nnop\nnop\n"); P1_1 = 1; __asm__("nop\nnop\nnop\n"); } while(0) +#define eepromByte spiByte +#define eepromPrvSelect() do { __asm__("nop\nnop\nnop\n"); P1_1 = 0; __asm__("nop\nnop\nnop\n"); } while(0) +#define eepromPrvDeselect() do { __asm__("nop\nnop\nnop\n"); P1_1 = 1; __asm__("nop\nnop\nnop\n"); } while(0) //eeprom map -#define EEPROM_SETTINGS_AREA_START (0x01000UL) -#define EEPROM_SETTINGS_AREA_LEN (0x03000UL) -#define EEPROM_UPDATA_AREA_START (0x04000UL) -#define EEPROM_UPDATE_AREA_LEN (0x10000UL) -#define EEPROM_IMG_START (0x14000UL) -#define EEPROM_IMG_EACH (0x04000UL) +#define EEPROM_SETTINGS_AREA_START (0x00000UL) +#define EEPROM_SETTINGS_AREA_LEN (0x01000UL) +#define EEPROM_IMG_START (0x01000UL) +#define EEPROM_IMG_EACH (0x03000UL) //till end of eeprom really. do not put anything after - it will be erased at pairing time!!! -#define EEPROM_PROGRESS_BYTES (128) +#define EEPROM_PROGRESS_BYTES (128) #define HAS_EEPROM 1 #define HAS_SCREEN 1 #define NFC_TYPE -1 #define AP_EMULATE_TAG 1 +#define EXTRA_EEPROM_LINES // this tag has extra eeprom lines that need to be driven //hw types -#define HW_TYPE SOLUM_29_BW_SSD1619 +#define HW_TYPE SOLUM_M2_BW_29_LOWTEMP #include "../boardCommon.h" diff --git a/zbs243_shared/board/zbs29_BW_ssd1619/screen.c b/zbs243_shared/board/zbs29_BW_ssd1619/screen.c index abc290f3..821ccb80 100644 --- a/zbs243_shared/board/zbs29_BW_ssd1619/screen.c +++ b/zbs243_shared/board/zbs29_BW_ssd1619/screen.c @@ -810,25 +810,3 @@ void epdPrintEnd() { } commandEnd(); } - -extern uint8_t __xdata blockXferBuffer[]; - -void readRam() { - setWindowY(296, 0); - setWindowX(0, 8); - setPosXY(0, 296); - shortCommand1(CMD_DATA_ENTRY_MODE, 1); // was 3 - shortCommand1(0x41, 0x00); - commandReadBegin(0x27); - epdReadByte(); - - for (uint16_t c = 0; c < 293; c++) { - blockXferBuffer[c] = epdReadByte() | 0x10; - } - commandReadEnd(); - commandBegin(CMD_WRITE_FB_BW); - for (uint16_t c = 0; c < 296; c++) { - epdSend(blockXferBuffer[c]); - } - commandEnd(); -} diff --git a/zbs243_shared/board/zbs29_uc8151/board.h b/zbs243_shared/board/zbs29_uc8151/board.h index 77496055..860efc47 100755 --- a/zbs243_shared/board/zbs29_uc8151/board.h +++ b/zbs243_shared/board/zbs29_uc8151/board.h @@ -24,7 +24,7 @@ #define AP_EMULATE_TAG 1 //hw types -#define HW_TYPE SOLUM_29_UC8151 +#define HW_TYPE SOLUM_M2_BWR_29_UC8151 #include "../boardCommon.h"